Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
19 replies to this topic

#1 vminh_ct

vminh_ct

    biết lệnh stretch

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

Đã gửi 09 March 2009 - 01:25 AM

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.
  • 0
" Sống trên đời cần có 1 tấm lòng,để gió mãi cuốn đi"

#2 tucdrom

tucdrom

    — T — U — N — A —

  • Members
  • PipPipPipPipPipPip
  • 497 Bài viết
Điểm đánh giá: 642 (tốt)

Đã gửi 09 March 2009 - 01:59 AM

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.c...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:
  • 0

Email : anhtu2101@gmail.com



 


#3 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 09 March 2009 - 09:04 AM

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

#4 vminh_ct

vminh_ct

    biết lệnh stretch

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

Đã gửi 09 March 2009 - 01:25 PM

Thanks các Bro nhé,mới tập tọe biết về lisp lên em còn phải học hỏi nhiều.
  • 0
" Sống trên đời cần có 1 tấm lòng,để gió mãi cuốn đi"

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 15 March 2009 - 10:21 AM

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

#6 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 15 March 2009 - 02:35 PM

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

#7 ththang

ththang

    biết vẽ line

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

Đã gửi 17 March 2009 - 10:18 AM

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"))
)
)
)
)
  • 2

#8 KE AN MAY DI VANG

KE AN MAY DI VANG

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 822 Bài viết
Điểm đánh giá: 572 (tốt)

Đã gửi 17 March 2009 - 09:49 PM

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


  • 0
KẺ ĂN MÀY DĨ VÃNG

#9 daotac541

daotac541

    biết vẽ circle

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

Đã gửi 23 March 2009 - 05:01 PM

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

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 25 March 2009 - 07:57 AM

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 (< i n)

(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.c...amp;#entry53407
  • 0

#11 daotac541

daotac541

    biết vẽ circle

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

Đã gửi 25 March 2009 - 11:31 AM

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

#12 archhnm

archhnm

    biết zoom

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

Đã gửi 31 May 2009 - 04:09 PM

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

#13 nghiautc

nghiautc

    biết lệnh copy

  • Members
  • PipPipPip
  • 112 Bài viết
Điểm đánh giá: 18 (tàm tạm)

Đã gửi 19 September 2009 - 01:24 PM

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

)
  • 0

#14 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 19 September 2009 - 03:40 PM

Đâ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:
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#15 huuthuctvtl

huuthuctvtl

    Chưa sử dụng CAD

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

Đã gửi 02 October 2012 - 10:17 AM

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

#16 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 02 October 2012 - 03:20 PM

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

#17 toiyeuvietnam

toiyeuvietnam

    biết vẽ polygon

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

Đã gửi 29 June 2016 - 06:23 AM

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


  • 0

#18 toiyeuvietnam

toiyeuvietnam

    biết vẽ polygon

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

Đã gửi 01 July 2016 - 08:08 AM

nhờ các bác coi và giúp khắc phục lỗi này với ạ

89068_20160630_173112.jpg


  • 0

#19 toiyeuvietnam

toiyeuvietnam

    biết vẽ polygon

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

Đã gửi 03 July 2016 - 02:29 PM

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


  • -1

#20 toiyeuvietnam

toiyeuvietnam

    biết vẽ polygon

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

Đã gửi 04 July 2016 - 09:54 AM

(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ế!


  • 0