Updating old drawings with iLogic rules

Updating old drawings with iLogic rules

Anonymous
Not applicable
1,080 Views
6 Replies
Message 1 of 7

Updating old drawings with iLogic rules

Anonymous
Not applicable

I've created a macro (VBA) which updates old drawings to the new templates borders and styles etc. These new templates have iLogic rules which also need to be transferred to the drawings, along with the triggers. I'm able to call external rules when I run this macro but I need them to have the right trigger. iTriggers only work with internal rules(?) which the old templates don't have and although this http://beinginventive.typepad.com/being-inventive/2012/02/injecting-ilogic-code-and-ilogic-event-tri... kind of does the right thing I can't expect everyone to have to open it and add the correct rules when they're updating a drawing- any suggestions?

0 Likes
1,081 Views
6 Replies
Replies (6)
Message 2 of 7

MegaJerk
Collaborator
Collaborator

To clarify, would you like to apply some Event Triggers or iTriggers to Internal or External rules?



If my solution worked or helped you out, please don't forget to hit the kudos button 🙂
iLogicCode Injector: goo.gl/uTT1IB

GitHub
0 Likes
Message 3 of 7

Anonymous
Not applicable

Event Trigger to external rules is what I'm going with (sorry for the rambling) but they need to be set up through VBA

0 Likes
Message 4 of 7

Anonymous
Not applicable

@MegaJerk Do you think this can be done?

0 Likes
Message 5 of 7

MegaJerk
Collaborator
Collaborator

My bad on not getting back to you sooner.

Is it possible?

Absolutely… but, it’s going to be a journey.

Another question I have is, how many external rules need eventTriggers, and which types of eventTriggers are you interested in using (that is - Before Save, On Model Change, etc. etc.)??



If my solution worked or helped you out, please don't forget to hit the kudos button 🙂
iLogicCode Injector: goo.gl/uTT1IB

GitHub
0 Likes
Message 6 of 7

Anonymous
Not applicable

There are only a few rules and I'd like the triggers to be on exit, on save and on opening

0 Likes
Message 7 of 7

Curtis_Waguespack
Consultant
Consultant

Hi aliceloneragan,

 

 I use this to copy event triggers from my templates. I set up external rules with event triggers in the templates, and then I have this "Copy Event Triggers rule" called from various other external rules as needed. I almost never use internal rules.

 

Keep in mind, I repurposed a rule I found on line, and so there is likely some extra stuff in there that is not needed, etc. I never did go back through it and clean it up.

 

 

Here is a batch processor also:

http://forums.autodesk.com/t5/inventor-general-discussion/any-way-to-automatically-update-all-relate...

 

I hope this helps.
Best of luck to you in all of your Inventor pursuits,
Curtis
http://inventortrenches.blogspot.com

 

 

 

 

 

 

Imports System.Collections.Generic
'code taken and modified from:
'http://adndevblog.typepad.com/manufacturing/2015/01/add-external-ilogic-rule-to-event-trigger.html

Sub Main
Trace.WriteLine("Event Driven Rules Copy", "iLogic") 'debug 

	Dim oTemplateDoc As Document
	Dim oTemplate As String 
	
	'check file type 
	If ThisApplication.ActiveEditDocument.DocumentType = kDrawingDocumentObject Then
	'If ThisDoc.Document.DocumentType = kDrawingDocumentObject Then
		oTemplate = "\\server\departments\CAD\Inventor\Templates\Standard.idw"   'file to copy events from
	ElseIf ThisApplication.ActiveEditDocument.DocumentType = kPartDocumentObject Then
	'ElseIf ThisDoc.Document.DocumentType = kPartDocumentObject Then
		oTemplate = "\\server\departments\CAD\Inventor\Templates\Standard.ipt"   'file to copy events from
	Else
		oTemplate = "\\server\departments\CAD\Inventor\Templates\Standard.iam"   'file to copy events from
	End If
	
	'file to copy events to
	oInput =  ThisApplication.ActiveEditDocument.FullFileName 
	If oInput = "" Then 'catch a new file with no path
		Return
	End If	
	
	'open the template
	oTemplateDoc = ThisApplication.Documents.Open(oTemplate, False)
	CopyEventsToDocuments(oTemplateDoc)
	oTemplateDoc.Close 
End Sub

Private Const m_ourGuid As String = "{2C540830-0723-455E-A8E2-891722EB4C3E}"
Private savedEnabled As Boolean
Dim oInput As String

