Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
uce46

Hỏi về polyline

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

uce46    0

Nhờ bạn nào chỉ giúp cách nào để lấy ra chiều dài của từng đoạn (segment) của 1 polyline, không phải là chiều dài của polyline nhé. Cám ơn bạn rất 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
uce46    0
Nếu không phiền, bạn post code lấy chiều dài của polyline lên, mọi nguời sẽ chỉ giúp cách để lấy ra chiều dài của từng đoạn (segment) của 1 polyline.

Cám ơn gia_bach đã quan tâm, mình sửa ví dụ của help luôn rồi gửi lên đây (vẽ ra 1 pl và lấy chiều dài):

Sub Example_AddPolyline()

' This example creates a polyline in model space.

 

Dim cd As Double

Dim plineObj As AcadPolyline

Dim points(0 To 14) As Double

 

' Define the 2D polyline points

points(0) = 1: points(1) = 1: points(2) = 0

points(3) = 1: points(4) = 2: points(5) = 0

points(6) = 2: points(7) = 2: points(8) = 0

points(9) = 3: points(10) = 2: points(11) = 0

points(12) = 4: points(13) = 4: points(14) = 0

 

' Create a lightweight Polyline object in model space

Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)

cd = plineObj.Length

Debug.Print cd

ZoomAll

 

End Sub

  • 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
gia_bach    1.442
Cám ơn gia_bach đã quan tâm, mình sửa ví dụ của help luôn rồi gửi lên đây (vẽ ra 1 pl và lấy chiều dài):

Sub Example_AddPolyline()

' This example creates a polyline in model space.

 

Dim cd As Double

Dim plineObj As AcadPolyline

Dim points(0 To 14) As Double

 

' Define the 2D polyline points

points(0) = 1: points(1) = 1: points(2) = 0

points(3) = 1: points(4) = 2: points(5) = 0

points(6) = 2: points(7) = 2: points(8) = 0

points(9) = 3: points(10) = 2: points(11) = 0

points(12) = 4: points(13) = 4: points(14) = 0

 

' Create a lightweight Polyline object in model space

Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)

cd = plineObj.Length

Debug.Print cd

ZoomAll

 

End Sub

Ôi trời! :)

Lỡ hứa với bạn rồi nên post bài chứ ... như thế này làm sao khá đuợc?!

Cứ mãi là học sinh cấp 4 à ?

Sub TestPL()
   Dim oPline As AcadEntity
   Dim Point As Variant
   Dim i As Integer
   Dim Ct As Integer
   Dim strText As String
   Dim C1, C2

   ThisDrawing.Utility.GetEntity oPline, Point, "Chon LWPolyline:"

   If TypeOf oPline Is AcadLWPolyline Then
       Ct = (UBound(oPline.Coordinates) - 1) / 2
       If oPline.Closed = True Then Ct = Ct + 1
       ReDim Coords(Ct) As Variant
       For i = 0 To Ct - 1
           Coords(i) = oPline.Coordinate(i)
       Next
       If oPline.Closed = True Then
           Coords(Ct) = oPline.Coordinate(0)
       Else
           Coords(Ct) = oPline.Coordinate(Ct)
       End If

       For i = 0 To Ct - 1
           C1 = Coords(i)
           C2 = Coords(i + 1)
           strText = strText & "Chieu dai Segment " & i & " = " & Length2d(C1, C2) & Chr(10)
       Next i

       MsgBox strText
   Else
       MsgBox "Khong phai LWPolyline."
   End If

End Sub

Public Function Length2d(StartPoint As Variant, EndPoint As Variant) As Double
   Dim dX As Double, dY As Double
   dX = StartPoint(0) - EndPoint(0)
   dY = StartPoint(1) - EndPoint(1)
   Length2d = Sqr(dX * dX + dY * dY)
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
uce46    0
Ôi trời! :)

Lỡ hứa với bạn rồi nên post bài chứ ... như thế này làm sao khá đuợc?!

xin lỗi bạn nếu bạn nghĩ mình hỏi câu dễ quá, nhưng mà mình hỏi thủ tục get length của vba để mình có thể lấy chiều dài trong TH đoạn polyline có chứa đoạn cong chẳng hạn, chứ nếu mà chỉ đơn giản những line với nhau rồi dùng công thức tính khoảng cách theo tọa độ thì mình nghĩ bạn đề cao mình quá, học sinh cấp 2 cũng có thể tính đc mà.

+ một điều nữa, nếu ko thích thì cũng ko cần post, đây là diễn đàn tự do mà.

  • 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
gia_bach    1.442
Trong trường hợp mà trong LWPolyline đó có cung tròn thì có thể lấy độ dài của nó đc ko bác gia_bach nhỉ?

Trong t/hợp LWPolyline có cung tròn, bạn sử dụng hàm GetBulge để lấy thông số Bulge.

Với thông số Bulge và tọa độ của 2 điểm đầu và cuối của cung tròn ta có thể tính được độ dài cung tròn đó.

 

