Zum Inhalt springen

Kommandozeilenwerkzeug-Skripte

Mit Skripten lassen sich Kommandozeilenwerkzeuge erstellen, welche die Funktionalität von QCAD nutzen. Ein solches Skript könnte zum Beispiel eine Zeichnung anhand von Parametern erzeugen, eine Zeichnung konvertieren oder eine Zeichnung analysieren.

Die Grundstruktur eines Kommandozeilenwerkzeug-Skripts kann zum Beispiel wie unten gezeigt aussehen. Dies ist zugleich ein voll funktionsfähiges Beispielskript, das als Kommandozeilenwerkzeug verwendet werden kann, um einer gegebenen Zeichnung eine Linie von 0,0 nach 100,100 hinzuzufügen und diese Zeichnung unter einem neuen Dateinamen zu exportieren:

include("scripts/simple.js");
include("scripts/Tools/arguments.js");
function printHelp() {
print("Usage: " + args[1] + " [OPTION]... <drawing file>");
print();
print("This tool does...");
print();
print(" -f, -force Overwrite existing output file");
print(" -h, -help Display this help");
print(" -o, -outfile=FILE Set output file to FILE");
print(" -p, -parameter Some parameter...");
print(" ...");
printGenericUsage();
print();
}
function main() {
if (testArgument(args, "-h", "-help")) {
printHelp();
return;
}
if (args.length < 3) {
print("No input file given. Try -h for help.");
return;
}
var inFile = args[args.length - 1];
if (inFile.indexOf("-") === 0) {
print("No input file. Try -h for help.");
return;
}
var fi = new QFileInfo(inFile);
if (!fi.isAbsolute()) {
inFile = RSettings.getLaunchPath() + QDir.separator + inFile;
fi = new QFileInfo(inFile);
}
var outFile = getArgument(args, "-o", "-outfile");
if (outFile !== undefined) {
outFile = getAbsolutePathForArg(outFile);
}
else {
print("No output file. Try -h for help.");
}
if (new QFileInfo(outFile).exists() && !testArgument(args, "-f", "-force")) {
print("Output file exists already, not overwriting: ", outFile);
print("Use -f to force overwrite");
return;
}
// neues Dokument erstellen (ohne Bildschirm):
var doc = new RDocument(new RMemoryStorage(), new RSpatialIndexNavel());
var di = new RDocumentInterface(doc);
// gegebene Datei importieren:
if (di.importFile(inFile) != RDocumentInterface.IoErrorNoError) {
di.destroy();
print("Cannot import file:", inFile);
return;
}
// Linie zur Zeichnung hinzufügen (mit QCAD Simple API):
startTransaction(di);
addLine(0, 0, 100, 100);
endTransaction();
// in gegebene Datei exportieren (-o)
if (!di.exportFile(outFile)) {
di.destroy();
print("Cannot export file:", outFile);
return;
}
di.destroy();
}
if (typeof(including) == 'undefined' || including === false) {
main();
}

Nehmen wir an, dieses Skript ist unter scripts/Tools/ExTool/ExTool.js gespeichert.

Es kann dann wie folgt ausgeführt werden:

qcad -autostart scripts/Tools/ExTool/ExTool.js -f -o out.dxf in.dxf

Wenn das Skript als Teil eines Webdienstes ausgeführt wird, übergeben Sie unbedingt auch die Schalter -no-gui und -allow-multiple-instances, um QCAD mitzuteilen, dass keine GUI verfügbar ist und mehrere Instanzen parallel ausgeführt werden können:

qcad -no-gui -allow-multiple-instances -autostart scripts/Tools/ExTool/ExTool.js -f -o out.dxf in.dxf

Auf einem Server würden Sie typischerweise auch -platform offscreen übergeben, um ohne Bildschirm (headless) auszuführen (d. h. ohne X11-Server unter Linux):

qcad -platform offscreen -no-gui -allow-multiple-instances -autostart scripts/Tools/ExTool/ExTool.js -f -o out.dxf in.dxf