Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết Lisp theo yêu cầu

Các bài được khuyến nghị

phamthanhbinh    3.123
Các bác pro ơi viết dùm em lísp khi click vào 2 điểm của hình chữ nhật bao quanh đối tượng cần tạo Block thì lísp sẽ tạo ra 1 Block có tên là tên file bản vẽ, điểm chèn là tâm của hình chữ nhật.

 

http://www.cadviet.com/upfiles/xe_hoi.dwg

 

Em xin cám ơn nhiều lắm.

Chào bạn tuan_thietkedien,

Thú thục với bạn là mình chưa viết cái lisp tạo block bao giờ. Nay thấy bạn yêu cầu thì làm thử song không biết có vừa ý bạn hay không. Trong lisp này cái việc đặt tên cho block theo tên file hiện hành mình chưa biết ính sao nên đành để cho bạn tự nhập vậy. Do cái tên không dài quá nên chắc bạn cũng vui lòng nhập giùm nha.

(defun c:mb()
(setq p1 (getpoint "\n Nhap diem thu nhat:")
  p2 (getpoint "\n Nhap diem thu hai:")
  p3 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2))
) 
(command "block" (getstring "\n Nhap ten block: ") p3 (ssget  "w" p1 p2) "")
(princ)
)

 

Chúc bạn vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
duy782006    1.375
nhờ các bác viết luôn hộ code đi, em chỉ biết sửa mấy thu đơn giản thôi chứ viết thì em chịu.Các bác giúp em nha.

Mạn phép thêm 1 chút vào lisp của bạn cuongtk2

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)

(vl-load-com)

(setq ent (entsel "\nChon mai doc:"))

(setq cao_text 0.5

thap_phan 2

p1 (cadr ent)

ent (car ent)

sp (vlax-curve-getStartPoint ent)

ep (vlax-curve-getEndPoint ent)

ang (angle sp ep)

dodoc (* (abs (/ (sin ang) (cos ang))) 100)

dodoc (strcat (rtos dodoc 2 thap_phan) "%"))

(command "ucs" "ob" ent)

(command "_.text" p1 cao_text 0 dodoc)

(command "ucs" "p")

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình thấy bạn cũng đã tập viết lisp nên cái này đơn giản bạn nên tự viết theo gợi ý sau.

-Hỏi chọn điểm thứ nhất.

-Hỏi chọn điểm thứ hai.

-Tính toán ra điểm thứ 3 là trung điểm của 2 điểm vừa tạo.

-Gọi lệnh BLOCK chọn đối tượng bằng chế độ W điểm thứ nhất và điểm thứ 2. Tùy nhu cầu mà bạn tính toán chọn từ điểm trái qua pahỉ hay từ phải qua trái. điểm đặt là điểm thứ 3 mà bạn vừa tính được. Khi tạo xong đối tượng gốc mất đi nếu bạn muốn không mất thì thêm dòng gọi lệnh OOPS.

 

Anh Duy có thể hướng dẫn em thêm cách lấy tên của file hiện hành, còn chọn đối tượng bằng chế độ W mình phải làm sao?

Em đã thử viết rồi nhưng lisp không chạy được

(defun c:test()
(setq 
p1 (getpoint "\nChon diem 1: ")
p2 (getcorner p1 "\nChon diem 2: ")
td (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2))
)
(command "block" "abc" td p1 p2 "")
(princ)
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
nhờ các bác viết luôn hộ code đi, em chỉ biết sửa mấy thu đơn giản thôi chứ viết thì em chịu.Các bác giúp em nha.

Chào bạn sucuph,

Cái yêu cầu của bạn bác Cuongtk2 đã giải quyết phần cơ bản rồi, dòng text ghi độ dốc đã có, bạn chỉ việc thay đổi nội dung text , vị trí điểm đặt của text và góc xoay text là xong mà.

