<?xml encoding=”UTF-8″>By Balaji Ramamoorthy
If you wish to slice a part and get mass properties of the resulting bodies and the section properties along the section plane, here are the steps that would be needed using the Inventor API :
- Slice the part by creating a “SplitFeature” and using the SplitBody API to retain both the resulting bodies.
-
Create two part documents (either visible or otherwise)
-
Copy the surface bodies created in step-1 to the new part documents.
-
Retrieve the Mass properties from the part documents.
-
To retrieve the section properties, use the bodies created in Step-1 and use the ImprintBodies API to identify the overlapping faces.
-
Get the section property from the overlapping faces using the Face.Evaluator. If you need any further information on the section properties, those can be computed from the Face.EdgeLoops and Face.Edges collection.
Here is a VBA code snippet :
<span>Dim</span><span> oPartDoc <span>As</span><span> PartDocument</span></span>
<span>Set</span><span> oPartDoc = ThisApplication.Documents.Add( _</span>
DocumentTypeEnum.kPartDocumentObject, _
ThisApplication.FileManager.GetTemplateFile(DocumentTypeEnum.kPartDocumentObject))
<span>Dim</span><span> oDef <span>As</span><span> PartComponentDefinition</span></span>
<span>Set</span><span> oDef = oPartDoc.ComponentDefinition</span>
<span>Dim</span><span> oSketch <span>As</span><span> PlanarSketch</span></span>
<span>Set</span><span> oSketch = oDef.Sketches.Add(oDef.WorkPlanes.Item(3))</span>
<span>Dim</span><span> oTG <span>As</span><span> TransientGeometry</span></span>
<span>Set</span><span> oTG = ThisApplication.TransientGeometry</span>
<span>Call</span><span> oSketch.SketchLines.AddAsTwoPointRectangle( _</span>
oTG.CreatePoint2d(0, 0), oTG.CreatePoint2d(6, 3))
<span>Dim</span><span> oProfile <span>As</span><span> Profile</span></span>
<span>Set</span><span> oProfile = oSketch.Profiles.AddForSolid()</span>
<span>Dim</span><span> oBaseExtrude <span>As</span><span> ExtrudeFeature</span></span>
<span>Set</span><span> oBaseExtrude = _</span>
oDef.Features.ExtrudeFeatures.AddByDistanceExtent( _
oProfile, 4, PartFeatureExtentDirectionEnum.kPositiveExtentDirection, _
PartFeatureOperationEnum.kJoinOperation)
<span>Set</span><span> oSketch = oDef.Sketches.Add(oDef.WorkPlanes.Item(3))</span>
<span>Dim</span><span> oLine <span>As</span><span> SketchLine</span></span>
<span>Set</span><span> oLine = oSketch.SketchLines.AddByTwoPoints( _</span>
oTG.CreatePoint2d(2, -1), oTG.CreatePoint2d(3, 2))
<span>Set</span><span> oLine = oSketch.SketchLines.AddByTwoPoints( _</span>
oLine.EndSketchPoint, oTG.CreatePoint2d(2, 4))
<span>Set</span><span> oProfile = oSketch.Profiles.AddForSurface()</span>
<span>Dim</span><span> oCutExtrude <span>As</span><span> ExtrudeFeature</span></span>
<span>Set</span><span> oCutExtrude = _</span>
oDef.Features.ExtrudeFeatures.AddByDistanceExtent( _
oProfile, 5, PartFeatureExtentDirectionEnum.kPositiveExtentDirection, _
PartFeatureOperationEnum.kSurfaceOperation)
<span>Dim</span><span> oWorkSurface <span>As</span><span> WorkSurface</span></span>
<span>Set</span><span> oWorkSurface = oCutExtrude.SurfaceBody.Parent</span>
<span' Create a split feature with split body<span> </span>
<span>Dim</span><span> oSplit <span>As</span><span> SplitFeature</span></span>
<span>Set</span><span> oSplit = oDef.Features.SplitFeatures.SplitBody( _</span>
oWorkSurface, oDef.SurfaceBodies(1))
<span>Dim</span><span> oMatrix <span>As</span><span> Matrix</span></span>
<span>Set</span><span> oMatrix = ThisApplication.TransientGeometry.CreateMatrix</span>
oMatrix.SetTranslation _
ThisApplication.TransientGeometry.CreateVector(0, 0, 10)
<span' Mass properties of first body<span> </span>
<span>Dim</span><span> oPartDoc1 <span>As</span><span> PartDocument</span></span>
<span>Set</span><span> oPartDoc1 = ThisApplication.Documents.Add(kPartDocumentObject, _</span>
ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject), <span>False</span><span> )</span>
oPartDoc1.FullFileName = "C:\Temp\Part1.ipt"
<span>Dim</span><span> oBody1 <span>As</span><span> SurfaceBody</span></span>
<span>Set</span><span> oBody1 = oDef.SurfaceBodies.Item(1)</span>
<span>Call</span><span> oPartDoc1.ComponentDefinition.Features.NonParametricBaseFeatures.Add( _</span>
oBody1, oMatrix)
<span' Optional<span> </span>
<span' Call oPartDoc1.Save<span> </span>
<span>Dim</span><span> oMassProps1 <span>As</span><span> MassProperties</span></span>
<span>Set</span><span> oMassProps1 = oPartDoc1.ComponentDefinition.MassProperties</span>
oMassProps1.CacheResultsOnCompute = <span>False</span><span> </span>
<span>Dim</span><span> M1 <span>As</span><span> <span>Double</span><span> </span></span></span>
M1 = oMassProps1.Mass
<span>Dim</span><span> Volume1 <span>As</span><span> <span>Double</span><span> </span></span></span>
Volume1 = oMassProps1.Volume
<span' Display mass properties of the first surface body<span> </span>
MsgBox "Mass 1 : (kg) " & M1 & vbNewLine & "Volume 1: (cm^3) " _
& Volume1, vbInformation, "Split Body-1"
<span' Mass properties of second body<span> </span>
<span' Invisible new part document<span> </span>
<span>Dim</span><span> oPartDoc2 <span>As</span><span> PartDocument</span></span>
<span>Set</span><span> oPartDoc2 = ThisApplication.Documents.Add(kPartDocumentObject, _</span>
ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject), <span>False</span><span> )</span>
oPartDoc2.FullFileName = "C:\Temp\Part2.ipt"
<span>Dim</span><span> oBody2 <span>As</span><span> SurfaceBody</span></span>
<span>Set</span><span> oBody2 = oDef.SurfaceBodies.Item(2)</span>
<span>Call</span><span> oPartDoc2.ComponentDefinition.Features.NonParametricBaseFeatures.Add( _</span>
oBody2, oMatrix)
<span' Optional<span> </span>
<span' Call oPartDoc2.Save<span> </span>
<span>Dim</span><span> oMassProps2 <span>As</span><span> MassProperties</span></span>
<span>Set</span><span> oMassProps2 = oPartDoc2.ComponentDefinition.MassProperties</span>
oMassProps2.CacheResultsOnCompute = <span>False</span><span> </span>
<span>Dim</span><span> M2 <span>As</span><span> <span>Double</span><span> </span></span></span>
M2 = oMassProps2.Mass
<span>Dim</span><span> Volume2 <span>As</span><span> <span>Double</span><span> </span></span></span>
Volume2 = oMassProps2.Volume
<span' Display mass properties of the second surface body<span> </span>
MsgBox "Mass 2 : (kg) " & M2 & vbNewLine & "Volume 2: (cm^3) " _
& Volume2, vbInformation, "Split Body-2"
<span' Body imprint to find overlap faces of the split bodies<span> </span>
<span>Dim</span><span> newBody1 <span>As</span><span> SurfaceBody</span></span>
<span>Dim</span><span> newBody2 <span>As</span><span> SurfaceBody</span></span>
<span>Dim</span><span> body1OverlapFaces <span>As</span><span> Faces</span></span>
<span>Dim</span><span> body2OverlapFaces <span>As</span><span> Faces</span></span>
<span>Dim</span><span> body1OverlapEdges <span>As</span><span> Edges</span></span>
<span>Dim</span><span> body2OverlapEdges <span>As</span><span> Edges</span></span>
<span>Call</span><span> ThisApplication.TransientBRep.ImprintBodies( _</span>
oBody1, oBody2, <span>True</span><span> , _</span>
newBody1, newBody2, body1OverlapFaces, body2OverlapFaces, _
body1OverlapEdges, body2OverlapEdges)
<span>For</span><span> i = 1 <span>To</span><span> body1OverlapFaces.Count</span></span>
<span>Dim</span><span> overlapFace1 <span>As</span><span> <span>Face</span><span> </span></span></span>
<span>Set</span><span> overlapFace1 = body1OverlapFaces.Item(i)</span>
MsgBox "Section Area (cm^2) : " & overlapFace1.Evaluator.Area
<span>Next</span>

Leave a Reply