Page 1 of 1
How do I run "Detect Duplicates MD" programatically?
Posted: Tue Dec 10, 2019 12:22 pm
by daniel_frac
Dear Support
I'm trying to create a script that cleans DXF files automatically, for our internal process.
Part of our cleaning operations require to delete duplicate entities, I would like to do this automatically on a jvscript but I cannot find any reference of "Detect Duplicates" on
https://www.ribbonsoft.com/doc/qcad/3.0/developer/ or in
https://github.com/qcad/qcad/tree/v3.23.0.9/scripts
Can you point me out to the right documentation or if this is possible to do in JS?
Best Regards
Daniel Hung
System Information:
OS: Windows 10 Pro 64bit
QCAD Version: QCAD Professional 3.23.0.0 (3.23.0)
Re: How do I run "Detect Duplicates MD" programatically?
Posted: Tue Dec 10, 2019 1:25 pm
by andrew
It's part of QCAD Professional.
You can invoke it like this:
Code: Select all
var cadFileName = "in.dxf";
var outFileName = "out.dxf";
var tolerance = 0.0001;
var doc = new RDocument(new RMemoryStorage(), createSpatialIndex());
var di = new RDocumentInterface(doc);
if (di.importFile(cadFileName) !== RDocumentInterface.IoErrorNoError) {
print("Cannot import file:", cadFileName);
return;
}
Duplicates.findDuplicates(di, true, tolerance, 0.0, true);
// delete duplicates:
var counter = doc.countSelectedEntities();
var op = new RDeleteSelectionOperation();
di.applyOperation(op);
if (!di.exportFile(outFileName, "DXF R27")) {
qWarning("Export to file failed: ", outFileName);
}
else {
print("Deleted: " + counter);
}
di.destroy();
The function signature is:
Code: Select all
/**
* Find duplicate entities.
*
* \param di RDocumentInterface
* \param allLayers True: compare entities across different layers
* \param distanceTolerance Tolerance (maximum distance between two points to be regarded as identical)
* \param angleTolerance Angle tolerance (maximum angle between two lines to be regarded as identical)
* \param reversedIsSame True: ignore direction of entities when comparing
*/
Duplicates.findDuplicates = function(di, allLayers, distanceTolerance, angleTolerance, reversedIsSame) { ... }
Re: How do I run "Detect Duplicates MD" programatically?
Posted: Tue Dec 17, 2019 3:01 pm
by daniel_frac
Which module library Duplicates is?
in my script I have
include("scripts/library.js");
include("scripts/simple.js");
and I get an error when running:
Duplicates.findDuplicates(di, true, 0.001, 0.001, true);
Warning: RScriptHandlerEcma::eval: script engine exception: "ReferenceError: Can't find variable: Duplicates"
Warning: "main() at C:\\qcadModules\\main.js:51\n<global>() at C:\\qcadModules\\main.js:63"
Warning: At least one uncaught exception:
Warning: "main() at C:\\qcadModules\\main.js:51\n<global>() at C:\\qcadModules\\main.js:63"
13:58:09: Debug: "<global>() at 51"
Re: How do I run "Detect Duplicates MD" programatically?
Posted: Tue Dec 17, 2019 4:44 pm
by andrew
You can find a list of all scripts and their location under Help > About > Scripts.
You may want to copy that list and paste it into a text editor to make it searchable.
Duplicates scripts/Pro/Modify/Detection/Duplicates
This entry means that you you have to include scripts/Pro/Modify/Detection/Duplicates/Duplicates.js