Đến nội dung


Hình ảnh
- - - - -

Xin lisp copy align


  • Please log in to reply
22 replies to this topic

#1 tuanthunder

tuanthunder

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 12 July 2009 - 09:02 PM

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.
  • 0

#2 tuanthunder

tuanthunder

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 July 2009 - 09:12 PM

Cảm ơn bác.
Nhưng bác xem lại cho em lisp trên.Vì nó chỉ align thôi chứ chưa copy đối tượng.
  • 0

#3 tuanthunder

tuanthunder

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 13 July 2009 - 10:43 PM

: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
  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 14 July 2009 - 04:54 PM

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:
  • 2

#5 tuanthunder

tuanthunder

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 14 July 2009 - 05:23 PM

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 .
  • 1

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 14 July 2009 - 07:07 PM

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)
)

  • 0

#7 tuanthunder

tuanthunder

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 14 July 2009 - 10:47 PM

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.
  • 1

#8 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 10 September 2009 - 07:27 PM

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é.
  • 1

#9 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 11 September 2009 - 01:10 AM

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.
Hình đã gửi
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.
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#10 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 11 September 2009 - 07:03 AM

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.
Hình đã gửi
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 .
  • 0

#11 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 11 September 2009 - 07:12 AM

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.c...amp;#entry18320
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#12 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 12 September 2009 - 09:07 AM

Bạn xen ở đây!
http://www.cadviet.c...amp;#entry18320

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?
  • 0

#13 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 12 September 2009 - 09:21 AM

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.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#14 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 12 September 2009 - 09:36 AM

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.
  • 0

#15 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 12 September 2009 - 09:42 AM

Đ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?
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#16 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 12 September 2009 - 10:10 AM

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.
  • 0

#17 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 12 September 2009 - 10:13 AM

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)
  • 0

#18 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 12 September 2009 - 10:24 AM

(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?
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#19 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 12 September 2009 - 02:44 PM

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:
  • 0

#20 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 14 September 2009 - 07:18 AM

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)
)

  • 2

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D