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

Tạo BOUNDARY (BO) bằng VBA

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

Hi, chào các bác!

Các bác có thể giúp em thuật toán tạo các đường BOUNDARY (lệnh BO trong Cad) bằng VBA với?

Kiểu như select một loạt đối tượng (Line, Arc, Cicle...) và tạo ra các BOUNDARY trong các miền được hình thành bởi các đường này.

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

Trong VBA mình thấy có BOUNDARY nhưng lại không thấy cách để tạo ra nó .Lên đành sử dụng SendCommand , đưa tọa độ thuộc 1 vùng kín vào , và ta lấy đối tượng được tạo ra sau cùng của bản vẽ .Bạn tham khảo thử :

Tạo Region :

Function Taoregion(x As Double, y As Double) As AcadRegion
  ThisDrawing.SendCommand ("-Boundary" & vbCr & "A" & vbCr & "o" & vbCr & "R" & vbCr & vbCr & x & "," & y & vbCr & vbCr)
  Set Taoregion = ThisDrawing.ModelSpace.Item(ThisDrawing.ModelSpace.count - 1)
End Function

 

Tạo Polyline

 

Function Taopolyline(x As Double, y As Double) As AcadLWPolyline
  ThisDrawing.SendCommand ("-Boundary" & vbCr & "A" & vbCr & "o" & vbCr & "P" & vbCr & vbCr & x & "," & y & vbCr & vbCr)
  Set Taopolyline = ThisDrawing.ModelSpace.Item(ThisDrawing.ModelSpace.count - 1)
End Function

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

Thanhks bác garupro, em đã làm được theo hướng dẫn của bác

Cho em hỏi thêm về cách xác định tọa độ:

- Giả sử em có 1 polyline kín, có cách nào để biết 1 điểm cho trước có thuộc trên, trong hay ngoài đường polyline đó khô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ái vụ này mình không biết có phương pháp nào hay hơn nhanh hơn để làm không , nhưng mình có phương pháp như thế này , đi đường vòng thui :

Thứ nhất điểm đó nằm trên Pline : Pline thực chất là các Line ghép lại mà thành . Để xác định nó có thuộc không bạn chỉ cần xét tất cả các line đó là được (Bạn duyệt 2 điểm 1 của Pline , viết PT đường thẳng rùi xét nó có thuộc không thui)

Còn vấn đề nằm trong hay nằm ngoài : Thì hơi khó . bạn thử giải quyết theo cách này xem .Dùng chính hàm tạo Boundary ở trên để tạo 1 Pline . Sau đó so sánh thằng Pline đó với thằng này (Diện tích chẳng hạn) thì bạn biết ngay nó nằm trong hay nằm ngoài mà (nằm trong đương nhiên ta dược 1 pline y xì thằng đang xét , còn nằm ngoài có thể có Pline khác or không . Va đương nhiên thằng đó sẽ khác thằng đang xét .Cũng có thể xảy ra trường hợp giống nhau , nhưng rất ít , và cách này chỉ áp dụng với Pline khép kín thui ) . Bạn nghiên cứu thử xem , mình cũng chưa có thử . Chúc bạn thành cô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

Hi, bác garupro

Phương pháp của bác để xác định một điểm cho trước có thuộc hay không thuộc một vùng điện tích cho trước (bằng ranh giới Pline kín) có vẻ không khả thi lắm.

Em đang loay hoay theo phuong pháp hình học về đường:

- Xac định các hàm đường thẳng trên Pline (ax+by=0), tiếp theo là xác định các điểm cho trước nằm trên hay dưới các đường này

Nhưng vẫn lúng túng cho 1 Pline kín bất kì vì thường bài toán tìm miền diện tích xác dịnh bởi các đường thẳng là bài toán xuô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

Nếu biết trước 1 điểm và 1 Polyline, bạn tìm giao giữa PL và nửa đường thẳng bất kỳ có một đầu tại điểm đó bằng hàm IntersectWith.

Nếu số điểm giao là lẻ thì điểm nằm trong, nếu số giao chẵn là điểm nằm ngoài vùng kín.

 

Tuy nhiên vẫn có ngoại lệ, khi có các điểm tiếp xúc, vì vậy phương án đơn giản nhất là tìm giao giữa PL với 3 đường thẳng bất kỳ qua điểm đó.

 

Trong 4r cũng có bài nói về phần này, nhưng mình chẳng theo dõi hết nên không biết KQ cuối cù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

Nếu pline không chứa arc thì có thể dùng thêm cách này:

1). Chọn đối tượng kiểu "fence" qua các đỉnh pline.

2). Chọn đối tượng kiểu "wp" qua các đỉnh pline.

Xét:

Nếu điểm nằm trong pline thì nó được chọn với trường hợp 2 và không được chọn với trường hợp 1.

Nếu điểm nằm trên pline thì nó được chọn với trường hợp 1 và không được chọn với trường hợp 2.

Nếu điểm nằm ngoài thì nó không được chọn với cả 2 trường hợ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

Cả 2 phương pháp của bác anhcos và bác Doan Van Ha rất hay, thanks 2 bác

Em thấy cách của bác Doan Van Ha có vẻ đơn giản hơn:

- Đầu tiên là tạo ra 1 point cho trước

- Sau đó sử dụng phép select:

SelectByPolygon Mode, PointsList[, FilterType][, FilterData]

với: + Pointlist là các đỉnh Pline

+ Mode sẽ được chọn theo các trường hợp: acSelectionSetFence, acSelectionSetWindowPolygon, acSelectionSetCrossingPolygon

+ [, FilterType][, FilterData] sẽ được lọc theo điềhu kiện tạo ra điểm cho trước

Một lần nữa thanks các bác đã quan tâm, diễn đàn rất bổ ích cho các anh em!

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
Sub Are_Object()
'Bo loc text ten coc
Dim ssx As AcadSelectionSet
Dim ftype(0) As Integer, fdata(0)
Set ssx = CreateSelectionSet("Texttencon")
ftype(0) = 0: fdata(0) = "Polyline"
ssx.SelectOnScreen ftype, fdata
Dim intpt As Variant, pstr As String
intpt = ThisDrawing.Utility.GetPoint(, "Pick the inner point of boundary")
'(command "BOUNDARY" "a" "b" "n" ss "" "" x "")
Dim X As Double, Y As Double
X = intpt(0): Y = intpt(1)
ThisDrawing.SendCommand ("-Boundary" & vbCr & "A" & vbCr & "B" & vbCr & "N" & vbCr & vbCr & ssx & X & "," & Y & vbCr & vbCr)
End Sub

Xin phép hỏi các bác

Vấn đề tạo Boundary bằng lisp cho các đối tương chọn mình đã nhờ Bác ĐVH làm ổn rồi

Mình thử chuyển sang VBA bằng code trên thi chưa được

Mong bác nào đã từng làm qua VBA chỉ giáo

Trân 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
Đăng nhập để thực hiện theo  

×