Skript

Seitenfilter Filtereinstellungen per Script setzen

Nun habe ich schon gezeigt wie man ein Seitenfilter Schema aktiv schalten kann… Und hier seht ihr wie man einzelnen Filtereinstellungen hinzufügen kann.
In diesem Beispiel wird der Filter neu erstellt und eine Filtereinstellung hinzugefügt:

  • Kriterium: Seitenbeschreibung
  • Wert: Test
public class PageFilterExample
{
  private const string SCHEME_NAME = "MyFilter";
  private const string SETTINGS_PATH = "USER.PageBrowserGui.PageFilterScheme";

  [DeclareAction("PageFilterExample")]
  public void Action()
  {
    try
    {
      // Remove filter if exists
      SchemeSetting schemeSetting = new SchemeSetting();
      schemeSetting.Init(SETTINGS_PATH);
      if (schemeSetting.CheckIfSchemeExists(SCHEME_NAME))
      {
        schemeSetting.RemoveScheme(SCHEME_NAME);
      }

      // Create filter
      MultiLangString mlName = new MultiLangString();
      mlName.AddString(ISOCode.Language.L___, SCHEME_NAME);

      MultiLangString mlDescription = new MultiLangString();
      mlDescription.AddString(ISOCode.Language.L___, "My Description");
      schemeSetting.CreateScheme(SCHEME_NAME, mlName, mlDescription);

      SetSchemeSettings();

      // Update page filter
      schemeSetting.SetLastUsed(SCHEME_NAME);
      new Settings().SetBoolSetting("USER.PageBrowserGui.PageFilterScheme.ApplyCheckBox", true, 0);
      EventParameterString eventParameterString = new EventParameterString();
      eventParameterString.String = "RefreshPageFilter";
      new EventManager().Send("RefreshPageFilter", eventParameterString);
    }
    catch (Exception exception)
    {
      var baseException = new BaseException("PageFilterExample: " + exception, MessageLevel.Error);
      baseException.FixMessage();
      new Decider().Decide(EnumDecisionType.eOkDecision, exception.ToString(), "SetPageFilter",
        EnumDecisionReturn.eOK, EnumDecisionReturn.eOK, null, false, EnumDecisionIcon.eFATALERROR);
    }
  }

  private void SetSchemeSettings(int index = 0)
  {
    // Setup path: < is in the default schemes also, don't know why
    const string SETTINGS_PATH_SCHEME_SETTINGS = SETTINGS_PATH + "." + SCHEME_NAME + ".Data<.";

    // Set single (needed) settings
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "Value", "Test", index); // Search value
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "PropDescr", "11011;0", index); // page property id & index
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "Activ", true, index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "CriteriaType", 0, index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "IgnoreCase", false, index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "Negation", false, index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "Operator", 0, index);      
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "QuickFilter", false, index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "RelationDescr", "0;0", index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "SingleValue", false, index);
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "UseWildcards", true, index);      
    SetSchemeSetting(SETTINGS_PATH_SCHEME_SETTINGS + "WholeText", true, index);
  }

  public void SetSchemeSetting(string settingsPath, object value, int index = 0)
  {
    // Add settings nodes (needed because SchemeSetting.Set don't create Settings) & Set filter entries
    var settings = new Settings();
    if (value is bool)
    {
      settings.AddBoolSetting(settingsPath, new[] { (bool)value }, ISettings.CreationFlag.Insert);
      settings.SetBoolSetting(settingsPath, (bool)value, index);

    }
    else if (value is int)
    {
      var range = new[] { new Range { FromValue = 0, ToValue = 32768 } };
      settings.AddNumericSetting(settingsPath, new[] { (int)value }, range, ISettings.CreationFlag.Insert);
      settings.SetNumericSetting(settingsPath, (int)value, 0);

    }
    else if (value is string)
    {
      settings.AddStringSetting(settingsPath, new string[] { }, new string[] { }, ISettings.CreationFlag.Insert);
      settings.SetStringSetting(settingsPath, value.ToString(), 0);
    }
    else if (value is MultiLangString)
    {
      settings.AddMultiLangStringDefault(settingsPath, new MultiLangString[] { }, new MultiLangString[] { }, ISettings.CreationFlag.Insert);
      settings.SetMultiLangStringSetting(settingsPath, (MultiLangString) value, 0);
    }
    else
    {
      throw new NotImplementedException("SetSchemeSetting: Unknow type --> " + value.GetType());
    }
  }

}
Von |2018-11-30T16:16:09+01:002018-12-12|EPLAN, EPLAN-Scripts|

