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

lisp tính diện tích 1 hình vẽ kín mà mình chỉ cần pick

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

bác nào viết giúp em cái lisp tính diện tích 1 hình vẽ kín mà mình chỉ cần pick vao khoảng không ở bên trong của hình là tính được diện tích rồi giống như khi mình hatch í, em đã đọc bài học lisp đơn giản của bác Hoành nhưng toàn phải joint các đối tượng lai với nhau thì mới tính được 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
bác nào viết giúp em cái lisp tính diện tích 1 hình vẽ kín mà mình chỉ cần pick vao khoảng không ở bên trong của hình là tính được diện tích rồi giống như khi mình hatch í, em đã đọc bài học lisp đơn giản của bác Hoành nhưng toàn phải joint các đối tượng lai với nhau thì mới tính được thôi.

Lần sau bạn chịu khó Search trên diễn đàn hoặc trên Google trước rồi hãy đặt câu hỏi nhé.Lisp của bạn đây :

http://www.cadviet.com/caddata/2_Auto_Lisp...download-1.html

 

Chú ý:Nếu miền cần tính diện tích được tạo bởi 1 Polyline khép kín thì bạn có thể dùng lệnh Properties(Ctrl+1),hoặc Li(List).

 

Còn nếu miền cần tính diện tích được tạo bởi các Line riêng biệt thì bạn có thể dùng lệnh Aa(Area).

 

Chúc thành công !!!

 

:undecided: :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
bác nào viết giúp em cái lisp tính diện tích 1 hình vẽ kín mà mình chỉ cần pick vao khoảng không ở bên trong của hình là tính được diện tích rồi giống như khi mình hatch í, em đã đọc bài học lisp đơn giản của bác Hoành nhưng toàn phải joint các đối tượng lai với nhau thì mới tính được thôi.

Bạn có thể tham khảo hai lệnh sau : lệnh DT1 dừng lại cho bạn xem đường bao, lệnh DT2 không dừng lại.

Đây là lệnh tạo đường bao theo cơ chế của AutoCAD. Các đối tượng tạo đường bao phải nằm trọn trong màn hình và tương đối đơn giản.

Đối với hình phức tạp hay nằm ngoài màn hình như tuyến thủy hệ, giao thông chằng chịt, lệnh này không tốt lắm.

 

;Ham tinh dien tich bang lenh bpoly

(defun tinhdtich( p / name)

(setq name (entlast))

(command "Bpoly" p "\\");

(if (null (equal name (entlast)))

(progn

(command "area" "O" "l")

(command "_.erase" "l" "")

(getvar "area")

)

(PROGN

(alert "Khong khep")

NIL

)

)

)

(defun C:DT1()

(SETQ P (GETPOINT "\nPICK"))

(IF P (TINHDTICH P))

)

(defun C:DT2( / old)

(setq old (getvar "osmode"))

(bpoly (getpoint "\nPick"))

(setvar "osmode" old)

(command "_area" "o" "l")

(entdel (entlast))

(rtos (getvar "area") 2 1)

)

  • 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
Bạn có thể tham khảo hai lệnh sau : lệnh DT1 dừng lại cho bạn xem đường bao, lệnh DT2 không dừng lại.

Đây là lệnh tạo đường bao theo cơ chế của AutoCAD. Các đối tượng tạo đường bao phải nằm trọn trong màn hình và tương đối đơn giản.

Đối với hình phức tạp hay nằm ngoài màn hình như tuyến thủy hệ, giao thông chằng chịt, lệnh này không tốt lắm.

 

;Ham tinh dien tich bang lenh bpoly

(defun tinhdtich( p / name)

(setq name (entlast))

(command "Bpoly" p "\\");

(if (null (equal name (entlast)))

(progn

(command "area" "O" "l")

(command "_.erase" "l" "")

(getvar "area")

)

(PROGN

(alert "Khong khep")

NIL

)

)

)

(defun C:DT1()

(SETQ P (GETPOINT "\nPICK"))

(IF P (TINHDTICH P))

)

