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

Tính diện tích tạo nên từ những vùng giao nhau giữa 2 đường polyline

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

Mình đang muốn tính diện tích tạo nên bởi những vùng giao nhau giữa 2 polyline: khi chọn 2 polyline bất kỳ nếu chúng giao nhau tạo nên những vùng kín thì lisp sẽ hatch những vùng đấy và tính diện tích các vùng đó. Có bác nào giúp mình với.

Thanks nhiề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
Mình đang muốn tính diện tích tạo nên bởi những vùng giao nhau giữa 2 polyline: khi chọn 2 polyline bất kỳ nếu chúng giao nhau tạo nên những vùng kín thì lisp sẽ hatch những vùng đấy và tính diện tích các vùng đó. Có bác nào giúp mình với.

Thanks nhiều.

Bạn có thể làm theo các bước :

1. chọn 2 polyline kín

2. Chuyển 2 polyline thành Region -> Lấy vùng giao (Intersect) 2 Region này.

3. hatch những vùng đấy và tính diện tích các vù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
Bạn có thể làm theo các bước :

1. chọn 2 polyline kín

2. Chuyển 2 polyline thành Region -> Lấy vùng giao (Intersect) 2 Region này.

3. hatch những vùng đấy và tính diện tích các vùng đó

Ý mình là 2 polyline bất kỳ, nếu là pl hở thì không tạo đc region và intersect đúng k. Tue_nv có phương pháp nào khác không. Thanks bạn đã 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
Ý mình là 2 polyline bất kỳ, nếu là pl hở thì không tạo đc region và intersect đúng k. Tue_nv có phương pháp nào khác không. Thanks bạn đã quan tâm.

Với các Pline hở thì Break tại các điểm giao nhau rồi mới tạo Region

Tính diện tích của các Region được tạo ra này.

 

Trên diễn đàn đã có Lisp của anh gia_bach, bác DuongTrungHuy và của bạn PhamngocTu viết về cách tạo Region hay Boundary nhưng đều có 1 khuyết điểm nhất định. Bạn chịu khó tìm nhé. Trong topic Viết Lisp theo yêu cầu phần 2 <_>

 

Để không bị mất đối tượng nguồn Polyline thì bạn nên copy đối tượng nguồn tại vị trí của chính nó rồi thao tác trên đối tượng mới vừa copy ra nầy

  • 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à 2 polyline bất kỳ, nếu là pl hở thì không tạo đc region và intersect đúng k. Tue_nv có phương pháp nào khác không. Thanks bạn đã quan tâm.

Hề hề hề,

Chào bạn haimed,

Cái vụ này theo mình nhớ thì trên diễn đàn có lisp rồi mà. Bạn chịu khó tìm kiếm xem sao....

Nếu bạn có thể thì theo mình cái lisp này cũng không quá phức tạp.

Bạn có thể thử làm xem.

