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
Programmierung von Plugins
Forum rules
Immer Betriebssystem und QCAD Version angeben.
Zeichnungsdateien und Bildschirmfotos beifügen.
Eine Frage pro Topic.
Immer Betriebssystem und QCAD Version angeben.
Zeichnungsdateien und Bildschirmfotos beifügen.
Eine Frage pro Topic.
Re: Programmierung von Plugins
Guten Abend,
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:
- 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":
Ein Kommandozeilenwerkzeug, welches in der Regel aufgerufen würde als:
könnte mit run() aufgerufen werden als:
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.
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.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?
Nein.2.) Allerdings bin ich bei meinen Recherchen darauf gestoßen, dass man mit JavaScript keine DLL's benutzen kann. Geht das mit ECMAScript?
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(...);
...
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;
}
Code: Select all
myapp -a -f myinputfile.csv
Code: Select all
run("myapp", ["-a", "-f", "myinputfile.csv"]);
Re: Programmierung von Plugins
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
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
Re: Programmierung von Plugins
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