Bạn hãy thay dòng lệnh (command "_.text" p1 cao_text 0 dodoc) bằng dòng lệnh tương tự như sau:(command "_.text" (list (car p1) (+ 5 (cadr p1)) cao_text ang (strcat " Do doc mai la " dodoc)).

Như vậy vị trí đặt text sẽ cao hơn điểm chọn 5 đơn vị và text sẽ nghiêng một góc ang tức là song song với mặt dốc. Text sẽ được đổi thành Do doc mai là ....%

 

Bạn thử lại nhé. Chúc bạn vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
Anh Duy có thể hướng dẫn em thêm cách lấy tên của file hiện hành, còn chọn đối tượng bằng chế độ W mình phải làm sao?

Em đã thử viết rồi nhưng lisp không chạy được

(defun c:test()
(setq 
p1 (getpoint "\nChon diem 1: ")
p2 (getcorner p1 "\nChon diem 2: ")
td (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2))
)
(command "block" "abc" td p1 p2 "")
(princ)
)

Chào bạn tuan_thietkedien,

Câu hỏi 1 mình chưa trả lời được.

Câu hỏi 2, bạn tham khảo cái lisp của mình đã post cho bạn trong topic này. Cái sai của bạn là điểm p1 p2 là đối số của hàm ssget chứ không phải là tham số của lệnh block. Lệnh block yêu cầu bạn chọn một tập đối tượng trên bản vẽ chứ không phải các điểm chọn. Do vậy mình dùng hàm ssget để lấy tập đối tượng này với mode "W" và các điểm chọn p1, p2 làm đối số.

Bạn nên lưu ý khi dùng lệnh command của cad phải tuân thủ đúng yêu cầu về các tham số của nó thì lisp mới chạy được, kể cả về trình tự sắp xếp các tham số trong lệnh nữa.

Chúc bạn vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
sucuph    1
Chào bạn sucuph,

Cái yêu cầu của bạn bác Cuongtk2 đã giải quyết phần cơ bản rồi, dòng text ghi độ dốc đã có, bạn chỉ việc thay đổi nội dung text , vị trí điểm đặt của text và góc xoay text là xong mà.

