Programmierung von Plugins

Bitte benutzen Sie dieses Forum für Fragen, Kommentare und Probleme im Zusammenhang mit QCAD Professional

Moderators: andrew, Husky

Forum rules

Immer Betriebssystem und QCAD Version angeben.

Zeichnungsdateien und Bildschirmfotos beifügen.

Eine Frage pro Topic.

Post Reply
Rainbow
Registered Member
Posts: 2
Joined: Fri Feb 11, 2022 7:08 pm

Programmierung von Plugins

Post by Rainbow » Fri Feb 11, 2022 7:42 pm

Guten Abend und Hallo in's Forum,

ich bin neu bei QCAD und auf der Suche nach einem "programmierbaren CAD" für'n Mac (eigentlich für alle drei OS [Mac, Linux, Windows] und hatte LibreCAD in's Auge gefasst. Aber die Programmierung ist mir mit C++ und Qt zu umständlich bzw. nicht gewohnt weil ich FreePascal mit der Lazarus-IDE programmiere.

Auf Windows habe ich recht passable Ergebnisse mit der COM-Schnittstelle von DesignCAD erreicht. Das funzt recht gut. Leider nicht für Mac und Linux.

Was ich im Netz über QCAD herausgefunden habe ist, dass Plugins, ähnlich LibreCAD, mittels Qt, qmake und C++ geproggt werden können. Wenn ich es richtig verstehe, dann wird doch in den C++-Programmen über Headerdateien, welche die Funktionen für's CAD enthalten, auf QCAD-DLL's zugegriffen und es werden die auszuführenden CAD-Befehle (z.B. zeichnen einer Linie -ähnlich dem Befehl addLine(0,0 ,100, 100) in ECMAScript-) durchgeführt.
Hier setzt meine erste Frage an:

1.) Kann man auch mit Lazarus Plugin's entwickeln, indem man eine DLL baut die als Plugin geladen werden kann und die die entsprechenden Befehle an QCAD übergibt?

2.) Die zweite Frage betrifft ECMAScript. Das scheint JavaScript zu entsprechen. Das Beispiel aus dem Netz mit der Lissajous-Figur funktionierte auf Anhieb. Großer Pluspunkt schonmal für QCad. Da ich unter Lazarus die Unit "Numlib" benutze um lineare Gleichungssysteme oder einfache DGL's zu lösen dachte ich daran evtl. mit Lazarus oder FORTRAN (ist ja prädestiniert für sowas) DLL's zu bauen und diese mit ECMAScript zu benutzen. Allerdings bin ich bei meinen Recherchen darauf gestoßen, dass man mit JavaScript keine DLL's benutzen kann. Geht das mit ECMAScript?

Für Gleichungssysteme in Javascript habe ich gerade hier: http://walter.bislins.ch/blog/index.asp ... aScript%29 eine Funktion gefunden.

Für Antworten danke ich im Voraus!

Viele Grüße

Rainbow

User avatar
andrew
Site Admin
Posts: 9037
Joined: Fri Mar 30, 2007 6:07 am

Re: Programmierung von Plugins

Post by andrew » Fri Feb 11, 2022 9:20 pm

Guten Abend,
1.) Kann man auch mit Lazarus Plugin's entwickeln, indem man eine DLL baut die als Plugin geladen werden kann und die die entsprechenden Befehle an QCAD übergibt?
Als Plugin: nein. QCAD verwendet ein Plugin System welches bedingt, dass ein Plugin zwingend die C++ Schnittstelle "RPluginInterface" implementieren muss. Das Plugin muss ausserdem mit der gleichen Qt Version gelinkt werden wie QCAD.
2.) Allerdings bin ich bei meinen Recherchen darauf gestoßen, dass man mit JavaScript keine DLL's benutzen kann. Geht das mit ECMAScript?
Nein.


Es gibt mehrere Ansätze, wie die Idee trotzdem klappen könnte.

Ich würde wie folgt vorgehen:
- In der Lieblingsumgebung / Programmiersprache "XY" ein beliebiges Executable (myapp.exe / myapp.app / myapp) kompilieren welches eine ECMAScript-Code Datei generiert in der Form:

Code: Select all

addLayer(...);
addLine(...);
addArc(...);
addText(...);
...
- Ein einfaches ECMAScript in QCAD integrieren, welches ein QCAD Menu erstellt und beim Start zuerst dieses Executable als externen Prozess aufruft und anschliessend das generierte Skript ausführt.

Mit diesem Ansatz kann man ein beliebiges externes Programm integrieren, egal welche Technologie benutzt wurde.

Das Ausführen des externen Prozesses geschieht über die Qt Klasse QProcess oder über diese komfortable Hilfs-Funktion "run":

Code: Select all

function run(program, arguments, environment, background) {
    if (isNull(background)) {
        background = false;
    }

    var process = new QProcess();
    process.error.connect(function(e) { qDebug("Error: ", e); });
    var stdout = "";
    var stderr = "";

    if (!background) {
        process.readyReadStandardOutput.connect(function() { stdout += process.readAllStandardOutput(); });
        process.readyReadStandardError.connect(function() { stderr += process.readAllStandardError(); });
    }

    if (environment!==undefined) {
        var env = QProcessEnvironment.systemEnvironment();
        for (var i=0; i<environment.length; i++) {
            env.insert(environment[i][0], environment[i][1]);
        }
        process.setProcessEnvironment(env);
    }

    process.start(program, arguments);
    if (!background) {
        process.waitForFinished(-1 /* no timout! */);
        qDebug(stdout);
        qDebug(stderr);
        EAction.handleUserMessage(stdout);
        EAction.handleUserWarning(stderr);
    }

    return process;
}
Ein Kommandozeilenwerkzeug, welches in der Regel aufgerufen würde als:

Code: Select all

myapp -a -f myinputfile.csv
könnte mit run() aufgerufen werden als:

Code: Select all

run("myapp", ["-a", "-f", "myinputfile.csv"]);
Ich denke, dass dies die sauberste Lösung ist, da in diesem Projekt doch sehr unterschiedliche Technologien verwendet werden sollen und eine Integration als Library wohl sehr aufwändig und schmerzhaft wäre. Wenn richtig implementiert hat dies ausserdem den Vorteil, dass der grösste Teil des Aufwands von QCAD unabhängig ist und auch andere Zielplattformen implementiert werden könnten.

Rainbow
Registered Member
Posts: 2
Joined: Fri Feb 11, 2022 7:08 pm

Re: Programmierung von Plugins

Post by Rainbow » Fri Feb 11, 2022 10:29 pm

Hallo andrew,

vielen Dank für die umfangreiche, sehr gut beschriebene Antwort. Sogar ich verstehe (im groben) die Vorgehensweise.

Ich baue eine Executable mit GUI-Funktionalität in die Eingaben vorgenommen und Berechnungen ausgeführt werden. Die Ergebnisse werden dann an das ECMAScript übergeben und über die Befehle addLine(...) etc. Das werde ich dann mal ausprobieren.

Die Funktion "run" ist dann ein Skriptfile für die Konsole (Bash, zsh, powershell) oder muß sie mit einem C++ Compiler zunächst compiliert werden?

Der erste Übergabeparameter an die Funktion ist der Name der Executable in Gänsefüßchen als String. Was bedeuten "-a" für den Parameter arguments und "-f" für environment? Background steuert irgendwas mit stdout bzw. stderr von process.

Was hat jetzt "myinputfile.csv" für eine Aufgabe? Das ist eine *.csv-Datei welche die Berechnungsergebnisse (z.B. Stützstellen für einen Spline) eines ECMAScriptes enthält oder ist myinputfile.js gemeint, das "generierte Skript?

Ich werde es nach weiterem Studium und ausprobieren der Tutorial-Skripte ausprobieren.

Jetzt geht's in die Falle. Ich wünsche allen eine gute Nacht!

Rainbow

CVH
Premier Member
Posts: 3416
Joined: Wed Sep 27, 2017 4:17 pm

Re: Programmierung von Plugins

Post by CVH » Sat Feb 12, 2022 8:21 am

andrew wrote:
Fri Feb 11, 2022 9:20 pm
Die Funktion "run" ist dann ein Skriptfile für die Konsole (Bash, zsh, powershell) oder muß sie mit einem C++ Compiler zunächst compiliert werden?
Ich gehe davon aus, dass die Ausführungsfunktion ECMAScript ist.
Und dass '-a', '-f' nur einige Beispiele für Übergabeoptionen sind.

'myinputfile.csv' wären die Eingabedaten für Ihre Berechnungen, der Prozess würde 'Simple API'-Befehle in einer *.js-Datei zurückgeben.
Ein einfaches QCAD-Addon würde dann Ihren Prozess mit 'Run ....' aufrufen und dann das 'Simple API'-Skript ausführen.

Eine andere Option als das Generieren von 'Simple API'-Befehlen ist DrawFromCSV, das die meisten Dinge 'als ob' unter Verwendung der QCAD-GUI zeichnen kann. https://qcad.org/rsforum/viewtopic.php? ... 135#p35383
Dieses Addon kann mit einem Dateinamen aufgerufen werden.

Aber es scheint alles ziemlich komplex zu werden, ich codiere normalerweise ein Addon direkt in ECMAscript,
selbst für komplexe Berechnungen z. Centroids:
https://qcad.org/rsforum/viewtopic.php?f=30&t=8970
Das Lesen von Daten aus einer Eingabedatei ist ziemlich einfach.

Grüße,
CVH

Post Reply

Return to “QCAD Professional”