xin lỗi bạn nếu bạn nghĩ mình hỏi câu dễ quá, nhưng mà mình hỏi thủ tục get length của vba để mình có thể lấy chiều dài trong TH đoạn polyline có chứa đoạn cong chẳng hạn, chứ nếu mà chỉ đơn giản những line với nhau rồi dùng công thức tính khoảng cách theo tọa độ thì mình nghĩ bạn đề cao mình quá, học sinh cấp 2 cũng có thể tính đc mà.

+ một điều nữa, nếu ko thích thì cũng ko cần post, đây là diễn đàn tự do mà.

Sorry!

Vì đọc VD mà bạn đưa lên thì khó mà có suy nghĩ khác được.

Bạn kiếm đâu đó 1 Sub rồi post lên cho xong chuyện : - tạo Pline đơn giản (line).

 

- thủ tục get length của vba không thể lấy chiều dài của polyline đượ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
uce46    0
Trong t/hợp LWPolyline có cung tròn, bạn sử dụng hàm GetBulge để lấy thông số Bulge.

Với thông số Bulge và tọa độ của 2 điểm đầu và cuối của cung tròn ta có thể tính được độ dài cung tròn đó.

 

Sorry!

Vì đọc VD mà bạn đưa lên thì khó mà có suy nghĩ khác được.

Bạn kiếm đâu đó 1 Sub rồi post lên cho xong chuyện : - tạo Pline đơn giản (line).

 

- thủ tục get length của vba không thể lấy chiều dài của polyline được.

mình sẽ thử xem, dù sao cũng cám ơn bạn rất nhiều, không biết VBA có khả năng sử dụng visuallisp active X (các hàm dạng vla-) không nhỉ? nếu được thì mọi chuyện sẽ đơn giản hơn.

  • 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
ks_chang    2

Mình có thử thông số này như gia_bach góp ý theo vd sau:

Sub Example_SetBulge()
   ' This example creates a lightweight polyline in model space.
   ' It then finds and changes the bulge for a given segment.

   Dim plineObj As AcadLWPolyline
   Dim points(0 To 11) As Double

   ' Define the 2D polyline points
   points(0) = 1: points(1) = 1
   points(2) = 1: points(3) = 2
   points(4) = 2: points(5) = 2
   points(6) = 3: points(7) = 2
   points(8) = 4: points(9) = 4
   points(10) = 4: points(11) = 1

   ' Create a lightweight Polyline object in model space
   Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
   ZoomAll

   ' Find the bulge of the third segment
   Dim currentBulge As Double
   currentBulge = plineObj.GetBulge(3)
   MsgBox "The bulge for the third segment is " & plineObj.GetBulge(3), , "SetBulge Example"

   ' Change the bulge of the third segment
   [b]plineObj.SetBulge 3, -0.5[/b]
   plineObj.Update
   MsgBox "The bulge for the third segment is now " & plineObj.GetBulge(3), , "SetBulge Example"

End Sub

Điểm quan tâm là phương thức plineObj.SetBulge 3, -0.5 thì thông số -0.5 này được hiểu là khoảng cách từ trung điểm đoạn PLine tới đỉnh cung tròn tạo ra. Nhưng giá trị này khi đo là 0.559???

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
gia_bach    1.442
Mình có thử thông số này như gia_bach góp ý theo vd sau:

Sub Example_SetBulge()
   ' This example creates a lightweight polyline in model space.
   ' It then finds and changes the bulge for a given segment.

   Dim plineObj As AcadLWPolyline
   Dim points(0 To 11) As Double

   ' Define the 2D polyline points
   points(0) = 1: points(1) = 1
   points(2) = 1: points(3) = 2
   points(4) = 2: points(5) = 2
   points(6) = 3: points(7) = 2
   points(8) = 4: points(9) = 4
   points(10) = 4: points(11) = 1

   ' Create a lightweight Polyline object in model space
   Set plineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(points)
   ZoomAll

   ' Find the bulge of the third segment
   Dim currentBulge As Double
   currentBulge = plineObj.GetBulge(3)
   MsgBox "The bulge for the third segment is " & plineObj.GetBulge(3), , "SetBulge Example"

   ' Change the bulge of the third segment
   [b]plineObj.SetBulge 3, -0.5[/b]
   plineObj.Update
   MsgBox "The bulge for the third segment is now " & plineObj.GetBulge(3), , "SetBulge Example"

End Sub

Điểm quan tâm là phương thức plineObj.SetBulge 3, -0.5 thì thông số -0.5 này được hiểu là khoảng cách từ trung điểm đoạn PLine tới đỉnh cung tròn tạo ra. Nhưng giá trị này khi đo là 0.559???

Tham khảo : Bulge

Help :

The bulge is the tangent of 1/4 of the included angle for the arc between the selected vertex and the next vertex in the polyline's vertex list.

A negative bulge value indicates that the arc goes clockwise from the selected vertex to the next vertex.

A bulge of 0 indicates a straight segment, and a bulge of 1 is a semicircle.

giá trị bulge là tang của 1/4 góc chắn phần tử (segment).

- Nếu bulge >0 : cung tròn theo ngược chiều kim đồng hồ, ngược lại cùng chiều kim đồng hồ.

- Nếu bulge = 0 : phần tử là đuờng thẳng

- Nếu bulge = 1 : phần tử là đuờng tròn

  • 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

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  

×