(defun C:DT2( / old)

(setq old (getvar "osmode"))

(bpoly (getpoint "\nPick"))

(setvar "osmode" old)

(command "_area" "o" "l")

(entdel (entlast))

(rtos (getvar "area") 2 1)

)

Chào bác tdvn,

Mình đang xài cad2004, tìm trong Help thì khong thấy có lệnh Bpoly mà chỉ thấy có lệnh Boundary thôi bác ạ. Không biết hai lệnh này có tương đương nhau không? Nhờ bác giải thích kỹ giùm cái dòng code (command "bpoly" p "\\"). Ở đây cái tham số "\\" dùng để làm gì vậy???

Cám ơn bác trước.

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 bác tdvn,

Mình đang xài cad2004, tìm trong Help thì khong thấy có lệnh Bpoly mà chỉ thấy có lệnh Boundary thôi bác ạ. Không biết hai lệnh này có tương đương nhau không? Nhờ bác giải thích kỹ giùm cái dòng code (command "bpoly" p "\\"). Ở đây cái tham số "\\" dùng để làm gì vậy???

Cám ơn bác trước.

Lệnh Bpoly trong cad2004 cũng có đấy. Trên dòng Command bạn đáng lệnh Bpoly sẽ hiện khung đối thoại Boundary.

Tham số "\\" (có lẽ tương tự PAUSE) để chương trình dừng lại cho bạn xem đường bao nó chạy như thế nào, có đúng như mình muốn hay không vì đôi khi cad chạy cũng lung tung. Nếu đúng thì dùng kết quả diện tích trả về, còn không thì xem lạ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 các bạn!

Mình vẫn hay dùng lisp này để tính diện tích thấy cũng chuẩn. Chỉ yêu càu là hình kín, chỉ cần pick vào là sẽ ra diện tích ngay. Yêu cầu là đặt chiều cao font chữ mặc định STANDARD. Các bạn dùng thử xem như thế nào rồi cho mình nhận xét nhé.

 

(Defun C:DTI()

(Setvar "TEXTSTYLE" "STANDARD")

(Setq What (GetString "\nSdao(E)/Sdap(:undecided:: "))

(Setq Point (GetPoint "\nPoint in the area: "))

(Setq TArea 0)

 

(While Point

(Command "BPOLY" Point "")

(Command "AREA" "O" "L")

(Command "ERASE" "LAST" "")

(Setq TArea (+ TArea (/ (Getvar "Area") 1)))

(Setq Point (GetPoint "\nNext point: "))

)

 

(If (= InsertPoint Nil)

(Setq InsertPoint (GetPoint "\nInsert Point: "))

)

 

(Cond ((= (Strcase What) "B")

(Progn

(Setq TextPoint (List (- (Car InsertPoint) 40) (+ (Cadr InsertPoint) 50)))

(Command "TEXT" TextPoint "0" "SB:")

(Command "TEXT" "R" (List (+ (Car TextPoint) 25) (Cadr TextPoint)) "0" (Strcat (Rtos TArea 2 3) "m2"))

)

)

((= (Strcase What) "E")

(Progn

(Setq TextPoint (List (- (Car InsertPoint) 40) (+ (Cadr InsertPoint) 45)))

(Command "TEXT" TextPoint "0" "SE:")

(Command "TEXT" "R" (List (+ (Car TextPoint) 25) (Cadr TextPoint)) "0" (Strcat (Rtos TArea 2 3) "m2"))

)

)

)

)

  • 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

Còn một cách này nữa:

 

1) Dùng lệnh Cad:

 

- Gõ lệnh bo (boundary), pick vào vùng cần tính -> 1 pline kín được tạo thành.

- Select nó, gõ lệnh mo sẽ thấy diện tích. Nếu không cần đến nó nữa thì bấm del.

 

2) Dùng lisp:

 

Gõ lệnh are, toàn bộ thao tác trên được thực hiện tự động.

 

