EPLAN

EPLAN 2.7: Scripting Neuerungen

Die Beta läuft ja schon ne Weile und ich hab mich mal hingesetzt und die neuen Action angeschaut. Folgende kamen dazu:

changeLayer
Ändert die grafischen Eigenschaften von Ebenen.
export3D
Exportiert Bauräume in das STEP-Format.
exportNCData
Exportiert NC-Daten
exportProductionWiring
Exportiert Drahtkonfektionierungsdaten in verschiedenen Formaten.
GraphicalLayerTable
Importiert / exportiert Ebenen.
Renumber
Führt eine Nummerierung durch.
XPlaUpdateDetailAction
Detailplanung wird aktualisiert
XPamSelectPart
Artikel aus GUI auswählen
Von |2017-11-09T11:16:27+01:002017-05-22|EPLAN, EPLAN-Scripts|

Multiuserkonflikt erkennen

Vorab: Leider geht das nur per API, nicht im Scripting.

Die Ermittlung der User ist schnell gemacht, hab aber noch einen Dialog dazu gepackt, welcher Infos über die User anzeigt:

public static bool IsMultiUserConflict(Project project, bool showDialog = false)
{
   var currentUsers = project.CurrentUsers.ToList();

   // No conflict
   if (currentUsers.Count <= 1)
   {
      return false;
   }

   // Conflict
   if (showDialog)
   {
      StringBuilder sb = new StringBuilder();
      foreach (var user in currentUsers)
      {
         if (!string.IsNullOrEmpty(user.Name) && !string.IsNullOrEmpty(user.Identification))
         {
            sb.AppendLine(user.ComputerName + " / " + user.Name + " / " + user.Identification);
         }
         else if (!string.IsNullOrEmpty(user.Name))
         {
            sb.AppendLine(user.ComputerName + " / " + user.Name);
         }
         else if (!string.IsNullOrEmpty(user.Identification))
         {
            sb.AppendLine(user.ComputerName + " / " + user.Identification);
         }
         else
         {
            sb.AppendLine(user.ComputerName);
         }
      }
      MessageBox.Show(sb.ToString(), "Multi user conflict", MessageBoxButton.OK, MessageBoxImage.Warning);
   }
   return true;
}
Von |2017-05-03T13:34:52+02:002017-05-04|EPLAN, EPLAN-API|

RunSystemConfigurationDialog

Viele Leute haben in Foren oder Ähnliches schon nach einer Möglichkeit gefragt, wie man die EPLAN Stammdaten komplett umschalten kann.

Damit ist das Verzeichnis $(EPLAN_DATA) gemeint. Somit die Stammdaten.

EPLAN hat in der 2.6 eine Möglichkeit geschaffen, aber warum auch immer nicht dokumentiert. Somit wird es wohl auch (noch?!) nicht offiziell unterstützt.
Draufgekommen bin ich weil in der API-Hilfe etwas von den Befehlszeilenparameter dokumentiert war, da hab ich mal in den DLLs geschaut ob ne neue Action hinzukam.

Mit der versteckten Action RunSystemConfigurationDialog  kann man sich Schemata anlegen, welche dann per Aufrufparameter /SystemConfiguration  aufgerufen werden kann.

Wichtig ist dass er EPLAN mit Admin-Rechten startet, sonst könnt Ihr kein Schema anlegen.

Hier mal eine Bespielkonfiguration, welche ich für die API-Programmierung nutze und deren Aufruf:

"C:\Program Files\EPLAN\Platform\2.6.3\Bin\Eplan.exe" /Variant:"Electric P8" /SystemConfiguration:"API"
Von |2017-11-09T11:16:27+01:002016-12-14|EPLAN, EPLAN-Scripts|

EPLAN-API: Suchen & Ersetzen

Hört sich einfach an, ist aber bisl umständlich zu implementieren. Ich hab das mal ausprogrammiert… bin mir aber nicht sicher ob es alle Eigenschaften richtig setzt, bzw. ob es recht performant ist…

Verwendung

var project = ProjectUtility.GetCurrentProject();

Search search = new Search();
search[Search.Settings.AllProperties] = true;
search[Search.Settings.Placeholders] = true;
search[Search.Settings.DeviceTag] = true;
search[Search.Settings.GraphicPages] = true;
search[Search.Settings.InstallationSpaces] = true;
search[Search.Settings.LogicPages] = true;
search[Search.Settings.NotPlaced] = true;
search[Search.Settings.EvalutionPages] = false;
search[Search.Settings.PageData] = true;
search[Search.Settings.ProjectData] = true;
search[Search.Settings.Texts] = true;
search[Search.Settings.WholeTexts] = true;

search.ClearSearchDB(project); // important

const string SEARCH_TEXT = "MyStringToSearch";
const string REPLACE_TEXT = "MyNewString";

SearchUtility.SearchAndReplaceText(search, SEARCH_TEXT, REPLACE_TEXT, project);

 

Methode

/// <summary>
/// Find and replace text
/// </summary>
/// <param name="search">Searchobject with the given properties</param>
/// <param name="searchText">Text to search</param>
/// <param name="replaceText">Replacement text</param>
/// <param name="project">EPLAN Project</param>
public static void SearchAndReplaceText(Search search, string searchText, string replaceText, Project project)
{
   // Init search
   search.ClearSearchDB(project);
   search.Project(project, searchText);

   // Get objects
   StorableObject[] foundObjects = search.GetAllSearchDBEntries(project);
   foreach (var foundObject in foundObjects)
   {
      // Filter only text objects
      // todo: EPLAN fix (2.6) T1085938
      var existingValues = foundObject.Properties.ExistingValues
         .Where(p => !p.Definition.IsInternal &&
         (p.Definition.Type == PropertyDefinition.PropertyType.MultilangString ||
         p.Definition.Type == PropertyDefinition.PropertyType.String)).ToList();
      List<PropertyValue> existingValuesWithoutEmpty = new List<PropertyValue>();
      foreach (var propertyValue in existingValues)
      {
         if (propertyValue.Definition.IsIndexed)
         {
            foreach (int index in propertyValue.Indexes)
            {
               if (!propertyValue[index].IsEmpty)
               {
                  existingValuesWithoutEmpty.Add(propertyValue[index]);
               }
            }
         }
         else
         {
            if (!propertyValue.IsEmpty)
            {
               existingValuesWithoutEmpty.Add(propertyValue);
            }
         }
      }
      existingValues = existingValuesWithoutEmpty;

      // Replace
      foreach (PropertyValue propertyValue in existingValues)
      {
         switch (propertyValue.Definition.Type)
         {
            // MultiLanguageString
            case PropertyDefinition.PropertyType.MultilangString:
               MultiLangString multiLangString = propertyValue;
               var valueMultiLangString = multiLangString.GetAsString();
               if (valueMultiLangString.Contains(searchText))
               {
                  string newValue = valueMultiLangString.Replace(searchText, replaceText); // All languages
                  multiLangString.SetAsString(newValue);
                  propertyValue.Set(newValue);
               }
               break;

            // String
            case PropertyDefinition.PropertyType.String:
               var value = propertyValue.ToString();
               if (value.Contains(searchText))
               {
                  string newValue = value.Replace(searchText, replaceText);
                  propertyValue.Set(newValue);
               }
               break;
         }

      }
   }
}
Von |2016-12-13T07:55:09+01:002016-12-13|EPLAN, EPLAN-API|
Nach oben