Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
victor85

[Yêu cầu] Nhờ viết lisp copy nhóm đối tượng lên points

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

Em nhờ các bác viết dùm em lisp sau với ạ:

Trong bản vẽ mình đang có một số lượng points đã được tạo ra sẵn (bằng một số lệnh hoặc lisp tạo nhanh points mong muốn).

Mình muốn copy một nhóm đối tượng lên các points này.

 

Lisp cụ thể như sau:

lisp: copy_quick: lệnh cq

chọn nhóm đối tượng cần copy -> enter

chọn điểm gốc copy của nhóm đối tượng -> enter

chọn các points làm điểm đến.

 

Kết quả là nhóm đối tượng được copy tới từ điểm gốc tới các điểm đến là các points mình chọn ạ.

Hình minh họa:

1.jpg

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

Em nhờ các bác viết dùm em lisp sau với ạ:

Trong bản vẽ mình đang có một số lượng points đã được tạo ra sẵn (bằng một số lệnh hoặc lisp tạo nhanh points mong muốn).

Mình muốn copy một nhóm đối tượng lên các points này.

 

Lisp cụ thể như sau:

lisp: copy_quick: lệnh cq

chọn nhóm đối tượng cần copy -> enter

chọn điểm gốc copy của nhóm đối tượng -> enter

chọn các points làm điểm đến.

 

Kết quả là nhóm đối tượng được copy tới từ điểm gốc tới các điểm đến là các points mình chọn ạ.

Hình minh họa:

 

Hề hề hề,

bạn dùng thử cái này coi đã ưng ý chưa hè.


(defun c:cq (/ oldos ssn pls pn p)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 16383)
(command "undo" "be")
(alert "\n Chon nhom doi tuong nguon")
(setq ssn (ssget)
		pn (getpoint "\n Chon diem goc cua nhom doi tuong")  )
(alert "\n Chon tap hop cac diem dich den ")
(setq pls (acet-ss-to-list (ssget (list (cons 0 "point")))))
(setvar "osmode" 0)
(command "copy" ssn "" "m" pn )
(foreach po pls
       (setq p (cdr (assoc 10 (entget po))))
       (command p)
)
(command "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Chúc bạn vui

  • 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

Hoặc đây nữa!

(defun C:HA( / lst ss pg )
(command "undo" "be") (setq osm (getvar "osmode"))
(princ "\nChon cac point...")
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "POINT")))))))
(princ "\nChon nhom doi tuong can copy...")
(setq ss (ssget))
(setq pg (getpoint "\nChon diem goc: "))
(setvar "osmode" 0)
(foreach n lst
 (command "copy" ss "" pg (cdr (assoc 10 (entget n)))))
(command "undo" "end") (setvar "osmode" osm) (princ))

  • 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

he he, em cảm ơn các bác nhé.

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

@ Bác phamthanhbinh: lisp chạy được rồi bác ạ nhưng đến cái bước xác định điểm gốc nó mất chế độ bắt điểm thành ra thao tác rất phức tạp bác ạ. Bác có cách điều chỉnh dùm em với ạ?

 

@ Bác Doan Van Ha: Lisp chạy báo lỗi này. Bác check xem nguyên nhân do đâu ạ?

Command: ha undo Current settings: Auto = On, Control = All, Combine = Yes,

Layer = Yes

Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]

<1>: be

Command:

Chon cac point...

Select objects: Specify opposite corner: 4 found

 

Select objects:

 

Chon nhom doi tuong can copy...

Select objects: Specify opposite corner: 2 found

 

Select objects:

Chon diem goc: copy

Select objects: 2 found

 

Select objects:

Specify base point or [Displacement/Multiple] <Displacement>: non

Specify second point or [Array] <use first point as displacement>: non ; error:

bad argument type: lentityp nil

 

Specify second point or [Array] <use first point as displacement>: *Cancel*

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

Các bác cho em tham gia với :

