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

Đo kích thước nhiều line

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

Xin chào các pro, do đặc thù công việc của em là bóc tách khối lượng van, đường ống ... từ bản vẽ. Khi tính khối lượng ống thì hơi phê vì nó có nhiều nhánh, ngồi đo từng đoạn rồi cộng lại mất rất nhiều thời gian

Như những file vẽ hệ thống sprinkler có hàng ngàn đoạn 2-3m (không giống nhau).

Xin hỏi có cách nào clock các line lại rồi dùng 1 lệnh để đo kích thước tổng của nó được không?

Giống ta vẽ chử M chẳng hạn thì có 4 line, tổng chiều dài 4 line đó bằng 1 hoặc 2 lệnh?

  • 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

1 lệnh cũng được, nhiều lệnh cũng được, trên diễn đàn có lisp để bạn là việc này rồi mà.Bạn chịu khó search nhé.Trường hợp của bạn có thể dùng lệnh nối các line liền nhau lại thành 1 Pline, khi đó khối lượng công việc giảm đi nhiều

Còn đây là 1 lisp tính tổng chiều dài các đoạn được chọn.

;; free lisp from cadviet.com @Bommak
(defun add_mline ()
 (foreach e_record_sub	e_record
   (cond ((= 10 (car e_record_sub))
   (setq pt1	   (cdr e_record_sub)
	 mline_len 0.0
   )
  )
  ((= 11 (car e_record_sub))
   (setq pt2	   (cdr e_record_sub)
	 mline_len (+ mline_len (distance pt2 pt1))
	 pt1	   pt2
   )
  )
   )
 )
 (setq tot_len (+ tot_len mline_len))
 (ssdel e_name ss)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



(defun WriteRes(kq / OK e data)
(setq OK nil)
(while (not OK)
(setq e (car (entsel "\tChon text ghi ket qua:")))
(if (CheckObj e "TEXT") (setq OK T) (princ "\nDoi tuong chon khong phai text"))
)
(entmod (subst (cons 1 (rtos kq 2 2)) (assoc 1 (setq data (entget e))) data))
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun C:tg2a (/ tot_len ss e_name e_record e_type)
 (setq tot_len 0.0)
 (setq ss (ssget))
 (if (null ss)
   (exit)
 )
 (while (> (sslength ss) 0)
   (setq e_name (ssname ss 0))
   (setq e_record (entget e_name))
   (setq e_type (cdr (assoc '0 e_record)))
   (cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")
   (command "lengthen" e_name "")
   (setq tot_len (+ tot_len (getvar "PERIMETER")))
   (ssdel e_name ss)
  )
  ((wcmatch e_type "MLINE") (add_mline))
  (e_type (ssdel e_name ss))
   )
 )
;De dong nay neu muon cong them gia tri vao kq
;(setq tot_len (+ tot_len (getreal "\nGia tri cong them : ")))
 (writeres tot_len)
)

  • 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

mình hơi gà vụ lisp này lắm, load nó vào cad rồi dùng lệnh gì để kích hoạt vậy bạn

tới đoạn "chon tẽt ghi ket quả" thì po tay không biết làm tiếp thế nào

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ùm bùm em xin đưa ra 1 lsp có trên diễn đàn để tính chiều dài các thể loại

(defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
;;;--------------------------------------------------------------------
(defun C:TL( / ss L e)
(setq
ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(alert (strcat "Total length = " (rtos L)))
)

Tên lệnh TL

  • Vote tăng 4

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ùm bùm em xin đưa ra 1 lsp có trên diễn đàn để tính chiều dài các thể loại
(defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
;;;--------------------------------------------------------------------
(defun C:TL( / ss L e)
(setq
ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(alert (strcat "Total length = " (rtos L)))
)

Tên lệnh TL

Cái này nhanh gọn. Thanks

  • Vote giảm 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 hơi gà vụ lisp này lắm, load nó vào cad rồi dùng lệnh gì để kích hoạt vậy bạn

tới đoạn "chon tẽt ghi ket quả" thì po tay không biết làm tiếp thế nào

Lisp đầu tiền mình post lệnh là tg2a, bạn có thể điều chỉnh nó thành lệnh theo ý bạn (lệnh của lisp hiển thị trên tên file lúc bạn download về đấy).Lisp tg2a có thể tính chiều dài tất cả đối tượng có thuộc tính Length và Mline (do bác Hoành viết hàm tính Mline, bạn Bommak phát triển)

Trong quá trình thực hiện,đến phần chọn text ghi kết quả thì bạn chọn vào 1 text bất kỳ để nó ghi tổng kết quả đo được ra đó.Mình cũng thấy ngạc nhiên vì không hiểu với câu "chọn text ghi kết quả" thì bạn thấy khó hiểu ở chỗ nào ^^>. Mình cũng hok hiểu bạn chưa rõ lệnh để chạy mà mần răng có thể ra được dòng thông báo đó :)

Lisp dưới bác 18011985 post là do anh ssg viết, cũng có tác dụng tương tự nhưng báo kquả trên hộp thoại alert, và không tính được với Mline

 

P/S : Để sử dụng lisp và thay đổi lệnh, bạn nên đọc phần Hướng dẫn sử dụng lisp (trong mục Autolisp), đừng dùng cái gì mà bạn không hiểu chút nào về 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 cũng thao tác giống bác thenhan va cũng tới câu hỏi " chon text" thi cũng chẳng thể nào làm được cả, mà em cũng làm theo bác ketxu là chọn một text để nó ghi kích thước vào nhưng cũng không được, bác ketxu chỉ bảo chi tiết giùm, thank bác nhiều!!!!!!!!!!

  • Vote giảm 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ẳng thể nào làm được cả" tức là sao ?? Bạn nhớ là TEXT chứ khôn gphải MTEXT nhé

  • 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ẳng thể nào làm được cả" tức là sao ?? Bạn nhớ là TEXT chứ khôn gphải MTEXT nhé

Hic.Cái này mình đã chế lisp trên diễn đàn rồi mà.Mấy lisp ở trên còn có mấy hạn chế.Lisp mình đưa đây có thể đo được ở bản vẽ tỉ lệ bất kì và ghi kết quả ra text luôn này.

;-----------------------tinh chieu dai duong thang theo ti le hien hanh ( tt )----------------------------

(defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))

;;;--------------------------------------------------------------------

(defun C:TT( / ss L e)

(setq

ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))

L 0.0

k (getvar "dimlfac")

)

(vl-load-com)

(while (setq e (ssname ss 0))

(setq L (+ L (length1 e)))

(ssdel e ss)

)

(setq L1 (* k L))

(progn

(setq p (getpoint "\n Chon diem nhap ket qua" ))

(command "text" p 2.5 "0" (rtos L1 2 2))

)

)

(ssdel e ss)

)

(princ)

)

 

Nhớ đưa tỉ lệ hiện hành về cùng tỉ lệ bản vẽ nhé.Có thể tính cho 1 đường hay tổng nhiều đường.

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

Xin chào các pro, do đặc thù công việc của em là bóc tách khối lượng van, đường ống ... từ bản vẽ. Khi tính khối lượng ống thì hơi phê vì nó có nhiều nhánh, ngồi đo từng đoạn rồi cộng lại mất rất nhiều thời gian

Như những file vẽ hệ thống sprinkler có hàng ngàn đoạn 2-3m (không giống nhau).

Xin hỏi có cách nào clock các line lại rồi dùng 1 lệnh để đo kích thước tổng của nó được không?

Giống ta vẽ chử M chẳng hạn thì có 4 line, tổng chiều dài 4 line đó bằng 1 hoặc 2 lệnh?

Bạn làm cứu hỏa à, bạn sử dụng lisp này: http://www.cadviet.com/cadtips/5054_Tinh_tong_chieu_dai_theo_tung_layer33/91/

Bạn đưa tất cả các line cần đo kích thước về cùng layer (trên thực tế, nếu người vẽ cẩn thận, các đoạn ống khác nhau sẽ đưa về từng layer khác nhau). Rồi sử dụng lệnh này, có thể xuất sang bảng excel.

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

Hic.Cái này mình đã chế lisp trên diễn đàn rồi mà.Mấy lisp ở trên còn có mấy hạn chế.Lisp mình đưa đây có thể đo được ở bản vẽ tỉ lệ bất kì và ghi kết quả ra text luôn này.

;-----------------------tinh chieu dai duong thang theo ti le hien hanh ( tt )----------------------------

(defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))

;;;--------------------------------------------------------------------

(defun C:TT( / ss L e)

(setq

ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))

L 0.0

k (getvar "dimlfac")

)

(vl-load-com)

(while (setq e (ssname ss 0))

(setq L (+ L (length1 e)))

(ssdel e ss)

)

(setq L1 (* k L))

(progn

(setq p (getpoint "\n Chon diem nhap ket qua" ))

(command "text" p 2.5 "0" (rtos L1 2 2))

)

)

(ssdel e ss)

)

(princ)

)

 

Nhớ đưa tỉ lệ hiện hành về cùng tỉ lệ bản vẽ nhé.Có thể tính cho 1 đường hay tổng nhiều đường.

cho mình hỏi nếu đường ống có bán kính và độ dày khác nhau và có nhiều đoạn giống nhau nằm ở vị trí khác nhau thì thêm code gì ah? xin các anh chỉ 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

Bùm bùm em xin đưa ra 1 lsp có trên diễn đàn để tính chiều dài các thể loại

(defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)))
;;;--------------------------------------------------------------------
(defun C:TL( / ss L e)
(setq
ss (ssget (list (cons 0 "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))
L 0.0
)
(vl-load-com)
(while (setq e (ssname ss 0))
(setq L (+ L (length1 e)))
(ssdel e ss)
)
(alert (strcat "Total length = " (rtos L)))
)

Tên lệnh TL

ngon quá. Thanks bạn rùi nhé ^^. cố gắng phát huy nha.

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

 

1 lệnh cũng được, nhiều lệnh cũng được, trên diễn đàn có lisp để bạn là việc này rồi mà.Bạn chịu khó search nhé.Trường hợp của bạn có thể dùng lệnh nối các line liền nhau lại thành 1 Pline, khi đó khối lượng công việc giảm đi nhiều

Còn đây là 1 lisp tính tổng chiều dài các đoạn được chọn.

;; free lisp from cadviet.com @Bommak(defun add_mline ()  (foreach e_record_sub	e_record    (cond ((= 10 (car e_record_sub))	   (setq pt1	   (cdr e_record_sub)		 mline_len 0.0	   )	  )	  ((= 11 (car e_record_sub))	   (setq pt2	   (cdr e_record_sub)		 mline_len (+ mline_len (distance pt2 pt1))		 pt1	   pt2	   )	  )    )  )  (setq tot_len (+ tot_len mline_len))  (ssdel e_name ss));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(defun WriteRes(kq / OK e data)(setq OK nil)(while (not OK)(setq e (car (entsel "\tChon text ghi ket qua:")))(if (CheckObj e "TEXT") (setq OK T) (princ "\nDoi tuong chon khong phai text")))(entmod (subst (cons 1 (rtos kq 2 2)) (assoc 1 (setq data (entget e))) data))(princ));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(defun C:tg2a (/ tot_len ss e_name e_record e_type)  (setq tot_len 0.0)  (setq ss (ssget))  (if (null ss)    (exit)  )  (while (> (sslength ss) 0)    (setq e_name (ssname ss 0))    (setq e_record (entget e_name))    (setq e_type (cdr (assoc '0 e_record)))    (cond ((wcmatch e_type "LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")	   (command "lengthen" e_name "")	   (setq tot_len (+ tot_len (getvar "PERIMETER")))	   (ssdel e_name ss)	  )	  ((wcmatch e_type "MLINE") (add_mline))	  (e_type (ssdel e_name ss))    )  );De dong nay neu muon cong them gia tri vao kq	;(setq tot_len (+ tot_len (getreal "\nGia tri cong them : ")))  (writeres tot_len))

Mình có dùng cái lipsp này của bạn nhưng cũng đến bước chọn text ghi kết quả là nó cũng bị lỗi. Bạn kia nói không rõ lắm thôi, sau đây là lỗi trên dòng command "ketxu" à:

Command: TG2A

Select objects: 1 found

Select objects: 1 found, 2 total

Select objects:

Current length: 4.91263

Current length: 0.47663   Chon text ghi ket qua:; error: no function

definition: CHECKOBJ

Command:

Nó có tính được chiều dài các đối tượng rồi nhưng đến ghi ra text thì bị lỗi

Bạn xem lại xem có gì sai sót ko vì khi mình dùng lisp TL để tính chiều dài thì ngon lành nhưng nó chỉ tính được có 1 đối tượng mà thôi

Mình search nên giờ mới thấy topic này

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ó dùng cái lipsp này của bạn nhưng cũng đến bước chọn text ghi kết quả là nó cũng bị lỗi. Bạn kia nói không rõ lắm thôi, sau đây là lỗi trên dòng command "ketxu" à:

Command: TG2A

Select objects: 1 found

Select objects: 1 found, 2 total

Select objects:

Current length: 4.91263

Current length: 0.47663   Chon text ghi ket qua:; error: no function

definition: CHECKOBJ

Command:

Nó có tính được chiều dài các đối tượng rồi nhưng đến ghi ra text thì bị lỗi

Bạn xem lại xem có gì sai sót ko vì khi mình dùng lisp TL để tính chiều dài thì ngon lành nhưng nó chỉ tính được có 1 đối tượng mà thôi

Mình search nên giờ mới thấy topic này

Hề hề hề,

Có thể do bạn chép thiếu code nên không có cái hàm con (chekobj ....). Vậy nên lisp nó đứng lại. Bạn có thể xin lại bác ket cái hàm này hoặc tự viết bổ sung là Ok mà.

  • 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

Hề hề hề,

Có thể do bạn chép thiếu code nên không có cái hàm con (chekobj ....). Vậy nên lisp nó đứng lại. Bạn có thể xin lại bác ket cái hàm này hoặc tự viết bổ sung là Ok mà.

chào anh "hề hề hề"

chắc là bị lỗi gì đó, thật sự là mình chỉ biết down lisp về dùng thôi còn cái hàm con thì mình chịu

thấy lisp nói riêng và CV nói chung rất hay nhưng khả năng mình chịu hổng có làm đc chỉ chịu khó tìm và dùng các tiện ích, các cái hay trên này thôi

giờ phải chờ bác ketxu dọc cái này và xem hộ 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

chào anh "hề hề hề"

chắc là bị lỗi gì đó, thật sự là mình chỉ biết down lisp về dùng thôi còn cái hàm con thì mình chịu

thấy lisp nói riêng và CV nói chung rất hay nhưng khả năng mình chịu hổng có làm đc chỉ chịu khó tìm và dùng các tiện ích, các cái hay trên này thôi

giờ phải chờ bác ketxu dọc cái này và xem hộ thôi

Hề hề hề,

Trong lúc chờ bác ket giải quyết việc riêng, bạn thử chép đoạn code dưới đây về rồi nhét vào dưới cùng của lisp đó. Load lại và chạy thử coi sao nhé.

http://www.cadviet.com/upfiles/3/5194_thuchoi.lsp

(defun checkobj (e / )
     (setq typ (cdr (assoc 10 (entget e))))
     typ
)
  • 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

 

Hề hề hề,

Trong lúc chờ bác ket giải quyết việc riêng, bạn thử chép đoạn code dưới đây về rồi nhét vào dưới cùng của lisp đó. Load lại và chạy thử coi sao nhé.

http://www.cadviet.com/upfiles/3/5194_thuchoi.lsp

(defun checkobj (e / )
     (setq typ (cdr (assoc 10 (entget e))))
     typ
)

hình như nó vẫn bị lỗi bác à, vẫn ở bước ghi kết quả ra text:

Command: tg2a

Select objects: 1 found

Select objects: 1 found, 2 total

Select objects:  lengthen

Select an object or [DElta/Percent/Total/DYnamic]:

Current length: 1.94325

Select an object or [DElta/Percent/Total/DYnamic]:

Command: lengthen

Select an object or [DElta/Percent/Total/DYnamic]:

Current length: 0.28855

Select an object or [DElta/Percent/Total/DYnamic]:

Command:    Chon text ghi ket qua:; error: too many arguments

mình gửi kèm cả lisp luôn đây

http://www.cadviet.com/upfiles/3/50811_tg2a.lsp

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  

×