by Luke Davenport
Welcome back! This is the final and 3rd part of my 3 Blogs on iLogic View Representations!
Part 3 – Automatically Check if View Rep Updates are Required.
See Previous Blogs to get up to speed with this. So now we’ve got our auto-created view reps and we can run the Update rules to update them whenever we want. However it’d be nice if the user could ‘create and forget’ the view reps and be prompted when saving/closing the document to update them only if required. Hence Part 3 here.
I’ve pasted the final 2 iLogic rules below. Either (or both) rules should be pasted into an assembly and set to the required event trigger (eg ‘before close document’). It will then run before the document is closed but will only prompt the user to run the ‘Update’ rule if the update is actually required. How refreshing.
Once again – we’ve got 2 rules instead of 1. You may have created the view reps using the ‘Create Contains’ rule (in which case use the ‘Check for Update - Contains’ rule), or the ‘Create Begins’ rule (in which case use the ‘Check for Update - Begins’ rule). – Watch the videos if this doesn’t make sense! Either of these methods will work totally fine in isolation. Otherwise the rules are identical.
Here’s what the ‘Check for Update - Contains’ rule will do when it is run (using an event trigger);
1) Find any existing view reps with a name that starts with ‘Contains’
2) Run a count to see if the visibility quantities displayed in the view rep title are up-to-date.
3) Stop as soon as an out-of-date count is found and ask the user whether they want to update the rules (in this case only the ‘Contains’ rules).
4) If they click ‘Yes’ then run Update rule. If they click ‘No’ then exit.
And yes of course there is a wonderfully informative video
Hope you get some use out of this. Let me know if you have other ideas for some iLogic code you’d like to see!
Luke
---------------------------------------------------------------------------
‘iLogic code starts here;
‘Check for Update - Contains’ Rule;
‘Note I must subscribe to Luke Davenport’s blog – it’ll change my life.
‘http://www.cadlinecommunity.co.uk/Blogs/lukedavenport/Default.aspx
‘And if I am a twitter user I really must follow him.
'define current document
Dim openDoc As Document
openDoc = ThisDoc.Document
Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = openDoc.ComponentDefinition
Dim oViewRep As DesignViewRepresentation
'loop through each view representation in the assembly
For Each oViewRep In oAsmCompDef.RepresentationsManager.DesignViewRepresentations
If oViewRep.Name.Contains("Contains") Then
'Set initial values for component counts
ActualOccCounter = 0
ActualSubOccCounter = 0
'Find current value for Top level component visibility count
CurrentOccCounter = Right(oViewRep.Name,((Len(oViewRep.Name))-oViewRep.Name.Indexof(":")-2))
'Find current value for Sub component visibility count
CurrentSubOccCounter = Right(oViewRep.Name,((Len(oViewRep.Name))-oViewRep.Name.Indexof(",")-2))
'Create string for current contents of view rep (this is located inside the view rep name so needs to be pulled out)
CurrentRepName = Mid(oViewRep.Name,11,Len(oViewRep.Name)-12-((Len(oViewRep.Name))-((oViewRep.Name.Indexof("(")))))
'look at all of the components in the assembly
Dim oCompDef As Inventor.ComponentDefinition = openDoc.ComponentDefinition
'define the first level components collection
Dim oCompOcc As Inventor.ComponentOccurrence
'define the next level components collection
Dim oSubCompOcc As Inventor.ComponentOccurrence
'Check no. of parts in the top level assembly that contain the current view rep name
For Each oCompOcc in oCompDef.Occurrences
If oCompOcc.Suppressed = False Then
If oCompOcc.Name.Contains(CurrentRepName) Then
ActualOccCounter = ActualOccCounter+1
End If
'Check no. of parts in the next level assembly that contain the current view rep name
For Each oSubCompOcc In oCompOcc.SubOccurrences
If oSubCompOcc.Suppressed = False Then
If oSubCompOcc.Name.Contains(CurrentRepName) Then
ActualSubOccCounter = ActualSubOccCounter+1
End If
End If
Next
End If
Next
'Compare actual component counts with the current view rep counts
TestEqual = String.Compare(CStr(ActualOccCounter),CStr(Left(CurrentOccCounter,Len(CStr(ActualOccCounter)))),True)
'Compare actual subcomponent counts with the current view rep counts
SubTestEqual =String.Compare(CStr(ActualSubOccCounter),CStr(Left(CurrentSubOccCounter,Len(CStr(ActualSubOccCounter)))),True)
'if counts don't match then inform user and allow update rules to be run
If TestEqual <> 0 Or SubTestEqual <> 0 Then
UpdateNow = MessageBox.Show("The View Rep Containing '" & CurrentRepName & "' Needs Updating" _
& vbLf & vbLf & "Update All 'Contains' View Reps Now?","iLogic View Representations",MessageBoxButtons.YesNo)
If UpdateNow = vbYes Then
iLogicVb.RunRule("Update Contains")
End If
Return
End If
End If
Next
‘------------------------------------------------------------------------------------------------------------------------------------
Start of ‘Check for Update - Begins’ Rule;
‘Note I must subscribe to Luke Davenport’s blog – it’ll change my life.
‘http://www.cadlinecommunity.co.uk/Blogs/lukedavenport/Default.aspx
'define current document
Dim openDoc As Document
openDoc = ThisDoc.Document
Dim oAsmCompDef As AssemblyComponentDefinition
oAsmCompDef = openDoc.ComponentDefinition
Dim oViewRep As DesignViewRepresentation
'loop through each view representation in the assembly
For Each oViewRep In oAsmCompDef.RepresentationsManager.DesignViewRepresentations
If oViewRep.Name.Contains("Begins") Then
'Set initial values for component counts
ActualOccCounter = 0
ActualSubOccCounter = 0
'Find current value for Top level component visibility count
CurrentOccCounter = Right(oViewRep.Name,((Len(oViewRep.Name))-oViewRep.Name.Indexof(":")-2))
'Find current value for Sub component visibility count
CurrentSubOccCounter = Right(oViewRep.Name,((Len(oViewRep.Name))-oViewRep.Name.Indexof(",")-2))
'Create string for current contents of view rep (this is located inside the view rep name so needs to be pulled out)
CurrentRepName = Mid(oViewRep.Name,9,Len(oViewRep.Name)-10-((Len(oViewRep.Name))-((oViewRep.Name.Indexof("(")))))
'look at all of the components in the assembly
Dim oCompDef As Inventor.ComponentDefinition = openDoc.ComponentDefinition
'define the first level components collection
Dim oCompOcc As Inventor.ComponentOccurrence
'define the next level components collection
Dim oSubCompOcc As Inventor.ComponentOccurrence
'Check no. of parts in the top level assembly that contain the current view rep name
For Each oCompOcc in oCompDef.Occurrences
If oCompOcc.Suppressed = False Then
If Left(oCompOcc.Name,Len(CurrentRepName)) = CurrentRepName Then
ActualOccCounter = ActualOccCounter+1
End If
'Check no. of parts in the next level assembly that contain the current view rep name
For Each oSubCompOcc In oCompOcc.SubOccurrences
If oSubCompOcc.Suppressed = False Then
If Left(oSubCompOcc.Name,Len(CurrentRepName)) = CurrentRepName
ActualSubOccCounter = ActualSubOccCounter+1
End If
End If
Next
End If
Next
'Compare actual component counts with the current view rep counts
TestEqual = String.Compare(CStr(ActualOccCounter),CStr(Left(CurrentOccCounter,Len(CStr(ActualOccCounter)))),True)
'Compare actual subcomponent counts with the current view rep counts
SubTestEqual =String.Compare(CStr(ActualSubOccCounter),CStr(Left(CurrentSubOccCounter,Len(CStr(ActualSubOccCounter)))),True)
'if counts don't match then inform user and allow update rules to be run
If TestEqual <> 0 Or SubTestEqual <> 0 Then
UpdateNow = MessageBox.Show("The View Rep Containing Parts Beginning With '" & CurrentRepName & "' Needs Updating" _
& vbLf & vbLf & "Update All 'Begins' View Reps Now?","iLogic View Representations",MessageBoxButtons.YesNo)
If UpdateNow = vbYes Then
iLogicVb.RunRule("Update Begins")
End If
Return
End If
End If
Next
Comments
0 comments
Please sign in to leave a comment.