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

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

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

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.

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

  • 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

em xin bổ sung: có thể dùng hàm Subtr để thay thế nội dung text, sau đó entmod ?

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

  • 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

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:

  • 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

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.

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

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

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  

×