Kdo si někdy zkoušel vytvářet vlastní pravidla v iLogic, jistě narazil na jednu zvláštnost při přístupu k hodnotám parametrů v modelu Inventoru. Numerické hodnoty jsou reprezentovány tzv. databázovými jednotkami, což je v případě délkových, plošných a objemových jednotek vždy cm (centimetr, resp. cm^2, cm^3). My ale zpravidla potřebujeme hodnotu mm, resp. jednotky původního dokumentu nebo původního parametru.
V těchto případech pomůže jednoduchá konverzní funkce, která hodnotu daného parametru vrátí v jednotkách daného parametru, nebo - ještě praktičtěji - v hodnotách aktuálního dokumentu Inventoru.
V následujícím kódu iLogic najdete funkci GetRealParValue, která vrací skutečnou číselnou hodnotu v jednotkách parametru, a pokročilejší funkci GetRealParameterValue, která vrací hodnotu v libovolných jednotkách, např. ve výchozích jednotkách dokumentu. Ve vašich pravidlech pak prostě použijete místo Param.Value volání GetRealParValue(Param).
Kód obsahuje i úvodní, nepodstatnou část, která jen ilustruje použití obou funkcí.
Public Sub Main()
Dim oDoc As PartDocument = ThisDoc.Document
Dim Param As [Parameter] = oDoc.ComponentDefinition.Parameters.Item("d17a") ' <-- YOUR PARAMETER
Dim uom = oDoc.UnitsOfMeasure
Dim valueInParameterUnits As Double = GetRealParValue(Param)
' Dim valueInParameterUnits As Double = GetRealParameterValue(oDoc, Param)
Dim valueInDocumentUnits As Double = GetRealParameterValue(oDoc, Param, UnitsTypeEnum.kDefaultDisplayLengthUnits)
Dim documentUnits As String = uom.GetStringFromType(UnitsTypeEnum.kDefaultDisplayLengthUnits)
MsgBox("Parameter value is: " & vbCrLf &
valueInParameterUnits & " " & Param.Units & vbCrLf &
valueInDocumentUnits & " " & documentUnits,
MsgBoxStyle.Information, "iLogic convertor")
End Sub
Public Function GetRealParValue(Par As [Parameter]) As Double ' BASIC
Dim uom = ThisDoc.Document.UnitsOfMeasure
Dim outUnit = uom.GetTypeFromString(Par.Units)
Dim dbUnitStr As String = uom.GetDatabaseUnitsFromExpression(Par.Expression, Par.Units)
Dim dbUnit As UnitsTypeEnum = uom.GetTypeFromString(dbUnitStr)
Dim rValue As Double = uom.ConvertUnits(Par.Value, dbUnit, outUnit)
Return rValue
End Function
Public Function GetRealParameterValue(oDoc As Document, ' ADVANCED
Param As [Parameter],
Optional OutputUnit As UnitsTypeEnum = Nothing) As Double
Dim uom = oDoc.UnitsOfMeasure
If (OutputUnit = Nothing) Then
OutputUnit = uom.GetTypeFromString(Param.Units)
End If
Dim DatabaseUnitStr As String = uom.GetDatabaseUnitsFromExpression(
Param.Expression, Param.Units)
Dim DatabaseUnit As UnitsTypeEnum = uom.GetTypeFromString(DatabaseUnitStr)
Dim rValue As Double = uom.ConvertUnits(Param.Value, DatabaseUnit, OutputUnit)
Return rValue
End Function
Ukázka použití funkcí pro parametr "d17a", v dokumentu s jednotkami "mm":
a výstup tohoto kódu:
Připomínáme, že standardní přístup přes hodnotu parametru, tedy .Value, by u tohoto parametru vrátil hodnotu 0.1 (cm).