<CommandMethod("InvertECS")> _
Public Sub InvertECS()
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
'pick the solid
Dim peo As New PromptEntityOptions(vbLf & "Select a 3D solid: ")
peo.SetRejectMessage(vbLf & "Invalid selection...")
peo.AddAllowedClass(GetType(Solid3d), True)
Dim per As PromptEntityResult = ed.GetEntity(peo)
If per.Status <> PromptStatus.OK Then
Return
End If
Dim Id As ObjectId = per.ObjectId
'start transaction
Using Tr As Transaction = db.TransactionManager.StartTransaction()
'get the solid
Dim sol As Solid3d = DirectCast(Tr.GetObject(Id, OpenMode.ForWrite), Solid3d)
'get the solid mass properties
Dim mprops As Solid3dMassProperties = sol.MassProperties
Dim origin As Point3d = mprops.Centroid
Dim solX As Vector3d = mprops.PrincipalAxes(0)
Dim solY As Vector3d = mprops.PrincipalAxes(1)
Dim solZ As Vector3d = mprops.PrincipalAxes(2)
'entity coordinate system from mass properties
Dim ECS As New CoordinateSystem3d(origin, solX, solY)
'world coordinate system
Dim WCS As New CoordinateSystem3d(New Point3d(0, 0, 0), New Vector3d(1, 0, 0), New Vector3d(0, 1, 0))
'transformation matrix
Dim TrMatrix As New Matrix3d()
TrMatrix = Matrix3d.AlignCoordinateSystem(ECS.Origin, _
ECS.Xaxis, _
ECS.Yaxis, _
ECS.Zaxis, _
WCS.Origin, _
WCS.Xaxis, _
WCS.Yaxis, _
WCS.Zaxis)
'transform the solid
sol.TransformBy(TrMatrix)
'save for now to check results
Tr.Commit()
End Using
End Sub