.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

given coordinate, find polyline width at that segment

9 REPLIES 9
SOLVED
Reply
Message 1 of 10
wang890
1045 Views, 9 Replies

given coordinate, find polyline width at that segment

i have a set of coordinates, not on the polyline. i want to find the polyline width where that coodinate intersects perpendicular to the polyline (shortest distance). without going through all the vertices.

 

i have a polyline with many segments with varying width, which are constant through the each segments (no taper width). need to read off the "instantaneous" width.

 

just 2dpoly or lwpoly not 3d.

 

i found this

 

http://through-the-interface.typepad.com/through_the_interface/2012/01/testing-whether-a-point-is-on...

 

not quite what i want.

 

thanks

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
9 REPLIES 9
Message 2 of 10
wang890
in reply to: wang890

i thought about going through the polyline vertices one at a time and then take my point and calculate distance. find the shortest distance from that and then record the index where that happens.

 

but i am afraid it may slow down my program. i have 1000 of these to run and if it goes through 1000 vertices could be slow. but i am gonna try it with my way first and hopefully someone has a better way.

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 3 of 10
Jeff_M
in reply to: wang890

A polyline derives froma Curve, so it inherits the GetClosestPointTo() method. With the point you can get the parameter at the point which you can then use to GetStartWidthAt()

Jeff_M, also a frequent Swamper
EESignature
Message 4 of 10
wang890
in reply to: Jeff_M

thanks jeff very helpful. not figured out yet but getting there.

 

where is the help file for all these rare functions? i think there is none. like roughly explains what the arguments you need to feed it do.

 

not just for this but generally for everything.

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 5 of 10
wang890
in reply to: wang890

how do you get closest index giving a point?

 

doesn't have a "GetIndexAt" function

 

the getparameteratpoint returns a double? what is it which parameter does it return?

 

i need to get the index without going through the vertices as this will slow down my subassembly.

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 6 of 10
Alexander.Rivilis
in reply to: wang890


@wang890 wrote:

the getparameteratpoint returns a double? what is it which parameter does it return?


For Polyline parameter is number of vertex. For example parameter == 1 means second vertex, parameter = 2.5 means  middle between third and fourth vertex.

 

What are AcDbCurve/Curve Parameters? ObjectARX/.NET

Getting the Midpoint of each Polyline Segment using ObjectARX

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 7 of 10
wang890
in reply to: Alexander.Rivilis

seen.

i am off testing this now.

 

2.6 of a vertex lol.

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 8 of 10
wang890
in reply to: wang890

works, here's the code

Dim oEmbankmentTypeTarget As WidthOffsetTarget

            Try
                oEmbankmentTypeTarget = oParamsOffsetTarget.Value("TargetHA1")

                Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
                Dim acCurDb As Database = acDoc.Database
                Using lock As DocumentLock = acDoc.LockDocument
                    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
                        '' Open the Block table for read
                        Dim acBlkTbl As BlockTable
                        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)

                        '' Open the Block table record Model space for write
                        Dim acBlkTblRec As BlockTableRecord
                        acBlkTblRec = CType(acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                                        OpenMode.ForWrite), BlockTableRecord)

                        Dim obj As DBObject = acTrans.GetObject(oEmbankmentTypeTarget.TargetId, OpenMode.ForWrite)

                        If TypeOf obj Is Polyline Then
                            Dim oPoly2dOrig As Polyline = CType(obj, Polyline)


                            'get the index where the current station is closest to
                            Dim x, y, z As Double
                            corridorState.SoeToXyz(corridorState.CurrentAlignmentId, corridorState.CurrentStation, 0, 0, x, y, z)
                            Dim oPt3D_CL As New Point3d(x, y, z)

                            'get vertex index (fraction)
                            Dim dVertex As Double = oPoly2dOrig.GetParameterAtPoint(oPoly2dOrig.GetClosestPointTo(oPt3D_CL, True))

                            'get polyline width
                            dSegmentWidth = oPoly2dOrig.GetStartWidthAt(Truncate(dVertex))

                        End If

                    End Using

                End Using
Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19
Message 9 of 10
Alexander.Rivilis
in reply to: wang890

IMHO method Truncate should be replaced with method Round.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 10 of 10
wang890
in reply to: wang890

no, have to round down.

 

say point 0 to 10 is 0.5m wide, 10-20 is 1.0m wide. when hit 9.99 say it is still within the 0.5m geotechnical zone.

 

don't worry i am all good.

 

cheers mate.

Stantec
Dell Precision 5530, Prism M320PU, C3D 14/17/19

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost