' VB ' ****************************************************************************** ' Preconditions: Part is open and contains a body. ' Postconditions: Body is tessellated. ' ****************************************************************************** Dim swApp As SldWorks.SldWorks Dim swBody As SldWorks.Body2 Dim swModel As SldWorks.ModelDoc2 Dim swFace As SldWorks.Face2 Dim swTessellation As SldWorks.Tessellation Dim swSketchLine As SldWorks.SketchLine Dim swPart As SldWorks.PartDoc Dim vBodies As Variant Dim aBodies As Variant Dim aFacetIds As Variant Dim aFinIds() As Integer Dim aVertexIds() As Integer Dim aVertexCoords1() As Double Dim aVertexCoords2() As Double Dim bResult As Boolean Dim iNumVertices As Integer Dim iNumFacets As Integer Dim iNumFacetIds As Integer Dim iNumBodies As Long Dim iNumSolidBodies As Integer Dim iNumSheetBodies As Integer Dim iFacetIdIdx As Integer Dim iFinIdx As Integer Dim nBodyType As Integer Dim b As Integer Dim title As String Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc swModel.ClearSelection2 True title = swModel.GetTitle Set swPart = swModel ' Get bodies vBodies = swPart.GetBodies2(swSolidBody, True) ' Cast to an array of bodies aBodies = vBodies iNumBodies = UBound(vBodies) iNumSolidBodies = 0 iNumSheetBodies = 0 ' Loop through array For b = 0 To iNumBodies - 1 ' Get a body and apply cast Set swBody = aBodies(b) ' Call a method on a body nBodyType = swBody.GetType() If nBodyType = SwConst.swBodyType_e.swSheetBody Then iNumSheetBodies = iNumSheetBodies + 1 ElseIf nBodyType = SwConst.swBodyType_e.swSolidBody Then iNumSolidBodies = iNumSolidBodies + 1 End If Set swFace = Nothing Set swTessellation = Nothing bResult = False ' Pass in null so the whole body will be tessellated swTessellation = swBody.GetTessellation(Null) ' Set up the Tessellation object ' Required data swTessellation.NeedFaceFacetMap = True swTessellation.NeedVertexParams = True swTessellation.NeedVertexNormal = True ' How to handle matches across common edges swTessellation.MatchType = SwConst.swTesselationMatchType_e.swTesselationMatchFacetTopology ' Do it bResult = swTessellation.Tessellate() ' Get the number of vertices and facets iNumVertices = swTessellation.GetVertexCount() iNumFacets = swTessellation.GetFacetCount() ' Get the facet data per face ' Add sketch for this body ' Speed things up swModel.SetAddToDB True swModel.SetDisplayWhenAdded False ' Insert sketch swModel.Insert3DSketch2 False ' Loop over faces Set swFace = swBody.GetFirstFace() While swFace <> Null aFacetIds = swTessellation.GetFaceFacets(swFace) iNumFacetIds = aFacetIds.Length For iFacetIdIdx = 0 To iNumFacetIds - 1 aFinIds = swTessellation.GetFacetFins(aFacetIds(iFacetIdIdx)) ' There should always be three fins per facet For iFinIdx = 0 To 2 aVertexIds = swTessellation.GetFinVertices(aFinIds(iFinIdx)) ' Should always be two vertices per fin aVertexCoords1 = swTessellation.GetVertexPoint(aVertexIds(0)) aVertexCoords2 = swTessellation.GetVertexPoint(aVertexIds(1)) ' Create a line Set swSketchLine = swModel.CreateLine2(aVertexCoords1(0), aVertexCoords1(1), aVertexCoords1(2), _ aVertexCoords2(0), aVertexCoords2(1), aVertexCoords2(2)) Next iFinIdx Next iFacetIdIdx Set swFace = swFace.GetNextFace() ' Close sketch swModel.Insert3DSketch2 (True) ' Clear selection for next pass swModel.ClearSelection2 (True) ' Restore settings swModel.SetAddToDB (False) swModel.SetDisplayWhenAdded (True) Wend Next b End Sub ' C# ' ****************************************************************************************** 'Tessellate a Body Example (C#) 'This example shows how to tessellate a body. ' ****************************************************************************************** ' ' Preconditions: Part is open and contains a body. ' ' Postconditions: Body is tessellated. ' '-------------------------------------------------- using System; using SldWorks; namespace ConsoleApplication1 { class Class1 { /// /// Main entry point for the application /// [STAThread] static void Main(string[] args) { // Connect to SolidWorks SldWorks.SldWorks swApp = new SldWorks.SldWorksClass(); // Get the active document SldWorks.ModelDoc2 swModel = swApp.IActiveDoc2; // Get the document title String title = swModel.GetTitle(); // Cast down to a part SldWorks.PartDoc swPart = (SldWorks.PartDoc)swModel; // Variant is returned, which can be dealt with as an object // Variant represents an array of references System.Object vBodies; System.Array aBodies; // Get bodies vBodies = swPart.GetBodies2((int)SwConst.swBodyType_e.swAllBodies, false); // Cast to an array of bodies aBodies = (System.Array)vBodies; int iNumBodies = aBodies.Length; int iNumSolidBodies = 0; int iNumSheetBodies = 0; // Loop through array SldWorks.Body2 swBody; for (int b = 0; b < iNumBodies; b++) { // Get a body and apply cast swBody = (SldWorks.Body2)aBodies.GetValue(b); // Now call a method on a body int nBodyType = swBody.GetType(); if (nBodyType == (int)SwConst.swBodyType_e.swSheetBody) { iNumSheetBodies++; } if (nBodyType == (int)SwConst.swBodyType_e.swSolidBody) { iNumSolidBodies++; SldWorks.Face2 swFace = null; SldWorks.Tessellation swTessellation = null; bool bResult = false; // Pass in null so the whole body will be tessellated swTessellation = (Tessellation)swBody.GetTessellation(null); // Set up the Tessellation object // Required data swTessellation.NeedFaceFacetMap = true; swTessellation.NeedVertexParams = true; swTessellation.NeedVertexNormal = true; // How to handle matches across common edges swTessellation.MatchType = (int)SwConst.swTesselationMatchType_e.swTesselationMatchFacetTopology; // Do it bResult = swTessellation.Tessellate(); // Get the number of vertices and facets int iNumVertices = swTessellation.GetVertexCount(); int iNumFacets = swTessellation.GetFacetCount(); // Now get the facet data per face int[] aFacetIds; int iNumFacetIds; int[] aFinIds; int[] aVertexIds; double[] aVertexCoords1; double[] aVertexCoords2; // Add sketch for this body // Speed things up swModel.SetAddToDB(true); swModel.SetDisplayWhenAdded(false); // Insert sketch swModel.Insert3DSketch2(false); // Loop over faces swFace = (Face2)swBody.GetFirstFace(); while (swFace != null) { aFacetIds = (int[])swTessellation.GetFaceFacets(swFace); iNumFacetIds = aFacetIds.Length; for (int iFacetIdIdx = 0; iFacetIdIdx < iNumFacetIds; iFacetIdIdx++) { aFinIds = (int[])swTessellation.GetFacetFins(aFacetIds[iFacetIdIdx]); // There should always be three fins per facet for (int iFinIdx= 0; iFinIdx < 3; iFinIdx++) { aVertexIds = (int[])swTessellation.GetFinVertices(aFinIds[iFinIdx]); // Should always be two vertices per fin aVertexCoords1 = (double[])swTessellation.GetVertexPoint(aVertexIds[0]); aVertexCoords2 = (double[])swTessellation.GetVertexPoint(aVertexIds[1]); // Create a line swModel.CreateLine2(aVertexCoords1[0], aVertexCoords1[1], aVertexCoords1[2], aVertexCoords2[0], aVertexCoords2[1], aVertexCoords2[2]); } } swFace = (Face2)swFace.GetNextFace(); } // Close sketch swModel.Insert3DSketch2(true); // Clear selection for next pass swModel.ClearSelection2(true); // Restore settings swModel.SetAddToDB (false); swModel.SetDisplayWhenAdded(true); } } return; } } }