JohannWeiher

Über Johann Weiher

Der Autor hat bisher keine Details angegeben.
Bisher hat Johann Weiher, 536 Blog Beiträge geschrieben.

Serverumzug von Uberspace zu Uberspace

Hört sich komisch an, ist aber so…
Uberspace stellt eine neue Version ihrer Dienstleistung bereit: Uberspace7

Viele Verbesserungen und zwei davon haben mich überzeugt den Aufwand für einen Umzug in Kauf zu nehmen. Habe viele Domain auf Uberspace6 liegen, welche diese Features nicht benötigen. Darum habe ich noch nur meine private (weiher.io) und geschäftliche (suplanus.de) Domain umgezogen. Hauptgründe:

  • PHP Instanz sofort verfügbar (Performance)
  • Rspamd (Spam Schutz, derzeit wohl der meist gelobte)

Mit dieser Anleitung ging das relativ schnell und einfach.
Dennoch musste ich meine SQL Datenbanken dann nochmal neu verknüpfen und im WordPress paar Links ersetzen, was aber überschaubar war.

Domains hab ich gleich zu Gandi umgezogen. Für mich der beste Platz für Domains.

Mit Mail musste ich mich mehr ärgern, aber da hab ich mir mein eigenes Grab mit Namespaces im U6 geschaufelt. Wusste es nicht besser und darum hab ich Sie auf dem neuen Server dann wieder aufgetrennt in eigene User.

Mein User bekommt mehr Email-Aliase, Familienmitglieder nur jeweils eine (pro Domain, automatisch).
Rspamd hab ich mit dieser Anleitung noch geändert. Alles in die Datei .mailfilter , diese wird per default ausgeführt. Trefferquote scheint wirklich gut zu sein.

Es war schon eine Nacht Arbeit, aber es hat sich gelohnt, vor allem das Aufräumen von Altlasten. Nach wie vor kann ich Uberspace nur empfehlen, für Leute die ein bisschen mehr aus ihrem Webspace rausholen wollen und keine Angst vor einem Terminal haben.

Von |2018-06-06T12:08:00+02:002018-06-06|Allgemein|

BackgroundWorker in der EPLAN API

… geht offiziell nicht. Steht auch so in der Dokumentation. Darum hier gleich der Vermerk: Es handelt sich um eine interne Funktionalität welche nicht supported wird.

Dennoch hat es genau mein Problem gelöst:
Ich habe eine ProgressBar welche über einen BackgroundWorker viel Arbeit macht. An paar Stellen brauche ich die EPLAN API. Hier hatte ich aber komisches Verhalten (DLLs wurden nicht gefunden, usw.).
Zurückzuführen war es darauf dass der EPLAN Thread nicht wusste wo er suchen soll.

Mit EplanMainThreadDispatcher  gibt es die Möglichkeit Code im Dispatcher und somit im Thread von EPLAN auszuführen. Hier ein Beispiel:

new EplanMainThreadDispatcher().ExecuteInMainThreadSync(o =>
{
  new CommandLineInterpreter().Execute("reports /TYPE:PROJECT");
  return null;
}, null);

Hab mir das mal bisl vereinfacht mit einer Helper-Klasse:

using Eplan.EplApi.Base.Internal;
using Action = System.Action;

namespace Suplanus.Sepla.Application
{
  public class EplanDispatcher
  {
    public static void ExecuteInMainThread(Action action)
    {
      new EplanMainThreadDispatcher().ExecuteInMainThreadSync(o =>
      {
        action.Invoke();
        return null;
      }, null);
    }
  }
}

Dann brauch ich nur noch:

EplanDispatcher.ExecuteInMainThread(() =>
  {
    new CommandLineInterpreter().Execute("reports /TYPE:PROJECT");
  }
);
Von |2018-07-19T10:53:25+02:002018-06-01|EPLAN, EPLAN-API|

EPLAN-API: Showcase 2018 April

Mit dem MacroTool ist es möglich schnell und einfach Makros zu erzeugen. Es spart viel Zeit bei der Erstellung von Bauteil-, Pro Panel-, Fenster- und Seitenmakros…
Hier mal die Funktionen / Actions im Überblick:

 

Create – Electric P8

  • Artikel anlegen / aktualisieren
  • Funktionsschablone erstellen
  • Seiten im Makroprojekt erstellen
  • Gerät im Makroprojekt einfügen
  • Makrokasten einfügen und alle notwendigen Eigenschaften füllen
  • Makro erzeugen
  • Link in Artikelverwaltung eintragen

 

Create – Pro Panel

  • Artikel anlegen / aktualisieren
  • Bauraum im Makroprojekt erstellen
  • Gerät im Bauraum einfügen
  • Makrodaten einfügen und alle notwendigen Eigenschaften füllen
  • Makro erzeugen
  • Link in Artikelverwaltung eintragen

 

CreateNeutral
Gleich zu Create mit dem Unterschied dass die Zielstruktur, in der das Makro gespeichert werden soll, angegeben wird.

 

NewVariant
Es wird ein Dialog angezeigt, zur Auswahl der Darstellungsart und Variante der neuen Makro-Variante. Es wird die nächste freie Variante der Darstellungsart automatisch ausgewählt. Nach bestätigen mit OK wird die Seite erzeugt und ein Makrokasten mit gefüllten Informationen eingefügt.

 

SelectMacro
Es wird das Makroprojekt geöffnet und an die Seite des Makros gesprungen.

 

Set
Makropfade und Eigenschaften werden an Makrokasten, Seite oder Bauraum geschrieben.

 

Es sind mehrere Videos in der Youtube Playlist:

Von |2018-07-19T10:54:38+02:002018-05-04|EPLAN, EPLAN-API|

GetProjectProperty

Dieses Script gibt es nun schon in der dritten Auflage. Ich habe die Unterstützung für benutzerdefinierte Eigenschaften hinzugefügt. Im Test des Scriptes seht ihr die verschiedenen Aufrufe:

[Start]
public void Test()
{
  string projectProperty;

  // No index
  projectProperty = GetProjectPropertyAction("10000", "0");
  MessageBox.Show("No index: " + Environment.NewLine +  projectProperty);

  // Index
  projectProperty = GetProjectPropertyAction("10901", "1");
  MessageBox.Show("Index: " + Environment.NewLine + projectProperty);

  // UserDefinied
  projectProperty = GetProjectPropertyAction("ibKastl.Project.Test", null);
  MessageBox.Show("UserDefinied: " + Environment.NewLine + projectProperty);
}

 

Script:

using System;
using System.IO;
using System.Windows.Forms;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;

namespace EplanScriptingProjectBySuplanus.GetProjectProperty
{
  class GetProjectProperty
  {
    private string GetProjectPropertyAction(string id, string index)
    {
      string value = null;
      ActionCallingContext actionCallingContext = new ActionCallingContext();
      actionCallingContext.AddParameter("id", id);
      actionCallingContext.AddParameter("index", index);
      new CommandLineInterpreter().Execute("GetProjectProperty", actionCallingContext);
      actionCallingContext.GetParameter("value", ref value);
      return value;
    }

    [DeclareAction("GetProjectProperty")]
    public void Action(string id, string index, out string value)
    {
      string pathTemplate = Path.Combine(PathMap.SubstitutePath("$(MD_SCRIPTS)"),
          "GetProjectProperty", "GetProjectProperty_Template.xml");
      string pathScheme = Path.Combine(PathMap.SubstitutePath("$(MD_SCRIPTS)"),
          "GetProjectProperty", "GetProjectProperty_Scheme.xml");

      bool isUserDefinied = string.IsNullOrEmpty(index) || index.ToUpper().Equals("NULL");

      try
      {
        // Set scheme
        const string QUOTE = "\"";
        string content = File.ReadAllText(pathTemplate);

        if (isUserDefinied)
        {
          string isSelectedPropertyUserDef =
            @"<Setting name=" + QUOTE + "SelectedPropertyIdUserDef" + QUOTE + " type=" + QUOTE + "string" + QUOTE + ">" +
            "<Val>" + id + "</Val>" +
            "</Setting>";

          content = content.Replace("GetProjectProperty_ID_SelectedPropertyId", "0");
          content = content.Replace("IsSelectedPropertyIdUserDef", isSelectedPropertyUserDef);
          content = content.Replace("GetProjectProperty_INDEX", "0");
          content = content.Replace("GetProjectProperty_ID", id);
        }
        else
        {
          content = content.Replace("GetProjectProperty_ID_SelectedPropertyId", id);
          content = content.Replace("IsSelectedPropertyIdUserDef", "");
          content = content.Replace("GetProjectProperty_INDEX", index);
          content = content.Replace("GetProjectProperty_ID", id);
        }

        File.WriteAllText(pathScheme, content);

        new Settings().ReadSettings(pathScheme);

        string pathOutput = Path.Combine(
            PathMap.SubstitutePath("$(MD_SCRIPTS)"), "GetProjectProperty",
            "GetProjectProperty_Output.txt");

        // Export
        ActionCallingContext actionCallingContext = new ActionCallingContext();
        actionCallingContext.AddParameter("configscheme", "GetProjectProperty");
        actionCallingContext.AddParameter("destinationfile", pathOutput);
        actionCallingContext.AddParameter("language", "de_DE");
        new CommandLineInterpreter().Execute("label", actionCallingContext);

        // Read
        value = File.ReadAllLines(pathOutput)[0];
      }
      catch (Exception exception)
      {
        MessageBox.Show(exception.Message, "GetProjectProperty", MessageBoxButtons.OK,
            MessageBoxIcon.Error);
        value = "[Error]";
      }

    }
  }
}

 

Das Script findet Ihr wie gewohnt auf GitHub.

Von |2019-03-14T08:34:18+01:002018-03-13|EPLAN, EPLAN-Scripts|
Nach oben