Symbol per API erstellen
In einem aktuellen Kundenprojekt werden Bediensymbole (Piktogramme) per DXF-Dateien eingelesen und in einer eigenen Symbolbibliothek abgespeichert.
Generell empfehlen wir keine eigene Symbolbibliothek zu machen. Für diesen Anwendungsfall ist es aber völlig in Ordnung.
Leider ist es per API nicht ganz so einfach.
Als erstes erstellen wir mal eine neue SymbolLibrary. Achtet darauf dass der komplette Pfad übergeben werden muss:
var symbolLibrary = MDSymbolLibrary.Create(symbolLibraryPath);
Danach können wir neue Symbole hinzufügen. Sucht euch die gewünschte Funktionsdefinition und die Typen des Symbols aus der Oberfläche. Nur ein Teil ist in der Hilfe beschrieben:
MDSymbol symbol = symbolLibrary.AddSymbol(id, symbolName); symbol.Type = MDSymbol.Enums.SymbolType.Function; symbol.FunctionDefinitionCategory = Function.Enums.Category.Undefined; symbol.FunctionDefinitionGroup = 98; symbol.FunctionDefinitionId = 1; symbol.PlacementType = DocumentTypeManager.DocumentType.Circuit; symbol.Properties.SYMB_DESC = description; symbol.Properties.SYMB_SYBMOLFUNCTIONTYPE = 1;
Nun gehts an die Varianten. Da wird es knifflig. Variante A (Index 0) wird automatisch beim Erstellen des Symbols mit erstellt. Weitere Varianten müssen wir dann separat hinzufügen. Achja, der VariantIndex wird als sbyte übergeben :)
sbyte variantIndex = Convert.ToSByte(variantCount); // A = 0 MDSymbolVariant variant; if (variantCount == 0) // First variant is created at Symbol.Create() { variant = symbol.Variants.First(); } else { variant = symbol.AddSymbolVariant(variantIndex); }
Nun können wir der SymbolVariant Placements hinzufügen. Kleiner Handstand um die Group von der Variant zu bekommen. Danach können wir die Platzierungen hinzufügen. Jedes Placements muss einzeln hinzugefügt werden.
Group group = variant.AsGroup; foreach (var placement in page.AllFirstLevelPlacements) { placement.CopyTo(group); }
Mir ist aufgefallen dass hier EPLAN bzw. die API sehr empfindlich reagiert was das Locking angeht. Darum am besten das Quellprojekt exklusiv öffnen.