1/- Pick vào vùng giao nhau để tạo boundary (lưu ý là trên màn hình phải chứa chọn vùng giao nhau đó.

2/- dùng lệnh AREA để lấy diện tích và chu vi của boundary.

3/- Dùng (getvar "area") sẽ cho bạn cái diện tích đó thôi.

 

Cách làm này có thể khác với suy nghĩ của bạn là chọn hai polyline, song theo mình nó có vẻ tiện dụng hơn là việc chọn polyline vì các polyline có thể khá lớn nằm ngoài màn hình và khi đó sẽ không lấy boundary được mặc dầu thực tế là vẫn có bạn ạ. Hơn nữa nó cũng giúp bạn kiểm soát được các vùng đã tính diện tích mà không sợ bị trùng do trên bản vẽ có thể có nhiều polyline và chúng cắt nhau theo các vùng chồng lên nhau bạn ạ.

Hề hề hề, đó là thiển ý của mình, nếu không trúng với ý của bạn mong bạn dừng chấp nhé.

Hế hề hề....

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ề,

Chào bạn haimed,

Cái vụ này theo mình nhớ thì trên diễn đàn có lisp rồi mà. Bạn chịu khó tìm kiếm xem sao....

Nếu bạn có thể thì theo mình cái lisp này cũng không quá phức tạp.

Bạn có thể thử làm xem.

1/- Pick vào vùng giao nhau để tạo boundary (lưu ý là trên màn hình phải chứa chọn vùng giao nhau đó.

2/- dùng lệnh AREA để lấy diện tích và chu vi của boundary.

3/- Dùng (getvar "area") sẽ cho bạn cái diện tích đó thôi.

 

Cách làm này có thể khác với suy nghĩ của bạn là chọn hai polyline, song theo mình nó có vẻ tiện dụng hơn là việc chọn polyline vì các polyline có thể khá lớn nằm ngoài màn hình và khi đó sẽ không lấy boundary được mặc dầu thực tế là vẫn có bạn ạ. Hơn nữa nó cũng giúp bạn kiểm soát được các vùng đã tính diện tích mà không sợ bị trùng do trên bản vẽ có thể có nhiều polyline và chúng cắt nhau theo các vùng chồng lên nhau bạn ạ.

Hề hề hề, đó là thiển ý của mình, nếu không trúng với ý của bạn mong bạn dừng chấp nhé.

Hế hề hề....

Topic : Tính diện tích tạo nên từ những vùng giao nhau giữa 2 đường polyline

 

Hế hề hề....

Bác Bình cứ nghĩ đơn giản quá. Bác đã tính đến trường hợp 2 polyline hở giao nhau bởi nhiều vùng chưa?.

  • 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
Topic : Tính diện tích tạo nên từ những vùng giao nhau giữa 2 đường polyline

 

Hế hề hề....

Bác Bình cứ nghĩ đơn giản quá. Bác đã tính đến trường hợp 2 polyline hở giao nhau bởi nhiều vùng chưa?.

Hề hề hề,

Chưa bác ạ, vậy nên mình mới nghĩ ra cái củ chuối là pick từng chú cho chắc, khỏi sợ nhầm lẫn hay sót xiếc gì 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

Cùng chung thắc mắc với Haimed ( H aime D ? ^^) : Thuật toán của mình từ lúc băn khoăn, cũng cả tháng trước roài, nhưng chưa thử thực hiện vì chưa thạo code lắm, là như thế này :

1 Xác định các điểm giao của 2 đường

Từ điểm giao đầu đến điểm giao 2 tạo 1 vùng kinh, từ 3-4,5-6...

2.Tạo danh sách điểm của các vùng kín bằng việc lấy tọa độ các đỉnh của 2 đường nằm giữa 2 giao điểm, sắp xếp sao cho đúng thứ tự

3. Tính diện tích các vùng kín đó bằng cách chia nhỏ thành các tam giác

4.Cộng các diện tích lại là ok

Vướng mắc ở chỗ là : đối với vùng kín là đa giác lồi thì thuật toán chia nhỏ thành tam giác là ok, còn với các đa giác lõm thì chưa biết xử lý thế nào

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

Mình đã cải tiến được Lisp tính diện tích của công ty (hoặc có khi của Cadviet nhà mình cũng nên) khá ưng ý, nhưng muốn tự động hóa công việc tính toán lên mức cao nhất thì đúng là phải nghiên cứu đến việc tính diện tích vùng giao giữa 2 đườ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
Cùng chung thắc mắc với Haimed ( H aime D ? ^^) : Thuật toán của mình từ lúc băn khoăn, cũng cả tháng trước roài, nhưng chưa thử thực hiện vì chưa thạo code lắm, là như thế này :

1 Xác định các điểm giao của 2 đường

Từ điểm giao đầu đến điểm giao 2 tạo 1 vùng kinh, từ 3-4,5-6...

2.Tạo danh sách điểm của các vùng kín bằng việc lấy tọa độ các đỉnh của 2 đường nằm giữa 2 giao điểm, sắp xếp sao cho đúng thứ tự

3. Tính diện tích các vùng kín đó bằng cách chia nhỏ thành các tam giác

4.Cộng các diện tích lại là ok

Vướng mắc ở chỗ là : đối với vùng kín là đa giác lồi thì thuật toán chia nhỏ thành tam giác là ok, còn với các đa giác lõm thì chưa biết xử lý thế nào

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

Mình đã cải tiến được Lisp tính diện tích của công ty (hoặc có khi của Cadviet nhà mình cũng nên) khá ưng ý, nhưng muốn tự động hóa công việc tính toán lên mức cao nhất thì đúng là phải nghiên cứu đến việc tính diện tích vùng giao giữa 2 đường

Bạn đã tính tới trường hợp PLINE chứa Arc chưa?

Bài toán ra đề là Pline bất kì????

  • 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ì, đề là polyline mà, tính đến spline và arc thì cái thuật toán của em phá sản roài

Bài tham khảo:

Chào thanhduan2407

Do bạn biết lập trình, tui chỉ cung cấp giải pháp cho bạn triển khai.

 

B1. Xác định tọa độ của các đỉnh hình chử nhật bao quanh "vùng kín"

- có thể dùng hàm getBoundingBox : http://s.cadviet.com/m

B2. array đối tượng trong phạm vi hình chử nhật này.

- quá dễ :iluvyousmiley:

B3. xóa các đối tượng phía ngòai "vùng kín"

- tham khảo Lisp xóa tất cả đối tượng nằm ngoài curve. : http://s.cadviet.com/n

 

Chú ý : làm việc với "vùng kín" lúc nào cũng rắc rối và phức tạp. Tuy nhiên nếu thành công thì có nhiều thú vị đang chờ bạn đấy.

Cố lên! :D

  • 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 Xác định các điểm giao của 2 đường

Từ điểm giao đầu đến điểm giao 2 tạo 1 vùng kinh, từ 3-4,5-6...

2.Tạo danh sách điểm của các vùng kín bằng việc lấy tọa độ các đỉnh của 2 đường nằm giữa 2 giao điểm, sắp xếp sao cho đúng thứ tự

-Mình đang khó ở vấn để này, bạn có giải quyết được thì giúp mình với.

 

3. Tính diện tích các vùng kín đó bằng cách chia nhỏ thành các tam giác

-Nếu giải quyết được vấn đề trên thì việc tính diện tích vùng kín đó bằng cách vẽ 1 đường pl theo danh sách điểm bạn tạo được, dùng lệnh area tính dt pl đó là xong, kể cả đa giác lõm cũng tính được.

 

-haimed = H aime D , sao bạn biết vậy? Mỗi tội đây là kỉ niệm buồn của mình :iluvyousmiley:

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
Với các Pline hở thì Break tại các điểm giao nhau rồi mới tạo Region

Phương án break của bạn cũng rất hay, nhưng mình gặp phải vấn đề thế này:

+ Khi break polyline thì nó tạo thành 2 đối tượng mới, dùng entlast thì get đc name 1 đối tượng còn đối tượng thứ 2 mình không biết cach select thế nào

+ Giả sử get name được cả 2 đối tượng mới tạo thành thì cũng không biết xác định đối tượng nào dùng để tạo region.

Bạn giúp mình giải quyết vấn đề này với.

 

@phamthanhbinh: yêu cầu đề bài của mình là chỉ chọn 2 polyline, mình không được pick hay làm gì nữa, các thao tác còn lại đều do lisp thực hiện và tính toá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

@HaimeD : Uh, cũng hợp lý đấy, theo mình thì thế này :

Ta xác định được các giao điểm của 2 pline bằng hàm acet-geom-intersecwith

Sắp xếp thì trước hết làm 1 cái chương trình con lấy các đỉnh pline nằm giữa 2 điểm giao nhau (hehe, thực ra mình làm rồi, nhưng bài toán của mình rất đơn giản là các đỉnh vốn dĩ nó đã sắp sẵn theo thứ tự tăng dần của hoành độ X nên nếu hợp ý bạn thì mình post lên). Giả sử sau đó ta có được 2 danh sách lst1 và lst2 là các đỉnh của pline 1 và pline2 nằm giữa giao1 và giao2 :

=> Danh sách sắp xếp là : giao1 + lst1 + giao 2 + (reverse lst2) : hi, ok chưa ? đã đủ các đỉnh của đa giác rồi đấy, có thể thêm giao1 vào cuối danh sách tùy bạn

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

Normallement, je parle francais

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 đỉnh vốn dĩ nó đã sắp sẵn theo thứ tự tăng dần của hoành độ X

Nếu các đỉnh sắp xếp thì có thể làm như cách của bạn. Mình có cách làm đơn giản hơn nhưng chỉ áp dụng cho trường hợp 2 polyline chỉ giao nhau tại 2 điểm và tạo nên 1 vùng kín

(defun c:tdt()
 (setq pl1 (car(entsel))
pl2 (car(entsel))
)
 ;(command "copy" pl1 "" (vlax-curve-getStartPoint pl1) (vlax-curve-getStartPoint pl1)  "")
 ;(setq pl3 (entlast))
 ;(command "copy" pl2 "" (vlax-curve-getStartPoint pl2) (vlax-curve-getStartPoint pl2) "")
 ;(setq pl4 (entlast))

 (setq gd1 (car(giaodt pl1 pl2))
gd2 (cadr(giaodt pl1 pl2))
p (vlax-curve-getStartPoint pl2)
 )


 (command "trim" pl1 "" (vlax-curve-getEndPoint pl2) (vlax-curve-getStartPoint pl2) "")
 (command "trim" pl2 "" (vlax-curve-getEndPoint pl1) (vlax-curve-getStartPoint pl1) "")
 (command "region" pl1 pl2 "")
 (setq reg (entlast))
 (command "area" "o" reg)
 (setq dientich (getvar "area"))

)

 

Normallement, je parle francais

Chắc học cầu đường pháp xây dựng ah

  • 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ấy nay bận quá, chưa check cái lisp của bạn HaimeD, nhưng thông thường thực tế mình cũng thường chỉ quan tâm để trường hợp như trên, 2 Pline 1 vùng kín, Mình học PFIEV nhìn cái username là đoán được roài mà .hì

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

Hehe, ngồi mấy ngày viết một cái lisp cho công việc, xong roài, thích cái lisp của HaimeD ở cái lệnh "TRIM", đây là cách giải quyết vấn đề theo thuật toán của mình Lisp tính diện tích giữa 2 Pline

(Defun Dscon(TDlist gd1 gd2)(Vl-remove-if '(lambda(x)(or(<=(car x)(car Gd1))(>=(car x)(car gd2)))) TDlist))
(Defun c:TDT()
 (Setq Pl1    (Car(Entsel"\n Select First Pline :"))
Pl2    (Car(Entsel"\n Select Second Pline :"))
TDlist (Acet-geom-intersectwith Pl1 pl2 0)
TDlist1(Acet-geom-vertex-list PL1)
TDlist2(Acet-geom-vertex-list Pl2)
n      (Length TDList)
i      0
DT     0)
 (While (< i (- n 1))
   (Setq Gd1     (Nth i TDlist)
  Gd2     (NTh (1+ i) TDlist)
  TDlist11 (Dscon TDlist1 gd1 gd2)
  TDlist22 (Dscon TDlist2 gd1 gd2)
  TDlist3 (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))
   (Acet-pline-make (list TDlist3))
   (Command "AREA" "O" (Entlast))
   (Setq DT(+(Getvar "AREA")DT))
   (Princ(Strcat"\n Tong dien tich hien tai la : "(Rtos DT 2 2)))
   (Command "ERASE" (Entlast)"")
   (Setq i(1+ i))
   )
 (Princ (Strcat"\n Tong dien tich nam giua 2 duong Pline = " (Rtos DT 2 2)))
 (Princ))

Đã check thử vài lần, thấy cũng tạm, có gì mọi người góp ý luôn nhé :leluoi:

  • 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

Tiện đây các bạn cho mình hỏi tí. Có phải bạn tính diện tích giữa hai đường pline để phục vụ cho chươg trình tương tự như Nova , Roadplan phải không. Mình từng có ý nghĩ tính diện tích giữa hai đường Pline. Nhưng lúc trước mình đặt ra yêu cầu hơi khác. Tính diện tích giữa hai đường Pline bất kỳ và phân ra 2 loại diện tích. Khi Pline1 nằm trên Pline2 thì cho diện tích loại 1, khi pline1 nằm dưới Pline2 thì cho diện tích loại 2. Khi chúng cắt nhau (lên, xuống) sẽ có đồng thời 2 loại diện tích. Khi dùng một đường thẳng đứng di chuyển từ trái qua phải, nếu nó không cắt đồng thời 2 pline thì 2 loại diện tích đều bằng 0

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

Đúng là mình sử dụng các điều kiện để viết lisp với đối tượng của Nova, ý tưởng của bạn cũng là ý tưởng của mình hồi còn làm 1 vài thứ và chưa bít tí gì về lisp, h vẫn chưa làm vì xong mất roài :undecided:

Theo mình thì việc xét loại diện tích có thể xem xét thế này, từ trung điểm của 2 giao điểm vẽ 1 Xline, cắt 2 Polyline (ấy là đang nói đến đối tượng của Nova thui nhé) xét vị trí của 2 điểm ấy sẽ ra được loại diện tích cần tí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

Tính 2 loại diện tích nằm giữa 2 polyline đây :

;============================================================================!
;================================PFIEVXD-CADViet.com==============================
(Defun Dscon(TDlist gd1 gd2)
(Vl-remove-if '(lambda(x)(or(<=(car x)(car Gd1))(>=(car x)(car gd2)))) TDlist))
;---------------------------------------------------------------------------------
(Defun c:TDT(/ TDlist TDlist1 TDlist2 pl1 pl2 DT DT1 DT2
       TDlist11 TDlist22 i gd1 gd2 gd3 gd4 )
 (Setq Pl1     (Car(Entsel"\n Select First Pline :"))
Pl2     (Car(Entsel"\n Select Second Pline :"))
TDlist  (Acet-geom-intersectwith Pl1 pl2 0)
TDlist1 (Acet-geom-vertex-list PL1)
TDlist2 (Acet-geom-vertex-list Pl2)
n       (Length TDList)
i       0
DT1     0
DT2     0)
 (While (< i (- n 1))
   (Setq Gd1      (Nth i TDlist)
  Gd2      (NTh (1+ i) TDlist)
  TDlist11 (Dscon TDlist1 gd1 gd2)
  TDlist22 (Dscon TDlist2 gd1 gd2)
  TDlist3  (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))
   (Acet-pline-make (list TDlist3))
   (Command "AREA" "O" (Entlast))
   (Setq DT(Getvar "AREA"))
   (Command "ERASE" (Entlast)"")
   ;------------------------------------------------------------------------------
   (Setq Midpoint(Acet-geom-midpoint Gd1 Gd2))
   (Command "XLINE" "Ver" Midpoint "")
   (Setq gd3 (Acet-geom-intersectwith (Entlast) Pl1 0)
  gd4 (Acet-geom-intersectwith (Entlast) Pl2 0)
  )
   (If(>=(Cadr(Car gd3))(Cadr(Car gd4)))
     (Setq DT1(+ DT1 DT))
     (Setq DT2(+ DT2 DT))
     )
   (Command "ERASE" (Entlast)"")
   (Setq i(1+ i))
   )
 (Princ (Strcat"\n Dien tich loai 1 = " (Rtos DT1 2 2)))
 (Princ (Strcat"\n Dien tich loai 2 = " (Rtos DT2 2 2)))
 (Princ))
;================================PFIEVXD-CADViet.com===============================!

  • 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
Đúng là mình sử dụng các điều kiện để viết lisp với đối tượng của Nova, ý tưởng của bạn cũng là ý tưởng của mình hồi còn làm 1 vài thứ và chưa bít tí gì về lisp, h vẫn chưa làm vì xong mất roài :undecided:

Theo mình thì việc xét loại diện tích có thể xem xét thế này, từ trung điểm của 2 giao điểm vẽ 1 Xline, cắt 2 Polyline (ấy là đang nói đến đối tượng của Nova thui nhé) xét vị trí của 2 điểm ấy sẽ ra được loại diện tích cần tính

Cảm ơn bạn đã có những thông tin bổ ích. Mình đã sử dụng thử Lisp của bạn và nảy sinh vấn đề như sau: Khi đường Pline chọn đầu tiên có hướng từ bên phải qua thì chương trình tính diện tích không đúng nữa. (Đường Pline có tọa độ từ điểm đầu đến đếm cuối, Khi dùng lệnh PEDIT/Editvrtex thì nó sẽ chọn tại đỉnh đầu tiên của Pline, nếu Pline được thể hiện trọn trong khung nhì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
Tính 2 loại diện tích nằm giữa 2 polyline đây :

;============================================================================!
;================================PFIEVXD-CADViet.com==============================
(Defun Dscon(TDlist gd1 gd2)
(Vl-remove-if '(lambda(x)(or(<=(car x)(car Gd1))(>=(car x)(car gd2)))) TDlist))
;---------------------------------------------------------------------------------
(Defun c:TDT(/ TDlist TDlist1 TDlist2 pl1 pl2 DT DT1 DT2
       TDlist11 TDlist22 i gd1 gd2 gd3 gd4 )
 (Setq Pl1     (Car(Entsel"\n Select First Pline :"))
Pl2     (Car(Entsel"\n Select Second Pline :"))
TDlist  (Acet-geom-intersectwith Pl1 pl2 0)
TDlist1 (Acet-geom-vertex-list PL1)
TDlist2 (Acet-geom-vertex-list Pl2)
n       (Length TDList)
i       0
DT1     0
DT2     0)
 (While (< i (- n 1))
   (Setq Gd1      (Nth i TDlist)
  Gd2      (NTh (1+ i) TDlist)
  TDlist11 (Dscon TDlist1 gd1 gd2)
  TDlist22 (Dscon TDlist2 gd1 gd2)
  TDlist3  (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))
   (Acet-pline-make (list TDlist3))
   (Command "AREA" "O" (Entlast))
   (Setq DT(Getvar "AREA"))
   (Command "ERASE" (Entlast)"")
   ;------------------------------------------------------------------------------
   (Setq Midpoint(Acet-geom-midpoint Gd1 Gd2))
   (Command "XLINE" "Ver" Midpoint "")
   (Setq gd3 (Acet-geom-intersectwith (Entlast) Pl1 0)
  gd4 (Acet-geom-intersectwith (Entlast) Pl2 0)
  )
   (If(>=(Cadr(Car gd3))(Cadr(Car gd4)))
     (Setq DT1(+ DT1 DT))
     (Setq DT2(+ DT2 DT))
     )
   (Command "ERASE" (Entlast)"")
   (Setq i(1+ i))
   )
 (Princ (Strcat"\n Dien tich loai 1 = " (Rtos DT1 2 2)))
 (Princ (Strcat"\n Dien tich loai 2 = " (Rtos DT2 2 2)))
 (Princ))
;================================PFIEVXD-CADViet.com===============================!

Xin bổ sung như sau! bạn xem và góp ý nhé!

(Defun C:TDT (/ TDlist TDlist1 TDlist2 pl1 pl2 DT DT1 DT2 TDlist11 TDlist22 i gd1 gd2 gd3 gd4

)

(Defun Dscon (TDlist gd1 gd2)

(Vl-remove-if '(Lambda (X) (Or (<= (Car X) (Car Gd1)) (>= (Car X) (Car gd2)))) TDlist)

)

(Setq Pl1 (Car(Entsel"\n Select First Pline :"))

Pl2 (Car(Entsel"\n Select Second Pline :"))

TDlist (Vl-sort (Acet-geom-intersectwith Pl1 pl2 0) (Function (Lambda (E1 E2) (< (Car E1) (Car E2)))))

TDlist1 (Vl-sort (Acet-geom-vertex-list PL1) (Function (Lambda (E1 E2) (< (Car E1) (Car E2)))))

TDlist2 (Vl-sort (Acet-geom-vertex-list Pl2) (Function (Lambda (E1 E2) (< (Car E1) (Car E2)))))

n (Length TDList)

i 0

DT1 0

DT2 0)

(While (< i (- n 1))

(Setq Gd1 (Nth i TDlist)

Gd2 (NTh (1+ i) TDlist)

TDlist11 (Dscon TDlist1 gd1 gd2)

TDlist22 (Dscon TDlist2 gd1 gd2)

TDlist3 (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))

(Acet-pline-make (list TDlist3))

(Command "AREA" "O" (Entlast))

(Setq DT(Getvar "AREA"))

(Command "ERASE" (Entlast)"")

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

(Setq Midpoint(Acet-geom-midpoint Gd1 Gd2))

(Command "XLINE" "Ver" Midpoint "")

(Setq gd3 (Acet-geom-intersectwith (Entlast) Pl1 0)

gd4 (Acet-geom-intersectwith (Entlast) Pl2 0)

)

(If(>=(Cadr(Car gd3))(Cadr(Car gd4)))

(Setq DT1(+ DT1 DT))

(Setq DT2(+ DT2 DT))

)

(Command "ERASE" (Entlast)"")

(Setq i(1+ i))

)

(Princ (Strcat"\n Dien tich loai 1 = " (Rtos DT1 2 2)))

(Princ (Strcat"\n Dien tich loai 2 = " (Rtos DT2 2 2)))

(Princ)

)

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 ổn tí nào bác "pfievxd" và bác "Happyspringla2007" ạ vấn đề bác hãy thử lại nếu nó cắt nhau trên dưới thì nó sai hết bác ạ (bác xem hình 1 nhé)

nhân đây bác sửa dùm em tính cái hình như thế này ạ (hình 2)16281_lisp_tdt_1.jpg16281_lisp_tdt_2.jpg

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  

×