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.
Đăng nhập để thực hiện theo  
tuanthunder

Xin lisp copy align

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

tuanthunder    4

Xin chào các bác CADVIET.

Em là newbie. Hôm nay em muốn phiền các bác viết cho em 1 lisp:

- Lisp này có tác dụng: Tự động copy đối tượng khi Align đối tượng đó ra chỗ khác.

( VD: Em vẽ 1 cái cửa trên mặt bằng.Em muốn dóng cái cửa đó vào 1 cái ô cửa khác.Thì bình thường em phải: 1.Copy cái cửa đó. B2: Dùng lệnh Al.)

-Các bác giúp em nhé.Cảm ơn các bác trướ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
tuanthunder    4
:s_big: Sơ ý quá, mình chưa kiểm tra với nhiều đồi tượng 1 lúc, nhưng nó vẫn ok khi chọn 1 đối tượng đấy.

Cảm ơn bác. Nhưng bác xem lại cho em.Ý của em là lisp có tác dụng:

B1: Copy đối tượng được chọn.

B2: Align đối tượng đó ra chỗ khác.

Lisp của bác em thử rồi nhưng không Copy đối tượng ra khi Align.B

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ảm ơn bác. Nhưng bác xem lại cho em.Ý của em là lisp có tác dụng:

B1: Copy đối tượng được chọn.

B2: Align đối tượng đó ra chỗ khác.

Lisp của bác em thử rồi nhưng không Copy đối tượng ra khi Align.B

Bạn thử đoạn code này xem :

(defun c:COA()
(prompt "\n Chon doi tuong : ")
(setq ss (ssget))
(setq p1 (getpoint "\n Specify first source point : "))
(setq p2 (getpoint p1"\n Specify first destination point: "))
(setq p3 (getpoint "\n Specify Second source point : "))
(setq p4 (getpoint p3 "\n Specify Second destination point: "))
(command "copy" ss "" p1 "@")
(command "align" ss "" p1 p2 p3 p4 "" "")
(princ)
)

Specify first source point :

Specify first destination point:

Specify Second source point :

Specify Second destination point: giống như lệnh Align

 

Mong bạn làm được :s_big:

  • Vote tăng 2

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
tuanthunder    4
Bạn thử đoạn code này xem :

(defun c:COA()
(prompt "\n Chon doi tuong : ")
(setq ss (ssget))
(setq p1 (getpoint "\n Specify first source point : "))
(setq p2 (getpoint p1"\n Specify first destination point: "))
(setq p3 (getpoint "\n Specify Second source point : "))
(setq p4 (getpoint p3 "\n Specify Second destination point: "))
(command "copy" ss "" p1 "@")
(command "align" ss "" p1 p2 p3 p4 "" "")
(princ)
)

Specify first source point :

Specify first destination point:

Specify Second source point :

Specify Second destination point: giống như lệnh Align

 

Mong bạn làm được :s_big:

Cảm ơn các bác đã tận tình viết lisp giúp em.

Bác Tue_NV bác sửa lại cho em sao cho lisp đó khi Align có thể Scale được (Giống như lệnh Align binh thường )

Cái dòng đó em nhớ hình như: "Scale Objects based on alignment point/ Yes/ No

Cảm ơn bác .

  • 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ảm ơn các bác đã tận tình viết lisp giúp em.

Bác Tue_NV bác sửa lại cho em sao cho lisp đó khi Align có thể Scale được (Giống như lệnh Align binh thường )

Cái dòng đó em nhớ hình như: "Scale Objects based on alignment point/ Yes/ No

Cảm ơn bác .

Code đây : rất ngắn gọn

(defun c:COA()
(prompt "\n Chon doi tuong : ")
(setq ss (ssget))
(command "copy" ss "" '(0 0 0) "@")
(command "align" ss "" pause)
(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
tuanthunder    4
Code đây : rất ngắn gọn

(defun c:COA()
(prompt "\n Chon doi tuong : ")
(setq ss (ssget))
(command "copy" ss "" '(0 0 0) "@")
(command "align" ss "" pause)
(princ)
)

Cảm ơn bác TUE_NV và các bác rất nhiều. Lisp đã đúng theo ý muốn của em.

  • 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
Phiphi-    175
Code đây : rất ngắn gọn

(defun c:COA()
(prompt "\n Chon doi tuong : ")
(setq ss (ssget))
(command "copy" ss "" '(0 0 0) "@")
(command "align" ss "" pause)
(princ)
)

Vẩn sử dụng với mục đích copy MỘT đối tượng rồi align với TỪNG (nhiều) đối tượng khác.

Thay vì phải chọn từng point do lệnh Align yêu cầu, xin Bác Tue_NV viết LISP cho phép chọn LINE trên đối tượng copy (tức là chọn được 2 điểm endpoints) rồi align vào CÁC đối tượng khác cũng bằng cách chọn các LINE trên các đối tượng cần Align.

Như vậy sẽ giảm rất nhiều lần phải Specify... point.

Thank you Bác nhé.

  • 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
Thaistreetz    515
Vẩn sử dụng với mục đích copy MỘT đối tượng rồi align với TỪNG (nhiều) đối tượng khác.

Thay vì phải chọn từng point do lệnh Align yêu cầu, xin Bác Tue_NV viết LISP cho phép chọn LINE trên đối tượng copy (tức là chọn được 2 điểm endpoints) rồi align vào CÁC đối tượng khác cũng bằng cách chọn các LINE trên các đối tượng cần Align.

Như vậy sẽ giảm rất nhiều lần phải Specify... point.

Thank you Bác nhé.

 

Nếu pick như vậy, làm cách nào bạn kiểm soát được đâu là điểm đầu (start point), đâu là điểm cuối (end point) của các đường line. vì nó ảnh hưởng trực tiếp đến góc quay và vị trí của đối tượng sau khi align.

thai2.jpg

bạn cứ thực hiện lệnh align sẽ hiểu.

Mình nghĩ công việc này không lười đượ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
Phiphi-    175
Nếu pick như vậy, làm cách nào bạn kiểm soát được đâu là điểm đầu (start point), đâu là điểm cuối (end point) của các đường line. vì nó ảnh hưởng trực tiếp đến góc quay và vị trí của đối tượng sau khi align.

thai2.jpg

bạn cứ thực hiện lệnh align sẽ hiểu.

Mình nghĩ công việc này không lười được.

1. Trong mỗi Line, Pline đều phân biệt rõ điểm đầu và điểm cuối rồi.

2. Nếu cần xoay lại thì LISP sẽ có option để xử lý.

3. Và nên có thêm option để Mirror đối tượng khi cần.

Vậy nếu có LISP này thì công việc sẽ nhanh chóng hơn là dùng lệnh Align căn bản khi cần copy/align cho nhiều đối tượng trong 1 lúc.

Nếu đối tượng copy là 1 Dynamic block thì no problem với ý kiến của Thaistreetz .

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
Vẩn sử dụng với mục đích copy MỘT đối tượng rồi align với TỪNG (nhiều) đối tượng khác.

Thay vì phải chọn từng point do lệnh Align yêu cầu, xin Bác Tue_NV viết LISP cho phép chọn LINE trên đối tượng copy (tức là chọn được 2 điểm endpoints) rồi align vào CÁC đối tượng khác cũng bằng cách chọn các LINE trên các đối tượng cần Align.

Như vậy sẽ giảm rất nhiều lần phải Specify... point.

Thank you Bác nhé.

Bạn xen ở đây!

http://www.cadviet.com/forum/index.php?sho...amp;#entry18320

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
Thank you, Bác Duy782006.

Nhưng có thể nào để chỉ cần pick LINE thay vì phải pick từng POINT được không vậy Bác?

Chỉnh được nhưng lúc đó không kiểm soát được cái nào là điểm đầu cái nào là điểm cuối theo ý muốn đâu! Nếu chịu theo mặc định của nó thì mình chỉnh lại chút.

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
Phiphi-    175
Chỉnh được nhưng lúc đó không kiểm soát được cái nào là điểm đầu cái nào là điểm cuối theo ý muốn đâu! Nếu chịu theo mặc định của nó thì mình chỉnh lại chút.

Điều này không vấn đề vì đối tượng Copy là 1 Dynamic block cho phép xoay chuyển theo ý muốn rồi.

Bác Duy782006 có thể sửa sao có thể select nhiều LINE trong 1 lúc nhé. Cám ơn nhiều.

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
Điều này không vấn đề vì đối tượng Copy là 1 Dynamic block cho phép xoay chuyển theo ý muốn rồi.

Bác Duy782006 có thể sửa sao có thể select nhiều LINE trong 1 lúc nhé. Cám ơn nhiều.

Nếu nó là block thì mình lấy line nguồn và line đích ở đâu vậy 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
Phiphi-    175
Nếu nó là block thì mình lấy line nguồn và line đích ở đâu vậy bạn?

Trong bước đầu tiên của LISP nal của duy782006 đã yêu cầu pick 2 điểm đầu/cuối rồi. Drafter cứ tự chọn lấy.

Khi align với line thì mình chỉ cần 1 điểm (bất kỳ) đã pick nhập trùng với 1 điểm (đầu/cuối) của line là OK.

Phần SCALE mình sẽ không cần dùng vì dynamic block sẽ làm công việc kế tiếp theo ý muốn của Drafter.

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
Phiphi-    175
Trong bước đầu tiên của LISP nal của duy782006 đã yêu cầu pick 2 điểm đầu/cuối rồi. Drafter cứ tự chọn lấy.

Khi align với line thì mình chỉ cần 1 điểm (bất kỳ) đã pick nhập trùng với 1 điểm (đầu/cuối) của line là OK.

Phần SCALE mình sẽ không cần dùng vì dynamic block sẽ làm công việc kế tiếp theo ý muốn của Drafter.

(tóm lại chỉ cần COPY rồi ALIGN theo line, không SCALE)

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
(tóm lại chỉ cần COPY rồi ALIGN theo line, không SCALE)

Mình tổng kết lại trình tự như này nhé:

-Lisp hỏi chọn đối tượng.

-Chọn điểm chuẩn 1

-Chọn điểm chuẩn 2

-Chọn các line đích

Thực hiện algin không scale, không hỏi han gì ráo trọi. OK?

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
Phiphi-    175
Mình tổng kết lại trình tự như này nhé:

-Lisp hỏi chọn đối tượng.

-Chọn điểm chuẩn 1

-Chọn điểm chuẩn 2

-Chọn các line đích

Thực hiện algin không scale, không hỏi han gì ráo trọi. OK?

Yes, please. :s_big:

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
Yes, please. :s_big:

*Đây bạn:

-Tên lệnh: NALL (new algin line)

-Chọn đối tượng mốn copy và rotate (1 hoặc nhiều đối tượng) enter.

-Chọn các line (1 hoặc nhiều đối tượng, chỉ nhận đối tượng line) enter ==>Xong.

*Ở đây thì lisp sẽ copy đối tượng từ điểm đích thứ nhất đến điểm đầu của line và quay nó song song với line. Nếu bạn muốn copy đối tượng từ điểm đích thứ nhất đến điểm cuối của line thì sửa

(setq diem1m (cdr (assoc 10 ttdt)))

(setq diem2m (cdr (assoc 11 ttdt)))

Thành

(setq diem1m (cdr (assoc 11 ttdt)))

(setq diem2m (cdr (assoc 10 ttdt)))

Là được.

 

*Sẳn tiện mình viết luôn lệnh NALCL:

Giống lệnh trên nhưng thay vì chọn 2 điểm nguồn thì lisp hỏi chọn line nguồn (line này có thể nằm trong tập hợp chọn hoặc không gì cũng được). Lisp sẽ lầy điểm đầu và điểm cuối của line này làm 2 điểm nguồn.

 

(Defun C:NALCL ( ) 
(princ "\nPHAM QUOC DUY Binh Son - Quang ngai")

(command "undo" "be")
(setq donvi (/ (getvar "viewsize") 50))

(Princ "\nHay chon doi tuong :")
(setq XX (ssget))

(setq ddd (entsel "\nChon LINE nguon"))
(while
(or
  (null ddd)
  (/= "LINE" (cdr (assoc 0 (entget (car ddd)))))
)
(princ "\nDoi tuong khong phai la LINE! Chon lai")
(setq ddd (entsel "\nChon LINE nguon"))
)

 (setq DTDTT (car ddd))
 (setq DTTT (entget DTDTT))
 (setq NDTTT (cdr (assoc 1 DTTT)))
 (setq diem1 (cdr (assoc 10 DTTT)))
 (setq diem2 (cdr (assoc 11 DTTT)))

(grdraw diem1 diem2 3)
(setq gocchuan(angle diem1 diem2))
(thuchienchon)
(command "undo" "end")
(Princ)
) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun C:NALL ( ) 
(princ "\nPHAM QUOC DUY Binh Son - Quang ngai")

(command "undo" "be")
(setq donvi (/ (getvar "viewsize") 50))

(Princ "\nHay chon doi tuong :")
(setq XX (ssget))
(setq diem1 (getpoint "\nDiem chuan thu nhat: "))
(setq diemvt1 (polar diem1 pi donvi))
(setq diemvt2 (polar diem1 (* 2 pi) donvi))
(setq diemvt3 (polar diem1 (/ pi 2) donvi))
(setq diemvt4 (polar diem1 (- 0 (/ pi 2)) donvi))
(grdraw diemvt1 diemvt2 3)
(grdraw diemvt3 diemvt4 3)
(setq diem2 (getpoint "\nDiem chuan thu hai: "))
(setq diemvt12 (polar diem2 pi donvi))
(setq diemvt22 (polar diem2 (* 2 pi) donvi))
(setq diemvt32 (polar diem2 (/ pi 2) donvi))
(setq diemvt42 (polar diem2 (- 0 (/ pi 2)) donvi))
(grdraw diemvt12 diemvt22 3)
(grdraw diemvt32 diemvt42 3)
(setq gocchuan(angle diem1 diem2))
(thuchienchon)
(command "undo" "end")
(Princ)
) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun thuchienchon ()
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)
(Princ "\nHay chon cac LINE dich :")
(setq SS (ssget '((0 . "LINE"))))

(setq i 0)
(setq N (sslength ss))
(while (< i N)
  (setq doituong (ssname SS i))
  (setq ttdt (entget doituong))
  (setq diem1m (cdr (assoc 10 ttdt)))
  (setq diem2m (cdr (assoc 11 ttdt)))
(thuchienall)
  (setq i (1+ i))
)
(setvar "osmode"luubatdiem)
(Princ)
) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun thuchienall ()
(setq gocmoi(angle diem1m diem2m))
(setq goctinh (- gocmoi gocchuan))
(setq diem3 (polar diem1m goctinh 100))

(setq L 0)
(setq M (sslength XX))
(while (< L M)
(setq DT (ssname xx L))
(command ".copy" DT "" diem1 diem1m)
(command ".rotate" "last" "" diem1m diem3)
(setq L (1+ L))
)
(Princ)
) 

  • Vote tăng 2

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
Phiphi-    175
*Đây bạn:

-Tên lệnh: NALL (new algin line)

-Chọn đối tượng mốn copy và rotate (1 hoặc nhiều đối tượng) enter.

-Chọn các line (1 hoặc nhiều đối tượng, chỉ nhận đối tượng line) enter ==>Xong.

*Ở đây thì lisp sẽ copy đối tượng từ điểm đích thứ nhất đến điểm đầu của line và quay nó song song với line. Nếu bạn muốn copy đối tượng từ điểm đích thứ nhất đến điểm cuối của line thì sửa

(setq diem1m (cdr (assoc 10 ttdt)))

(setq diem2m (cdr (assoc 11 ttdt)))

Thành

(setq diem1m (cdr (assoc 11 ttdt)))

(setq diem2m (cdr (assoc 10 ttdt)))

Là được.

 

*Sẳn tiện mình viết luôn lệnh NALCL:

Giống lệnh trên nhưng thay vì chọn 2 điểm nguồn thì lisp hỏi chọn line nguồn (line này có thể nằm trong tập hợp chọn hoặc không gì cũng được). Lisp sẽ lấy điểm đầu và điểm cuối của line này làm 2 điểm nguồn.

Tuyệt vời quá. nay mai khi model các tháp thép khác PP sẽ ứng dụng LISP này. Công việc chằc chắn sẽ nhanh chóng hơn. Thank you bác Duy782006 rất nhiều.

Model PP đã làm: http://www.cadviet.com/forum/index.php?showtopic=11939

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
Tuyệt vời quá. nay mai khi model các tháp thép khác PP sẽ ứng dụng LISP này. Công việc chằc chắn sẽ nhanh chóng hơn. Thank you bác Duy782006 rất nhiều.

Model PP đã làm: http://www.cadviet.com/forum/index.php?showtopic=11939

Ủa nó chạy đúng trong 3d lun ha bạn. Mình cũng không ngờ há há!

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
qtc1096    25
Ủa nó chạy đúng trong 3d lun ha bạn. Mình cũng không ngờ há há!

Command:

hãy chon điẻm chuan 1

"Hay chon doi tuong :

Select objects: 1 found

 

Select objects:

Diem chuan thu nhat: >>

Diem chuan thu nhat:

Diem chuan thu hai:

Hay chon cac LINE dich :; error: too many arguments"

xuất hiện lỗi này a. Duy ơi. bạn dùng cad 2010 và sau khi thực hiện hiện lệnh mất hết các lựa chọn trong Object snap.

chỉ dùng được cái lisp cũ lệnh nal.

em không biết viết lisp nên hay sưu tầm copy tất vào 1 cái, không biết có lỗi khi các câu lệnh đá nhau không. A có thể chỉnh sửa gọt bớt cài em đang dùng này không. thanks.

http://www.mediafire.com/file/mzzdwtyaijm/FULL.V15.LSP

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

Code đây : rất ngắn gọn

(defun c:COA()

 

(prompt "\n Chon doi tuong : ")

 

(setq ss (ssget))

 

(command "copy" ss "" '(0 0 0) "@")

 

(command "align" ss "" pause)

 

(princ)

 

)

 

 

chào bác, thấy bác viết nhiều lisp rất hay và hữu ích. nay nhờ bác viết cho e cái lisp copy align theo ảnh minh họa. e xin cảm ơn. http://www.cadviet.com/upfiles/7/161651_lisp_copy_align.pdf

  • Vote giảm 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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×