Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
9 replies to this topic

#1 PHONGVAN1804

PHONGVAN1804

    biết zoom

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

Đã gửi 29 August 2011 - 09:33 AM

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.
  • 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 29 August 2011 - 01:40 PM

Ồ, bạn có chắc là mỗi lần chỉ chọn 3 đối tượng không ?
  • 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


#3 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 29 August 2011 - 04:31 PM

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

#4 lp_hai

lp_hai

    biết lệnh measure

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

Đã gửi 30 August 2011 - 01:10 PM

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

#5 PHONGVAN1804

PHONGVAN1804

    biết zoom

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

Đã gửi 30 August 2011 - 02:34 PM

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

#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 30 August 2011 - 03:01 PM

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 :)
  • 1

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


#7 PHONGVAN1804

PHONGVAN1804

    biết zoom

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

Đã gửi 30 August 2011 - 03:16 PM

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

#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 30 August 2011 - 03:24 PM

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

  • 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


#9 PHONGVAN1804

PHONGVAN1804

    biết zoom

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

Đã gửi 30 August 2011 - 03:36 PM

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

#10 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 30 August 2011 - 07:54 PM

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