Đến nội dung


Hình ảnh
- - - - -

[Hỏi] Cách thay đổi giá trị cho 1 đối tượng bằng Lisp


  • Please log in to reply
6 replies to this topic

#1 avi612

avi612

    biết lệnh move

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

Đã gửi 19 June 2012 - 12:37 PM

Mình đang tập tành viết Lisp, có 1 số vấn đề cần hỏi:
Mình đang thực hành ứng dụng một số hàm như "ssget, sslength, ssname, assoc..."
Thì mình có làm 1 ví dụ nhỏ cho các hàm như sau:
_ Chọn 1 đối tượng text gốc, lấy nội dung của text gốc "thay thế" cho 1 tập hợp các text còn lại.
Cách viết của mình như sau:
_ Chọn text gốc sau đó lấy nội dung của text này.
_ Chọn 1 tổ hợp text lấy tọa độ điểm chèn của tổ hợp này.
_ Sau đó xóa tổ hợp text này đi.
_ Tạo 1 tổ hợp text mới với nội dung của text gốc được chèn ở đúng điểm chèn đã lấy ở tổ hợp text cũ.
Thì sau khi viết theo cách trên thì hàm vẫn chạy được nhưng mình thấy nó không đúng với chức năng là "thay thế" đã nêu trên.
-----------
Nên mình muốn được giúp 1 cách viết khác hay hơn, ứng dụng được nhiều hàm hơn....Mong mọi người giúp đỡ.

Àh 1 vấn đề nhỏ nữa:

(Princ "\n Chọn text góc: ")

(setq text (ssget '((0 . "text")))

Hai dòng lisp trên là để chọn các đối tượng text sau đó Enter kết thúc lệnh.
Bi giờ mình muốn chỉ chọn 1 text thôi và tự động Enter để mình thực hiện các bước tiếp theo, vậy thì mình phải thêm cái gì vào 2 dòng trên.
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 June 2012 - 01:09 PM

Chọn 1 đối tượng : bạn đọc hàm entsel
Chọn 1 đối tượng với type cố định : Bạn đọc hàm ssget với method :S
Thay thế nội dung text : Bạn đọc hàm entmod (chỉnh sửa chứ không tạo lại)
  • 2

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 19 June 2012 - 01:48 PM

em xin bổ sung: có thể dùng hàm Subtr để thay thế nội dung text, sau đó entmod ?
  • 1
Hình đã gửi

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 June 2012 - 01:57 PM

Mình đang tập tành viết Lisp, có 1 số vấn đề cần hỏi:
Mình đang thực hành ứng dụng một số hàm như "ssget, sslength, ssname, assoc..."
Thì mình có làm 1 ví dụ nhỏ cho các hàm như sau:
_ Chọn 1 đối tượng text gốc, lấy nội dung của text gốc "thay thế" cho 1 tập hợp các text còn lại.
Cách viết của mình như sau:
_ Chọn text gốc sau đó lấy nội dung của text này.
_ Chọn 1 tổ hợp text lấy tọa độ điểm chèn của tổ hợp này.
_ Sau đó xóa tổ hợp text này đi.
_ Tạo 1 tổ hợp text mới với nội dung của text gốc được chèn ở đúng điểm chèn đã lấy ở tổ hợp text cũ.
Thì sau khi viết theo cách trên thì hàm vẫn chạy được nhưng mình thấy nó không đúng với chức năng là "thay thế" đã nêu trên.
-----------
Nên mình muốn được giúp 1 cách viết khác hay hơn, ứng dụng được nhiều hàm hơn....Mong mọi người giúp đỡ.

Àh 1 vấn đề nhỏ nữa:

Hai dòng lisp trên là để chọn các đối tượng text sau đó Enter kết thúc lệnh.
Bi giờ mình muốn chỉ chọn 1 text thôi và tự động Enter để mình thực hiện các bước tiếp theo, vậy thì mình phải thêm cái gì vào 2 dòng trên.

Hề hề hề,
Mình xin bổ sung ý của bác ketxu là:
1/- Sau khi bạn chọn text gốc là tg có thể sử dụng (cdr (assoc 1 (entget tg))) để lấy nội dung text gốc
2/- Sau khi chọn được tập hợp các text cần thay thế, có thể sử dụng các vòng lặp while, repeat, foreach .... để lặp cái việc thay thế này cho tất cả các đối tượng có trong tập chọn. Việc thay thế nội dung text đích là td có thể sử dụng hàm subst như bác lp_hai đã nói rồi sau đó mới dùng thằng entmod để hiển thị nó ra màn hình.
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.

#5 mathan

mathan

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 19 June 2012 - 02:02 PM

Các bác PHAMTHANHBINH, LP_HAI và KETXU đã giúp bạn tới từng bước thật tỉ mỉ rồi
Nhưng nếu mới lập trình lisp sẽ còn nhiều khó khăn.
Với mình thường xem và copy code của các lisp rồi trộn nó với nhau để được lisp mình mong muốn
Lisp này mình chỉ cụ thể hóa ý tưởng của các bác đã nêu trên để bạn dễ hình dung hơn

; free lisp from cadviet.com
(defun c:ttext()
(command "undo" "be")
(command "cmdecho" 0)
(if (/= (setq sset (ssget "_I")) nil)
(setq hnd (ssname sset 0))
(setq hnd (car (entsel "\nDS> Chon text ban dau: "))) ;; Ham entsel de chon 1 doi tuong
)
(if (/= hnd nil)
(progn
(if (= "TEXT" (cdr (assoc 0 (entget hnd))))
(progn
(setq gtext (cdr(assoc 1 (entget hnd))))
(prompt "\nChon chu muon chinh.")
(setq ss (ssget '((0 . "text"))))
(setq n (sslength ss))
(setq i 0)
(while (< i n)
(setq e (entget(ssname ss i)))
(setq e (subst (cons 1 gtext) (assoc 1 e) e))
(entmod e) ;; Thay noi dung cua doi tuong
(setq i (1+ i))
);; while
);progn
);;if
);;progn
);;if
(command "undo" "end")
(princ)
);;defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Chúc bạn vui vẻ với niềm vui lập trình lisp
P/s: Các bác đừng ném đá nhé :ph34r:
  • 1
-----------
Hình đã gửi Hãy chia sẻ để thấy có được nhiều hơn điều mình muốn!
Best regard,

#6 avi612

avi612

    biết lệnh move

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

Đã gửi 19 June 2012 - 02:28 PM

Chà, nhanh quá...Mới viết câu hỏi, ngủ 1 giấc dậy thì có liền mấy câu trả lời....Thanks every body.
Tiện đây cho hỏi ai có những ví dụ nho nhỏ để mình thao khảo và tập tành viết theo ko, cho mình vài ý với.
Tại nhiều khi tự mình nghĩ ra ví dụ tự viết thấy ví dụ nó ko hay...mà khả năng ứng dụng không được nhiều.
  • 0

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 June 2012 - 02:53 PM

Ví dụ cho yêu cầu của bạn :

;Neu chi chon Text la cac doi tuong un-nested thi su dung ssget de thao tac 1 lan, doi tuong goc la doi tuong dau cua ssget
(defun c:mat ()
(setq x (cdr (assoc 1 (entget (ssname (ssget '((0 . "*TEXT"))) 0)))))
(vlax-for txt (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
(vla-put-textstring txt x)
)
)

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC