Chuyển đến nội dung
Diễn đàn CADViet
Sony2007

[Đã xong] Tính tổng diện tích các hình trên bản vẽ, "Ed" vào text sẵn có

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

Em đang làm công việc là kiểm tra khối lượng thông qua việc kiểm tra diện tích các mặt cắt. Nội dung như sau:

Tính tổng diện tích các hình có trong bản vẽ thông qua việc chọn các hình. Sau đó ghi giá trị tổng diện tích này qua việc thay giá trị của 1 text sẵn có trên bản vẽ do người dùng chọn.

Vì công việc này em dùng lặp đi lặp lại nhiều lần, nên không thể cứ mỗi lần lại “area” “add” “object” rồi chọn các đối tượng sau đó lại “edit” các text được. Làm như vậy mất một số thao tác hơi lâu. Có bác nào giúp em vớ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
Em đang làm công việc là kiểm tra khối lượng thông qua việc kiểm tra diện tích các mặt cắt. Nội dung như sau:

Tính tổng diện tích các hình có trong bản vẽ thông qua việc chọn các hình. Sau đó ghi giá trị tổng diện tích này qua việc thay giá trị của 1 text sẵn có trên bản vẽ do người dùng chọn.

Vì công việc này em dùng lặp đi lặp lại nhiều lần, nên không thể cứ mỗi lần lại “area” “add” “object” rồi chọn các đối tượng sau đó lại “edit” các text được. Làm như vậy mất một số thao tác hơi lâu. Có bác nào giúp em với

Thử dùng lisp này nhé!

http://myfreefilehosting.com/f/dbeb446373_0.1MB

Lệnh lấy diện tích 1 vùng là dtt với 2 lựa chọn pick và selec, sau đó pick 1 điểm đẻ chèn kq hoặc enter để chọn 1 text có sẵn.

Cộng 2 kq bằng lệnh add

trừ bằng lệnh sub

tính diện tích sàn dts

Chú ý text style hiện hành phải có heigh=0 trong mặc định!

  • 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 đang làm công việc là kiểm tra khối lượng thông qua việc kiểm tra diện tích các mặt cắt. Nội dung như sau:

Tính tổng diện tích các hình có trong bản vẽ thông qua việc chọn các hình. Sau đó ghi giá trị tổng diện tích này qua việc thay giá trị của 1 text sẵn có trên bản vẽ do người dùng chọn.

Vì công việc này em dùng lặp đi lặp lại nhiều lần, nên không thể cứ mỗi lần lại “area” “add” “object” rồi chọn các đối tượng sau đó lại “edit” các text được. Làm như vậy mất một số thao tác hơi lâu. Có bác nào giúp em với

 

Lệnh UDT (Update diện tích) dưới đây sẽ làm điều bạn muốn:

(defun c:udt(/ ss tong ham tmp tt)
 (setq
   ss (ssget '((-4 . "")))	
   tong 0.0
   ham (lambda (x) (command ".area" "o" x) (setq tong (+ tong (getvar "area"))))
   tmp (mapcar 'ham (ss2ent ss))  
   tt (entget (car (entsel "\nChon text ket qua: ")))
   tong (vl-string-right-trim "." (vl-string-right-trim "0" (rtos tong)))
 )
 (entmod (subst (cons 1 tong) (assoc 1 tt) tt))
)

(defun ss2ent(ss / sodt index lstent)
 (setq 
   sodt (if ss (sslength ss) 0)	 
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)
(princ "\nUpdate Area - free lisp from cadviet.com")
(princ "\nUse UDT command to start!")
(vl-load-com)

  • Vote tăng 6

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

Hoanh ơi,hình như lisp của anh yêu cầu dối tượng là 1 polyline,có cách nào để tính diện tích 1 hình mà gồm các line,spline,arc nối lại ko,nhờ Hoanh chỉ júp,cảm ơn nhì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
Hoanh ơi,hình như lisp của anh yêu cầu dối tượng là 1 polyline,có cách nào để tính diện tích 1 hình mà gồm các line,spline,arc nối lại ko,nhờ Hoanh chỉ júp,cảm ơn nhìu

Bạn muốn tính diện tích của hình phức tạp như vậy, Đầu tiên hãy sử dụng lệnh boundary để tạo đối tượng REGION là miền tạo bởi giới hạn các đối tượng đó. Tiếp đến mới sử dụng lisp 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
Lệnh UDT (Update diện tích) dưới đây sẽ làm điều bạn muốn:

(defun c:udt(/ ss tong ham tmp tt)
 (setq
   ss (ssget '((-4 . "<OR")(0 . "LWPOLYLINE")(0 . "REGION")(0 . "CIRCLE")(0 . "ARC")(-4 . "OR>")))	
   tong 0.0
   ham (lambda (x) (command ".area" "o" x) (setq tong (+ tong (getvar "area"))))
   tmp (mapcar 'ham (ss2ent ss))  
   tt (entget (car (entsel "\nChon text ket qua: ")))
   tong (vl-string-right-trim "." (vl-string-right-trim "0" (rtos tong)))
 )
 (entmod (subst (cons 1 tong) (assoc 1 tt) tt))
)

(defun ss2ent(ss / sodt index lstent)
 (setq 
   sodt (if ss (sslength ss) 0)	 
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)
(princ "\nUpdate Area - free lisp from cadviet.com")
(princ "\nUse UDT command to start!")
(vl-load-com)

 

Cám ơn bác Hoanh nhé, yêu cầu của em đã được đáp ứng. Diễn đàn Cadviet rất có ích cho những cư dân dùng AutoCad. Năm mới, em chúc bác mạnh khỏe, thành đạt và hạnh phúc trong cuộc số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
Lệnh UDT (Update diện tích) dưới đây sẽ làm điều bạn muốn:

(defun c:udt(/ ss tong ham tmp tt)
 (setq
   ss (ssget '((-4 . "")))	
   tong 0.0
   ham (lambda (x) (command ".area" "o" x) (setq tong (+ tong (getvar "area"))))
   tmp (mapcar 'ham (ss2ent ss))  
   tt (entget (car (entsel "\nChon text ket qua: ")))
   tong (vl-string-right-trim "." (vl-string-right-trim "0" (rtos tong)))
 )
 (entmod (subst (cons 1 tong) (assoc 1 tt) tt))
)

(defun ss2ent(ss / sodt index lstent)
 (setq 
   sodt (if ss (sslength ss) 0)	 
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)
(princ "\nUpdate Area - free lisp from cadviet.com")
(princ "\nUse UDT command to start!")
(vl-load-com)

 

Anh cho em hỏi nếu tỉ lệ bản vẽ không phải là 1/1 thì sửa thế nào để giá trị diện tích đo được gán vào text được đúng ( VD: bản vẽ dùng đơn vị là mm nhưng cần thể hiện kết quả diện tích là m2 chứ không phải mm2 ?Phải chỉnh lại lisp này chổ nào ? Em không biết nhiều về lisp. :cheers:

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
Anh cho em hỏi nếu tỉ lệ bản vẽ không phải là 1/1 thì sửa thế nào để giá trị diện tích đo được gán vào text được đúng ( VD: bản vẽ dùng đơn vị là mm nhưng cần thể hiện kết quả diện tích là m2 chứ không phải mm2 ? Em không biết nhiều về lisp. :cheers:

1m2 = 1000000 mm2

Tỷ lệ bản vẽ là 1/a thì kết quả diện tích sẽ phải nhân lên a^2 bạ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
1m2 = 1000000 mm2

Tỷ lệ bản vẽ là 1/a thì kết quả diện tích sẽ phải nhân lên a^2 bạn ạ.

 

Dạ ý em hỏi là phải sửa lisp này thế nào để kết quả nhận được ( gán vào text) đúng đơn vị mình mong muốn. VD: bản vẽ của em đang dùng đơn vị mm--> kết quả diện tích tính được gán vào text là mm2--> phải chia cho 10^6 thì mới được kết quả là m2.

Có nghĩa là sau khi gán kết quả vào text thì em phải edit text lần nữa mới được kết quả mong muốn. :cheers:

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
Dạ ý em hỏi là phải sửa lisp này thế nào để kết quả nhận được ( gán vào text) đúng đơn vị mình mong muốn. VD: bản vẽ của em đang dùng đơn vị mm--> kết quả diện tích tính được gán vào text là mm2--> phải chia cho 10^6 thì mới được kết quả là m2.

Có nghĩa là sau khi gán kết quả vào text thì em phải edit text lần nữa mới được kết quả mong muốn. :cheers:

Kích thước của chương trình đang sử dụng là mm

Bạn muốn đổi sang mét thì nhập vào hệ số chuyển đổi đơn vị là 1/1000 (hoặc 0,001) nhé.

Code sửa lại đây :

 

(defun c:udt(/ ss tong ham tmp tt hstl oldim)

(prompt "\n Kich thuoc cua chuong trinh tinh theo don vi mm ")

(setq hstl (getreal "\n Nhap ti le chuyen doi don vi :"))

(setq tp (getint "\n so chu so thap phan : "))

(setq oldim (getvar "Dimzin"))

(setvar "Dimzin" 0)

(setq

ss (ssget '((-4 . "")))

tong 0.0

ham (lambda (x) (command ".area" "o" x) (setq tong (+ tong (getvar "area"))))

tmp (mapcar 'ham (ss2ent ss))

tt (entget (car (entsel "\nChon text ket qua: ")))

tong (vl-string-right-trim "." (vl-string-right-trim "0" (rtos tong)))

)

(entmod (subst (cons 1 (rtos (* (atof tong) hstl hstl) 2 2)) (assoc 1 tt) tt))

(setvar "Dimzin" oldim)

(princ)

)

 

(defun ss2ent(ss / sodt index lstent)

(setq

sodt (if ss (sslength ss) 0)

index 0

)

(repeat sodt

(setq ent (ssname ss index)

index (1+ index)

lstent (cons ent lstent)

)

)

(reverse lstent)

)

(princ "\nUpdate Area - free lisp from cadviet.com")

(princ "\nUse UDT command to start!")

(vl-load-com)

  • Vote tăng 5

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
Kích thước của chương trình đang sử dụng là mm

Bạn muốn đổi sang mét thì nhập vào hệ số chuyển đổi đơn vị là 1/1000 (hoặc 0,001) nhé.

Code sửa lại đây :

 

(defun c:udt(/ ss tong ham tmp tt hstl oldim)

(prompt "\n Kich thuoc cua chuong trinh tinh theo don vi mm ")

(setq hstl (getreal "\n Nhap ti le chuyen doi don vi :"))

(setq tp (getint "\n so chu so thap phan : "))

(setq oldim (getvar "Dimzin"))

(setvar "Dimzin" 0)

(setq

ss (ssget '((-4 . "")))

tong 0.0

ham (lambda (x) (command ".area" "o" x) (setq tong (+ tong (getvar "area"))))

tmp (mapcar 'ham (ss2ent ss))

tt (entget (car (entsel "\nChon text ket qua: ")))

tong (vl-string-right-trim "." (vl-string-right-trim "0" (rtos tong)))

)

(entmod (subst (cons 1 (rtos (* (atof tong) hstl hstl) 2 2)) (assoc 1 tt) tt))

(setvar "Dimzin" oldim)

(princ)

)

 

(defun ss2ent(ss / sodt index lstent)

(setq

sodt (if ss (sslength ss) 0)

index 0

)

(repeat sodt

(setq ent (ssname ss index)

index (1+ index)

lstent (cons ent lstent)

)

)

(reverse lstent)

)

(princ "\nUpdate Area - free lisp from cadviet.com")

(princ "\nUse UDT command to start!")

(vl-load-com)

 

Hic hic..anh ơi ! Sau khi chuyển đơn vị, chọn số chử số thập phân xong, chương trình bảo chọn text để gán kết quả, bỏ qua bước chọn đối tượng để tính diện tích. Thế nên kết quả gán vào text là 0.00 hoài <_< :cheers: :cheers: :cheers: :cheers:

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 hic..anh ơi ! Sau khi chuyển đơn vị, chọn số chử số thập phân xong, chương trình bảo chọn text để gán kết quả, bỏ qua bước chọn đối tượng để tính diện tích. Thế nên kết quả gán vào text là 0.00 hoài <_ :cheers:>

Không hiểu sao chép code lên lại bị lỗi. Vào cả codebox cũng bị lỗi. Nhờ Bác Hoành xem lại chổ này với

Thế này nhé bạn nhấn nút Reply bài viết số 10 của Tue_NV -> Chép hết code của Tue_NV về chạy là được

  • 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 nhấn nút Reply bài viết số 10 của Tue_NV -> Chép hết code của Tue_NV về chạy là được

Bạn Tue_NV cho hỏi : làm thế nào bạn biết đuợc cách nhấn nút Reply sẽ cho kết quả (đoạn code) đúng?

Tài thật ! :cheers:

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
Không hiểu sao chép code lên lại bị lỗi. Vào cả codebox cũng bị lỗi. Nhờ Bác Hoành xem lại chổ này với

Thế này nhé bạn nhấn nút Reply bài viết số 10 của Tue_NV -> Chép hết code của Tue_NV về chạy là được

 

Cảm ơn anh Tue_NV rất nhiều, cảm ơn bác Hoành nữa ! Em làm được rồi. Kì này em phải cố học thêm lisp mới được. Có gì mong các anh trên diễn đàn chỉ bảo thêm. :cheers: :cheers:

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

Gửi anh Tue_NV: Anh có thể cải tiến lisp trên có tác dụng kích điểm chọn vùng tính diện tích như lệnh tính diện tích của autocad và bổ sung thêm giá trị tỉ lệ và số lẻ mặc định của lần nhập trước đó được không? Vì mỗi lần làm lại lện udt thì lại pjhair nhập lại 0.001 rất mất thời gian. Cảm ơn anh đã quan tâ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
Gửi anh Tue_NV: Anh có thể cải tiến lisp trên có tác dụng kích điểm chọn vùng tính diện tích như lệnh tính diện tích của autocad và bổ sung thêm giá trị tỉ lệ và số lẻ mặc định của lần nhập trước đó được không? Vì mỗi lần làm lại lện udt thì lại pjhair nhập lại 0.001 rất mất thời gian. Cảm ơn anh đã quan tâm.

Lisp này Tue_NV đã hoàn thành lại theo ý bạn PhuongAnh.

Có 2 lựa chọn cho bạn tính diện tích

1. Tính diện tích theo cách chọn đối tượng

2. Tính diện tích theo cách Pick điểm vào miền kín

Các bạn test lại xem nhé :

 

Command: udt : gõ lệnh udt

Kich thuoc cua chuong trinh tinh theo don vi mm

Nhap ti le chuyen doi don vi :1/1000

 

Nhap So chu so thap phan :2

 

Chon doi tuong de tinh dien tich hay Enter de tinh dien tich theo Pick diem

Select objects: -> Nếu ở dòng này bạn chọn đối tượng -> sẽ Tính diện tích theo cách chọn đối tượng

-> Nếu ở dòng này bạn nhấn Enter -> sẽ Tính diện tích theo cách Pick điểm vào miền kín

 

Code đây : http://www.cadviet.com/upfiles/2/udt.lsp

 

Bạn Tue_NV cho hỏi : làm thế nào bạn biết đuợc cách nhấn nút Reply sẽ cho kết quả (đoạn code) đúng?

Tài thật ! :cheers:

Chào anh gia_bach.

Em phát hiện điều này là do suy luận và nhìn code thấy có sự sai khác so với code gốc. Khi ta viết bài viết thì chắc chắn là các kí tự trong Code phải đúng. Nhưng khi ta gửi bài đi thì một số kí tự bị mã hoá như dấu

Do đó Code không đúng nữa

 

Cảm ơn anh Tue_NV rất nhiều, cảm ơn bác Hoành nữa ! Em làm được rồi. Kì này em phải cố học thêm lisp mới được. Có gì mong các anh trên diễn đàn chỉ bảo thêm. :cheers: :cheers:

@ lquocthinh : Bạn cứ yên tâm. Anh em trên diễn đàn sẽ hỗ trợ nhiệt tình cho bạn.

  • Vote tăng 5

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
cho em hỏi!em muốn khi pick nó tạo thành POLYLINE luôn dc ko vậy anh TUE?

Có những trường hợp mà các Line cắt nhau và chúng tạo thành miền kín. Mình chỉ có thể giữ lại Polyline tạo thành miền đó mà thôi.

 

Nếu bạn muốn giữ lại Polyline tạo bởi miền kín thì hãy bỏ dòng này trong code

(command "erase" ss "")

 

hoặc bạn thêm 1 dấu chấm phẩy trước dòng đó -> thành :

;(command "erase" ss "")

  • 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 có cái lisp tính diện tích này,mấy bạn dùng thử nha,có rất nhiều lênh,tính diện tích thì đánh dt0( bấm vào vùng kín) dt(bấm vào polyline kín). nếu thấy hay,cảm ơn nhó cảm ơn mình nha,http://www.cadviet.com/upfiles/2/pro.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
mình có cái lisp tính diện tích này,mấy bạn dùng thử nha,có rất nhiều lênh,tính diện tích thì đánh dt0( bấm vào vùng kín) dt(bấm vào polyline kín). nếu thấy hay,cảm ơn nhó cảm ơn mình nha,http://www.cadviet.com/upfiles/2/pro.rar

vùng kín là vùng nào hả bạ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

nếu thấy hay và muốn dùng lisp thì liên lạc với mình mình sẽ cung cấp tên lênh cho,nếu không hay cũng cho y kiến nha.nick mình nè(thonghoang_bmt@yahoo.com.vn)

  • 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 có cái lisp tính diện tích này,mấy bạn dùng thử nha,có rất nhiều lênh,tính diện tích thì đánh dt0( bấm vào vùng kín) dt(bấm vào polyline kín). nếu thấy hay,cảm ơn nhó cảm ơn mình nha,http://www.cadviet.com/upfiles/2/pro.rar

bạn cho file đuôi FAS làm sao mà sửa?lệnh DT trùng với lệnh DText 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

tại bạn đã đổi lênh dtext lệnh tắt của nó là dt thì giò bạn đổi lênh dtext là dt1 chẳng hạn,để sử dựng thử lệnh của mình đấy mà,còn không thì bạn dùng lệnh dt0 đi,có lẽ không trù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

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

×