Public Sub CopyEventsToDocuments(ByVal sourceDoc As Document)
	Dim sourcePropSet As PropertySet = GetEventRulesPropertySet(sourceDoc)
	Dim inputs() As String = { oInput} 
	Dim destinationFileNames As List(Of String) = New List(Of String)(inputs)
	If (destinationFileNames Is Nothing) Then Return
	savedEnabled = iLogicVb.Automation.RulesOnEventsEnabled
	iLogicVb.Automation.RulesOnEventsEnabled = False
	Try	
		CopyEventsToAllDocuments(sourcePropSet, sourceDoc, destinationFileNames)
	Finally		
		iLogicVb.Automation.RulesOnEventsEnabled = savedEnabled
	End Try

End Sub

Function GetEventRulesPropertySet(ByVal sourceDoc As Document) As PropertySet
	Try
		Return sourceDoc.PropertySets(m_ourGuid)
	Catch ex As Exception
		Return Nothing
	End Try
End Function

Function VerifyRulesPropertySet(ByVal propSet As PropertySet) As Boolean
	If (propSet Is Nothing) Then Return True
	' See if any rules are internal instead of external.  We can't copy those.
	For Each prop As Inventor.Property In propSet
		Dim strValue As String = prop.Value.ToString
		If (Not strValue.StartsWith("file://")) Then Return False
	Next
	Return True
End Function


Sub CopyEventsToAllDocuments(ByVal sourcePropSet As PropertySet, ByVal sourceDoc As Document, ByVal destinationFileNames As List(Of String))
	For Each fileName As String In destinationFileNames
		If (String.Equals(sourceDoc.FullFileName, fileName)) Then Continue For
		CopyEventsToDocument(sourcePropSet, fileName)
	Next
End Sub

Sub CopyEventsToDocument(ByVal sourcePropSet As PropertySet, ByVal fileName As String)
	'Dim doc As Document = FindOpenDocument(fileName)

	Dim openedHere As Boolean = False

	If (doc Is Nothing) Then
		doc = ThisApplication.Documents.Open(fileName, True)
		openedHere = True
	End If
		
	CopyEventsPropertySetToDocument(sourcePropSet, doc)
	iLogicVb.Automation.RulesOnEventsEnabled = savedEnabled

End Sub

Sub CopyEventsPropertySetToDocument(ByVal sourcePropSet As PropertySet, ByVal doc As Document)
	' If an event-driven rules property set already exists, delete it.
	Dim oldPropSet As PropertySet = GetEventRulesPropertySet(doc)
	If (oldPropSet IsNot Nothing) Then
		oldPropSet.Delete()
	End If
	If (sourcePropSet Is Nothing OrElse sourcePropSet.Count = 0) Then Return
	Dim destPropSet As PropertySet = doc.PropertySets.Add("_iLogicEventsRules", m_ourGuid)
	For Each prop As Inventor.Property In sourcePropSet
		destPropSet.Add(prop.Value, prop.Name, prop.PropId)
	Next
	EnsureDocumentInterest(doc)
End Sub

Const iLogicId As String = "{3bdd8d79-2179-4b11-8a5a-257b1c0263ac}"

Sub EnsureDocumentInterest(ByVal doc As Document)
	If (ThisApplication.SoftwareVersion.Major < 15) Then Return ' Inventor 2010 or before
	If (DocumentHasiLogicInterest(doc)) Then Return
	Dim dataVersion As Integer = 20090512
	Dim newInterest As DocumentInterest = doc.DocumentInterests.Add(iLogicId, "iLogic", DocumentInterestTypeEnum.kInterested, dataVersion, Nothing)
End Sub

Function DocumentHasiLogicInterest(ByVal doc As Document) As Boolean
	Dim interest As DocumentInterest = FindDocumentInterest(doc, iLogicId)
	If (interest IsNot Nothing) Then
		If (interest.InterestType = DocumentInterestTypeEnum.kInterested) Then
			Return True
		End If
		interest.Delete()
	End If
	Return False
End Function

Function FindDocumentInterest(ByVal doc As Document, ByVal clientId As String) As DocumentInterest
	For Each interest As DocumentInterest In doc.DocumentInterests
		If (String.Equals(interest.ClientId, clientId, StringComparison.OrdinalIgnoreCase)) Then
			Return interest
		End If
	Next
	Return Nothing
End Function

EESignature

0 Likes