| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- /**
- * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved.
- *
- * This file is part of the QCAD project.
- *
- * QCAD is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * QCAD is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with QCAD.
- */
- /**
- * Command line tool.
- * Merges multiple drawing files (DWG, DXF) into one.
- */
- include("scripts/Tools/arguments.js");
- function printHelp() {
- print("Usage: " + args[1] + " [OPTIONS]... <XML config file>");
- print();
- print("Merges multiple drawing files (DWG, DXF, ...) into one.");
- print();
- print(" -f, -force Overwrite existing output file");
- print(" -h, -help Display this help");
- print(" -t TYPE, -type=TYPE Set file type to TYPE ");
- print(" (e.g. R12...R27 or 2000...2013)");
- print(" -o FILE, -outfile=FILE Set output file to FILE");
- print(" default is same path and base name as input file");
- printGenericUsage();
- print();
- print("XML format:");
- print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
- print("<merge xmlns=\"http://qcad.org/merge/elements/1.0/\" unit=\"Millimeter\">");
- print(" <item src=\"file1.dxf\">");
- print(" <insert x=\"10\" y=\"0\" angle=\"30\" flipx=\"false\" flipy=\"false\" />");
- print(" </item>");
- print("</merge>");
- print();
- }
- function main() {
- if (testArgument(args, "-h", "-help")) {
- printHelp();
- return;
- }
- if (args.length < 3) {
- print("No input file given. Try -h for help.");
- return;
- }
- qApp.organizationName = "QCAD";
- qApp.organizationDomain = "QCAD.org";
- qApp.applicationVersion = RSettings.getVersionString();
- qApp.applicationName = "QCAD";
- RSettings.setApplicationNameOverride("QCAD3");
-
- var xmlFile = args[args.length - 1];
- if (xmlFile.indexOf("-") === 0) {
- print("No input file. Try -h for help.");
- return;
- }
- include("scripts/ImportExport/SvgImporter/SvgImporterInit.js");
- RFileImporterRegistry.registerFileImporter(new SvgImporterFactory());
- var fi = new QFileInfo(xmlFile);
- if (!fi.isAbsolute()) {
- xmlFile = RSettings.getLaunchPath() + QDir.separator + xmlFile;
- fi = new QFileInfo(xmlFile);
- }
- var outputFile = getArgument(args, "-o", "-outfile");
- if (outputFile!==undefined) {
- if (!new QFileInfo(outputFile).isAbsolute()) {
- outputFile = RSettings.getLaunchPath() + QDir.separator + outputFile;
- }
- }
- else {
- outputFile = fi.absolutePath() + QDir.separator + fi.completeBaseName() + ".dxf";
- }
- if (new QFileInfo(outputFile).exists() && !testArgument(args, "-f", "-force")) {
- print("Output file exists already, not overwriting: ", outputFile);
- print("Use -f to force overwrite");
- return;
- }
- var type = getArgument(args, "-t", "-type");
- if (type===undefined) {
- type = "";
- }
- // parse XML into array:
- //var file = new QFile(xmlFile);
- //var xmlReader = new QXmlSimpleReader();
- //var source = new QXmlInputSource(file);
- var handler = new XmlHandler();
- //xmlReader.setContentHandler(handler);
- //var ok = xmlReader.parse(source, false);
- parseXml(xmlFile, handler);
- //file.close();
- // target document:
- var docDest = new RDocument(new RMemoryStorage(), new RSpatialIndexSimple());
- docDest.setUnit(handler.outputUnit);
- var diDest = new RDocumentInterface(docDest);
- for (var i=0; i<handler.items.length; i++) {
- var item = handler.items[i];
- for (var k=0; k<item.inserts.length; k++) {
- var insert = item.inserts[k];
- qDebug("insert: ", item.src, insert.x);
- var doc = new RDocument(new RMemoryStorage(), new RSpatialIndexSimple());
- var di = new RDocumentInterface(doc);
- var src;
- if (!new QFileInfo(item.src).isAbsolute()) {
- src = fi.absolutePath() + QDir.separator + item.src;
- }
- else {
- src = item.src;
- }
- if (di.importFile(src) !== RDocumentInterface.IoErrorNoError) {
- qWarning("cannot import file: ", src);
- }
- // input files without units are assumed to be in output unit:
- // if (doc.getUnit()===RS.None) {
- // qDebug("adjusting unit of unitless input file '%1' to '%2'.".arg(src).arg(RUnit.unitToName(handler.outputUnit)));
- // doc.setUnit(handler.outputUnit);
- // }
- var op = new RPasteOperation(doc);
- op.setOffset(new RVector(insert.x, insert.y));
- op.setRotation(insert.angle);
- op.setScale(insert.scale);
- op.setFlipHorizontal(insert.flipX);
- op.setFlipVertical(insert.flipY);
- op.setBlockName(new QFileInfo(src).completeBaseName());
- diDest.applyOperation(op);
- destr(di);
- }
- }
- diDest.exportFile(outputFile, type);
- print("Converting");
- print(" from: " + xmlFile);
- print(" to : " + outputFile);
- destr(diDest);
- }
- /**
- * SAX style XML handler.
- */
- function XmlHandler() {
- QXmlDefaultHandler.call(this);
- this.items = [];
- this.item = undefined;
- this.outputUnit = RS.Millimeter;
- }
- XmlHandler.prototype = new QXmlDefaultHandler();
- /**
- * Handle element (tag).
- */
- XmlHandler.prototype.startElement = function(namespaceURI, localName, qName, atts) {
- if (localName==="merge") {
- this.outputUnit = this.getUnitAttribute(atts, "unit", RS.Millimeter);
- }
- if (localName==="item") {
- this.item = {};
- this.item.src = atts.value("src");
- this.item.inserts = [];
- this.items.push(this.item);
- }
- if (localName==="insert") {
- if (this.item===undefined) {
- qWarning("insert element found outside of the scope of an item element");
- return false;
- }
- var insert = {};
- insert.x = this.getDoubleAttribute(atts, "x", 0);
- insert.y = this.getDoubleAttribute(atts, "y", 0);
- insert.angle = RMath.deg2rad(this.getDoubleAttribute(atts, "angle", 0));
- insert.scale = this.getDoubleAttribute(atts, "scale", 1.0);
- insert.flipX = this.getBoolAttribute(atts, "flipx", false);
- insert.flipY = this.getBoolAttribute(atts, "flipy", false);
- this.item.inserts.push(insert);
- }
- return true;
- };
- XmlHandler.prototype.getDoubleAttribute = function(atts, name, defaultValue) {
- var str = atts.value(name);
- if (str.length===0) {
- return defaultValue;
- }
- return parseFloat(str);
- };
- XmlHandler.prototype.getBoolAttribute = function(atts, name, defaultValue) {
- var str = atts.value(name).toLowerCase();
- if (str.length===0) {
- return defaultValue;
- }
- return str==="true" || str==="1";
- };
- XmlHandler.prototype.getUnitAttribute = function(atts, name, defaultValue) {
- var str = atts.value(name).toLowerCase();
- if (str.length===0) {
- return defaultValue;
- }
- return RUnit.parseUnit(str);
- };
- if (typeof(including)=='undefined' || including===false) {
- main();
- }
|