Đến nội dung


Hình ảnh
- - - - -

Hỏi về polyline


  • Please log in to reply
8 replies to this topic

#1 uce46

uce46

    biết zoom

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

Đã gửi 19 January 2011 - 08:17 AM

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

#2 uce46

uce46

    biết zoom

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

Đã gửi 19 January 2011 - 11:46 AM

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

#3 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 19 January 2011 - 03:34 PM

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

  • 0

#4 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 19 January 2011 - 05:16 PM

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

#5 uce46

uce46

    biết zoom

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

Đã gửi 19 January 2011 - 05:21 PM

Ô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à.
  • -1

#6 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 19 January 2011 - 09:20 PM

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

#7 uce46

uce46

    biết zoom

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

Đã gửi 19 January 2011 - 10:35 PM

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

#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 20 January 2011 - 01:47 PM

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

#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 20 January 2011 - 02:01 PM

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

  • 1