Guest Post by Jelte de Jong

Over the years, I have created several assemblies containing many parts with various iLogic rules, generally they work perfectly. But sometimes for seemingly no reason, an edge case will not work as expected, and is usually discovered by a colleague. The challenge is that I then need to find the rule that is responsible for the problem. Often I know more or less what to look for, but out of the box, there is no iLogic search command that will look through all of the parts and all of the rules in an assembly.
Lately I have been playing around with the Inventor API in iLogic. iLogic has some nice functions that can help a lot if you’re making configurators. For example the possibility to run rules in SilentOperation mode and later read out the exceptions that were thrown. But that is for another blog post. Using iLogic, I can loop through all of the rules in a document and get the text contained in the rule. This helped me to write an iLogic utility that solves the previously described problem.
I created a rule that that can search all rules in each part in an assembly (or just in a part). To use this iLogic utility, just save it as a external rule. Check that the variable “outputFile” is pointing to a file location that you have write access to. (it’s not necessary to create the file. It will be created if its not there.)

When you run the rule you will see an input box. Fill in a text that you are looking for. Notepad will be stared with the search results. It will look something like this:
Note that this external rule searches the content of all internal rules.

Here is the rule:
'Code by Jelte de Jong Originally posted at https://clintbrown.co.uk/one-rule-to-search-them-all---guest-post
Public Class ThisRule
Private searchText As String
Private iLogicAddinGuid As String = "{3BDD8D79-2179-4B11-8A5A-257B1C0263AC}"
Private iLogicAddin As ApplicationAddIn = Nothing
Private iLogicAutomation = Nothing
Private outputFile As String = "c:\TEMP\seachedRules.txt"
Sub Main()
If (IO.File.Exists(outputFile)) Then
IO.File.Delete(outputFile)
End If
searchText = InputBox("Text to search for", "Search")
iLogicAddin = ThisApplication.ApplicationAddIns.ItemById(
"{3bdd8d79-2179-4b11-8a5a-257b1c0263ac}")
iLogicAutomation = iLogicAddin.Automation
Dim doc As AssemblyDocument = ThisDoc.Document
searchDoc(doc)
For Each refDoc As Document In doc.AllReferencedDocuments
searchDoc(refDoc)
Next
Process.Start("notepad.exe", outputFile)
End Sub
Private Sub searchDoc(doc As Document)
Dim rules = iLogicAutomation.Rules(doc)
If (rules Is Nothing) Then Return
For Each rule In rules
Dim strReader As IO.StringReader = New IO.StringReader(rule.Text)
Dim i As Integer = 1
Do While (True)
Dim line As String
line = strReader.ReadLine()
If line Is Nothing Then Exit Do
If (line.ToUpper().Contains(searchText.ToUpper())) Then
Dim nl = System.Environment.NewLine
IO.File.AppendAllText(outputFile,
"Doc name : " & doc.DisplayName & nl &
"Rule name: " & rule.Name & nl &
"line " & i & " : " & line.Trim() & nl & nl)
End If
i = i + 1
Loop
Next
End Sub
End Class
About the Author:
Jelte de Jong works for a company that creates custom heat exchangers. He has used Inventor for over 10 years. Jelte has worked mostly as a mechanical engineer, but in recent years he has combined his hobby (programming) with his professional life. He now works as a software/mechanical engineer. His main task is supporting the drawing office by creating and maintaining configurable models and Inventor add-ins.

Find Jelte de Jong on Linkedin (https://nl.linkedin.com/in/jeltedejong)
To find out more about becoming an Unofficial Guest Blogger, click here:
You must be logged in to post a comment.