(defun C:ARE( / p S Pe)
(setq p (getpoint "\nPick a internal point:"))
(command "boundary" p "" "Y")
(command "area" "o" (entlast))
(setq
S (getvar "area")
Pe (getvar "perimeter")
)
(command "erase" (entlast) "")
(alert (strcat "Area = " (rtos S) "\nPerimeter = " (rtos Pe)))
)

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 thấy lisp của bác ko đúng hoàn toàn như yêu cầu.

Nếu chỉ là 1 hình kín thì ko phải bàn. Nhưng nếu nó là 1 hình xuyến ( hoặc 1 minh tương tự có đa giác ngoài và đa giác ở trong ). Thì lisp chỉ cho ta giá trị diện tích của đa giác ngoài ( điểm này hoàn toàn khác hacth).

Bác xem lại dùm 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
Em thấy lisp của bác ko đúng hoàn toàn như yêu cầu.

Nếu chỉ là 1 hình kín thì ko phải bàn. Nhưng nếu nó là 1 hình xuyến ( hoặc 1 minh tương tự có đa giác ngoài và đa giác ở trong ). Thì lisp chỉ cho ta giá trị diện tích của đa giác ngoài ( điểm này hoàn toàn khác hacth).

Bác xem lại dùm em nhé !!!

Đây là đoạn Code tính diện tích của hình đa giác kín bị khoét n lỗ rỗng ở giữa. Số lỗ rỗng n bị khoét do user nhập vào. Nếu không có lỗ rỗng thì n =0

Số n lỗ rỗng và đa giác ngoài được tạo bởi lệnh boundary tạm thời Tue_NV chưa tìm được cách nào để có thể đếm được đối tượng được sinh ra bởi lệnh boundary.

Mình chỉ biết một cách là dùng ssget với lựa chọn là all trước khi tạo đa tuyến bằng lệnh boundary. Và là dùng ssget với lựa chọn là all sau khi tạo đa tuyến bằng lệnh boundary. Sau đó dùng hàm sslength đếm số đối tượng sau khi tạo (boundary) trừ đi số đối tượng trước khi tạo (boundary) thì ra được số đối tượng đa tuyến tạo bởi boundary.

 

Đây là đoạn Code :

