I wonder if you can make ilogic/VBA program.
that works similarly to bounding box, you have in CAM. so you can make a solid that represent the stock based on the part.
can you have you have the flexibility to increase the size, on the different sides.
and then you will get a cutting info for the material.
Solved! Go to Solution.
Solved by JelteDeJong. Go to Solution.
The easiest function (that has no flexibility) looks like this. Creating a visual representation is more difficult and will add depending on what you want features to your model. is that what you want?
Sub Main() Dim doc As PartDocument = ThisDoc.Document Dim uom = doc.UnitsOfMeasure For Each body As SurfaceBody In doc.ComponentDefinition.SurfaceBodies Dim box As Box = body.RangeBox Dim x As Double = ConvertToDefault(uom, box.MaxPoint.X - box.MinPoint.X) Dim y As Double = ConvertToDefault(uom, box.MaxPoint.Y - box.MinPoint.Y) Dim z As Double = ConvertToDefault(uom, box.MaxPoint.Z - box.MinPoint.Z) Dim msg = String.Format("Body: '{0}': x:{1} y:{2} z:{3}", body.Name, x, y, z) MsgBox(msg) Next End Sub Private Function ConvertToDefault(uom As UnitsOfMeasure, value As Double) Return uom.ConvertUnits(value, UnitsTypeEnum.kDatabaseLengthUnits, UnitsTypeEnum.kDefaultDisplayLengthUnits) End Function
Jelte de Jong
Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.
Blog: hjalte.nl - github.com
' Get the current Part document. Dim partDoc As PartDocument = ThisDoc.Document ' Get the TransientBRep and TransientGeometry objects. Dim transBRep As TransientBRep = ThisApplication.TransientBRep Dim transGeom As TransientGeometry = ThisApplication.TransientGeometry ' Combine all bodies in Part into a single transient Surface Body. Dim combinedBodies As SurfaceBody = Nothing For Each surfBody As SurfaceBody In partDoc.ComponentDefinition.SurfaceBodies If combinedBodies Is Nothing Then combinedBodies = transBRep.Copy(surfBody) Else transBRep.DoBoolean(combinedBodies, surfBody, BooleanTypeEnum.kBooleanTypeUnion) End If Next ' Get the oriented mininum range box of all bodies in Part. ' NOTE: "OrientedMinimumRangeBox" was added in Inventor 2020.3/2021. Dim minBox As OrientedBox = combinedBodies.OrientedMinimumRangeBox ' Get length of each side of mininum range box. Dim dir1 As Double = minBox.DirectionOne.Length Dim dir2 As Double = minBox.DirectionTwo.Length Dim dir3 As Double = minBox.DirectionThree.Length ' Convert lengths to document's length units. Dim uom As UnitsOfMeasure = partDoc.UnitsOfMeasure dir1 = uom.ConvertUnits(dir1, "cm", uom.LengthUnits) dir2 = uom.ConvertUnits(dir2, "cm", uom.LengthUnits) dir3 = uom.ConvertUnits(dir3, "cm", uom.LengthUnits) ' Sort lengths from smallest to largest. Dim lengths As New List(Of Double) From {dir1, dir2, dir3 } lengths.Sort Dim minLength As Integer = lengths(0) Dim midLength As Integer = lengths(1) Dim maxLength As Integer = lengths(2) ' Create surface to represent oriented range box... ' Create starting box with dimensions of oriented rangebox. Dim startBox As Box = transGeom.CreateBox() Dim boxMaxPoint As Point = transGeom.CreatePoint(minBox.DirectionOne.Length, minBox.DirectionTwo.Length, minBox.DirectionThree.Length) startBox.Extend(boxMaxPoint) ' Create transformation matrix to move box to correct location/orientation. Dim transMatrix As Matrix = ThisApplication.TransientGeometry.CreateMatrix transMatrix.SetCoordinateSystem(minBox.CornerPoint, minBox.DirectionOne.AsUnitVector.AsVector, minBox.DirectionTwo.AsUnitVector.AsVector, minBox.DirectionThree.AsUnitVector.AsVector) ' Create surface body for the range box. Dim minBoxSurface As SurfaceBody = ThisApplication.TransientBRep.CreateSolidBlock(startBox) ' Transform range box surface body to the correct location/orientation. ThisApplication.TransientBRep.Transform(minBoxSurface, transMatrix) ' Display range box on screen. Dim transac As Transaction = ThisApplication.TransactionManager.StartTransaction(partDoc, "DisplayRangeBox") Dim cGraphics As ClientGraphics Try cGraphics = partDoc.ComponentDefinition.ClientGraphicsCollection.Add("OrientedRangeBox") Dim surfacesNode As GraphicsNode = cGraphics.AddNode(1) Dim surfGraphics As SurfaceGraphics = surfacesNode.AddSurfaceGraphics(minBoxSurface) Dim targetAppearance As Asset Try targetAppearance = partDoc.Assets.Item("Clear - Blue") Catch Dim sourceAppearance As Asset = ThisApplication.AssetLibraries.Item("314DE259-5443-4621-BFBD-1730C6CC9AE9").AppearanceAssets.Item("InvGen-001-1-2") ' "Clear - Blue" targetAppearance = sourceAppearance.CopyTo(partDoc) End Try surfacesNode.Appearance = targetAppearance ThisApplication.ActiveView.Update ' Display message with minimum rangebox size. MessageBox.Show("Oriented Minimum Rangebox Size: " & minLength.ToString("#.###") & " x " & midLength.ToString("#.###") & " x " & maxLength.ToString("#.###"), "Oriented Minimum Rangebox", MessageBoxButtons.OK, MessageBoxIcon.Information) Finally ' Remove range box from screen. transac.Abort ThisApplication.ActiveView.Update End Try iProperties.Value("Custom", "Material") = "Z" & minLength.ToString("#.###") + 5 & " Y" & midLength.ToString("#.###") + 5 & " X" & maxLength.ToString("#.###") + 5 iProperties.Value("Custom", "Min Material") = minLength.ToString("#.###") & " x " & midLength.ToString("#.###") & " x " & maxLength.ToString("#.###") iProperties.Value("Custom", "X") = minLength.ToString("#.###") iProperties.Value("Custom", "Y") = midLength.ToString("#.###") iProperties.Value("Custom", "Z") = maxLength.ToString("#.###")
Private Sub UserForm_Click()
' Get the active part document.
Dim invPartDoc As PartDocument
Set invPartDoc = ThisApplication.ActiveDocument
' Get the custom property set.
Dim invCustomPropertySet As PropertySet
Set invCustomPropertySet = invPartDoc.PropertySets.Item("Inventor User Defined Properties")
'******
Dim length As Property
Dim width As Property
Dim height As Property
'******
Set length = invCustomPropertySet.Item("X")
Set width = invCustomPropertySet.Item("Y")
Set height = invCustomPropertySet.Item("Z")
'******
'MsgBox length.Value
txtW.Text = length.Value
txtH.Text = width.Value
txtD.Text = height.Value
End Sub
does this work for you?
Sub Main() Dim margin1 = 1 ' cm Dim margin2 = 1 ' cm Dim margin3 = 1 ' cm ' Get the current Part document. Dim partDoc As PartDocument = ThisDoc.Document ' Get the TransientBRep and TransientGeometry objects. Dim transBRep As TransientBRep = ThisApplication.TransientBRep Dim transGeom As TransientGeometry = ThisApplication.TransientGeometry ' Combine all bodies in Part into a single transient Surface Body. Dim combinedBodies As SurfaceBody = Nothing For Each surfBody As SurfaceBody In partDoc.ComponentDefinition.SurfaceBodies If combinedBodies Is Nothing Then combinedBodies = transBRep.Copy(surfBody) Else transBRep.DoBoolean(combinedBodies, surfBody, BooleanTypeEnum.kBooleanTypeUnion) End If Next ' Get the oriented mininum range box of all bodies in Part. ' NOTE: "OrientedMinimumRangeBox" was added in Inventor 2020.3/2021. Dim minBox As OrientedBox = combinedBodies.OrientedMinimumRangeBox ' Create starting box with dimensions of oriented rangebox. Dim startBox As Box = transGeom.CreateBox() Dim boxMaxPoint As Point = transGeom.CreatePoint( minBox.DirectionOne.Length + margin1, minBox.DirectionTwo.Length + margin2, minBox.DirectionThree.Length + margin3) startBox.Extend(boxMaxPoint) Dim boxMinPoint As Point = transGeom.CreatePoint(-margin1, -margin2, -margin3) startBox.Extend(boxMinPoint) ' Create surface body for the range box. Dim minBoxSurface As SurfaceBody = ThisApplication.TransientBRep.CreateSolidBlock(startBox) ' Create transformation matrix to move box to correct location/orientation. Dim transMatrix As Matrix = ThisApplication.TransientGeometry.CreateMatrix transMatrix.SetCoordinateSystem( minBox.CornerPoint, minBox.DirectionOne.AsUnitVector.AsVector, minBox.DirectionTwo.AsUnitVector.AsVector, minBox.DirectionThree.AsUnitVector.AsVector) 'Dim transMatrix2 As Matrix = ThisApplication.TransientGeometry.CreateMatrix 'transMatrix2.SetTranslation(transGeom.CreateVector(-margin, -margin, -margin)) 'transMatrix.TransformBy(transMatrix2) ' Transform range box surface body to the correct location/orientation. ThisApplication.TransientBRep.Transform(minBoxSurface, transMatrix) Dim cGraphics As ClientGraphics = CreateBox(partDoc, minBoxSurface) ' Get length of each side of mininum range box. Dim dir1 As Double = minBox.DirectionOne.Length Dim dir2 As Double = minBox.DirectionTwo.Length Dim dir3 As Double = minBox.DirectionThree.Length ' Convert lengths to document's length units. Dim uom As UnitsOfMeasure = partDoc.UnitsOfMeasure dir1 = uom.ConvertUnits(dir1, UnitsTypeEnum.kDatabaseLengthUnits, uom.LengthUnits) dir2 = uom.ConvertUnits(dir2, UnitsTypeEnum.kDatabaseLengthUnits, uom.LengthUnits) dir3 = uom.ConvertUnits(dir3, UnitsTypeEnum.kDatabaseLengthUnits, uom.LengthUnits) ' Sort lengths from smallest to largest. Dim lengths As New List(Of Double) From {dir1, dir2, dir3} lengths.Sort() Dim minLength As Integer = lengths(0) Dim midLength As Integer = lengths(1) Dim maxLength As Integer = lengths(2) ' Display message with minimum rangebox size. MessageBox.Show("Oriented Minimum Rangebox Size: " & minLength.ToString("#.###") & " x " & midLength.ToString("#.###") & " x " & maxLength.ToString("#.###"), "Oriented Minimum Rangebox", MessageBoxButtons.OK, MessageBoxIcon.Information) iProperties.Value("Custom", "Material") = "Z" & minLength.ToString("#.###") + 5 & " Y" & midLength.ToString("#.###") + 5 & " X" & maxLength.ToString("#.###") + 5 iProperties.Value("Custom", "Min Material") = minLength.ToString("#.###") & " x " & midLength.ToString("#.###") & " x " & maxLength.ToString("#.###") iProperties.Value("Custom", "X") = minLength.ToString("#.###") iProperties.Value("Custom", "Y") = midLength.ToString("#.###") iProperties.Value("Custom", "Z") = maxLength.ToString("#.###") cGraphics.Delete() End Sub Private Function CreateBox(partDoc As Document, surface As Object) As ClientGraphics Dim cGraphics As ClientGraphics cGraphics = partDoc.ComponentDefinition.ClientGraphicsCollection.Add("OrientedRangeBox") Dim surfacesNode As GraphicsNode = cGraphics.AddNode(1) Dim surfGraphics As SurfaceGraphics = surfacesNode.AddSurfaceGraphics(surface) Dim targetAppearance As Asset Try targetAppearance = partDoc.Assets.Item("Clear - Blue") Catch Dim sourceAppearance As Asset = ThisApplication.AssetLibraries.Item("314DE259-5443-4621-BFBD-1730C6CC9AE9").AppearanceAssets.Item("InvGen-001-1-2") ' "Clear - Blue" targetAppearance = sourceAppearance.CopyTo(partDoc) End Try surfacesNode.Appearance = targetAppearance ThisApplication.ActiveView.Update() Return cGraphics End Function
Jelte de Jong
Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.
Blog: hjalte.nl - github.com
hello and thank you.
it is absolutely a step in the right direction.
I need the blue to be a solid not just a presentation.
if I can make a solid Bounding box, then we get big step on the way
try this:
Dim margin1 = 1 ' cm Dim margin2 = 1 ' cm Dim margin3 = 1 ' cm ' Get the current Part document. Dim partDoc As PartDocument = ThisDoc.Document ' Get the TransientBRep and TransientGeometry objects. Dim transBRep As TransientBRep = ThisApplication.TransientBRep Dim transGeom As TransientGeometry = ThisApplication.TransientGeometry ' Combine all bodies in Part into a single transient Surface Body. Dim combinedBodies As SurfaceBody = Nothing For Each surfBody As SurfaceBody In partDoc.ComponentDefinition.SurfaceBodies If combinedBodies Is Nothing Then combinedBodies = transBRep.Copy(surfBody) Else transBRep.DoBoolean(combinedBodies, surfBody, BooleanTypeEnum.kBooleanTypeUnion) End If Next ' Get the oriented mininum range box of all bodies in Part. ' NOTE: "OrientedMinimumRangeBox" was added in Inventor 2020.3/2021. Dim minBox As OrientedBox = combinedBodies.OrientedMinimumRangeBox ' Create starting box with dimensions of oriented rangebox. Dim startBox As Box = transGeom.CreateBox() Dim boxMaxPoint As Point = transGeom.CreatePoint( minBox.DirectionOne.Length + margin1, minBox.DirectionTwo.Length + margin2, minBox.DirectionThree.Length + margin3) startBox.Extend(boxMaxPoint) Dim boxMinPoint As Point = transGeom.CreatePoint(-margin1, -margin2, -margin3) startBox.Extend(boxMinPoint) ' Create surface body for the range box. Dim minBoxSurface As SurfaceBody = ThisApplication.TransientBRep.CreateSolidBlock(startBox) ' Create transformation matrix to move box to correct location/orientation. Dim transMatrix As Matrix = ThisApplication.TransientGeometry.CreateMatrix transMatrix.SetCoordinateSystem( minBox.CornerPoint, minBox.DirectionOne.AsUnitVector.AsVector, minBox.DirectionTwo.AsUnitVector.AsVector, minBox.DirectionThree.AsUnitVector.AsVector) 'Dim transMatrix2 As Matrix = ThisApplication.TransientGeometry.CreateMatrix 'transMatrix2.SetTranslation(transGeom.CreateVector(-margin, -margin, -margin)) 'transMatrix.TransformBy(transMatrix2) ' Transform range box surface body to the correct location/orientation. ThisApplication.TransientBRep.Transform(minBoxSurface, transMatrix) ' Create a base body feature of the result. Dim nonParamFeatures As NonParametricBaseFeatures = partDoc.ComponentDefinition.Features.NonParametricBaseFeatures Dim nonParamDef As NonParametricBaseFeatureDefinition = nonParamFeatures.CreateDefinition Dim tObjs As TransientObjects = ThisApplication.TransientObjects Dim objs As ObjectCollection = tObjs.CreateObjectCollection objs.Add(minBoxSurface) nonParamDef.BRepEntities = objs nonParamDef.OutputType = BaseFeatureOutputTypeEnum.kSolidOutputType nonParamFeatures.AddByDefinition(nonParamDef) ' Get length of each side of mininum range box. Dim dir1 As Double = minBox.DirectionOne.Length Dim dir2 As Double = minBox.DirectionTwo.Length Dim dir3 As Double = minBox.DirectionThree.Length ' Convert lengths to document's length units. Dim uom As UnitsOfMeasure = partDoc.UnitsOfMeasure dir1 = uom.ConvertUnits(dir1, UnitsTypeEnum.kDatabaseLengthUnits, uom.LengthUnits) dir2 = uom.ConvertUnits(dir2, UnitsTypeEnum.kDatabaseLengthUnits, uom.LengthUnits) dir3 = uom.ConvertUnits(dir3, UnitsTypeEnum.kDatabaseLengthUnits, uom.LengthUnits) ' Sort lengths from smallest to largest. Dim lengths As New List(Of Double) From {dir1, dir2, dir3} lengths.Sort() Dim minLength As Integer = lengths(0) Dim midLength As Integer = lengths(1) Dim maxLength As Integer = lengths(2) ' Display message with minimum rangebox size. MessageBox.Show("Oriented Minimum Rangebox Size: " & minLength.ToString("#.###") & " x " & midLength.ToString("#.###") & " x " & maxLength.ToString("#.###"), "Oriented Minimum Rangebox", MessageBoxButtons.OK, MessageBoxIcon.Information) iProperties.Value("Custom", "Material") = "Z" & minLength.ToString("#.###") + 5 & " Y" & midLength.ToString("#.###") + 5 & " X" & maxLength.ToString("#.###") + 5 iProperties.Value("Custom", "Min Material") = minLength.ToString("#.###") & " x " & midLength.ToString("#.###") & " x " & maxLength.ToString("#.###") iProperties.Value("Custom", "X") = minLength.ToString("#.###") iProperties.Value("Custom", "Y") = midLength.ToString("#.###") iProperties.Value("Custom", "Z") = maxLength.ToString("#.###")
Jelte de Jong
Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.
Blog: hjalte.nl - github.com