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

[Yêu cầu] Lisp lọc các số sau chữ L, rồi tính tổng.

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

Bạn đã thay đúng. Bạn thay TEXT bởi *TEXT để dùng cho mtext luôn xem sao. Tôi test thì ok. Nếu không được nữa thì post bản vẽ lên thôi.

B400,L30 của e rõ ràng copy từ D400,L30 ra (là text). Thay B vào, nếu không đổi sang *TEXT thì không nhận B400,L30, trong khi nếu là D thì vẫn nhận D400,L30. Lạ thía....

Cám ơn bác, đổi *TEXT xong, nó nhận em B400,L30 của e roài. :D

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ặng mọi người Lisp giải bài toán này.

Lệnh: Csum

- Xuất thống kê (txt hoặc excel).

- Có 2 tùy chọn để nhặt đối tượng (TEXT và MTEXT)

M: chọn 1 text mẫu -> trình tự động nhặt tất cả

C: Chọn trên màn hình

- Xuất txt chọn: T

Xuất Excel chọn: E

 

Good Luck :D.

 

(defun CreateDataList(text / i truoc sau)
 (vl-load-com)
 (setq i (1+ (vl-string-search "," text))
truoc (substr text 1 (1- i))
sau (substr text (1+ i) (- (strlen text) i))
sau (vl-string-subst "" " " sau)
sau (vl-string-subst "" "l" sau)
sau (vl-string-subst "" "L" sau)
 )
 (list truoc sau)
)
;======================================================================================================
(defun GetObject(/ kw)
 (initget "M C")
 (if (= key nil)
(progn
 	(setq kw (getkword (strcat "\nKi\U+1EC3u ch\U+1ECDn [M\U+1EABu/Ch\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng] <C>: ")))
 	(if (= kw nil) (setq kw "C"))
)
(progn
 	(setq kw (getkword (strcat "\nKi\U+1EC3u ch\U+1ECDn [M\U+1EABu/Ch\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng] <" key ">: ")))
 	(if (= kw nil) (setq kw key))
)
 )
 (setq key kw)
 (defun Mselect(/ chk mau ssx)
(setq chk T)
(while chk
 	(setq mau (car (entsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng m\U+1EABu: ")))
 	(if mau (setq chk nil))
)
(setq ssx (ssget "_X" (list
  	(cons -4 "<OR")
  	(cons 0 "TEXT")
  	(cons 0 "MTEXT")
  	(cons -4 "OR>")
  	(cons 8 (cdr (assoc 8 (entget mau))))
  	(cons -4 "<OR")
  	(cons 1 "*#*`,L#*")
  	(cons 1 "*#*`, L#*")
  	(cons -4 "OR>")
)
  	)
)
 )
 (defun Cselect(/ ssx)
(setq ssx (ssget (list
  	(cons -4 "<OR")
  	(cons 0 "TEXT")
  	(cons 0 "MTEXT")
  	(cons -4 "OR>")
  	(cons -4 "<OR")
  	(cons 1 "*#*`,L#*")
  	(cons 1 "*#*`, L#*")
  	(cons -4 "OR>")
)
  	)
)
 )
 (cond
((= kw "C") (setq ssx (Cselect)))
((= kw "M") (setq ssx (Mselect)))
 )
 ssx
)
;======================================================================================================
(defun Summary(/ ssx DataList di AllType Dtype TypeI xi Tsum ExportData)
 (setq ssx (GetObject)
DataList '()
di 0
 )
 (while (< di (sslength ssx))
(setq DataList (append DataList (list (CreateDataList (cdr (assoc 1 (entget (ssname ssx di))))))))
(setq di (1+ di))
 )
 (setq AllType (mapcar 'car Datalist) Dtype '())
 (while AllType
(setq Dtype (append Dtype (list (car AllType))))
(setq AllType (vl-remove (car AllType) AllType))
 )
 (setq ExportData '())
 (while Dtype
(setq TypeI (car Dtype) xi 0 Tsum 0.0)
(while (< xi (length DataList))
 	(if (= (car (nth xi DataList)) TypeI) (setq Tsum (+ Tsum (atof (cadr (nth xi DataList))))))
 	(setq xi (1+ xi))
)
(setq ExportData (append ExportData (list (list TypeI Tsum))))
(setq Dtype (cdr Dtype))
 )
 ExportData
)
;======================================================================================================
(defun 2excel(ExportData / xlapp ex ex-wb nwb sheet cell exi coci Xchen Ychen)
 (VL-LOAD-COM)
 (setq xlapp (vlax-create-object "Excel.Application"))
 (setq ex (vlax-put-property xlapp "Visible" T))
 (setq ex-wb (vlax-get-property xlapp "Workbooks"))
 (setq nwb (vlax-invoke-method ex-wb "add"))
 (setq sheet (vlax-get-property nwb "ActiveSheet"))
 (setq cell (vlax-get-property sheet "Cells"))
 (setq exi 0)
 (vlax-put-property cell "item" (1+ exi) 1 "LOAI")
 (vlax-put-property cell "item" (1+ exi) 2 "TONG DAI")

 (while (< exi (length ExportData))
(setq coci (nth exi ExportData))
(setq Xchen (nth 0 coci))
(setq Ychen (nth 1 coci))
(vlax-put-property cell "item" (+ exi 2) 1 Xchen)
(vlax-put-property cell "item" (+ exi 2) 2 ychen)
(setq exi (1+ exi))
 )
 (princ)
 (princ)
)
;======================================================================================================
(defun 2txt(ExportData / Path txtFile file i coci Xchen Ychen)
 (setq Path (getvar "DWGPREFIX"))
 (setq txtFile (strcat Path "Summary.txt"))
 (setq file (Open txtFile "w"))
 (setq txi 0)
 (write-line (strcat "LOAI" " " "TONG DAI") file)
 (while (< txi (length ExportData))
(setq typi (nth txi ExportData))
(setq Xchen (nth 0 typi))
(setq Ychen (nth 1 typi))
(write-line (strcat Xchen " " (rtos Ychen 2 3)) file)
(setq txi (1+ txi))
 )
 (close file)
 (startapp "Notepad" txtFile)
 (princ)
 (princ)
)
;======================================================================================================
(defun c:Csum(/ kw ExportData)
 (setq ExportData (Summary))
 (initget "E T")
 (if (= keyx nil)
(progn
 	(setq kw (getkword (strcat "\nXu\U+1EA5t [Txt/Excel] <T>: ")))
 	(if (= kw nil) (setq kw "T"))
)
(progn
 	(setq kw (getkword (strcat "\nXu\U+1EA5t [Txt/Excel] <" keyx ">: ")))
 	(if (= kw nil) (setq kw keyx))
)
 )
 (setq keyx kw)
 (cond
((= kw "T") (setq ssx (2txt ExportData)))
((= kw "E") (setq ssx (2excel ExportData)))
 )
 (princ)
 (princ)
)

  • Vote tăng 3

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 vẽ của em được định dạng : D600-L5.0m-0.35%, em muốn tổng hợp chiều dài cống, số sau chữ L đó; Em không biết viết lisp như thế nào, các bác giúp em nhé!

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

Hề hề hề,

Bạn dùng thử cái này coi đã ưng ý chưa nhé.

Cái này được viết theo yêu cầu của người khác nên cách dùng có khác với cách bạn trình bày.

1/- Gõ lệnh tko

2/- Quét chọn toàn bộ vùng chứa các text mà bạn muốn tính.

3/- Nhập giá trị đường kính mà bạn muốn tính

4/- Lisp trả ra kết quả tổng chiều dài các đoạn ống có đường kính đã chọn và nằm trong vùng chọn của bạn.

5/- Nếu muốn lisp có thể thay thế giá trị này vào một text đã có trên bản vẽ của bạn.

 

Hãy dùng thử và nếu có ý kiến gì thì post lên mình sẽ sửa lại.

 

 (defun c:tko ( / sst L DK n els )(command "undo" "be")(setq sst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 8 "chu_thich") (cons 1 "*L#*")))))(setq L 0)(setq DK (getstring "\n Nhap loai ong can tinh tong chieu dai: ")          n (strlen DK))(foreach en sst(setq els (entget en))(cond   	((= (substr (cdr (assoc 1 els)) 1 n)  DK)        (setq L (+ L  (atof (substr (cdr (assoc 1 els)) (+ n 3))))) ) 				(T nil)))(alert (strcat "\n Tong chieu dai ong duong kinh " DK " la: "  (rtos L 2 2) "m"))   (if (= (strcase (getstring "\n Ban muon chon text ghi ket qua <y or n>: ")) "Y") 	(progn 	(setq els (entget (car (entsel "\n Chon text can thay the "))))   		(entmod (subst (cons 1 (rtos L 2 2)) (assoc 1 els) els)) 	))  (command "undo" "e")(princ))

 

Chúc bạn vui...

 

Nhờ các bạn giúp mình sửa như sau:

 

1. Nhập tên lệnh: AAA

2. Chọn vùng tính toán

3. Pick vị trí đặt bảng <đỉnh mép trái>:

4. Ghi chú: Lisp chỉ chọn các *text có định dạng chung là "*** D***, L = *****m

Kết quả sẽ cho ra như sau:

17200_thong_ke_ong_nuoc_1.jpg

http://www.cadviet.c...toan_nuoc_1.dwg

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

 

Nhờ các bạn giúp mình sửa như sau:

 

1. Nhập tên lệnh: AAA

2. Chọn vùng tính toán

3. Pick vị trí đặt bảng <đỉnh mép trái>:

4. Ghi chú: Lisp chỉ chọn các *text có định dạng chung là "*** D***, L = *****m

Kết quả sẽ cho ra như sau:

 

http://www.cadviet.c...toan_nuoc_1.dwg

Hề hề hề,

Không hiểu yêu cầu của bạn... Đừng đánh đố mọi người vì không phải ai cũng làm cái công việc của bạn để có thể hiểu tất cả những gì bạn không nói ra.

  • 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 là từ cái lisp Demigod post lên:

Tặng mọi người Lisp giải bài toán này.

Lệnh: Csum

- Xuất thống kê (txt hoặc excel).

- Có 2 tùy chọn để nhặt đối tượng (TEXT và MTEXT)

M: chọn 1 text mẫu -> trình tự động nhặt tất cả

C: Chọn trên màn hình

- Xuất txt chọn: T

Xuất Excel chọn: E

 

Good Luck :D.

 

(defun CreateDataList(text / i truoc sau)
 (vl-load-com)
 (setq i (1+ (vl-string-search "," text))
truoc (substr text 1 (1- i))
sau (substr text (1+ i) (- (strlen text) i))
sau (vl-string-subst "" " " sau)
sau (vl-string-subst "" "l" sau)
sau (vl-string-subst "" "L" sau)
 )
 (list truoc sau)
)
;======================================================================================================
(defun GetObject(/ kw)
 (initget "M C")
 (if (= key nil)
(progn
 	(setq kw (getkword (strcat "\nKi\U+1EC3u ch\U+1ECDn [M\U+1EABu/Ch\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng] <C>: ")))
 	(if (= kw nil) (setq kw "C"))
)
(progn
 	(setq kw (getkword (strcat "\nKi\U+1EC3u ch\U+1ECDn [M\U+1EABu/Ch\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng] <" key ">: ")))
 	(if (= kw nil) (setq kw key))
)
 )
 (setq key kw)
 (defun Mselect(/ chk mau ssx)
(setq chk T)
(while chk
 	(setq mau (car (entsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng m\U+1EABu: ")))
 	(if mau (setq chk nil))
)
(setq ssx (ssget "_X" (list
  	(cons -4 "<OR")
  	(cons 0 "TEXT")
  	(cons 0 "MTEXT")
  	(cons -4 "OR>")
  	(cons 8 (cdr (assoc 8 (entget mau))))
  	(cons -4 "<OR")
  	(cons 1 "*#*`,L#*")
  	(cons 1 "*#*`, L#*")
  	(cons -4 "OR>")
)
  	)
)
 )
 (defun Cselect(/ ssx)
(setq ssx (ssget (list
  	(cons -4 "<OR")
  	(cons 0 "TEXT")
  	(cons 0 "MTEXT")
  	(cons -4 "OR>")
  	(cons -4 "<OR")
  	(cons 1 "*#*`,L#*")
  	(cons 1 "*#*`, L#*")
  	(cons -4 "OR>")
)
  	)
)
 )
 (cond
((= kw "C") (setq ssx (Cselect)))
((= kw "M") (setq ssx (Mselect)))
 )
 ssx
)
;======================================================================================================
(defun Summary(/ ssx DataList di AllType Dtype TypeI xi Tsum ExportData)
 (setq ssx (GetObject)
DataList '()
di 0
 )
 (while (< di (sslength ssx))
(setq DataList (append DataList (list (CreateDataList (cdr (assoc 1 (entget (ssname ssx di))))))))
(setq di (1+ di))
 )
 (setq AllType (mapcar 'car Datalist) Dtype '())
 (while AllType
(setq Dtype (append Dtype (list (car AllType))))
(setq AllType (vl-remove (car AllType) AllType))
 )
 (setq ExportData '())
 (while Dtype
(setq TypeI (car Dtype) xi 0 Tsum 0.0)
(while (< xi (length DataList))
 	(if (= (car (nth xi DataList)) TypeI) (setq Tsum (+ Tsum (atof (cadr (nth xi DataList))))))
 	(setq xi (1+ xi))
)
(setq ExportData (append ExportData (list (list TypeI Tsum))))
(setq Dtype (cdr Dtype))
 )
 ExportData
)
;======================================================================================================
(defun 2excel(ExportData / xlapp ex ex-wb nwb sheet cell exi coci Xchen Ychen)
 (VL-LOAD-COM)
 (setq xlapp (vlax-create-object "Excel.Application"))
 (setq ex (vlax-put-property xlapp "Visible" T))
 (setq ex-wb (vlax-get-property xlapp "Workbooks"))
 (setq nwb (vlax-invoke-method ex-wb "add"))
 (setq sheet (vlax-get-property nwb "ActiveSheet"))
 (setq cell (vlax-get-property sheet "Cells"))
 (setq exi 0)
 (vlax-put-property cell "item" (1+ exi) 1 "LOAI")
 (vlax-put-property cell "item" (1+ exi) 2 "TONG DAI")

 (while (< exi (length ExportData))
(setq coci (nth exi ExportData))
(setq Xchen (nth 0 coci))
(setq Ychen (nth 1 coci))
(vlax-put-property cell "item" (+ exi 2) 1 Xchen)
(vlax-put-property cell "item" (+ exi 2) 2 ychen)
(setq exi (1+ exi))
 )
 (princ)
 (princ)
)
;======================================================================================================
(defun 2txt(ExportData / Path txtFile file i coci Xchen Ychen)
 (setq Path (getvar "DWGPREFIX"))
 (setq txtFile (strcat Path "Summary.txt"))
 (setq file (Open txtFile "w"))
 (setq txi 0)
 (write-line (strcat "LOAI" " " "TONG DAI") file)
 (while (< txi (length ExportData))
(setq typi (nth txi ExportData))
(setq Xchen (nth 0 typi))
(setq Ychen (nth 1 typi))
(write-line (strcat Xchen " " (rtos Ychen 2 3)) file)
(setq txi (1+ txi))
 )
 (close file)
 (startapp "Notepad" txtFile)
 (princ)
 (princ)
)
;======================================================================================================
(defun c:Csum(/ kw ExportData)
 (setq ExportData (Summary))
 (initget "E T")
 (if (= keyx nil)
(progn
 	(setq kw (getkword (strcat "\nXu\U+1EA5t [Txt/Excel] <T>: ")))
 	(if (= kw nil) (setq kw "T"))
)
(progn
 	(setq kw (getkword (strcat "\nXu\U+1EA5t [Txt/Excel] <" keyx ">: ")))
 	(if (= kw nil) (setq kw keyx))
)
 )
 (setq keyx kw)
 (cond
((= kw "T") (setq ssx (2txt ExportData)))
((= kw "E") (setq ssx (2excel ExportData)))
 )
 (princ)
 (princ)
)

 

Mình cải tiến cái lisp này thành như sau:

1. bỏ các tùy chọn sau:

- Xuất thống kê (txt hoặc excel).

- Có 2 tùy chọn để nhặt đối tượng (TEXT và MTEXT)

M: chọn 1 text mẫu -> trình tự động nhặt tất cả

C: Chọn trên màn hình

- Xuất txt chọn: T

Xuất Excel chọn: E

 

2. Thay thế bằng:

 

1. Nhập tên lệnh: AAA

2. Chọn vùng tính toán

3. Pick vị trí đặt bảng <đỉnh mép trái>: pick điểm đặt

Ghi chú: - Lisp chỉ chọn các *text có định dạng ký tự chung là "*** D***, L = *****m. (các *text có định dạng ký tự khác thì bỏ qua)

- Trên ống đã ghi "BBB D25, L = 2,5m" và có Block tên "Chech D25" (cùng là D25) thì sẽ lấy ký tự trước trên ống, chính là ký tự BBB và lấy tên tên Block "Chech D25" để cho ra text trong bảng là chech BBB D25......

 

5. Lisp sẽ tính toán và thống kê ra bảng như sau:

17200_gui_lai.jpg

File cad như sau:

http://www.cadviet.c...toan_nuoc_1.rar

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

File đính kèm: http://www.cadviet.c...ua_khu_11_1.rar

Bản vẽ của e có các text ghi chú có nội dung: D600,L30 hay D800,L60

Đây là thông số đường kính và chiều dài của cống. Để thống kê chiều dài của 1 loại cống nào đó (D600 chẳng hạn) e phải cộng lần lượt các số như số 30 sau chữ L, nên rất mất thời gian. Hic hic...

Mong các bác viết giúp e lisp: tính tổng các số sau chữ L mỗi khi pick chọn vào từng text như trên, kết quả thể hiện trên dòng command hoặc trên màn hình

Lisp đưa ra lựa chọn:

1.Chọn các text cần tính: Người dùng sẽ pick chọn vào lần lượt các text như trên. (Text được thể hiện là đã chọn rồi, và chỉ tính 1 lần, để không bị nhầm lẫn nếu lỡ pick lại text đó lần nữa)

2.Kết quả cho trên thanh command hoặc màn hình.

3.Kết thúc lệnh

VD: có 3 text: D600,L30 D600,L40 D600,L50

Dùng lisp: kết quả được: 120

Mong tin các bác ah! Thanks nhìu ah!

bach1212 ơi! Cậu cho mình hỏi file cad của cậu làm thế nào để zoom lại để xem toàn bộ bản vẽ nhỉ? tớ thấy khó xem bản vẽ này quá. hihi. Rất mong mọi người giúp đỡ

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  

×