(defun C:ARE()
(setq p (getpoint "\nPick a internal point:"))
(command "boundary" p "" "Y")
(setq n (getint "\n So luong hinh khoet rong :") i 0 S 0)

(if (= n 0)
(progn
(command "boundary" p "" "Y")
(command "area" "o" (entlast))
(setq
S (getvar "area")
Pe (getvar "perimeter")
)
(command "erase" (entlast) "")
(alert (strcat "Area = " (rtos S)))
)
)
(if (> n 0)
(progn
(setq ela (entlast))
(setq entla (entget ela))
(command "erase" ela "")


(while (
(setq ela1 (entlast))
(command "area" "S" "O" ela1 "" "")
(Command "erase" "L" "")
(setq t (getvar "area"))
(setq S (+ S t))
(setq i (+ i 1))
)

(entmake entla)


(command "area" "A" "O" "L" "" "")

(setq tr (getvar "area"))

(alert (strcat "Area = " (rtos (+ tr S) 2 2)))
)
)

(Princ)
)

Các bác có biết tìm số đối tượng được sinh ra bởi lẹnh Boundary thì xin trợ giúp cho Tue_NV ở đây :

http://www.cadviet.com/forum/index.php?sho...amp;#entry53407

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 thấy cái lisp của bác phải nhập lại số hình khoét rỗng có vẻ hơi bất tiện. Em xin nêu ra ý kiến của em :

Ta có thể dùng lệnh hatch để hacth miền đó sau đó lấy diện tích của vùng hatch ra. ( nhưng em ko biết viết lisp )

Em chỉ xin đưa ra ý kiến như thế. Hy vọng giúp được chút nào đó cho lisp của bác.

Thx bác.

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 thấy cái lisp của bác phải nhập lại số hình khoét rỗng có vẻ hơi bất tiện. Em xin nêu ra ý kiến của em :

Ta có thể dùng lệnh hatch để hacth miền đó sau đó lấy diện tích của vùng hatch ra. ( nhưng em ko biết viết lisp )

Em chỉ xin đưa ra ý kiến như thế. Hy vọng giúp được chút nào đó cho lisp của bác.

Thx bác.

 

Lisp này đã có anh em viết rồi , mình cũng thường vẽ qui hoạch cũng hay sử dụ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
Lisp này đã có anh em viết rồi , mình cũng thường vẽ qui hoạch cũng hay sử dụng

Đây là một ý tưởng hay nhưng tìm mãi mà hình như không có ai viết thì phải, có thể bổ sung thêm phần Gap tolerance (lỡ phần cần tính diện tích có khoảng hở nhỏ

vẫn có thể hatch được). Mình thử viết được 1 đoạn nhưng ko bít viết típ như thế nào ?? Ai có thế giúp mình cách lấy diện tích phần hatch ??

 

(defun c:aa () (command "-hatch" "Properties" "solid" "Advanced" "Gap" pause "")

(command "list" "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
Đây là một ý tưởng hay nhưng tìm mãi mà hình như không có ai viết thì phải, có thể bổ sung thêm phần Gap tolerance (lỡ phần cần tính diện tích có khoảng hở nhỏ

vẫn có thể hatch được). Mình thử viết được 1 đoạn nhưng ko bít viết típ như thế nào ?? Ai có thế giúp mình cách lấy diện tích phần hatch ??

 

(defun c:aa () (command "-hatch" "Properties" "solid" "Advanced" "Gap" pause "")

(command "list" "p" "")

 

)

có rồi, bạn tham khảo tại đây, và tại đây không cần hatch :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

Các Bro cho em hỏi, bây giờ em muốn tính diện tích đào đắp của một mặt cắt ngang làm đường chẳng hạn. Trong đó có phần khối lượng đào và đắp, em sẽ làm 1 đường PL bao quanh viền trong của công trình, khi muốn tính KL thì chỉ cần tắt hết các lớp chỉ để lớp địa hình, lớp bóc phong hóa, đào giật cấp và đường PL bao quanh kết cấu công trình. Mấu chốt ở đây là em muốn hỏi khi để lại các lớp đó để tính KL thì có Lips nào chỉ cần chọn toàn bộ các đối tượng đó sẽ tính được KL đắp và chọn toàn bộ phần đào giật cấp và đào nền đường 1 nhát mà tính ra diện tích đó ko? Tại m thấy khi tính phần đất đào có phần đào giật cấp làm mình cứ phải chọn nhiều lần đối tượng quá. Mong các Bro nào biết thì ném qua hộp thư cho em nhé. Mail của em là: huuthuctvtl@gmail.com

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

Các Bro cho em hỏi, bây giờ em muốn tính diện tích đào đắp của một mặt cắt ngang làm đường chẳng hạn. Trong đó có phần khối lượng đào và đắp, em sẽ làm 1 đường PL bao quanh viền trong của công trình, khi muốn tính KL thì chỉ cần tắt hết các lớp chỉ để lớp địa hình, lớp bóc phong hóa, đào giật cấp và đường PL bao quanh kết cấu công trình. Mấu chốt ở đây là em muốn hỏi khi để lại các lớp đó để tính KL thì có Lips nào chỉ cần chọn toàn bộ các đối tượng đó sẽ tính được KL đắp và chọn toàn bộ phần đào giật cấp và đào nền đường 1 nhát mà tính ra diện tích đó ko? Tại m thấy khi tính phần đất đào có phần đào giật cấp làm mình cứ phải chọn nhiều lần đối tượng quá. Mong các Bro nào biết thì ném qua hộp thư cho em nhé. Mail của em là: huuthuctvtl@gmail.com

Hề hề hề,

Hãy gửi bản vẽ cụ thể lên thì mới có thể có câu trả lời chuẩn xác được bạn ạ.

Còn nếu không muốn lộ bem thì hãy tham khảo trên diễn đàn, có khá nhiều bài viết kể cả lisp về vấn đề này rồi. hãy gõ các từ khóa bạn muốn tìm kiếm để kiếm tìm 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

Bạn có thể tham khảo hai lệnh sau : lệnh DT1 dừng lại cho bạn xem đường bao, lệnh DT2 không dừng lại.

Đây là lệnh tạo đường bao theo cơ chế của AutoCAD. Các đối tượng tạo đường bao phải nằm trọn trong màn hình và tương đối đơn giản.

Đối với hình phức tạp hay nằm ngoài màn hình như tuyến thủy hệ, giao thông chằng chịt, lệnh này không tốt lắm.

 

;Ham tinh dien tich bang lenh bpoly

(defun tinhdtich( p / name)

(setq name (entlast))

(command "Bpoly" p "\\");

(if (null (equal name (entlast)))

(progn

(command "area" "O" "l")

(command "_.erase" "l" "")

(getvar "area")

)

(PROGN

(alert "Khong khep")

NIL

)

)

)

(defun C:DT1()

(SETQ P (GETPOINT "\nPICK"))

(IF P (TINHDTICH P))

)

(defun C:DT2( / old)

(setq old (getvar "osmode"))

(bpoly (getpoint "\nPick"))

(setvar "osmode" old)

(command "_area" "o" "l")

(entdel (entlast))

(rtos (getvar "area") 2 1)

)

- Nhờ các bác sửa giúp em cho đường bao khu vực cần tính diện tích có màu xanh.

- sửa lỗi để không tạo đường bao quanh với đối tượng là Mtext và Dim (vì nó cứ để lại đường bao sau khi tính xong và lại phải xóa đi mất công quá)

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 anh giúp thêm hàm nào đó để có thể tắt tạm thời cái "inland detection" trong tùy chọn khi tạo Boundary lúc tính diện tích để không tạo đường bao cho đối tượng Mtext và Dim với a

  • 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
(command "-boundary" "A" "I" "N" "" "" pause)

em đã cố gắng tìm nhiều cách nhưng vẫn chưa được. em cũng không hiểu em nói sai cái gì mà bị trừ điểm đỏ như trên thế!

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 các chuyên gia CAD giúp đỡ.

Mình có một mặt bằng Ngũ Giác A,B,C,D,E ( không phải ngũ giác đều) đã có tất cả chiều dài từng đoạn.

Các góc đo không có. Làm sao mình dựng được hình này lên Autocad. Mục đích là mình dựng lên Autocad để lấy tọa độ.

Xin cảm ơn nhiều.

  • Vote giảm 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

Xin các chuyên gia CAD giúp đỡ.

Mình có một mặt bằng Ngũ Giác A,B,C,D,E ( không phải ngũ giác đều) đã có tất cả chiều dài từng đoạn.

Các góc đo không có. Làm sao mình dựng được hình này lên Autocad. Mục đích là mình dựng lên Autocad để lấy tọa độ.

Xin cảm ơn nhiều.

Tôi đã trả lời bên topic kia cho bạn là không thể dựng được, sao còn qua đây hỏ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

Xin các chuyên gia CAD giúp đỡ.

Mình có một mặt bằng Ngũ Giác A,B,C,D,E ( không phải ngũ giác đều) đã có tất cả chiều dài từng đoạn.

Các góc đo không có. Làm sao mình dựng được hình này lên Autocad. Mục đích là mình dựng lên Autocad để lấy tọa độ.

Xin cảm ơn nhiều.

Trường hợp tổng quát như bác Hạ nói là đúng. Nhưng trong trường hợp cụ thể: có thể scan thành jpg, vẽ gần đúng góc và chính xác cạnh thì có thể vi chỉnh gần đúng được. Tóm lại là post hình lên rồi mọi người sẽ dựng CAD gần đúng nhất cho ^_^

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

×