Archiv für den Monat: September 2018

ExtendedActionList

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;
    }
  }
}
Von |2018-10-01T10:43:39+02:002018-09-26|EPLAN, EPLAN-Scripts|

Script Debugging: Open Debug File

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;
    }    

 
   }
}
Von |2018-09-24T12:52:13+02:002018-09-25|EPLAN, EPLAN-Scripts|

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.

Von |2018-09-24T12:50:00+02:002018-09-24|EPLAN, EPLAN-API|

Wippe selber bauen

Ich hab ja hier schon über viel geschrieben… aber dass ich mal zeige wie ich eine Wippe selber baue, hätte ich nicht gedacht.
Bei uns gibt es den Brauch, einen sogenannten Kindsbaum zur Hochzeit aufzustellen. Hier mal ein Auszug aus Wikipedia:

Vor allem in südbayerischen Raum ist es üblich, zur Hochzeit einen sogenannten Kindsbaum aufzustellen. Es handelt sich hierbei um einen 5 bis 10 m langen, weiß-blau bemalten Stamm, an dessen „Ästen“ diverse Baby-Sachen aufgehängt werden (Strampler, Schnuller, Flasche, etc.). In der Regel ist an der Spitze des Kindsbaums ein Storch montiert. Zudem befindet sich am unteren Ende des Baumes in Augenhöhe eine Tafel mit einem Gedicht, in dem das frisch vermählte Ehepaar an seine Pflicht erinnert wird, innerhalb eines Jahres Nachwuchs auf die Welt zu bringen. Gleich, ob sich Nachwuchs einstellt oder nicht, nach einem Jahr ist auf jeden Fall eine Brotzeit fällig, die nicht von den Kindsbaumaufstellern, sondern von dem Paar auszurichten ist.

Unserer war nicht ganz klassisch:

  • Anstatt 5-10m hoch, mit 18m riesig
  • Anstatt weiß blau, pink und grün, angemalt
  • Anstatt eines Storches einen Yoshi
  • LED-Solar-Lampen welche Sommer wie Winter schön geleuchtet haben

Der Kindsbaum wurde ein Jahr nach der Hochzeit umgelegt. Er hat auch gut funktioniert…
Viele wissen wohl dass ich Vater von Zwillingen geworden bin und da bietet sich eine Wippe als Spielgerät an :)
Hatte den Baum schon dafür eingelagert…

Hab mir dann bei Ebay das Gelenk und die Sitze mit Haltebügel gekauft. Sind im Internet zum Teil sehr teuer, darum vergleicht die Preise.
Das Gelenk habe ich seitlich gekürzt, da es sonst zu breit gewesen wäre. Wir mussten das Gelenk dann noch mit Eisen verstärken (seitlich angeschweißt und verschraubt). Habe dann noch Schaumstoff angebracht als Fingerschutz. Finde es auch albern dass das Gelenk für öffentlich Spielplätze gedacht ist und man sich so leicht einklemmen kann. Als Puffer, habe ich zwei alte Autoreifen eingegraben.

Meinen Mädels gefällt es sehr gut!

Von |2018-09-17T17:05:30+02:002018-09-17|Garten, Projekte|

Anzeigesprache per Script ermitteln

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.

Von |2019-03-14T08:30:01+01:002018-09-07|EPLAN, EPLAN-Scripts|
Nach oben