LogBuch
A.Robert hat uns im CAD.de Forum ein kleines Script zur Verfügung gestellt um Änderungen zu dokumentieren. Ein Changelog für den Schaltplan.
Vielen Dank dafür!
A.Robert hat uns im CAD.de Forum ein kleines Script zur Verfügung gestellt um Änderungen zu dokumentieren. Ein Changelog für den Schaltplan.
Vielen Dank dafür!
Mit diesem Script wird ein 3-Punkte-Button im Schaltflächen einstellen Dialog angezeigt. Er zeigt alle verfügbaren Actions an (interne, offizielle und Script-Actions).
Vielen Dank an Frank Schöneck, der mir das Script bereitgestellt hat.
Das Script ausführen und die Einstellung wird gesetzt. Wird es nochmals ausgeführt, wird die Einstellung wieder deaktiviert. Ich hab das auch mal in unser kostenloses Produkt ExtendedSettings eingefügt. Die Einstellung gibt es erst ab Version 2.5, sie ist nicht dokumentiert und wird somit von EPLAN nicht supported!
// Einstellungen-ExtendedActionList.cs // // Schaltet einen More-Button im Fenster "Schaltfläche einstellen" // (Symbolleiste anpassen) neben dem Eingabefeld "Befehlszeile" frei. // Dieser öffnet ein Fenster mit allen verfügbaren Actions. // // Standardmäßig auf 0 gesetzt // // Copyright by Frank Schöneck, 2015 // letzte Änderung: Frank Schöneck, 08.07.2015 V1.0.0, Projektbeginn // // für Eplan Electric P8, ab V2.5 // // using System.Windows.Forms; using Eplan.EplApi.Scripting; namespace EplanScriptingProjectBySuplanus.ExtendedActionList { public class ExtendedActionList { [Start] public void MyFunction() { Eplan.EplApi.Base.Settings oSettings = new Eplan.EplApi.Base.Settings(); //Einstellung auslesen bool bolSetting = oSettings.GetBoolSetting("USER.ModalDialogs.XSdCustomToolbarComponent.ExtendedActionList", 0); //wenn nicht gesetzt, setzen if (bolSetting == false) { oSettings.SetBoolSetting("USER.ModalDialogs.XSdCustomToolbarComponent.ExtendedActionList", true, 0); MessageBox.Show("Die Einstellung wurde 'aktiviert'.", "USER.ModalDialogs.XSdCustomToolbarComponent.ExtendedActionList", MessageBoxButtons.OK, MessageBoxIcon.Information); } //wenn gesetzt, zurücksetzen else if (bolSetting == true) { oSettings.SetBoolSetting("USER.ModalDialogs.XSdCustomToolbarComponent.ExtendedActionList", false, 0); MessageBox.Show("Die Einstellung wurde 'deaktiviert'.", "USER.ModalDialogs.XSdCustomToolbarComponent.ExtendedActionList", MessageBoxButtons.OK, MessageBoxIcon.Information); } return; } } }
Hab ja hier geschrieben wie man das attachen zu EPLAN automatisieren kann. Hier ist noch die Beschreibung wie man einen Breakpoint setzen kann. Das kann man aber direkt machen wenn die temporäre Datei geöffnet wird. Mit diesem Script (welches man dann per Toolbar wieder einbinden kann), wird die Datei automatisch geöffnet:
using EnvDTE; using EnvDTE80; using System.Management; using System; public class C : VisualCommanderExt.ICommand { public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) { string _sActiveWindowName = string.Empty; if(DTE.ActiveWindow.Caption != null) { _sActiveWindowName = DTE.ActiveWindow.Caption; string _DebugScriptFileName = System.IO.Path.GetTempPath() + "\\Debug_" + _sActiveWindowName; System.IO.FileInfo oFI = new System.IO.FileInfo(_DebugScriptFileName); if(oFI.Exists) { DTE.ItemOperations.OpenFile(_DebugScriptFileName, Constants.vsext_vk_Debugging); } else { System.Windows.MessageBox.Show("Debug-script\n'" + _DebugScriptFileName + "'\nwas not found."); } return; } } }
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.
Wie so oft ist es in der API ganz einfach… Im Scripting muss man aber einmal einen Roundtrip machen…
Hier eine Action um die Anzeigesprache des Projektes per Script zu ermitteln.
Aufruf:
public void Function() { var languages = GetDisplayLanguages(); foreach (var language in languages) { MessageBox.Show(language); } return; } private static List<string> GetDisplayLanguages() { string value = null; ActionCallingContext actionCallingContext = new ActionCallingContext(); new CommandLineInterpreter().Execute("GetDisplayLanguages", actionCallingContext); actionCallingContext.GetParameter("value", ref value); var split = value.Split(';'); var languages = split.Where(language => !string.IsNullOrEmpty(language)).ToList(); return languages; }
Script:
using System.IO; using System.Xml; using Eplan.EplApi.ApplicationFramework; using Eplan.EplApi.Base; using Eplan.EplApi.Scripting; namespace EplanScriptingProjectBySuplanus.GetDisplayLanguages { public class GetDisplayLanguages { [DeclareAction("GetDisplayLanguages")] public void Action(out string value) { // Get language from settings string tempFile = Path.Combine(PathMap.SubstitutePath("$(TMP)"), "GetDisplayLanguages.xml"); ActionCallingContext actionCallingContext = new ActionCallingContext(); actionCallingContext.AddParameter("prj", FullProjectPath()); actionCallingContext.AddParameter("node", "TRANSLATEGUI"); actionCallingContext.AddParameter("XMLFile", tempFile); new CommandLineInterpreter().Execute("XSettingsExport", actionCallingContext); // Needed because there is no direct access to setting string language = GetValueSettingsXml(tempFile, "/Settings/CAT/MOD/Setting[@name='DISPLAYED_LANGUAGES']/Val"); value = language; } private static string GetValueSettingsXml(string filename, string url) { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(filename); XmlNodeList rankListSchemaName = xmlDocument.SelectNodes(url); if (rankListSchemaName != null && rankListSchemaName.Count > 0) { string value = rankListSchemaName[0].InnerText; return value; } return null; } private static string FullProjectPath() { ActionCallingContext acc = new ActionCallingContext(); acc.AddParameter("TYPE", "PROJECT"); string projectPath = string.Empty; new CommandLineInterpreter().Execute("selectionset", acc); acc.GetParameter("PROJECT", ref projectPath); return projectPath; } } }
Ihr findet das wie gewohnt auf GitHub.