Tutorial: Kommandozeilenwerkzeuge als Skripte

Inhalt

 

Einleitung

Scripts können verwendet werden, um Kommandozeilenwerkzeuge zu erstellen, welche QCAD-Funktionalität nutzen. Ein solches Skript kann z.B. eine Zeichnung anhand von Parametern erzeugen, eine Zeichnung konvertieren oder eine Zeichnung analysieren. 

Beispiel

Die Grundstruktur eines Kommandozeilenwerkzeugskripts kann z.B. wie folgt aussehen. Dies ist ein voll funktionsfähiges Beispielskript, das als Kommandozeilenwerkzeug verwendet werden kann, um eine Linie von 0,0 bis 100,100 zu einer gegebenen Zeichnung hinzuzufügen und diese Zeichnung unter einem neuen Dateinamen zu exportieren.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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;
    }

    // create new document (off screen):
    var doc = new RDocument(new RMemoryStorage(), new RSpatialIndexNavel());
    var di = new RDocumentInterface(doc);

    // import given file:
    if (di.importFile(inFile) != RDocumentInterface.IoErrorNoError) {
        di.destroy();
        print("Cannot import file:", inFile);
        return;
    }

    // add line to drawing (usine QCAD Simple API):
    startTransaction(di);
    addLine(0,0, 100,100);
    endTransaction()

    // export to given file (-o)
    if (!di.exportFile(outFile)) {
        di.destroy();
        print("Cannot export file:", outFile);
        return;
    }
    
    di.destroy();
}

if (typeof(including)=='undefined' || including===false) {
    main();
}

Skripte als Kommandozeilenwerkzeug starten 

Angenommen, 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 Webservices ausgeführt wird, verwenden Sie ausserdem 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 normalerweise auch -platform offscreen übergeben, um headless zu laufen (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