• Blog posts

    Bio

    by Luke Davenport

    Hi comrades,

     

    Virtual parts in Inventor – they're very useful in cases where you don't need the actual geometry of a part (for clearance, fits, etc.), but you need the correct quantity and properties of a part in the BOM or parts list. A common application would be adding consumables (Loctite, grease) to your parts list, or even fasteners, as bolts and nuts in large quantities can certainly weigh down your assembly.

     

    Getting the quantity of these bolts to update automatically if the size of the model changes is a perfect application for iLogic. I've produced a simple iLogic rule that does the following:

     

    Note: when copying and pasting this code into an iLogic rule, make sure you don't copy the explanation text!

     

    1)      Uses a single line of code at the top to calculate the number of virtual parts required. In this case I've got a parameter called 'Length' in my assembly file

     

        ' Calculate required number of virtual parts

        ' (In this case I want a screw placed every 100mm)

        QTY = Floor(CDbl(Length)/100)

     

    2)  Then makes a collection of the current virtual parts in the assembly file.

       

        Dim asmDoc As AssemblyDocument

        asmDoc = ThisDoc.ModelDocument

       

        Dim oOccs As ComponentOccurrences

        oOccs = asmDoc.ComponentDefinition.Occurrences

       

        ' Create collection to hold virtual parts

        Dim oVPs As ObjectCollection

        oVPs = ThisApplication.TransientObjects.CreateObjectCollection

           

        ' Add to collection of virtual parts

        For Each oOcc As ComponentOccurrence In oOccs

            If TypeOf oOcc.Definition Is VirtualComponentDefinition Then

                oVPs.Add(oOcc)

            End If

        Next

     

    3)  Then adds or removes virtual parts as required. Note you will need to insert the properties you'd like your virtual part to have in the code below (unless you'd like it to be called 'Cadline Self Tapping Screw' J

       

        Dim identity As Matrix = ThisApplication.TransientGeometry.CreateMatrix

       

        Dim virtOcc As ComponentOccurrence

        If oVPs.Count > 0 Then

            virtocc = oVPs.Item(1)

        Else

            virtOcc = oOccs.AddVirtual("CADLINE SELF TAPPING SCREW - SIZE 1", identity)

            ' Set properties of virtual part

            iProperties.Value(virtOcc.Name, "Project", "Part Number") = "INSERT PART NUMBER HERE"

            iProperties.Value(virtOcc.Name, "Project", "Description") = "INSERT DESCRIPTION HERE"

            iProperties.Value(virtOcc.Name, "Project", "Stock Number") = "INSERT STOCK NUMBER HERE"

            oVPs.Add(virtOcc)

        End If

       

        ' Compare actual to required

        If QTY > oVPs.Count Then ' Add more virtual parts

            For aaa = 1 To QTY - oVPs.Count

                Call oOccs.AddByComponentDefinition(virtOcc.Definition, identity)

            Next

        Else If QTY < oVPs.Count ' Remove virtual parts

            RemoveQTY = oVPs.Count - QTY

            For bbb = oVPs.Count To QTY + 1 Step -1

                oVPs.Item(bbb).Delete

            Next   

        End If

     

    4)      And that's it. If you set this iLogic rule to run automatically whenever your controlling parameter changes (or upon a document save operation) you'll be all set up, and the virtual part quantity should always be correct.

     

    Notes:

    a)      Remember you can use ANY number in your model to control the number of virtual parts, as required. Think outside the box.

    b)      You may want to put a few lines at the top of the rule to check that the current document is an assembly document, as you can't add virtual parts to a part or drawing file! Something like this….

     

    'check this file is an assembly

    Checkdoc = ThisDoc.ModelDocument

    If Checkdoc.DocumentType = kPartDocumentObject Then

    MessageBox.Show("This rule can only be run in an assembly file!", "Cadline iLogic")

    Return

    End If