Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
35 replies to this topic

#1 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 18 May 2012 - 09:16 AM

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

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 18 May 2012 - 09:47 AM

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
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 09:52 AM

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

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 18 May 2012 - 09:55 AM

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

#5 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 18 May 2012 - 10:11 AM

@ 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*
  • 0

#6 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 18 May 2012 - 10:19 AM

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

  • 2

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 10:39 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#8 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 18 May 2012 - 10:39 AM

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

#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 10:46 AM

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í!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#10 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 May 2012 - 10:58 AM

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

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 11:03 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#12 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 May 2012 - 11:08 AM

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

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 11:33 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#14 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 May 2012 - 11:37 AM

Đúng rùi bạn.
  • 0

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 11:41 AM


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

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#16 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 18 May 2012 - 11:45 AM

@ 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)))))
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#17 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 18 May 2012 - 11:52 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#18 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 18 May 2012 - 12:02 PM

Tuyệt vời! Thanks Mr DVH rất nhiều.
  • 0

#19 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 18 May 2012 - 12:07 PM

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ề
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#20 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 18 May 2012 - 02:44 PM

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