Seitenfilter per Script setzen

Ich hab, mit Hilfe des tollen API-Supports, es geschafft per Script den Seitenfilter zu setzen und diesen auch zu aktivieren.
In diesem Beispiel wird dann der Filter (sofern vorhanden) “MyFilter” im Seitennavigator gesetzt:

const string SCHEME_NAME = "MyFilter";
const string SETTINGS_PATH = "USER.PageBrowserGui.PageFilterScheme";

SchemeSetting schemeSetting = new SchemeSetting();
schemeSetting.Init(SETTINGS_PATH);

// Update page filter
schemeSetting.SetLastUsed(SCHEME_NAME);
new Settings().SetBoolSetting("USER.PageBrowserGui.PageFilterScheme.ApplyCheckBox", true, 0);
EventParameterString eventParameterString = new EventParameterString();
eventParameterString.String = "RefreshPageFilter";
new EventManager().Send("RefreshPageFilter", eventParameterString);
Von |2018-11-30T16:12:00+01:002018-12-11|EPLAN, EPLAN-Scripts|

Scripting C# Version

EPLAN verwendet aktuell (2.7) das .NET Framework 4.5.2
Somit würde uns mindestens C# Version 5 beim Programmieren zur Verfügung stehen (abhängig vom Client Rechner). In der EPLAN API geht das auch…

Leider verwendet EPLAN beim Laden von Scripten den CodeDomProvider  welcher nur C# Version 4 kann.
Somit könnte man im Visual Studio Projekt was programmieren, was keine Fehler verursacht, aber in EPLAN schon…

Stellt die Projekteinstellungen vom Visual Studio Projekt um: Projekt > Eigenschaften > Build > Erweitert… > Sprachversion > C# 4

Ich habe es dem Support gemeldet. Problem wurde erkannt, aber bis wann es umgesetzt wird, kann ich leider nicht sagen.

Von |2018-11-30T16:16:53+01:002018-12-10|EPLAN, EPLAN-Scripts|

Seitenmakro erstellen

Es gibt die interne Action XMExportPageMacroAction  um ein Seitenmakro aus der aktuellen Selektion zu erzeugen.
Wie gehabt, handelt es sich um eine nicht dokumentierte Action, welche nicht von EPLAN supported wird.

Parameter:

  • /Filename : vollständiger Name/Pfad der emp-Datei
  • /Description : Beschreibung
Von |2018-11-26T13:20:08+01:002018-11-26|EPLAN, EPLAN-Scripts|

Beschriftung: Filter per Script setzen

Jochen hat hier ein Script bereitgestellt um Stücklisten für PSI-Penta zu erstellen. Vielen Dank dafür!
Ich habe mir das mal angeschaut und er setzt den Filter im Script. Sehr elegant. Denn das Schema wird als Einstellungsknoten importiert und kann somit per Script angesprochen werden.

string schemaName = "My scheme";
string location = "+S1";
string usage = "external";
new Settings().SetStringSetting("USER.Labelling.Config." + schemaName + ".Data.SortFilter.FilterSchemeData",
"0|1|1|1200;0|0|" + location + "|0|1|1|0|0|0;0|#0|1|1|22041;0|0|29|0|1|1|0|0|0;0|#0|1|0|22144;0|0|" + usage + "|0|1|1|0|0|0;0|#3|1|0|;0|0||0|1|1|0|0|0;0|#0|1|1|1220;0|0|" + location + "|0|1|1|0|0|0;0|#0|1|0|22028;0|0|184|0|1|1|0|0|0;0|#0|1|0|22144;0|0|" + usage + "|0|1|1|0|0|0;0", 0);

Nun ist nur noch die Frage wie man an diesen kryptischen Filtertext kommt. Eigentlich relativ einfach (Bild aus dem CAD.Forum von Jochen):

Von |2018-11-09T07:16:30+01:002018-11-08|EPLAN, EPLAN-Scripts|
Nach oben