Best practice for repetitive "case" code

Best practice for repetitive "case" code

Tony__Watkins
Explorer Explorer
419 Views
5 Replies
Message 1 of 6

Best practice for repetitive "case" code

Tony__Watkins
Explorer
Explorer

I have a "case"  function to suppress components based on a length.  Though it is fairly simple code, the amount of input is large.  How can this be improved?  (Disclaimer: I have years of Inventor but only a few months of ilogic and no coding)

0 Likes
Accepted solutions (2)
420 Views
5 Replies
Replies (5)
Message 2 of 6

Michael.Navara
Advisor
Advisor
Accepted solution

You can try something similar to this

 

'Bottom cover patterns on sheet 4 of spreadsheet 9/13/2023 have covered travel to 208", will continue as needed
'Not sure if there an easier way to code

Dim components As New Dictionary(Of String, Boolean)

components.Add("CBA004933:1", False)
components.Add("CBA004933:2", False)
components.Add("CBA004933:3", False)
components.Add("CBA004933:4", False)
components.Add("CBA004933:5", False)
components.Add("CBA004933:6", False)
components.Add("CBA004932-44:1", False)
components.Add("CBA004932-44:2", False)
components.Add("CBA004932-44:3", False)
components.Add("CBA004932-44:4", False)
components.Add("CBA004932-44:5", False)
components.Add("CBA004932-36:1", False)
components.Add("CBA004932-36:2", False)
components.Add("CBA004932-36:3", False)
components.Add("CBA004932-36:4", False)
components.Add("CBA004932-22:1", False)
components.Add("CBA004932-22:2", False)
components.Add("CBA004932-22:3", False)
components.Add("CBA004932-22:4", False)
components.Add("CBA004932-22:5", False)
components.Add("CBA004932:1", False)
components.Add("CBA004932:2", False)
components.Add("CBA004932:3", False)

Select Case True

    Case TR >= 137 And TR <= 144  '-44.1 only
        components("CBA004932-44:1") = True

    Case TR >= 145 And TR <= 149
        components("CBA004933:1") = True


    Case TR >= 150 And TR <= 158
        components("CBA004932-36:1") = True
        components("CBA004932-22:1") = True

    Case TR >= 159 And TR <= 163
        components("CBA004932-44:1") = True
        components("CBA004932-22:2") = True

    Case TR >= 164 And TR <= 172
        components("CBA004932:1") = True

    Case TR >= 173 And TR <= 180
        components("CBA004932-44:1") = True
        components("CBA004932-36:1") = True


    Case TR >= 181 And TR <= 184
        components("CBA004933:1") = True
        components("CBA004932-36:2") = True


    Case TR >= 185 And TR <= 192
        components("CBA004933:1") = True
        components("CBA004932-44:2") = True


    Case TR >= 193 And TR <= 194
        components("CBA004932-22:3") = True
        components("CBA004932:1") = True

    Case TR >= 195 And TR <= 199
        components("CBA004933:1") = True
        components("CBA004933:2") = True


    Case TR >= 200 And TR <= 208
        components("CBA004932-36:2") = True
        components("CBA004932:1") = True

End Select

For Each item As KeyValuePair(Of String, Boolean) In components
    Component.IsActive(item.Key) = item.Value
Next

 

Message 3 of 6

CCarreiras
Mentor
Mentor

I believe there's a better way to do this, if you explain better what you want to achieve.

Probably using the pattern with formula will solve all that code.

 

Can you explain the conditions or share the model?

 

Look at this:

 

FG.gif

 

 

 

Anyway, I would use something like that to avoid such a long code:

 

'First clean all components

Component.IsActive("CBA004933:1") = False

Component.IsActive("CBA004933:2") = False

Component.IsActive("CBA004933:3") = False

Etc…

 

 

'Then, select the element needed for the size

If TR >= 137 And TR <= 144  then

Component.IsActive("CBA004933:1") = True

 

Elseif  TR >= 145 And TR <= 149  then

Component.IsActive("CBA004933:2") = true

 

Elseif  TR >= 150 And TR <= 154  then

Component.IsActive("CBA004933:3") = true

Etc…

 

End if

 

CCarreiras

EESignature

Message 4 of 6

JelteDeJong
Mentor
Mentor
Accepted solution

It can be done without "if" or "case" statements. This technique is not always the best but in this case, you might get away with it. It also gives you some good insights. For example, I noticed that some components never get turned on.

Component.IsActive("CBA004933:1") = (TR >= 145 And TR <= 149) Or (TR >= 181 And TR <= 184) Or (TR >= 185 And TR <= 192) Or (TR >= 195 And TR <= 199)
Component.IsActive("CBA004933:2") = (TR >= 195 And TR <= 199)
Component.IsActive("CBA004933:3") = False
Component.IsActive("CBA004933:4") = False
Component.IsActive("CBA004933:5") = False
Component.IsActive("CBA004933:6") = False
Component.IsActive("CBA004932-44:1") = (TR >= 137 And TR <= 144) Or (TR >= 159 And TR <= 163) Or (TR >= 173 And TR <= 180)
Component.IsActive("CBA004932-44:2") = (TR >= 185 And TR <= 192)
Component.IsActive("CBA004932-44:3") = False
Component.IsActive("CBA004932-44:4") = False
Component.IsActive("CBA004932-44:5") = False
Component.IsActive("CBA004932-36:1") = (TR >= 150 And TR <= 158) Or (TR >= 173 And TR <= 180)
Component.IsActive("CBA004932-36:2") = (TR >= 181 And TR <= 184) Or (TR >= 200 And TR <= 208)
Component.IsActive("CBA004932-36:3") = False
Component.IsActive("CBA004932-36:4") = False
Component.IsActive("CBA004932-22:1") = (TR >= 150 And TR <= 158)
Component.IsActive("CBA004932-22:2") = (TR >= 159 And TR <= 163)
Component.IsActive("CBA004932-22:3") = (TR >= 193 And TR <= 194)
Component.IsActive("CBA004932-22:4") = False
Component.IsActive("CBA004932-22:5") = False
Component.IsActive("CBA004932:1") = (TR >= 164 And TR <= 172) Or (TR >= 193 And TR <= 194) Or (TR >= 200 And TR <= 208)
Component.IsActive("CBA004932:2") = False
Component.IsActive("CBA004932:3") = False

Jelte de Jong
Did you find this post helpful? Feel free to Like this post.
Did your question get successfully answered? Then click on the ACCEPT SOLUTION button.

EESignature


Blog: hjalte.nl - github.com

Message 5 of 6

Tony__Watkins
Explorer
Explorer

Michael,

Thanks for the help, I love seeing how others would accomplish the same task.  Like I said in my post, I am new to the ilogic/coding.  Can you explain line 4 and line 80-82 of your program, I am not familiar with these commands and what they are doing.

Thanks for your time!!

0 Likes
Message 6 of 6

Michael.Navara
Advisor
Advisor

Line 4: Here is initialized new Dictionary. It is a collection of pairs KEY-VALUE. In this case the key is of type string and contains occurrence name. Value is of type Boolean and contains information if the occurrence should be active (by default I set it to false).

 

Line 80: I iterate all items in the Dictionary and use key and value of each item.

Line 81: When I call Component.IsActive I use item.Key as occurrence name and item.Value as IsActive new value. 

Line 82: End of loop. Go to next item in Dictionary

 

This approach allows you to choose (set) component IsActive state separately before you make any changes. If any exception occurs during Select, you have unmodified model.

0 Likes