Aufgrund eines aktuellen Projektes bin ich in Berührung mit der Klasse UnitParser gekommen. Hat mir ziemlich Kopfschmerzen bereitet, aber mit Hilfe vom (super) EPLAN-Support konnte ich mein Vorhaben realisieren.

Zur Kabellänge sollte ein gewisser Wert (in Meter) addiert werden. Generell kein Problem.
Aber man kann in EPLAN die Einheit am Kabel selbst bestimmen. So kann die Projekteinstellung Meter sein, aber am Kabel kann ein Wert in Millimeter angegeben werden.

Dadurch ergibt sich folgender Workflow:

  • Konvertierung der Kabellänge zu Länge in Meter
  • Addieren des Offsets
  • Konvertierung der Kabellänge von Meter in die Quell-Einheit (z.B. Millimeter)

 

Schön ist auch dass der ParserParameter gleich ein Property für die Unterdrückung von Nullstellen mitbringt.

private void SetCableLenght(Cable cable, double offsetInMeter)
{
    // Get cable properties
    UnitParser unitParserOld = new UnitParser();
    ParserParameter parserParameterOld = new ParserParameter();
    parserParameterOld.Group = UnitGroup.Length;
    parserParameterOld.SuppressFloatingZeroes = true; // remove trailling zeros

    string oldLengthInSourceUnit = cable.Properties.FUNC_CABLELENGTH;
    unitParserOld.Set(oldLengthInSourceUnit, parserParameterOld);

    // get the right enum
    String unitString = unitParserOld.GetUnit();
    foreach (Unit unit in Enum.GetValues(typeof(Unit)))
    {
        if (unit.ToString() == "Length_" + unitString)
        {
            parserParameterOld.UnitID = unit;
            break;
        }
    }

    // calc in meter
    ParserParameter parserParameterNew = new ParserParameter();
    parserParameterNew.UnitID = Unit.Length_m;
    double oldLengthInMeter = unitParserOld.ValueToUnit(parserParameterNew);
    double newLengthInMeter = oldLengthInMeter + offsetInMeter;
    UnitParser unitParserNew = new UnitParser();
    unitParserNew.Set(newLengthInMeter, "m", parserParameterNew);

    // calc in source unit
    string newLengthInSourceUnit = unitParserNew.ToDisplay(parserParameterOld);
    cable.Properties.FUNC_CABLELENGTH = newLengthInSourceUnit;
}