08-14-2020
12:08 AM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
08-14-2020
12:08 AM
Try this code, it should work ![]()
The difficult part here was to find the direction to searc for the faces in the panels that is not selected, since there are an infinite number of perpendicular faces to those two selected. I ended up using the edges of one of the faces outer edgeloop to get the directions to investigate.
Now it works as requested in your original post.
Sub Main Dim oAsm As AssemblyDocument = ThisDoc.Document Dim oDef As AssemblyComponentDefinition = oAsm.ComponentDefinition Dim oTG As TransientGeometry = ThisApplication.TransientGeometry Dim cmdM As CommandManager = ThisApplication.CommandManager Dim oOcc1 As ComponentOccurrence = cmdM.Pick(SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Pick first panel.") If oOcc1 Is Nothing Then Exit Sub Dim oOcc2 As ComponentOccurrence = cmdM.Pick(SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Pick second panel.") If oOcc2 Is Nothing Then Exit Sub Dim oCol As ObjectCollection = ThisApplication.TransientObjects.CreateObjectCollection Dim oPt1 As Point = oOcc1.MassProperties.CenterOfMass Dim oPt2 As Point = oOcc2.MassProperties.CenterOfMass Dim oPt1Pt2 As Vector = oPt1.VectorTo(oPt2) 'Find first two planes: Dim oFirstFaces As ObjectsEnumerator = oDef.FindUsingVector(oPt1, oPt1Pt2.AsUnitVector, {SelectionFilterEnum.kPartFacePlanarFilter }) 'Add the two first planes found (inside planes) to collection oCol.Add(oFirstFaces(1)) oCol.Add(oFirstFaces(2)) 'Move oPt1 to be the centerpoint of the partition oPt1Pt2.ScaleBy(1 / 2) oPt1.TranslateBy(oPt1Pt2) 'Use the outer edgeloop of one of the faces to get directions for finding the other faces For Each oLoop As EdgeLoopProxy In oFirstFaces(1).EdgeLoops If oLoop.IsOuterEdgeLoop For Each oEdge As EdgeProxy In oLoop.Edges If TypeOf (oEdge.Geometry) Is LineSegment Dim oLine As LineSegment = oEdge.Geometry Dim oFoundEnts As ObjectsEnumerator = _ oDef.FindUsingVector(oPt1, oLine.Direction, _ {SelectionFilterEnum.kPartFacePlanarFilter }) If oFoundEnts.Count > 0 Dim oInvVector As UnitVector = oTG.CreateUnitVector _ (oLine.Direction.X * -1, oLine.Direction.Y * -1, oLine.Direction.Z * -1) Dim oFoundEnts2 As ObjectsEnumerator = _ oDef.FindUsingVector(oPt1, oInvVector, _ {SelectionFilterEnum.kPartFacePlanarFilter }) If oFoundEnts2.Count > 0 oCol.Add(oFoundEnts(1)) oCol.Add(oFoundEnts2(1)) End If End If End If Next Exit For End If Next For Each oFace As FaceProxy In oCol AddWorkPlaneInAssembly(oAsm, oFace, 0) Next End Sub Sub AddWorkPlaneInAssembly(oAsm As AssemblyDocument, oFace As Object, oOffset As Double) Dim oDef As AssemblyComponentDefinition = oAsm.ComponentDefinition Dim oOriginPnt As Point Dim oXaxis, oYaxis As UnitVector oOriginPnt = ThisApplication.TransientGeometry.CreatePoint(0, 0, 0) oXaxis = ThisApplication.TransientGeometry.CreateUnitVector(1, 0, 0) oYaxis = ThisApplication.TransientGeometry.CreateUnitVector(0, 1, 0) Dim oPlane As WorkPlane = oDef.WorkPlanes.AddFixed(oOriginPnt, oXaxis, oYaxis) oPlane.AutoResize = True oDef.Constraints.AddFlushConstraint(oFace, oPlane, oOffset) oPlane.AutoResize = False End Sub
The result in your latest picture will be obtained by selecting theese two components (with no respect to selection order)
Jhoel Forshav
Download my free Inventor Addin - Hole Projector
LinkedIn | Ideas | Contributions | Blog posts | Website