Zobrazit plnou verzi příspěvku: PŘIDÁNÍ PARAMETRŮ A UŽ.IVL.

Lukáš Záruba
29.01.2019, 12:46
Zdravím mám vzorec viz.: níže který funguje dobře v .ipt ale v .iam mi to hlásí chybu. Vzorec hromadně přidává parmetry a uživatelské ivlastnosti které následně využívá jiný vzorec. Nevím proč mi to funguje v dílu ale ne v sestavě. Napadá někoho jak to upravit tak aby to fungovalo i v sestavě?Předem děkujiDim part As PartDocument = ThisDoc.DocumentDim userParams = part.ComponentDefinition.Parameters.UserParametersDim p As Inventor.ParameterTry p = userParams("R1")Catch p = userParams.AddByValue("R1", 0, "mm")End Tryp.Comment = "NADPIS - ROZMĚR"Try p = userParams("R2")Catch p = userParams.AddByValue("R2", 0, "mm")End Tryp.Comment = "NADPIS - ROZMĚR"Try p = userParams("R3")Catch p = userParams.AddByValue("R3", 0, "mm")End Tryp.Comment = "NADPIS - ROZMĚR"Try p = userParams("R4")Catch p = userParams.AddByValue("R4", 0, "mm")End Tryp.Comment = "NADPIS - ROZMĚR"Try p = userParams("PR1")Catch p = userParams.AddByValue("PR1", 0, "mm")End Tryp.Comment = "POPIS - ROZMĚR"Try p = userParams("PR2")Catch p = userParams.AddByValue("PR2", 0, "mm")End Tryp.Comment = "POPIS - ROZMĚR"Try p = userParams("PR3")Catch p = userParams.AddByValue("PR3", 0, "mm")End Tryp.Comment = "POPIS - ROZMĚR"Try p = userParams("PR4")Catch p = userParams.AddByValue("PR4", 0, "mm")End Tryp.Comment = "POPIS - ROZMĚR"Dim propertyName As String = "N1"Dim propertyValue As String = ""customPropertySet = ThisDoc.Document.PropertySets.Item("Inventor User Defined Properties")Try      prop = customPropertySet.Item(propertyName)Catch      customPropertySet.Add("", propertyName)End TryTry prop = customPropertySet.Item("N1-M")Catch customPropertySet.Add("","N1-M")End TryTry prop = customPropertySet.Item("N2")Catch customPropertySet.Add("","N2")End TryTry prop = customPropertySet.Item("N2-M")Catch customPropertySet.Add("","N2-M")End TryTry prop = customPropertySet.Item("N3")Catch customPropertySet.Add("","N3")End TryTry prop = customPropertySet.Item("N3-M")Catch customPropertySet.Add("","N3-M")End TryTry prop = customPropertySet.Item("P1")Catch customPropertySet.Add("","P1")End TryTry prop = customPropertySet.Item("P1-M")Catch customPropertySet.Add("","P1-M")End TryTry prop = customPropertySet.Item("P2")Catch customPropertySet.Add("","P2")End TryTry prop = customPropertySet.Item("P2-M")Catch customPropertySet.Add("","P2-M")End TryTry prop = customPropertySet.Item("P3")Catch customPropertySet.Add("","P3")End TryTry prop = customPropertySet.Item("P3-M")Catch customPropertySet.Add("","P3-M")End TryTry prop = customPropertySet.Item("PR1")Catch customPropertySet.Add("","PR1")End TryTry prop = customPropertySet.Item("PR1-M")Catch customPropertySet.Add("","PR1-M")End TryTry prop = customPropertySet.Item("PR2")Catch customPropertySet.Add("","PR2")End TryTry prop = customPropertySet.Item("PR2-M")Catch customPropertySet.Add("","PR2-M")End TryTry prop = customPropertySet.Item("PR3")Catch customPropertySet.Add("","PR3")End TryTry prop = customPropertySet.Item("PR3-M")Catch customPropertySet.Add("","PR3-M")End TryTry prop = customPropertySet.Item("PR4")Catch customPropertySet.Add("","PR4")End TryTry prop = customPropertySet.Item("PR4-M")Catch customPropertySet.Add("","PR4-M")End TryTry prop = customPropertySet.Item("R1")Catch customPropertySet.Add("","R1")End TryTry prop = customPropertySet.Item("R1-M")Catch customPropertySet.Add("","R1-M")End TryTry prop = customPropertySet.Item("R2")Catch customPropertySet.Add("","R2")End TryTry prop = customPropertySet.Item("R2-M")Catch customPropertySet.Add("","R2-M")End TryTry prop = customPropertySet.Item("R3")Catch customPropertySet.Add("","R3")End TryTry prop = customPropertySet.Item("R3-M")Catch customPropertySet.Add("","R3-M")End TryTry prop = customPropertySet.Item("R4")Catch customPropertySet.Add("","R4")End TryTry prop = customPropertySet.Item("R4-M")Catch customPropertySet.Add("","R4-M")End Try

Navara
29.01.2019, 14:12

Tohle je dost děsivé :)Pravilo selže, protože hned na prvním řádku je[code]Dim part As PartDocument = ThisDoc.Document[/code]a to v sestavě prostě neprojde. Níže je ten kód přepsaný do trochu lepšího tvaru včetně úpravy pro sestavu[code]Sub Main()    Dim userParams As UserParameters = GetUserParams(ThisDoc.Document)     EnsureParameter(userParams, "R1", comment:="NADPIS - ROZMĚR")    EnsureParameter(userParams, "R2", comment:="NADPIS - ROZMĚR")    EnsureParameter(userParams, "R3", comment:="NADPIS - ROZMĚR")    EnsureParameter(userParams, "R4", comment:="NADPIS - ROZMĚR")    EnsureParameter(userParams, "PR1", comment:="POPIS - ROZMĚR")    EnsureParameter(userParams, "PR2", comment:="POPIS - ROZMĚR")    EnsureParameter(userParams, "PR3", comment:="POPIS - ROZMĚR")    EnsureParameter(userParams, "PR4", comment:="POPIS - ROZMĚR")     Dim customPropertySet = ThisDoc.Document.PropertySets.Item("Inventor User Defined Properties")     EnsureProperty(customPropertySet, "N1")    EnsureProperty(customPropertySet, "N1-M")    EnsureProperty(customPropertySet, "N2")    EnsureProperty(customPropertySet, "N2-M")    EnsureProperty(customPropertySet, "N3")    EnsureProperty(customPropertySet, "N3-M")    EnsureProperty(customPropertySet, "P1")    EnsureProperty(customPropertySet, "P1-M")    EnsureProperty(customPropertySet, "P2")    EnsureProperty(customPropertySet, "P2-M")    EnsureProperty(customPropertySet, "P3")    EnsureProperty(customPropertySet, "P3-M")    EnsureProperty(customPropertySet, "PR1")    EnsureProperty(customPropertySet, "PR1-M")    EnsureProperty(customPropertySet, "PR2")    EnsureProperty(customPropertySet, "PR2-M")    EnsureProperty(customPropertySet, "PR3")    EnsureProperty(customPropertySet, "PR3-M")    EnsureProperty(customPropertySet, "PR4")    EnsureProperty(customPropertySet, "PR4-M")    EnsureProperty(customPropertySet, "R1")    EnsureProperty(customPropertySet, "R1-M")    EnsureProperty(customPropertySet, "R2")    EnsureProperty(customPropertySet, "R2-M")    EnsureProperty(customPropertySet, "R3")    EnsureProperty(customPropertySet, "R3-M")    EnsureProperty(customPropertySet, "R4")    EnsureProperty(customPropertySet, "R4-M") End SubFunction GetUserParams(doc As Document) As UserParameters    If (doc.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject) Then        Dim asm As AssemblyDocument = doc        Return asm.ComponentDefinition.Parameters.UserParameters    ElseIf (doc.DocumentType = DocumentTypeEnum.kPartDocumentObject) Then        Dim prt As PartDocument = doc        Return prt.ComponentDefinition.Parameters.UserParameters    Else        Throw New ArgumentOutOfRangeException("Document can be AssemblyDocument or PartDocument")    End IfEnd Function Function EnsureParameter(                userParams As UserParameters,                paramName As String,                Optional defaultValue As Double = 0,                Optional units As String = "mm",                Optional comment As String = "") As Parameter    Dim p As Parameter    Try        p = userParams(paramName)    Catch ex As Exception        p = userParams.AddByValue(paramName, defaultValue, units)        p.Comment = comment    End Try    Return pEnd Function Function EnsureProperty(propertySet As PropertySet, propName As String, optional defaultValue As String  = "") As [Property]    dim p as [Property]    Try        p = propertySet(propName)    Catch ex As Exception        p = propertySet.Add(defaultValue,propName)    End Try    Return pEnd Function[/code]


Lukáš Záruba
29.01.2019, 16:27
díky, už mi to funguje. 

Lukáš Záruba
29.01.2019, 18:19
Je možné do tohoto ilogicu dopsat i část která by stejně vkládala textové parametry jako teď číselné parametry ?

Navara
31.01.2019, 08:39


třeba takhle [code]Function EnsureParameter(                userParams As UserParameters,                paramName As String,                Optional defaultValue As String= "",                Optional comment As String = "") As Parameter    Dim p As Parameter    Try        p = userParams(paramName)    Catch ex As Exception        p = userParams.AddByValue(paramName, defaultValue, "TEXT")        p.Comment = comment    End Try    Return pEnd Function[/code]

Lukáš Záruba
31.01.2019, 11:08
OK, díky to je ono. Již to funguje a vypadá to takto:Sub Main()
Dim userParams As UserParameters = GetUserParams(ThisDoc.Document)

EnsureParameter(userParams, "R1", comment:="NADPIS - ROZM�R")
EnsureParameter(userParams, "R2", comment:="NADPIS - ROZM�R")
EnsureParameter(userParams, "R3", comment:="NADPIS - ROZM�R")
EnsureParameter(userParams, "R4", comment:="NADPIS - ROZM�R")
EnsureParameter(userParams, "R5", comment:="NADPIS - ROZM�R")
EnsureParameter(userParams, "PR1", comment:="POPIS - ROZM�R")
EnsureParameter(userParams, "PR2", comment:="POPIS - ROZM�R")
EnsureParameter(userParams, "PR3", comment:="POPIS - ROZM�R")
EnsureParameter(userParams, "PR4", comment:="POPIS - ROZM�R")
EnsureParameter(userParams, "PR5", comment:="POPIS - ROZM�R")
EnsureParameterTEXT(userParams, "TEST", comment:="TESTOVAC� PARAMETR")


Dim customPropertySet = ThisDoc.Document.PropertySets.Item("Inventor User Defined Properties")

EnsureProperty(customPropertySet, "N1")
EnsureProperty(customPropertySet, "N1-M")
EnsureProperty(customPropertySet, "N2")
EnsureProperty(customPropertySet, "N2-M")
EnsureProperty(customPropertySet, "N3")
EnsureProperty(customPropertySet, "N3-M")
EnsureProperty(customPropertySet, "N4")
EnsureProperty(customPropertySet, "N4-M")
EnsureProperty(customPropertySet, "N5")
EnsureProperty(customPropertySet, "N5-M")
EnsureProperty(customPropertySet, "P1")
EnsureProperty(customPropertySet, "P1-M")
EnsureProperty(customPropertySet, "P2")
EnsureProperty(customPropertySet, "P2-M")
EnsureProperty(customPropertySet, "P3")
EnsureProperty(customPropertySet, "P3-M")
EnsureProperty(customPropertySet, "P4")
EnsureProperty(customPropertySet, "P4-M")
EnsureProperty(customPropertySet, "P5")
EnsureProperty(customPropertySet, "P5-M")
EnsureProperty(customPropertySet, "PR1")
EnsureProperty(customPropertySet, "PR1-M")
EnsureProperty(customPropertySet, "PR2")
EnsureProperty(customPropertySet, "PR2-M")
EnsureProperty(customPropertySet, "PR3")
EnsureProperty(customPropertySet, "PR3-M")
EnsureProperty(customPropertySet, "PR4")
EnsureProperty(customPropertySet, "PR4-M")
EnsureProperty(customPropertySet, "PR5")
EnsureProperty(customPropertySet, "PR5-M")
EnsureProperty(customPropertySet, "R1")
EnsureProperty(customPropertySet, "R1-M")
EnsureProperty(customPropertySet, "R2")
EnsureProperty(customPropertySet, "R2-M")
EnsureProperty(customPropertySet, "R3")
EnsureProperty(customPropertySet, "R3-M")
EnsureProperty(customPropertySet, "R4")
EnsureProperty(customPropertySet, "R4-M")
EnsureProperty(customPropertySet, "R5")
EnsureProperty(customPropertySet, "R5-M")
EnsureProperty(customPropertySet, "MAT")
EnsureProperty(customPropertySet, "MAT-M")
EnsureProperty(customPropertySet, "MAT2")
EnsureProperty(customPropertySet, "MAT2-M")
EnsureProperty(customPropertySet, "TYP1")
EnsureProperty(customPropertySet, "TYP1-M")
EnsureProperty(customPropertySet, "TYP2")
EnsureProperty(customPropertySet, "TYP2-M")

End Sub

Function GetUserParams(doc As Document) As UserParameters
If (doc.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject) Then
Dim asm As AssemblyDocument = doc
Return asm.ComponentDefinition.Parameters.UserParameters
ElseIf (doc.DocumentType = DocumentTypeEnum.kPartDocumentObject) Then
Dim prt As PartDocument = doc
Return prt.ComponentDefinition.Parameters.UserParameters
Else
Throw New ArgumentOutOfRangeException("Document can be AssemblyDocument or PartDocument")
End If
End Function

Function EnsureParameter(
userParams As UserParameters,
paramName As String,
Optional defaultValue As Double = 0,
Optional units As String = "mm",
Optional comment As String = "") As Parameter
Dim p As Parameter
Try
p = userParams(paramName)
Catch ex As Exception
p = userParams.AddByValue(paramName, defaultValue, units)
p.Comment = comment
End Try
Return p
End Function

Function EnsureParameterTEXT(
userParams As UserParameters,
paramName As String,
Optional defaultValue As String= "",
Optional comment As String = "") As Parameter
Dim p As Parameter
Try
p = userParams(paramName)
Catch ex As Exception
p = userParams.AddByValue(paramName, defaultValue, "TEXT")
p.Comment = comment
End Try
Return p
End Function

Function EnsureProperty(propertySet As PropertySet, propName As String, Optional defaultValue As String = "") As [Property]
Dim p As [Property]
Try
p = propertySet(propName)
Catch ex As Exception
p = propertySet.Add(defaultValue,propName)
End Try
Return p
End Function

Lukáš Záruba
31.01.2019, 11:29
Napadá mě, že když už mám pravidlo které mi vytvoří všechny potřebné parametry a vlastnosti aby z nich jiné pravidlo mohlo poskládat texty. Nedalo by se na konec tohoto pravidla napsat příkaz?Něco takového - Vlož do tohoto dokumentu externí pravidlo :1) NADPIS2) POPIS3) MAT 

Navara
31.01.2019, 11:42

Zkuste se podívat na RunExternalRule

Lukáš Záruba
31.01.2019, 12:01
Ano to funguje když ho potřebuji spustit ale já bych ho chtěl uložit přímo do itp a iam. Pravidlo výše popsané mi připraví parametry a vlastnosti pro itp a iam, které jsou přeukládané ze starších projektů a ty je nemají. Nové již mají vše připravené v šablonách. Proto se snažím vytvořit si pravidlo které by mi po přeuložení starého modelu na nové pomohlo co nejvíce nastavit díl tak aby bez větších zásahů byl jako nová šablona.

Navara
31.01.2019, 13:25

Používání interních pravidel v dokumentu není vhodná cesta.Nejvíc se mi v praxi osvědčilo hlídání určité události nad dokumentem (nejčastěji před uložením) a na tuto událost spouštět externí pravidla.K tomu je v XTools přímo možnost nastavit pravidlo, které se má spouštět. Toto pravidlo pak může volat další pravidla atd...Důvody jsem tu už rozebíral mnohokrát, ale nejdůležitější je: Až (ne jestli!) bude potřeba v budoucnu změnit tato pravidla, budete mít opravdu velký problém. U externích to změníte na jednom místě a máte klid.

Lukáš Záruba
31.01.2019, 14:10
Ok, děkuji za doporučení.Je tedy možné na konec tohoto pravidla napsat příkaz, která mi přiřadí jednotlivá externí pravidla k událostem při který se mají spouštět? viz výstřižek níže? 

Navara
04.02.2019, 10:48

Nevím, jestli je tohle někde zdokumentované. Referenční příručka k iLogicu je dostupná tady: http://help.autodesk.com/view/INVNTOR/2019/ENU/?guid=GUID-AB9EE660-299E-408F-BBE1-AFE44C723F59 Možná to nějak půjde, ale nevím jak.Navíc tyhle spouštěče jsou opět uložené v dokumentu a pokud v budoucnu pravidlo nebude dostupné, nastane chyba. Pokud budete chtít další přidat, máte stejný problém, jako kdyby bylo pravidlo lokální.Já jsem pro tenhle účel napsal do XTools právě ty vlastní spouštěče, protože nejsou závislé na tom, aby byly uvedené v dokumentu, pokud v budoucnu zmizí, tak se nic nestane (takový stav je ošetřen), pokud přibydou, tak se jednoduše doplní.