new to VB.net, been using VBA for about 10 years. I have a VBA routine that I'm trying to covert to VB.net / objectARX, with some minor funcational refinments. I'd like the user to select polylines and/or 3d polylines & then my routine will do its things to these items that are in a selection set.
Things are working OK up to where I set my ENTITY type variable from the objectID conversion of the ads name of an item in the selection set.
I need to process the coordinates. I have tried various CAST implementations but none work. Can't cast
Autodesk.AutoCAD.DatabaseServices.Polyline to entity or acadentity or acadpolyline.
So how do I get the coordinates of a polyline (or a 3d polyline)?
Solved! Go to Solution.
Solved by Balaji_Ram. Go to Solution.
Hi,
can you show a little bit of code, it's quite difficult to find a mistake someone did without seeing what he/she did. 😉
- alfred -
Since I posted my question have have experimented more & after further investigation,it looks like I'm going to have to use the getpoint3dat method of the Autodesk.AutoCAD.DatabaseServices.Polyline which is the kind of thing I was trying to avoid, since I already have it all worked out in VBA, and was hoping to have to rewrite the whole thing. It looks like there is no way to get an ACADPOLYLINE object out of the GETSELECTION method of the editor.
here is the incomplete code for the begining of my routine, hopefully ffrom this you can tell what is happening, if not I guess I'll post the whole thing. FYI, ACF is a class module with various autocad input functions & containers for objects
Keep in mind I've been experimenting with different things to see what might work
Dim objObj AsObject
'Dim PLObj As AcadLWPolyline
'Dim Plobj As AcadPolyline
Dim PlObj As Autodesk.AutoCAD.DatabaseServices.Polyline
PublicSub vbREPL()
Dim entEntity AsAcadEntity
Dim ent AsEntity
Dim i AsInteger
Dim J AsInteger
Dim idArray AsObjectId()
Dim TransMan As Autodesk.AutoCAD.DatabaseServices.TransactionManager
Dim psResult AsPromptSelectionResult
Dim tXaction AsTransaction
Dim idId As ObjectId
Dim entity As Entity
InitializeREPL() 'sets strPrompt & DefaultSegments
If ACF.SsGetLwPlinesOr3dPolylines() = TrueThen 'continue
If ACF.GetIntFromUser(strPrompt, DefaultSegments) = TrueThen
X =ACF.iResult
Else
Exit Sub
EndIf
idArray =ACF.ssResult.GetObjectIds()
TransMan =ACF.Db.TransactionManager 'start a transaction
tXaction = TransMan.StartTransaction()
Try
ForEach Id In idArray
objObj = TransMan.GetObject(Id, OpenMode.ForRead, True)
ent = CType(objObj, Autodesk.AutoCAD.DatabaseServices.Entity)
' If ent.ObjectName = "AcDbPolyline" Then
'If ent.GetType().FullName = "AcDbPolyline" Then
If ent.GetType().FullName = "Autodesk.AutoCAD.DatabaseServices.Polyline"Then
'entEntity = CType(ent, AcadEntity)
Plobj = ent
' PLObj = Entry
varOrigPLpts = PlObj.Coordinates
PLStPT(0) = varOrigPLpts(0)
PLStPT(1) = varOrigPLpts(1)
PLEndPT(0) = varOrigPLpts(UBound(varOrigPLpts) - 1)
PLEndPT(1) = varOrigPLpts(UBound(varOrigPLpts))
OrigPLptCount = -2
OrigElev = Plobj.Elevation
varPolyElms = Plobj.Explode
Hi,
Can you try this ?
Polyline pl = Tx.GetObject(oid, OpenMode.ForWrite) asPolyline;
AcadLWPolyline acadPl = pl.AcadObject asAcadLWPolyline;
Just thought of posting the whole code that I have been using which works ok :
<CommandMethod("Test")> _ Public Sub TestMethod() Dim activeDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim ed As Editor = activeDoc.Editor Dim db As Database = HostApplicationServices.WorkingDatabase Dim pso As New PromptSelectionOptions() Dim psr As PromptSelectionResult = ed.GetSelection(pso) If psr.Status <> PromptStatus.OK Then Return End If Using Tx As Transaction = db.TransactionManager.StartTransaction() Dim entitites As New ObjectIdCollection(psr.Value.GetObjectIds()) For Each oid As ObjectId In entitites If oid.ObjectClass.Name.Equals("AcDbPolyline") Then Dim pl As Polyline = TryCast(Tx.GetObject(oid, OpenMode.ForWrite), Polyline) Dim acadPl As AcadLWPolyline = TryCast(pl.AcadObject, AcadLWPolyline) Dim isClosed As Boolean = acadPl.Closed End If Next Tx.Commit() End Using End Sub
Hi,
to reproduce what happens to your code we see now what you are doing with objects in your selectionset, but you don't show how you do select objects (and how you set your filtering mechanism for building the selection):
So what happens within "InitializeREPL" and "ACF.SsGetLwPlinesOr3dPolylines"?
>> It looks like there is no way to get an ACADPOLYLINE object out of the GETSELECTION method of the editor.
Of course, there are methods to get them. One option is to select all objects the user selects and while scanning through the objects within the selectionset.This is what Balaji showed in his second sample.
The other option is to define a filter before the user gets asked for selecting entities, define objecttypes to which the selection should get filtered .... and AutoCAD will select only entities that matches the filtering even if the user clicks other object types (they will not be highlighed during "Select Objects: ").
You can see a sample for filtering >>>here<<<, just change:
New DatabaseServices.TypedValue(DatabaseServices.DxfCode.Start, "POINT")
to:
New DatabaseServices.TypedValue(DatabaseServices.DxfCode.Start, "*POLYLINE*")
to get all types of Polyline selected, or change it to:
New DatabaseServices.TypedValue(DatabaseServices.DxfCode.Start, "LWPOLYLINE,3DPOLYLINE")
to select only objects of type LWPolyline or 3DPolyline.
HTH, - alfred -
specifically:
If oid.ObjectClass.Name.Equals("AcDbPolyline") Then
Dim pl As Polyline = TryCast(Tx.GetObject(oid, OpenMode.ForWrite), Polyline)
Dim acadPl As AcadLWPolyline = TryCast(pl.AcadObject, AcadLWPolyline)
End If
ok, onto the next problem:
attached are 2 classes. classACF contains general autocad interaction stuff, including one I'm having problems with called addlwpolyline.
classREPL cantains the main procedure I'm working on. Again, I'm converting a working VBA routine to VB.net & trying to keep as much of the original as possible.
classREPL references classACF.
REPL creates a new polyline(s) based on the one(s) selected, adding vertices based on how many the user wants. The new polyline only has straight segments.
There is also a command called TESTADDPL defined in classACF. This calls the addlwpoly sub & it works.
if I select the polyline created from that within REPL ( as a simple test) a new polyline is not drawn,the vertices check out as I'd except, but no new geometry on screen. Of course I tried polylines that I drew in autocad before running the REPL command, with the same result.
I get no errors.
do I have too many transactions open?
should the transaction at the end of REPL DISPOSE? (tX.Dispose())
is the problem the fact that there already is a polyline occupying that space? (shouldn't be)
I'm I not calling some addition database and/or blockrecordtable methods to get the new polylilne to appear?
OK, I figured it out. the transaction DSIPOSE w/in the REPL procedure had to be moved so that transaction ends before the call to the addlwpolyline sub with has its own transaction begin & end.
Can't find what you're looking for? Ask the community or share your knowledge.