Đến nội dung


Hình ảnh
- - - - -

Chọn đối tượng với lệnh "SSGET" trong Lisp


  • Please log in to reply
2 replies to this topic

#1 toanmda

toanmda

    biết zoom

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

Đã gửi 24 July 2008 - 07:04 PM

Gửi Bác Hoành cùng anh chị em trên CADVIET.
Mong mọi người chỉ giao giúp mình một chút. Chuyện là thế này, mình sử dụng lệnh "SSGET" để lựa chọn đối tượng text theo đoạn Lisp sau:
(defun chgtext_VT (objs / last_o tot_o ent o_str n_str st s_temp 
n_slen o_slen si chf chm cont ans)
(if (null objs)
(setq objs (ssget))
)
khi đó nhận được biến "Objs", đối tượng được chọn nằm trong một hình chữ nhật với lựa chon "W" tại dòng nhắc và sau đó là pickpoint hai điểm P1, P2. Nhưng khi sử dụng phép gán biến (Setq ent Objs) hoặc (Set ent Objs) thì biến này khác hoàn toàn với biến Objs
=> Mình không hiểu thế là sao, mong mọi người góp ý chỉ bảo giúp.
=> Mình sử dụng đoạn mã sau (setq objs (ssget "c" p1 p2)) để tự động chọn thì lại có thông báo lỗi, chẳng hiểu sai chỗ nào nữa ????
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 25 July 2008 - 08:41 AM

Gửi Bác Hoành cùng anh chị em trên CADVIET.
Mong mọi người chỉ giao giúp mình một chút. Chuyện là thế này, mình sử dụng lệnh "SSGET" để lựa chọn đối tượng text theo đoạn Lisp sau:

(defun chgtext_VT (objs / last_o tot_o ent o_str n_str st s_temp 
n_slen o_slen si chf chm cont ans)
(if (null objs)
(setq objs (ssget))
)
khi đó nhận được biến "Objs", đối tượng được chọn nằm trong một hình chữ nhật với lựa chon "W" tại dòng nhắc và sau đó là pickpoint hai điểm P1, P2. Nhưng khi sử dụng phép gán biến (Setq ent Objs) hoặc (Set ent Objs) thì biến này khác hoàn toàn với biến Objs
=> Mình không hiểu thế là sao, mong mọi người góp ý chỉ bảo giúp.
=> Mình sử dụng đoạn mã sau (setq objs (ssget "c" p1 p2)) để tự động chọn thì lại có thông báo lỗi, chẳng hiểu sai chỗ nào nữa ????

Bạn đừng trích một góc của code lên, vì như vậy không thể biết được bạn sai ở đâu.

Bạn hãy post code đầy đủ của bạn lên, hoặc chí ít bạn hãy viết 1 chương trình ngắn, đầy đủ, đúng theo tư duy của bạn (nhưng sai với tư duy của ACAD) rồi post lên. Chúng tôi sẽ giúp được bạn.
  • 0

#3 toanmda

toanmda

    biết zoom

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

Đã gửi 29 July 2008 - 09:50 PM

Bạn đừng trích một góc của code lên, vì như vậy không thể biết được bạn sai ở đâu.

Bạn hãy post code đầy đủ của bạn lên, hoặc chí ít bạn hãy viết 1 chương trình ngắn, đầy đủ, đúng theo tư duy của bạn (nhưng sai với tư duy của ACAD) rồi post lên. Chúng tôi sẽ giúp được bạn.

Mấy hôm nay ở công ty nhiều việc quá, về đến nhà chẳng còn tâm trí gì cả. Hôm nay mới có chút thời gian lướt Web. Dù sao cũng xin gửi lời cảm ơn tới bác Hoành trước nhé. Toàn bộ code bây giờ mới đưa lên diễn đàn được, có vẻ như nó chạy ngon rồi bác Hoành a.
(defun chgtext (objs / last_o tot_o ent o_str n_str st s_temp 
n_slen o_slen si chf chm cont ans)
(if (null objs)
(setq objs (ssget))
)
(setq chm 0)
(if objs
(progn
(if (= (type objs) 'ENAME)
(progn
(setq ent (entget objs))
(princ (strcat "\nExisting string: " (cdr (assoc 1 ent))))
)
(if (= (sslength objs) 1)
(progn
(setq ent (entget (ssname objs 0)))
(princ (strcat "\nExisting string: " (cdr (assoc 1 ent))))
)
)
)
(setq o_str (getstring "\nMatch string : " t))
(setq o_slen (strlen o_str))
(if (/= o_slen 0)
(progn
(setq n_str (getstring "\nNew string : " t))
(setq n_slen (strlen n_str))
(setq last_o 0
tot_o (if (= (type objs) 'ENAME)
1
(sslength objs)
)
)
(while (< last_o tot_o)
(if (or (= "TEXT" ; Look for TEXT entity type (group 0)
(cdr (assoc 0 (setq ent (entget (ssname objs last_o))))))
(= "MTEXT" ; Look for MTEXT entity type (group 0)
(cdr (assoc 0 (setq ent (entget (ssname objs last_o))))))
)
(progn
(setq chf nil si 1)
(setq s_temp (cdr (assoc 1 ent)))
(while (= o_slen (strlen (setq st (substr s_temp si o_slen))))
(if (= st o_str)
(progn
(setq s_temp (strcat
(if (> si 1)
(substr s_temp 1 (1- si))
""
)
n_str
(substr s_temp (+ si o_slen))
)
)
(setq chf t)
(setq si (+ si n_slen))
)
(setq si (1+ si))
)
)
(if chf
(progn
; Modify the TEXT entity
(entmod (subst (cons 1 s_temp) (assoc 1 ent) ent))
(setq chm (1+ chm))
)
)
)
)
(setq last_o (1+ last_o))
)
)
;; else go on to the next line...
)
)
)
(if (/= (type objs) 'ENAME)
(if (/= (sslength objs) 1)
(princ (strcat "Changed "
(rtos chm 2 0)
" text lines."
)
)
)
)
(terpri)
)
Đoạn lisp này tìm và thay đổi một hoặc nhiều ký tự trong text có lẽ trên diễn đàn cũng đã có khá nhiều rồi.
  • 0