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

[Yêu cầu] Viết lisp xử lý text

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

Mình có một yêu cầu như thế này: Mình có 3 text thuộc 3 layer khác nhau đặt tên là cd1, cd2, cd3. Mình có yêu cầu là dùng một lệnh chon đồng thời 3 text thì nó sẽ cộng text trong layer cd1 và cd2 rồi ghi kết quả vào layer cd3.

Giúp mình với đang rất cầ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

Mình có một yêu cầu như thế này: Mình có 3 text thuộc 3 layer khác nhau đặt tên là cd1, cd2, cd3. Mình có yêu cầu là dùng một lệnh chon đồng thời 3 text thì nó sẽ cộng text trong layer cd1 và cd2 rồi ghi kết quả vào layer cd3.

Giúp mình với đang rất cần.

Hề hề hề,

Bạn hãy gửi file mẫu lên nhé, việc viết lísp không khó nhưng để viết đúng yêu cầu của bạn lại là việc không dễ. Bạn hãy giúp mọi người bằng cách post bản vẽ có đấy đủ các yêu cầu của bạn chứ chỉ nói xuông thế này khó hiểu đúng lắm.....

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 nghĩ bác ấy nói chung chung là vậy, nhưng thực ra là có thể có nhiều layer hoặc ít hơn. Cách giải quyết là cho bác ấy chọn thoải mái nhưng kết quả ghi ra là theo layer thậm chí cở chữ font chữ theo đối tượng đầu tiên được chọn.

  • 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

Em nghĩ bác ấy nói chung chung là vậy, nhưng thực ra là có thể có nhiều layer hoặc ít hơn. Cách giải quyết là cho bác ấy chọn thoải mái nhưng kết quả ghi ra là theo layer thậm chí cở chữ font chữ theo đối tượng đầu tiên được chọn.

 

Mình gởi file lên mấy bạn giúp mình xem thử , mới biết lisp sơ sơ chưa làm được mấy cái này

http://www.mediafire.com/?wh4nx1y0acbynm0

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

Nếu bạn đã biết sơ sơ rồi mình gợi ý bạn làm tổng quát nhé :) Hãy tự tay làm để thấy kết quả

1. Chọn hàng loạt text : bao gồm text ở cả 3 layer bằng ssget ,và lấy ví dụ chỉ ghi kết quả vào 1 tượng thuộc CD3 :

(setq ss (ssget (list (cons 0 "TEXT,MTEXT")(cons 8 "CD1,CD2,CD3"))))

2. Khởi tạo biến tổng bằng 0, biến đếm bằng 0. Biến đếm dùng để duyệt qua tập đối tượng

(setq tong 0 i 0)

3. Duyệt qua tập ss, thấy thằng nào thuộc layer CD1, CD2 thì cộng vào tổng :

(while (setq txtObj (ssname ss i)) ;Khi nào còn (ssname ss i) thì vẫn chạy vòng lặp

(if (wcmatch (cdr (assoc 8 (entget txtObj))) "CD1,CD2") ;nếu thuộc 2 layer CD1,CD2

(setq tong (+ tong (atof (cdr (assoc 1 (entget txtObj)))))) ; thì cộng vào tổng, dùng hàm atof để lọc số

(setq eCD3 txtObj));Nếu không phải thuộc CD1,CD2 thì tức là đối tượng thuộc CD3, lấy ra để xử lý ở bước ghi kết quả

(setq i (1+ i) ;Tăng biến đếm i

);Kết thúc vòng lặp while

4. Ghi text vào eCD3 đã tìm được trong vòng lặp :

Sử dụng entmod + subst hoặc dùng vla-put-textstring. Cái này để bạn tự tìm hiểu, nếu thấy không được thì lại alo :)

  • 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

Nếu bạn đã biết sơ sơ rồi mình gợi ý bạn làm tổng quát nhé :) Hãy tự tay làm để thấy kết quả

1. Chọn hàng loạt text : bao gồm text ở cả 3 layer bằng ssget ,và lấy ví dụ chỉ ghi kết quả vào 1 tượng thuộc CD3 :

 

2. Khởi tạo biến tổng bằng 0, biến đếm bằng 0. Biến đếm dùng để duyệt qua tập đối tượng

 

3. Duyệt qua tập ss, thấy thằng nào thuộc layer CD1, CD2 thì cộng vào tổng :

 

4. Ghi text vào eCD3 đã tìm được trong vòng lặp :

Sử dụng entmod + subst hoặc dùng vla-put-string. Cái này để bạn tự tìm hiểu, nếu thấy không được thì lại alo :)

Thank bạn nhiều, bạn cho mình luôn một file, chứ mình làm lại theo bạn vẫn chưa được, cảm ơn bạn rất 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

À mình xin lỗi, phải có dòng (setq i (1+ i)) ở cuối bước 3 để tăng biến đếm i :)

Và chú ý là layer trong bản vẽ của bạn khác với yêu cầu đầu tiên :)

 

Thôi, mình đành viết ra vậy... Bạn chịu khó nghiên cứu các bước...Mình không giỏi viêt Tut nên toàn sai sót, chữa lại cũng chán -_-

 

(defun c:test ()
(setq ss (ssget (list (cons 0 "TEXT,MTEXT")(cons 8 "CD1,CD2,CD3"))))
(setq tong 0 i 0)
(while (setq txtObj (ssname ss i)) 
(if (wcmatch (strcase (cdr (assoc 8 (entget txtObj)))) "CD1,CD2") 
(setq tong (+ tong (atof (cdr (assoc 1 (entget txtObj)))))) 
(setq eCD3 txtObj))
(setq i (1+ i))
)
(vla-put-textstring (vlax-ename->vla-object eCD3) (rtos tong 2 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

Mình sửa lại thế này mà sao nó chyaj không thoát khỏi vòng lặp được.

 

 

 

(defun c:cht (/ ss tong eCD3 txtOBj)

(vl-load-com)

(princ "\nCHon cac doi tuong text")

(setq ss (ssget (list (cons 0 "TEXT,MTEXT")(cons 8 "CD1,CD2,CD3"))))

(setq tong 0 i 0)

(while (setq txtObj (ssname ss i)) ;Khi nào còn (ssname ss i) thì v?n ch?y vòng l?p

(if (wcmatch (cdr (assoc 8 (entget txtObj))) "CD1,CD2") ;n?u thu?c 2 layer CD1,CD2

(setq tong (+ tong (atof (cdr (assoc 1 (entget txtObj)))))) ; thì c?ng vào t?ng, dùng hàm atof d? l?c s?

(setq eCD3 txtObj));N?u không ph?i thu?c CD1,CD2 thì t?c là d?i tu?ng thu?c CD3, l?y ra d? x? lý ? bu?c ghi k?t qu?

);K?t thúc vòng l?p while

 

(vla-put-textstring txtObj tong)

)

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ạn không đọc bài trên của mình à :| Lúc đầu mình quên viết dòng tăng biến đếm i, nếu như kia thì vòng lặp cứ xét đi xét lại đối tượng đầu (i = 0) thôi :)

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  

×