View Full Version : Entities and Handles

2004-09-23, 04:42 PM
How do you pull an entity if you know it's handle?
dim myArc as AcadArc

set myArc = ????

or it it is not possible, I have actually trimmed a circle and I am now trying to find out it's end points. "myEntity.EndPoint" does not work.

Ed Jobe
2004-09-23, 04:48 PM

It would be helpful if you were to show a little more code than "myEntity.EndPoint".

2004-09-23, 06:26 PM
Below is a simple version of what I am trying to do. I am stuck at the bottom to Testing. I trimmed a circle and now I am trying to get the arc's end points.

'before running test, draw a closed Poly Line and a Circle centered at the end
Sub Testing()
Dim myCircle As AcadCircle, myPolyLine As AcadPolyline
Dim tempObj As AcadObject, basePt As Variant

'selectCircle lets the user select a existing circle
Set myCircle = selectCircle

'set the base point to the circle's center
basePt = myCircle.Center
'delete the circle because we do not need it

Set tempObj = selectPolyLine(basePt)

If tempObj.EntityName = "" Then GoTo NO_POLYLINE
On Error GoTo 0

'modify drawing
Dim circle1 As AcadCircle, circle2 As AcadCircle, circle3 As AcadCircle
Dim line1 As AcadLine, tempEntity As AcadEntity, arc1 As AcadArc
Dim TrimSide As Variant, trimString As String

TrimSide = ThisDrawing.Utility.GetPoint(, "Select outside of objects.")
Set circle3 = dCircle(basePt, 2#)
Set line1 = dLine(basePt, TrimSide)

trimString = Trim(Str(TrimSide(0))) & "," & _
Trim(Str(TrimSide(1))) & "," & _

ThisDrawing.SendCommand "_trim" & vbCr & vbCr & trimString & vbCr & vbCr

TrimSide = line1.EndPoint
If TrimSide(0) = basePt(0) And _
TrimSide(1) = basePt(1) Then TrimSide = line1.StartPoint

trimString = Trim(Str(TrimSide(0))) & "," & _
Trim(Str(TrimSide(1))) & "," & _

Set line1 = Nothing
'it will not let me use "line1.Delete" (because you just set line1 to Nothing) Therefore use undo
ThisDrawing.SendCommand "u u "

Set tempEntity = dCircle(basePt, 2#)
ThisDrawing.SendCommand "_trim" & vbCr & vbCr & trimString & vbCr & vbCr

'I need to get the endpoints of the circle which is now an arc and then delete the arc.
'debug.Print tempEntity.EndPoing(0) 'does not work
'debug.Print tempEntity.Center(0) 'does not work
'Once you trim the circle, there is no more circle, it gets deleted and an arc is created.
'Therefore, tempEntity is no longer set.
'You could use basept to select the arc like you selected the poly earlier or use Last.
Exit Sub
MsgBox "Interior object is not a Poly Line. Program Haulted!!!"

End Sub

'***Select Commands

Public Function selectCircle() As AcadObject
Dim myCircle As AcadObject, basePnt As Variant

Set selectCircle = Nothing

On Error Resume Next

Err = 123
While Err <> 0
ThisDrawing.Utility.GetEntity selectCircle, basePnt, "Select an Circle:"

If selectCircle.EntityName = "AcDbCircle" Then
MsgBox "The object is not a Circle. Please select a Circle."
End If
On Error GoTo 0
End Function

Public Function selectPolyLine(basePnt As Variant) As AcadEntity ' AcadObject 'AcadPolyline
Dim SS As AcadSelectionSet, myObj As AcadEntity ' AcadObject

On Error Resume Next

Set SS = ThisDrawing.SelectionSets.Add("SS001")
SS.SelectAtPoint (basePnt)

Set selectPolyLine = SS.Item(0)

' Set selectPolyLine = myObj
' selectPolyLine.Layer = "hello"
If Err = 0 Then
If selectPolyLine.EntityName = "AcDbPolyline" Then
'do nothing
Set selectPolyLine = Nothing
Set selectPolyLine = SS
End If
End If
End Function

'***Drawing commands
Public Function dLine(FirstPoint As Variant, SecondPoint As Variant) As AcadLine

Set dLine = ThisDrawing.ModelSpace.AddLine(FirstPoint, SecondPoint)
End Function

Public Function dCircle(CenterPoint As Variant, CircleRadius As Double) As AcadCircle
Set dCircle = ThisDrawing.ModelSpace.AddCircle(CenterPoint, CircleRadius)
End Function

2004-09-23, 09:54 PM
Try using the following with the actual handle you have for the object. If you know the actual object type you can also dimension it as such.

Dim SomeObj As AcadObject
Set SomeObj = ThisDrawing.HandleToObject("3dch5")

This Will make SomeObj = to the object of the noted handle. So if the handle belongs to a circle SomeObj will be that circle etc. This is good because handles are good from session to session.

Ed Jobe
2004-09-23, 10:03 PM
See my comments in Red within your post.