Bạn hãy thay dòng lệnh (command "_.text" p1 cao_text 0 dodoc) bằng dòng lệnh tương tự như sau:(command "_.text" (list (car p1) (+ 5 (cadr p1)) cao_text ang (strcat " Do doc mai la " dodoc)).

Như vậy vị trí đặt text sẽ cao hơn điểm chọn 5 đơn vị và text sẽ nghiêng một góc ang tức là song song với mặt dốc. Text sẽ được đổi thành Do doc mai là ....%

 

Bạn thử lại nhé. Chúc bạn vui.

em đã thử nhưng không được bác ạ, không biết lỗi chỗ nào tìm mãi không thấy. Bác cho em xin đoạn code hoàn thiện được không?Nhờ bác giúp đỡ, em đang online chờ bác!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
cuongtk2    40
em đã thử nhưng không được bác ạ, không biết lỗi chỗ nào tìm mãi không thấy. Bác cho em xin đoạn code hoàn thiện được không?Nhờ bác giúp đỡ, em đang online chờ bác!

thiếu 1 dấu đóng ngoặc cho list

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
Hình như bạn nhầm H/L thành L/H, bình thường nói mái dốc 60% hoặc 15% tức là tan(anpha)=0.60 = H/L

Cái này thì 100% bạn sai hoàn toàn rồi.

Tỉ số H/L gọi là độ dốc của mái được kí hiệu thông thường bằng chữ i=H/L=tan(anpha)

độ dốc i của mái càng lớn thì H càng lớn và ngược lại.

độ dốc i của mái càng lớn thì L càng nhỏ và ngược lại.

Tức là độ dốc của mái tỉ lệ thuận với chiều cao H và tỉ lệ nghịch với chiều dài L

 

Còn hệ số mái dốc kí hiệu bằng chữ m là đại lượng tỉ lệ nghịch với độ dốc i tính bằng cotg anpha =L/H

mái dốc m của mái càng lớn thì L càng lớn, người ta nói mái dốc này rất thoải và ngược lại

mái dốc m của mái càng nhỏ thì H càng lớn, người ta nói mái dốc này rất là dốc và ngược lại

Tức là mái dốc của mái tỉ lệ thuận với chiều dài L và tỉ lệ nghịch với chiều cao H

 

Mong các bạn hiểu đúng hai khái niệm này, đặc biệt là các bạn trong ngành Xây dựng dân dụng, xây dựng thuỷ lợi, xây dựng cầu đường và các ngành khác nói chung.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
Câu hỏi 2, bạn tham khảo cái lisp của mình đã post cho bạn trong topic này. Cái sai của bạn là điểm p1 p2 là đối số của hàm ssget chứ không phải là tham số của lệnh block. Lệnh block yêu cầu bạn chọn một tập đối tượng trên bản vẽ chứ không phải các điểm chọn. Do vậy mình dùng hàm ssget để lấy tập đối tượng này với mode "W" và các điểm chọn p1, p2 làm đối số.

Bạn nên lưu ý khi dùng lệnh command của cad phải tuân thủ đúng yêu cầu về các tham số của nó thì lisp mới chạy được, kể cả về trình tự sắp xếp các tham số trong lệnh nữa.

Chúc bạn vui.

Chào bạn phamthanhBinh

Đúng là dùng hàm ssget để lấy tập đối tượng này với mode "W" và các điểm chọn p1, p2 làm đối số.

 

Mình xin được góp ý thêm nhé : Lệnh Block có thể cho bạn chọn đối tượng trên bản vẽ là các điểm chọn và điểm chọn này phải trùng với đối tượng thì lệnh Block mới nhận được đối tượng này và thực thi lệnh Block

Và cái sai của bạn Tuanthietkedien không phải là điểm p1 p2 không phải là tham số của lệnh block mà chính sai ở chổ p1, p2 không trùng với đối tượng chọn cho nên không có đối tượng nào được chọn mà không có đối tượng nào được chọn thì lệnh Block sẽ không thực thi -> thành ra bị lỗi.

 

(command "block" "abc" td p1 p2 "")

Bạn xem dòng lệnh ở trên thì p1 p2 chính là các điểm chọn theo chế độ pick điểm phải không?

Mà chọn theo chế độ pick điểm p1, p2 thì không có đối tượng nào được chọn rồi còn gì?

 

@tuanthietkedien: Hãy làm theo gợi ý của bác phamthanhbinh sẽ được

Chúc bạn thành công :cheers:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
duy782006    1.375
Anh Duy có thể hướng dẫn em thêm cách lấy tên của file hiện hành, còn chọn đối tượng bằng chế độ W mình phải làm sao?

Em đã thử viết rồi nhưng lisp không chạy được

Đây là lisp theo đúng yêu vầu của bạn nhưng quả thật mình không hiểu lisp này dùng để làm gì.

-Tạo ra block trong chính bản vẽ bằng chính cái tên đó dùng để làm gì vậy bạn.

-Lisp này chỉ chạy được 1 lần cho 1 bản vẽ vì lần thứ 2 thì trong bản vẽ đã tồn tại block này rồi.

-Nếu mục đích bạn muốn đưa điểm chèn block về tâm của hình bạn chọn thì chỉ cần move nó về điểm 0,0 sau đó khi bạn chèn nó vào các bản vẽ khác thì nó là block có tên và điểm chèn như mong muốn của bạn rồi.

*Lưu ý khi chọn điểm bạn nên chọn từ trái qua phải nghen.

 

(defun c:tbl ()

(command "undo" "be")

(setq a (getpoint "\nChon diem thu nhat: "))

(setq b (getcorner a"\nChon diem thu hai: "))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

(setq c (list (/ (+ (car a) (car b)) 2) (/ (+ (cadr a) (cadr b)) 2)))

(setq ten (getvar "dwgname"))

(setq so (strlen ten))

(setq so (- so 4))

(setq ten (substr ten 1 so))

(command "select" "W" a b "" "")

(command "block" ten c "p" "")

(setvar "osmode" luubatdiem)

(command "undo" "end")

(princ)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
sucuph    1
thiếu 1 dấu đóng ngoặc cho list

em thử mãi cũng vẫn không được, nó không cho kết quả

 

Command: gocdoc

Chon mai doc:nil

 

nhờ bác test lại rồi post cho em xin đầy đủ code của lisp nhé!không biết gì khổ thế đấy!Cam ơn các bác!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đây là lisp theo đúng yêu vầu của bạn nhưng quả thật mình không hiểu lisp này dùng để làm gì.

-Tạo ra block trong chính bản vẽ bằng chính cái tên đó dùng để làm gì vậy bạn.

-Lisp này chỉ chạy được 1 lần cho 1 bản vẽ vì lần thứ 2 thì trong bản vẽ đã tồn tại block này rồi.

-Nếu mục đích bạn muốn đưa điểm chèn block về tâm của hình bạn chọn thì chỉ cần move nó về điểm 0,0 sau đó khi bạn chèn nó vào các bản vẽ khác thì nó là block có tên và điểm chèn như mong muốn của bạn rồi.

*Lưu ý khi chọn điểm bạn nên chọn từ trái qua phải nghen.

 

 

Chào anh Duy

Cám ơn anh đã hướng dẫn cụ thể, em muốn dùng lisp này để tạo thành 1 thư viện block các thiết bị sử dụng trong bản vẽ. Đầu tiên tải dữ liệu CAD của thiết bị từ công ty Panasonic, dữ liệu tải về là 1 file ***.dxf chỉ chứa 1 hình thiết bị chưa được tạo block. Nếu công trình của mình sử dụng loại thiết bị nào thì chỉ việc lấy block từ thư viện ra thôi. Việc chọn điểm chèn là tâm của hộp bao quanh thiết bị để khi mình chèn block cho đẹp mắt ý. :cheers:

:cheers:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
thiếu 1 dấu đóng ngoặc cho list

Cám ơn bác Cuongtk2,

Do sơ suất nên viết thiếu một dấu ngoặc đúng như bác nói. Xin rút kinh nghiệm để lần sau cẩn thận hơn. Chúc bác vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
em thử mãi cũng vẫn không được, nó không cho kết quả

 

Command: gocdoc

Chon mai doc:nil

 

nhờ bác test lại rồi post cho em xin đầy đủ code của lisp nhé!không biết gì khổ thế đấy!Cam ơn các bác!

 

Chào bạn sucuph,

Lisp đầy đủ đây ạ:

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)
(vl-load-com)
(setq ent (entsel "\nChon mai doc:"))
(setq cao_text 0.5
thap_phan 2
p1 (cadr ent)
ent (car ent)
sp (vlax-curve-getStartPoint ent)
ep (vlax-curve-getEndPoint ent)
ang (angle sp ep)
dodoc (* (abs (/ (sin ang) (cos ang))) 100)
dodoc (strcat (rtos dodoc 2 thap_phan) "%"))
(command "_.text" (list (car p1) (+ 5 (cadr p1))) cao_text (/ (* ang 180) pi) (strcat " Do doc mai la " dodoc))
)

 

Bạn lưu ý là khi lisp yêu cầu bạn chọn mái doc thì bạn phải chọn vào đúng mái dốc cần xác định độ dốc chứ không được nhấn enter ngay nha.

Khi góc dốc >pi/2 bạn sẽ thấy text bị lộn ngược và tùy theo ý bạn có thể để nguyên hay rotate nó nhé.

Bạn lưu ý thêm là mình có thay đổi cái cách xác định góc xoay của text do hàm angle trả ra giá trị theo radian mà lệnh text yêu cầu nhập giá trị theo độ.

Trong trường hợp mái dốc của bạn không phải là đường line thì góc ang sẽ là góc của điểm đầu và điểm cuối của đường polyline hay spline đó bạn nhé.

Mình đã chạy thử lisp ngon.

 

Chúc bạn vui và thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

chào các bạn, xin nhờ các bạn 1 việc. chả là thế này lần truớc mình có nhờ các bạn viết 1 lisp nối các đoạn thẳng liên tiếp nhau thành 1 PL và 1 cao thủ đã viết cho mình lisp này ( dùng rất tốt )

 

 

 

(defun c:nn (/ tdt ssdt sodt index)

(defun ObjName (ssdt /)

(cdr (assoc '0 (entget ssdt)))

)

(defun MoPL (ssdt /)

(= (cdr (assoc '70 (entget ssdt))) 0)

)

(defun NoiPL (ssdt /)

(if (MoPL ssdt)

(command ".PEDIT" ssdt "J" "All" "" "X")

)

)

(defun NoiLC (ssdt /)

(command ".PEDIT" ssdt "Y" "J" "All" "" "X")

)

(setq

tdt (ssget)

sodt (sslength tdt)

index 0

)

(repeat sodt

(setq

ssdt (ssname tdt index)

index (1+ index)

)

(if (or (= (Objname ssdt) "LWPOLYLINE")

(= (Objname ssdt) "POLYLINE")

)

(NoiPL ssdt)

)

(if (or (= (Objname ssdt) "LINE") (= (Objname ssdt) "ARC"))

(NoiLC ssdt)

)

)

(princ)

)

 

 

 

 

 

rưng mà có vấn đề nảy sinh như sau : cái lisp này nó sẽ nối tất tần tật các đoạn thẳng nào có liên hệ với đoạn thẳng mà mình chọn, trong khi đôi lúc mình chỉ muốn nối vài đuờng với nhau thôi ( các đuờng khác dù có tiếp theo thì cũng kô nối ) bình thường ra thì mình lại phải dùng PE,

mình nhờ các bạn sửa nó thành sao cho nó chỉ nối những đoạn thẳng mà mình chọn thôi, cảm ơn các bạn !

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
dacvien2007    10

Nhờ Bác giúp em về lisp tao Block của một kí hiệu nào đó, xin chọn và yêu cầu : đặt tên block và lưu vào thư mục như 1 file để dùng chung các bản vẽ khác,

Líp sưu tần như sau:

 

(defun c:tbl ()

(command "undo" "be")

(setq a (getpoint "\nChon diem thu nhat: "))

(setq b (getcorner a"\nChon diem thu hai: "))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

(setq c (list (/ (+ (car a) (car :undecided:) 2) (/ (+ (cadr a) (cadr :cheers:) 2)))

(setq ten (getvar "dwgname"))

(setq so (strlen ten))

(setq so (- so 4))

(setq ten (substr ten 1 so))

(command "select" "W" a b "" "")

(command "block" ten c "p" "")

(setvar "osmode" luubatdiem)

(command "undo" "end")

(princ)

)

 

và ;;;

 

(defun c:mb()

(setq p1 (getpoint "\n Nhap diem thu nhat:")

p2 (getpoint "\n Nhap diem thu hai:")

p3 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2))

)

(command "block" (getstring "\n Nhap ten block: ") p3 (ssget "w" p1 p2) "")

(princ)

)

 

 

Rất mong Bác giúp

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
playboy2612    27

pác nào viết jùm em lisp để vẽ mặt cong tren autocad với.Em cần vẽ mặt cong với nmhiều bán kính khác nhau : VD vỏ ô tô hay thân tàu thuỷ... em vẽ trên cad3d khó quá.thanks các pác. Hoặc có cách nào đó chỉ jùm em!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Nhờ Bác giúp em về lisp tao Block của một kí hiệu nào đó, xin chọn và yêu cầu : đặt tên block và lưu vào thư mục như 1 file để dùng chung các bản vẽ khác,

Líp sưu tần như sau:

 

(defun c:tbl ()

(command "undo" "be")

(setq a (getpoint "\nChon diem thu nhat: "))

(setq b (getcorner a"\nChon diem thu hai: "))

(setq luubatdiem (getvar "osmode"))

(setvar "osmode" 0)

(setq c (list (/ (+ (car a) (car :undecided:) 2) (/ (+ (cadr a) (cadr :cheers:) 2)))

(setq ten (getvar "dwgname"))

(setq so (strlen ten))

(setq so (- so 4))

(setq ten (substr ten 1 so))

(command "select" "W" a b "" "")

(command "block" ten c "p" "")

(setvar "osmode" luubatdiem)

(command "undo" "end")

(princ)

)

 

và ;;;

 

(defun c:mb()

(setq p1 (getpoint "\n Nhap diem thu nhat:")

p2 (getpoint "\n Nhap diem thu hai:")

p3 (list (/ (+ (car p1) (car p2)) 2) (/ (+ (cadr p1) (cadr p2)) 2))

)

(command "block" (getstring "\n Nhap ten block: ") p3 (ssget "w" p1 p2) "")

(princ)

)

Rất mong Bác giúp

 

2 cái lisp bạn sưu tầm ở trên không đúng ý bạn ở chỗ nào?

Bạn hãy up ký hiệu muốn tạo block lên để mọi người tham khảo.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình tính sử dụng các kí hiệu trong qui hoạch , qua líp để tạo các Block để chèn vào

Mong được Bạn giúp

file đây : http://www.cadviet.com/upfiles/KHQH_04_1.rar

 

Bạn có thể dùng lệnh BLOCK để tạo block các kí hiệu này, không cần tới lisp đâu.

Bạn thử làm xem, nếu không được mình sẽ hướng dẫn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
Mình dùng lệnh Block để tạo block, nó chỉ cho tách dụng trên 1 bản vẽ,

Làm thế nào sử dụng block đó với nhiều bản vẽ khác ?

Hãy sử dụng lệnh adcenter hoặc bấm tổ hợp phím Ctrol+2 -> Chọn Block -> Insert qua.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
chào các bạn, xin nhờ các bạn 1 việc. chả là thế này lần truớc mình có nhờ các bạn viết 1 lisp nối các đoạn thẳng liên tiếp nhau thành 1 PL và 1 cao thủ đã viết cho mình lisp này ( dùng rất tốt )

(defun c:nn (/ tdt ssdt sodt index)

(defun ObjName (ssdt /)

(cdr (assoc '0 (entget ssdt)))

)

(defun MoPL (ssdt /)

(= (cdr (assoc '70 (entget ssdt))) 0)

)

(defun NoiPL (ssdt /)

(if (MoPL ssdt)

(command ".PEDIT" ssdt "J" "All" "" "X")

)

)

(defun NoiLC (ssdt /)

(command ".PEDIT" ssdt "Y" "J" "All" "" "X")

)

(setq

tdt (ssget)

sodt (sslength tdt)

index 0

)

(repeat sodt

(setq

ssdt (ssname tdt index)

index (1+ index)

)

(if (or (= (Objname ssdt) "LWPOLYLINE")

(= (Objname ssdt) "POLYLINE")

)

(NoiPL ssdt)

)

(if (or (= (Objname ssdt) "LINE") (= (Objname ssdt) "ARC"))

(NoiLC ssdt)

)

)

(princ)

)

rưng mà có vấn đề nảy sinh như sau : cái lisp này nó sẽ nối tất tần tật các đoạn thẳng nào có liên hệ với đoạn thẳng mà mình chọn, trong khi đôi lúc mình chỉ muốn nối vài đuờng với nhau thôi ( các đuờng khác dù có tiếp theo thì cũng kô nối ) bình thường ra thì mình lại phải dùng PE,

mình nhờ các bạn sửa nó thành sao cho nó chỉ nối những đoạn thẳng mà mình chọn thôi, cảm ơn các bạn !

Chào bạn nguyenkhoadung98,

Bạn chỉ cần thay thế các tham số "All" "" "x" trong hàm Pedit bằng pause để trả quyền điều khiển cho cad là có thể chọn đối tượng thoải mái theo ý bạn thôi mà. Như vậy sau khi bạn đã nhập đủ các đoạn thẳng cần nối, bạn phải click chuột phải để thoát chọn giống như khi bạn thoát chọn đối tượng ban đầu, khi đó cad sẽ nối các đối tượng đã chọn với nhau nếu như chúng liền với nhau không có khoảng hở, đồng thời cad cũng yêu cầu bạn nhấn enter để kết thúc điều khiển của cad và trả về sự hoạt động của lisp.

Bạn hãy làm thử nhé.

Chúc bạn thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×