<CommandMethod("GetBound")> _
Public Shared Sub RunGetBound()
Dim dwg As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = dwg.Editor
Dim entIds As ObjectId() = SelectEntities(ed)
If entIds IsNot Nothing Then
DrawBoundBox(dwg, entIds)
End If
Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt()
End Sub
Private Shared Function SelectEntities(ByVal ed As Editor) As ObjectId()
Dim opt As New PromptSelectionOptions()
opt.MessageForAdding = "Select:"
Dim res As PromptSelectionResult = ed.GetSelection(opt)
If res.Status = PromptStatus.OK Then
Return res.Value.GetObjectIds()
Else
Return Nothing
End If
End Function
Private Shared Sub DrawBoundBox(ByVal dwg As Document, ByVal entIds As ObjectId())
Using tran As Transaction = dwg.TransactionManager.StartTransaction()
Dim ext As Extents3d = GetBoundBox(entIds, tran)
Dim poly As Polyline = DrawPolygon(ext)
Dim space As BlockTableRecord = TryCast(tran.GetObject(dwg.Database.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
space.AppendEntity(poly)
tran.AddNewlyCreatedDBObject(poly, True)
tran.Commit()
End Using
End Sub
Private Shared Function GetBoundBox(ByVal entIds As ObjectId(), ByVal tran As Transaction) As Extents3d
Dim ex As New Extents3d()
For Each id As Object In entIds
Dim ent As Entity = TryCast(tran.GetObject(id, OpenMode.ForRead), Entity)
ex.AddExtents(ent.GeometricExtents)
Next
Return ex
End Function
Private Shared Function DrawPolygon(ByVal ext As Extents3d) As Polyline
Dim pl As New Polyline(4)
pl.AddVertexAt(0, New Point2d(ext.MinPoint.X, ext.MinPoint.Y), 0.0, 0.0, 0.0)
pl.AddVertexAt(1, New Point2d(ext.MinPoint.X, ext.MaxPoint.Y), 0.0, 0.0, 0.0)
pl.AddVertexAt(2, New Point2d(ext.MaxPoint.X, ext.MaxPoint.Y), 0.0, 0.0, 0.0)
pl.AddVertexAt(3, New Point2d(ext.MaxPoint.X, ext.MinPoint.Y), 0.0, 0.0, 0.0)
pl.Closed = True
pl.SetDatabaseDefaults()
Return pl
End Function
Public Shared Sub RunGetBound()
Dim dwg As Document = Application.DocumentManager.MdiActiveDocument
Dim ed As Editor = dwg.Editor
Dim entIds As ObjectId() = SelectEntities(ed)
If entIds IsNot Nothing Then
DrawBoundBox(dwg, entIds)
End If
Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt()
End Sub
Private Shared Function SelectEntities(ByVal ed As Editor) As ObjectId()
Dim opt As New PromptSelectionOptions()
opt.MessageForAdding = "Select:"
Dim res As PromptSelectionResult = ed.GetSelection(opt)
If res.Status = PromptStatus.OK Then
Return res.Value.GetObjectIds()
Else
Return Nothing
End If
End Function
Private Shared Sub DrawBoundBox(ByVal dwg As Document, ByVal entIds As ObjectId())
Using tran As Transaction = dwg.TransactionManager.StartTransaction()
Dim ext As Extents3d = GetBoundBox(entIds, tran)
Dim poly As Polyline = DrawPolygon(ext)
Dim space As BlockTableRecord = TryCast(tran.GetObject(dwg.Database.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
space.AppendEntity(poly)
tran.AddNewlyCreatedDBObject(poly, True)
tran.Commit()
End Using
End Sub
Private Shared Function GetBoundBox(ByVal entIds As ObjectId(), ByVal tran As Transaction) As Extents3d
Dim ex As New Extents3d()
For Each id As Object In entIds
Dim ent As Entity = TryCast(tran.GetObject(id, OpenMode.ForRead), Entity)
ex.AddExtents(ent.GeometricExtents)
Next
Return ex
End Function
Private Shared Function DrawPolygon(ByVal ext As Extents3d) As Polyline
Dim pl As New Polyline(4)
pl.AddVertexAt(0, New Point2d(ext.MinPoint.X, ext.MinPoint.Y), 0.0, 0.0, 0.0)
pl.AddVertexAt(1, New Point2d(ext.MinPoint.X, ext.MaxPoint.Y), 0.0, 0.0, 0.0)
pl.AddVertexAt(2, New Point2d(ext.MaxPoint.X, ext.MaxPoint.Y), 0.0, 0.0, 0.0)
pl.AddVertexAt(3, New Point2d(ext.MaxPoint.X, ext.MinPoint.Y), 0.0, 0.0, 0.0)
pl.Closed = True
pl.SetDatabaseDefaults()
Return pl
End Function
[本日志由 tiancao1001 于 2018-01-16 00:03 AM 编辑]
|
暂时没有评论
发表评论 - 不要忘了输入验证码哦! |