(defun C:copy_quick( / ss ss1 pt pt1 vl ov)
 (princ "chon nhom doi tuong can copy :")
 (cond
( (null (setq ss (ssget)) )  (princ "\n*Cancel*")    	)
( (null (setq pt (getpoint "chon diem goc :")) )  (princ "\n*Cancel*")    	)
( (null (princ "chon cac Point :")))
( (null (setq ss1 (ssget '((0 . "POINT")))) )  (princ "\n*Cancel*")    	)
( t
 	(setq vl '("osmode" "orthomode" "cmdecho")
	ov (mapcar 'getvar vl))
 	(mapcar 'setvar vl '(0 0 0))
 	(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss1)))
(vl-cmdf "copy" ss "" pt (trans (cdr(assoc 10 (entget e)))0 1) ))
	(mapcar 'setvar vl ov))
  )
(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

@ Bác Doan Van Ha: Lisp chạy báo lỗi này. Bác check xem nguyên nhân do đâu ạ?

Ẹ! Chưa hiểu vì sao nó lỗi tại "NON"? (sẽ ngâm cứu, vì tôi chạy thì OK)

Đã sửa lại trên link 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

hi hi. Test lisp bác gia bạch chạy ổn nhất. Em cảm ơn các bác đã nhiệt tình giúp đỡ nhé. Chúc các bác làm việc vui vẻ.

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

hi hi. Test lisp bác gia bạch chạy ổn nhất. Em cảm ơn các bác đã nhiệt tình giúp đỡ nhé. Chúc các bác làm việc vui vẻ.

Cũng chưa "tuyệt vời" luôn! Vì bác ấy thiếu cài undo, nên nếu lỡ copy rồi mà buồn tình muốn undo lại thì hơi bị... oải!

Còn bác Bình thì "chuyên gia" "osmode" sớm nhé!. Đùa 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

Mọi người có thể sửa lisp trên thay vì chọn các point . ta chọn các text được không ah.

vd trong bản vẽ có các text là : A,B,C D...

ta đánh lệnh chọn đối tượng cần copy , chọn điểm gốc.

sau đó chọn text mẫu tiếp là bao hết các text.

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ọi người có thể sửa lisp trên thay vì chọn các point . ta chọn các text được không ah.

vd trong bản vẽ có các text là : A,B,C D...

ta đánh lệnh chọn đối tượng cần copy , chọn điểm gốc.

sau đó chọn text mẫu tiếp là bao hết các text.

Đỏ: không hiể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

Thanks.

sau khi chọn đối tượng cần copy xong

thì ta chọn text mẫu: vd chọn text A ( vì trong bản vẽ có rất nhiều text trùng tên nhau nhưng ở các vị trí khác nhau ( cái này là ghi chú tên điểm))

sau đó ta chọn vụng enter là đối tượng đó copy đến các text là A.

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

Thanks.

sau khi chọn đối tượng cần copy xong

thì ta chọn text mẫu: vd chọn text A ( vì trong bản vẽ có rất nhiều text trùng tên nhau nhưng ở các vị trí khác nhau ( cái này là ghi chú tên điểm))

sau đó ta chọn vụng enter là đối tượng đó copy đến các text là A.

Vậy các điểm đích xác định theo các text được chọn như thế nào? Là điểm chèn của chú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
(defun C:HA( / lst ss pg txt)
(command "undo" "be") (setq osm (getvar "osmode"))
(princ "\nChon nhom doi tuong can copy...")
(setq ss (ssget))
(setq pg (getpoint "\nChon diem goc: "))
(setq txt (cdr (assoc 1 (entget (car (entsel "\nChon text mau: "))))))
(princ "\nChon cac text...")
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget (list '(0 . "TEXT") (cons 1 txt)))))))
(setvar "osmode" 0)
(foreach n lst
 (command "copy" ss "" pg (cdr (assoc 10 (entget n)))))
(command "undo" "end") (setvar "osmode" osm) (princ))

  • 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

@ Bác phamthanhbinh: lisp chạy được rồi bác ạ nhưng đến cái bước xác định điểm gốc nó mất chế độ bắt điểm thành ra thao tác rất phức tạp bác ạ. Bác có cách điều chỉnh dùm em với ạ?

 

 

Hề hề hề,

Cái này là do biến osmode. Mình quen dùng truy bắt điểm bằng thanh osnap nên không để ý tới sự phức tạp của bạn. Đã sủa tại lisp cũ bạn down lại nhé.

@ bác Đoàn van ha: Bác thử dùng "_non" xem sao.

Hỏi thêm bác về sự khác biệt giữa :

(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget (list '(0 . "TEXT") (cons 1 txt)))))))

và :

(setq lst (acet-ss-to-list (ssget (list '(0 . "TEXT") (cons 1 txt)))))

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

@ bác Đoàn van ha: Bác thử dùng "_non" xem sao.

Chưa hiểu thằng "non" này nên cả thằng "_non" nữa thì cả 2 thằng này trên máy tôi đều ok cả. Không biết vì sao mà bạn ấy bị.

Chán thiệt! Chẳng lẽ dùng "_non" rồi nhờ bạn ấy thử? Bác thử cái "non" của tôi xem có bị không nhé?

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ưa hiểu thằng "non" này nên cả thằng "_non" nữa thì cả 2 thằng này trên máy tôi đều ok cả. Không biết vì sao mà bạn ấy bị.

Chán thiệt! Chẳng lẽ dùng "_non" rồi nhờ bạn ấy thử? Bác thử cái "non" của tôi xem có bị không nhé?

Hề hề hề,

Của đáng tội là mình dùng non hay _non trong lisp của bác nó đều chạy vù vù, và kết quả thì y chang như cùng một mẹ.

Có thể máy bạn đó có biến hệ thống chi đó chăng nên mình mới nói là thử bác ạ. Mình cũng âm u mu tít về cái vụ này. Chơi kiểu đặt biến Osmode có lẽ sẽ nhẹ đầu hơn.

Hề 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

Mình đã down lại lisp của bác phamthanhbinh. Có lẽ dùng cái lisp của bác là lành mạnh nhất. 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

Hề hề hề,

Cái này là do biến osmode. Mình quen dùng truy bắt điểm bằng thanh osnap nên không để ý tới sự phức tạp của bạn. Đã sủa tại lisp cũ bạn down lại nhé.

@ bác Đoàn van ha: Bác thử dùng "_non" xem sao.

Hỏi thêm bác về sự khác biệt giữa :

(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget (list '(0 . "TEXT") (cons 1 txt)))))))

và :

(setq lst (acet-ss-to-list (ssget (list '(0 . "TEXT") (cons 1 txt)))))

1). Cái chuyện "NON": tôi nghĩ rất có thể bạn ấy nhầm lẫn gì chăng. Chứ tham khảo nhiều lisp của các cao thủ foreign thì nó vẫn dùng bình thường mà không kèm bất cứ điều kiện nào.

2). Về câu hỏi của bác: kết quả trả về đều là list các ename.

- Hàm (setq lst (acet-ss-to-list (ssget)))

Bản chất bên trong như thế nào thì tôi chịu, chỉ có thằng viết ra nó mới hiểu.

- Hàm (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))))

Không biết bác théc méc hàm nào trong những hàm con của hàm trên. Vì vậy, tôi đưa ra ví dụ (chọn 3 text) cách dùng từng hàm để bác rõ vậy:

Hàm ssnamex:

Trả về 1 list chứa thông tin đối tượngphương pháp chọn đối tượng.

Trong đó, thành phần thứ 2 (tương ứng hàm cadr) trong mỗi list con của list mẹ chính là tên đối tượng. Ta đang quan tâm tới nó.

(ssnamex (ssget)) =>

((2 <Entity name: 7efaf2d8> 0 -1) (2 <Entity name: 7efaf2d0> 0 -1) (2 <Entity name: 7efaf2c8> 0 -1) (-1 (0 (42.7551 41.859 0.0)) (0 (53.315 41.859 0.0)) (0 (53.315 32.4024 0.0)) (0 (42.7551 32.4024 0.0))))

Hàm mapcar:

(mapcar 'car '((1 2 3 4 5))) => (1)

(mapcar 'cadr '((1 2 3 4 5))) => (2)

(mapcar 'caddr '((1 2 3 4 5))) => (3)

(mapcar 'cadr (ssnamex (ssget))) => (<Entity name: 7efaf2d8> <Entity name: 7efaf2d0> <Entity name: 7efaf2c8> (0 (47.2158 39.5858 0.0)))

Hàm vl-remove-if:

Loại bỏ những phần tử khỏi list nếu nó không thoả hàm ‘func (VD: 'zerop ; 'listp ; 'vl-symbolp...)

(vl-remove-if 'zerop (list pi 5 0 12)) => (3.14159 5 12)

(vl-remove-if 'listp (list pi 5 0 '(1 2) 12)) => (3.14159 5 0 12)

(vl-remove-if 'vl-symbolp (list pi t 0 "abc")) => (3.14159 0 "abc")

(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))) => (<Entity name: 7efaf2d8> <Entity name: 7efaf2d0> <Entity name: 7efaf2c8>)

  • 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

Mình đã down lại lisp của bác phamthanhbinh. Có lẽ dùng cái lisp của bác là lành mạnh nhất. hì.

Hồi giờ mới nghe "lisp lành mạnh"? Chắc 2 cái còn lại thuộc "lisp buông thả"?

  • 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

1). Cái chuyện "NON": tôi nghĩ rất có thể bạn ấy nhầm lẫn gì chăng. Chứ tham khảo nhiều lisp của các cao thủ foreign thì nó vẫn dùng bình thường mà không kèm bất cứ điều kiện nào.

2). Về câu hỏi của bác: kết quả trả về đều là list các ename.

- Hàm (setq lst (acet-ss-to-list (ssget)))

Bản chất bên trong như thế nào thì tôi chịu, chỉ có thằng viết ra nó mới hiểu.

- Hàm (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))))

Không biết bác théc méc hàm nào trong những hàm con của hàm trên. Vì vậy, tôi đưa ra ví dụ (chọn 3 text) cách dùng từng hàm để bác rõ vậy:

Hàm ssnamex:

Trả về 1 list chứa thông tin đối tượngphương pháp chọn đối tượng.

Trong đó, thành phần thứ 2 (tương ứng hàm cadr) trong mỗi list con của list mẹ chính là tên đối tượng. Ta đang quan tâm tới nó.

(ssnamex (ssget)) =>

((2 <Entity name: 7efaf2d8> 0 -1) (2 <Entity name: 7efaf2d0> 0 -1) (2 <Entity name: 7efaf2c8> 0 -1) (-1 (0 (42.7551 41.859 0.0)) (0 (53.315 41.859 0.0)) (0 (53.315 32.4024 0.0)) (0 (42.7551 32.4024 0.0))))

Hàm mapcar:

(mapcar 'car '((1 2 3 4 5))) => (1)

(mapcar 'cadr '((1 2 3 4 5))) => (2)

(mapcar 'caddr '((1 2 3 4 5))) => (3)

(mapcar 'cadr (ssnamex (ssget))) => (<Entity name: 7efaf2d8> <Entity name: 7efaf2d0> <Entity name: 7efaf2c8> (0 (47.2158 39.5858 0.0)))

Hàm vl-remove-if:

Loại bỏ những phần tử khỏi list nếu nó không thoả hàm ‘func (VD: 'zerop ; 'listp ; 'vl-symbolp...)

(vl-remove-if 'zerop (list pi 5 0 12)) => (3.14159 5 12)

(vl-remove-if 'listp (list pi 5 0 '(1 2) 12)) => (3.14159 5 0 12)

(vl-remove-if 'vl-symbolp (list pi t 0 "abc")) => (3.14159 0 "abc")

(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))) => (<Entity name: 7efaf2d8> <Entity name: 7efaf2d0> <Entity name: 7efaf2c8>)

Hề hề hề,

Thiệt tình mà nói thì các hàm trên bác sử dụng đều có trong help developer của CAd nên mình cũng đã mày mò đọc nó rồi. Tuy nhiên cái sự hiểu thì nó vẫn rất lỗ mỗ.bởi cái tiếng tây nó hơi lủng củng.

Việc mình théc méc là do khi sử dụng như vầy, không biết nó có cho kết quả gì chuẩn xác hơn dùng acet ..... không ??? Bởi vì cứ theo thiển ý của mình thì mèo trắng hay mèo đen, miễn là bắt được chuột sẽ là mèo tốt. Bởi vậy khi dùng như bác, những người mới học sẽ phải lọ mọ khá lâu mới có thể thủng hết cái chức năng của hàm cho dù trông nó thấy có vẻ bác học hơn.

Còn nếu dùng acet.... thì xem ra có vẻ trực quan và dễ hiểu hơn đối với người mới học, nhất là học mót như mình bác ạ. Nội dung bên trong của thằng acet mình cũng chả biết gì đâu nhưng biết rằng cứ dùng nó thì được cái mình cần thôi. Vậy là mần chớ chửa tìm hiểu được gì thêm.

Rất mong bác thông cảm cho cái sự thec méc của mình.

Hề 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

Thiệt tình là như cái hàm đã nói thì bần tui cũng đi mót thôi. Sau đó lấy búa gõ ra từng miếng rồi ngâm... rượu. Có cái ngâm nó ngọt, có cái ngâm nó đắng lè.

Nhưng chắc chắn 100% kết quả của hàm trên là đúng. Biết đâu thằng acet nó cũng viết kiểu đó 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

Hàm vl-remove-if:

Loại bỏ những phần tử khỏi list nếu nó không thoả hàm ‘func (VD: 'zerop ; 'listp ; 'vl-symbolp...)

Câu này hình như bác nói bị ngượ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

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  

×