Đến nội dung


Hình ảnh
- - - - -

Tạo BOUNDARY (BO) bằng VBA


  • Please log in to reply
9 replies to this topic

#1 ks_chang

ks_chang

    biết vẽ line

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

Đã gửi 14 December 2012 - 03:21 PM

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

#2 garupro

garupro

    biết vẽ circle

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

Đã gửi 14 December 2012 - 10:01 PM

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

  • 0

#3 ks_chang

ks_chang

    biết vẽ line

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

Đã gửi 15 December 2012 - 11:42 AM

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

#4 garupro

garupro

    biết vẽ circle

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

Đã gửi 15 December 2012 - 07:18 PM

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

#5 ks_chang

ks_chang

    biết vẽ line

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

Đã gửi 17 December 2012 - 06:02 PM

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

#6 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 17 December 2012 - 07:55 PM

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.
  • 0
Clear sky!

MF Rock collection.

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 17 December 2012 - 08:33 PM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#8 ks_chang

ks_chang

    biết vẽ line

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

Đã gửi 18 December 2012 - 11:21 AM

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

#9 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 10 August 2015 - 10:21 AM

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 !


  • 0

#10 506509

506509

    biết zoom

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

Đã gửi 16 November 2016 - 04:56 PM

Dùng Region đi bạn ạ. 


  • -1