Greetings everyone,
Back again for a little help. Obligatory I code like a toddler preface.
What I'm trying to do is put guard rails in place for a manual BOM entry to designate part finish.
Long story short, we've worked on a roundabout way of creating a rule that creates Material_Finish as a multi-value parameter, that then gets transcribed to "Authority" because you can only use Standard iProperties in view label creations.
The rules created, are causing issues, so I think it's best to just cut out the middle person and directly populate the Authority property we've chosen to designate finish, with some guards in place.
Problem is, the code I attempted works to check a list... but I would like it to just check the list and report back if the specified finish isn't in the list. Currently it does that, but it throws 3 message boxes at you.
I'd simply like to check a list and report back IF the finish ISN'T in the list at all. Also it would be nice if it would check all occurrences in an assembly, currently I think this would only check the active document
Code attached below, and many thanks in advance,
Gabe
testString = iProperties.Value("Design tracking Properties", "Authority") Dim List As New ArrayList List.add("GALV") List.add("ARTIST") List.add("RAW") List.add("POWDER COAT") Dim Ostring As Object i = 0 For Each Ostring In List If testString.Contains(List.Item(i)) Then 'MessageBox.Show(List.Item(i) & ": was found!", "iLogic") Else MessageBox.Show("Invalid Finish.", "Finish") End If i= i+1 Next
Solved! Go to Solution.
Greetings everyone,
Back again for a little help. Obligatory I code like a toddler preface.
What I'm trying to do is put guard rails in place for a manual BOM entry to designate part finish.
Long story short, we've worked on a roundabout way of creating a rule that creates Material_Finish as a multi-value parameter, that then gets transcribed to "Authority" because you can only use Standard iProperties in view label creations.
The rules created, are causing issues, so I think it's best to just cut out the middle person and directly populate the Authority property we've chosen to designate finish, with some guards in place.
Problem is, the code I attempted works to check a list... but I would like it to just check the list and report back if the specified finish isn't in the list. Currently it does that, but it throws 3 message boxes at you.
I'd simply like to check a list and report back IF the finish ISN'T in the list at all. Also it would be nice if it would check all occurrences in an assembly, currently I think this would only check the active document
Code attached below, and many thanks in advance,
Gabe
testString = iProperties.Value("Design tracking Properties", "Authority") Dim List As New ArrayList List.add("GALV") List.add("ARTIST") List.add("RAW") List.add("POWDER COAT") Dim Ostring As Object i = 0 For Each Ostring In List If testString.Contains(List.Item(i)) Then 'MessageBox.Show(List.Item(i) & ": was found!", "iLogic") Else MessageBox.Show("Invalid Finish.", "Finish") End If i= i+1 Next
Solved! Go to Solution.
Solved by A.Acheson. Go to Solution.
Here is a rule that should fit the bill for you. Instead of looping through occurrences the rule searches the reference documents of the assembly and checks the iProperty Authority against the supplied list. Regarding the custom iProperty in the view label can you share why that wouldn't work for you? That would be the logical place to put an iProperty like this.
Sub Main FinishList.Add("GALV") FinishList.Add("ARTIST") FinishList.Add("RAW") FinishList.Add("POWDER COAT") Dim oAsm As AssemblyDocument = ThisDoc.Document For Each oDoc As Document In oAsm.AllReferencedDocuments 'Traverse all referenced documents Dim DesignProp As PropertySet = oDoc.PropertySets.Item("Design Tracking Properties") Dim oAut As [Property] = DesignProp.Item("Authority") Dim Check As Boolean = FinishCheck(oAut.Value)'Function to check iprop against Finish List If Check = False Then If oDoc.DocumentType = DocumentTypeEnum.kPartDocumentObject Then Dim oPartDef As PartComponentDefinition = oDoc.ComponentDefinition If Not oPartDef.IsContentMember Then 'Remove content center parts Dim FileName As String = Left(oDoc.DisplayName, Len(oDoc.DisplayName) -3) Dim FinName As String If oAut.Value = Nothing Then FinName = "None" Else FinName = oAut.Value End If ErrorList.Add( FileName & " With finish of - " & FinName) End If End If End If Next d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish") End Sub Dim ErrorList As New ArrayList Dim FinishList As New ArrayList Function FinishCheck(testString As String ) As Boolean For Each sFinish In FinishList If Not FinishList.Contains(testString) Then Return False Else Return True End If Next End Function
Here is a rule that should fit the bill for you. Instead of looping through occurrences the rule searches the reference documents of the assembly and checks the iProperty Authority against the supplied list. Regarding the custom iProperty in the view label can you share why that wouldn't work for you? That would be the logical place to put an iProperty like this.
Sub Main FinishList.Add("GALV") FinishList.Add("ARTIST") FinishList.Add("RAW") FinishList.Add("POWDER COAT") Dim oAsm As AssemblyDocument = ThisDoc.Document For Each oDoc As Document In oAsm.AllReferencedDocuments 'Traverse all referenced documents Dim DesignProp As PropertySet = oDoc.PropertySets.Item("Design Tracking Properties") Dim oAut As [Property] = DesignProp.Item("Authority") Dim Check As Boolean = FinishCheck(oAut.Value)'Function to check iprop against Finish List If Check = False Then If oDoc.DocumentType = DocumentTypeEnum.kPartDocumentObject Then Dim oPartDef As PartComponentDefinition = oDoc.ComponentDefinition If Not oPartDef.IsContentMember Then 'Remove content center parts Dim FileName As String = Left(oDoc.DisplayName, Len(oDoc.DisplayName) -3) Dim FinName As String If oAut.Value = Nothing Then FinName = "None" Else FinName = oAut.Value End If ErrorList.Add( FileName & " With finish of - " & FinName) End If End If End If Next d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish") End Sub Dim ErrorList As New ArrayList Dim FinishList As New ArrayList Function FinishCheck(testString As String ) As Boolean For Each sFinish In FinishList If Not FinishList.Contains(testString) Then Return False Else Return True End If Next End Function
Thank you @A.Acheson,
Code works great, I am getting an occasional error though when using it. Screenshots attached.
This rule will go on an event trigger to run on save. Would it be possible to only show the dialogue box if there is an error?
Regarding the custom iProperty in the view label can you share why that wouldn't work for you? That would be the logical place to put an iProperty like this.
Screenshot attached. In the standards where the style for the view labels are created, you can only use Standard iProperties. Originally we were creating a parameter on the part, then transcribing it to another custom iProperty on the BOM. Easiest solution for us was to use a Standard iProperty (Authority) that we didn't foresee using for anything else in the future.
Thank you @A.Acheson,
Code works great, I am getting an occasional error though when using it. Screenshots attached.
This rule will go on an event trigger to run on save. Would it be possible to only show the dialogue box if there is an error?
Regarding the custom iProperty in the view label can you share why that wouldn't work for you? That would be the logical place to put an iProperty like this.
Screenshot attached. In the standards where the style for the view labels are created, you can only use Standard iProperties. Originally we were creating a parameter on the part, then transcribing it to another custom iProperty on the BOM. Easiest solution for us was to use a Standard iProperty (Authority) that we didn't foresee using for anything else in the future.
Line 40 looks to be the function and I'm not sure why that error is coming up. Maybe declare sFinish to always be a string before the loop begins.
Dim sFinish As String
To only bring up the inputlist box of error parts you can surround the input list box with and if statement and use the count of error array >0 as the condition.
Ok I see where your setting the view label. You can set all of that afterwards but it is extra code instead of setting it in one place.
Line 40 looks to be the function and I'm not sure why that error is coming up. Maybe declare sFinish to always be a string before the loop begins.
Dim sFinish As String
To only bring up the inputlist box of error parts you can surround the input list box with and if statement and use the count of error array >0 as the condition.
Ok I see where your setting the view label. You can set all of that afterwards but it is extra code instead of setting it in one place.
This seems to have worked, thanks again for all the help.
Dim sFinish As String
I'm trying to do like you said with the surrounding If statement and having no success. I tried googling around to better understand and throwing things at the wall to see if something sticks, and no luck.
I'll have to tinker with this some more later when I have some time to try to get the If statement to work.
Thanks again for the help,
Gabe
This seems to have worked, thanks again for all the help.
Dim sFinish As String
I'm trying to do like you said with the surrounding If statement and having no success. I tried googling around to better understand and throwing things at the wall to see if something sticks, and no luck.
I'll have to tinker with this some more later when I have some time to try to get the If statement to work.
Thanks again for the help,
Gabe
Ah yes it may not be a straight forward path if you haven't used count before. Count is a function of the arraylist so to find it in the drop down you would have to temporarily declare the array list in the block and then it appears in the drop down . Or just type it straight in. Don't forget to remove the temporary declaration as it will contradict the global one used to work with the function.
Ah yes it may not be a straight forward path if you haven't used count before. Count is a function of the arraylist so to find it in the drop down you would have to temporarily declare the array list in the block and then it appears in the drop down . Or just type it straight in. Don't forget to remove the temporary declaration as it will contradict the global one used to work with the function.
Apologies, I seem to have missed your response.
I seem to be having some trouble still creating your steps.
I added this (line 1 & 2 of snippet)
Dim ErrorList As ArrayList ErrorList. d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish")
Renamed the ArrayList to ArrayListGlobal to trick the other I assume?
Dim ErrorList As New ArrayListGlobal Dim FinishList As New ArrayList
Added in the .count, got a dropdown, tabbed it in.
Dim ErrorList As ArrayList ErrorList.Count d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish")
Removed the global from the other lines
Dim ErrorList As New ArrayList Dim FinishList As New ArrayList
Ran the rule and get the errors shown in screenshots. Final code screenshot also added.
Thanks again for your help.
Apologies, I seem to have missed your response.
I seem to be having some trouble still creating your steps.
I added this (line 1 & 2 of snippet)
Dim ErrorList As ArrayList ErrorList. d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish")
Renamed the ArrayList to ArrayListGlobal to trick the other I assume?
Dim ErrorList As New ArrayListGlobal Dim FinishList As New ArrayList
Added in the .count, got a dropdown, tabbed it in.
Dim ErrorList As ArrayList ErrorList.Count d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish")
Removed the global from the other lines
Dim ErrorList As New ArrayList Dim FinishList As New ArrayList
Ran the rule and get the errors shown in screenshots. Final code screenshot also added.
Thanks again for your help.
So the two error message are as follows.
1. The main rule has two declarations of the same object. Remove the one in the main rule as the global version is what is required to communicate between the main sub and the function. An alternate way to do this is to declare the object in the main sub and then pass it in as an argument just like teststring is set up.
2. You get a count of the arraylist but do nothing with it. Place this in an if statement to bypass the listbox if count is zero.
Optional:
As an additional observation I originally used an arraylist but I have since learned that this is an old method of getting a list and can have performance issues due to the way it operates. Here is the official documentation on the arraylist. It doesn't care the type of object added to it be it string or double etc.
So you can replace "New Arraylist"
With "New List(Of String)"
So the two error message are as follows.
1. The main rule has two declarations of the same object. Remove the one in the main rule as the global version is what is required to communicate between the main sub and the function. An alternate way to do this is to declare the object in the main sub and then pass it in as an argument just like teststring is set up.
2. You get a count of the arraylist but do nothing with it. Place this in an if statement to bypass the listbox if count is zero.
Optional:
As an additional observation I originally used an arraylist but I have since learned that this is an old method of getting a list and can have performance issues due to the way it operates. Here is the official documentation on the arraylist. It doesn't care the type of object added to it be it string or double etc.
So you can replace "New Arraylist"
With "New List(Of String)"
I think I got it to work. For some reason I feel like I tried this and was unsuccessful.
Next If ErrorList.Count>0 Then d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish") End If End Sub
However, I have a new problem. I need to check the AUTHORITY of the assemblies as well as the parts.
Looks like I would need to do something here to change the kPart to... kAsssembly? Sorry I'm not very good at this stuff.
If oDoc.DocumentType = DocumentTypeEnum.kPartDocumentObject Then Dim oPartDef As PartComponentDefinition = oDoc.ComponentDefinition
I think I got it to work. For some reason I feel like I tried this and was unsuccessful.
Next If ErrorList.Count>0 Then d0 = InputListBox("Prompt", ErrorList, d0, Title := "Finish Check", ListName := "Unlisted Finish") End If End Sub
However, I have a new problem. I need to check the AUTHORITY of the assemblies as well as the parts.
Looks like I would need to do something here to change the kPart to... kAsssembly? Sorry I'm not very good at this stuff.
If oDoc.DocumentType = DocumentTypeEnum.kPartDocumentObject Then Dim oPartDef As PartComponentDefinition = oDoc.ComponentDefinition
Just change the DocumentTypeEnum to check for AssemblyDocumentObject. You don't need the definition reference and the check for content center part file as you are only dealing with an assembly. So remove that piece but everything else is a copy of the part file check.
If oDoc.DocumentType = DocumentTypeEnum.kPartDocumentObject Then 'Do something with the part document ElseIf oDoc.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then 'Do something with the assembly document End If
Just change the DocumentTypeEnum to check for AssemblyDocumentObject. You don't need the definition reference and the check for content center part file as you are only dealing with an assembly. So remove that piece but everything else is a copy of the part file check.
If oDoc.DocumentType = DocumentTypeEnum.kPartDocumentObject Then 'Do something with the part document ElseIf oDoc.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then 'Do something with the assembly document End If
With your help, I got it to work!
Thanks for all the help!
With your help, I got it to work!
Thanks for all the help!
Can't find what you're looking for? Ask the community or share your knowledge.