Community
Inventor Programming - iLogic, Macros, AddIns & Apprentice
Inventor iLogic, Macros, AddIns & Apprentice Forum. Share your knowledge, ask questions, and explore popular Inventor topics related to programming, creating add-ins, macros, working with the API or creating iLogic tools.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

a dynamic box?

6 REPLIES 6
SOLVED
Reply
Message 1 of 7
kim.salvesen
759 Views, 6 Replies

a dynamic box?

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.

6 REPLIES 6
Message 2 of 7
JelteDeJong
in reply to: kim.salvesen

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.

EESignature


Blog: hjalte.nl - github.com

Message 3 of 7
kim.salvesen
in reply to: JelteDeJong

Hello thanks for quick reply
 
I shall try to explain my case, we are a small machine shop
we use Fusion 360 on the cam side.
 
when I do quotation to apart
I need to know how big the stock is going to be, to get the price on the stock and the material.
so this is the main purpose on the application.
 
on the stock we need to make it a little bit bigger.
so this is why I want to be able to adjust the size.
 
and I figure I don't need to do the work two times
that's why I want the solid to represent the stock.
so basically I do all the prep in Inventor
 
then I don't need to do the work again Fusion 360 when I pushed apart to Fusion.
 
this is what I come up with so far.
but in the picture you can see the blue but it is only a visual representation and I can't adjust it.
and here is the code
 
' 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("#.###")


 
and I also try something in vba

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

 

 

I Am brand new to inventor so I deeply appreciate the help.
 
 
 
 
 
 
 
Message 4 of 7
JelteDeJong
in reply to: kim.salvesen

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.

EESignature


Blog: hjalte.nl - github.com

Message 5 of 7
kim.salvesen
in reply to: kim.salvesen

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 

 

Message 6 of 7
JelteDeJong
in reply to: kim.salvesen

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.

EESignature


Blog: hjalte.nl - github.com

Message 7 of 7
kim.salvesen
in reply to: JelteDeJong

Thank you very much it helps so much 😃

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report