| 56 cfg (String, prog_coverer, ""); |
56 cfg (String, prog_coverer, ""); |
| 57 cfg (String, prog_ytruder, ""); |
57 cfg (String, prog_ytruder, ""); |
| 58 cfg (String, prog_rectifier, ""); |
58 cfg (String, prog_rectifier, ""); |
| 59 cfg (String, prog_edger2, ""); |
59 cfg (String, prog_edger2, ""); |
| 60 |
60 |
| 61 str* const g_extProgPaths[] = |
61 QString* const g_extProgPaths[] = |
| 62 { |
62 { |
| 63 &prog_isecalc, |
63 &prog_isecalc, |
| 64 &prog_intersector, |
64 &prog_intersector, |
| 65 &prog_coverer, |
65 &prog_coverer, |
| 66 &prog_ytruder, |
66 &prog_ytruder, |
| 99 |
99 |
| 100 // ============================================================================= |
100 // ============================================================================= |
| 101 // ----------------------------------------------------------------------------- |
101 // ----------------------------------------------------------------------------- |
| 102 static bool checkProgPath (const extprog prog) |
102 static bool checkProgPath (const extprog prog) |
| 103 { |
103 { |
| 104 str& path = *g_extProgPaths[prog]; |
104 QString& path = *g_extProgPaths[prog]; |
| 105 |
105 |
| 106 if (path.length() > 0) |
106 if (path.length() > 0) |
| 107 return true; |
107 return true; |
| 108 |
108 |
| 109 ExtProgPathPrompt* dlg = new ExtProgPathPrompt (g_extProgNames[prog]); |
109 ExtProgPathPrompt* dlg = new ExtProgPathPrompt (g_extProgNames[prog]); |
| 117 return false; |
117 return false; |
| 118 } |
118 } |
| 119 |
119 |
| 120 // ============================================================================= |
120 // ============================================================================= |
| 121 // ----------------------------------------------------------------------------- |
121 // ----------------------------------------------------------------------------- |
| 122 static str processErrorString (extprog prog, QProcess& proc) |
122 static QString processErrorString (extprog prog, QProcess& proc) |
| 123 { |
123 { |
| 124 switch (proc.error()) |
124 switch (proc.error()) |
| 125 { |
125 { |
| 126 case QProcess::FailedToStart: |
126 case QProcess::FailedToStart: |
| 127 { |
127 { |
| 128 str wineblurb; |
128 QString wineblurb; |
| 129 |
129 |
| 130 #ifndef _WIN32 |
130 #ifndef _WIN32 |
| 131 if (*g_extProgWine[prog]) |
131 if (*g_extProgWine[prog]) |
| 132 wineblurb = "make sure Wine is installed and "; |
132 wineblurb = "make sure Wine is installed and "; |
| 133 #endif |
133 #endif |
| 152 return ""; |
152 return ""; |
| 153 } |
153 } |
| 154 |
154 |
| 155 // ============================================================================= |
155 // ============================================================================= |
| 156 // ----------------------------------------------------------------------------- |
156 // ----------------------------------------------------------------------------- |
| 157 static bool mkTempFile (QTemporaryFile& tmp, str& fname) |
157 static bool mkTempFile (QTemporaryFile& tmp, QString& fname) |
| 158 { |
158 { |
| 159 if (!tmp.open()) |
159 if (!tmp.open()) |
| 160 return false; |
160 return false; |
| 161 |
161 |
| 162 fname = tmp.fileName(); |
162 fname = tmp.fileName(); |
| 185 } |
185 } |
| 186 } |
186 } |
| 187 |
187 |
| 188 // ============================================================================= |
188 // ============================================================================= |
| 189 // ----------------------------------------------------------------------------- |
189 // ----------------------------------------------------------------------------- |
| 190 static void writeObjects (const QList<LDObject*>& objects, str fname) |
190 static void writeObjects (const QList<LDObject*>& objects, QString fname) |
| 191 { |
191 { |
| 192 // Write the input file |
192 // Write the input file |
| 193 File f (fname, File::Write); |
193 File f (fname, File::Write); |
| 194 |
194 |
| 195 if (!f) |
195 if (!f) |
| 206 #endif |
206 #endif |
| 207 } |
207 } |
| 208 |
208 |
| 209 // ============================================================================= |
209 // ============================================================================= |
| 210 // ----------------------------------------------------------------------------- |
210 // ----------------------------------------------------------------------------- |
| 211 void writeSelection (str fname) |
211 void writeSelection (QString fname) |
| 212 { |
212 { |
| 213 writeObjects (selection(), fname); |
213 writeObjects (selection(), fname); |
| 214 } |
214 } |
| 215 |
215 |
| 216 // ============================================================================= |
216 // ============================================================================= |
| 217 // ----------------------------------------------------------------------------- |
217 // ----------------------------------------------------------------------------- |
| 218 void writeColorGroup (const int colnum, str fname) |
218 void writeColorGroup (const int colnum, QString fname) |
| 219 { |
219 { |
| 220 QList<LDObject*> objects; |
220 QList<LDObject*> objects; |
| 221 |
221 |
| 222 for (LDObject* obj : getCurrentDocument()->getObjects()) |
222 for (LDObject* obj : getCurrentDocument()->getObjects()) |
| 223 { |
223 { |
| 230 writeObjects (objects, fname); |
230 writeObjects (objects, fname); |
| 231 } |
231 } |
| 232 |
232 |
| 233 // ============================================================================= |
233 // ============================================================================= |
| 234 // ----------------------------------------------------------------------------- |
234 // ----------------------------------------------------------------------------- |
| 235 bool runUtilityProcess (extprog prog, str path, str argvstr) |
235 bool runUtilityProcess (extprog prog, QString path, QString argvstr) |
| 236 { |
236 { |
| 237 QTemporaryFile input, output; |
237 QTemporaryFile input, output; |
| 238 str inputname, outputname; |
238 QString inputname, outputname; |
| 239 QStringList argv = argvstr.split (" ", QString::SkipEmptyParts); |
239 QStringList argv = argvstr.split (" ", QString::SkipEmptyParts); |
| 240 |
240 |
| 241 #ifndef _WIN32 |
241 #ifndef _WIN32 |
| 242 if (*g_extProgWine[prog]) |
242 if (*g_extProgWine[prog]) |
| 243 { |
243 { |
| 271 stdinfp.write ("\n"); |
271 stdinfp.write ("\n"); |
| 272 |
272 |
| 273 // Wait while it runs |
273 // Wait while it runs |
| 274 proc.waitForFinished(); |
274 proc.waitForFinished(); |
| 275 |
275 |
| 276 str err = ""; |
276 QString err = ""; |
| 277 |
277 |
| 278 if (proc.exitStatus() != QProcess::NormalExit) |
278 if (proc.exitStatus() != QProcess::NormalExit) |
| 279 err = processErrorString (prog, proc); |
279 err = processErrorString (prog, proc); |
| 280 |
280 |
| 281 // Check the return code |
281 // Check the return code |
| 291 return true; |
291 return true; |
| 292 } |
292 } |
| 293 |
293 |
| 294 // ============================================================================= |
294 // ============================================================================= |
| 295 // ----------------------------------------------------------------------------- |
295 // ----------------------------------------------------------------------------- |
| 296 static void insertOutput (str fname, bool replace, QList<int> colorsToReplace) |
296 static void insertOutput (QString fname, bool replace, QList<int> colorsToReplace) |
| 297 { |
297 { |
| 298 #ifdef DEBUG |
298 #ifdef DEBUG |
| 299 QFile::copy (fname, "./debug_lastOutput"); |
299 QFile::copy (fname, "./debug_lastOutput"); |
| 300 #endif // RELEASE |
300 #endif // RELEASE |
| 301 |
301 |
| 364 |
364 |
| 365 const double depth = ui.planeDepth->value(), |
365 const double depth = ui.planeDepth->value(), |
| 366 condAngle = ui.condAngle->value(); |
366 condAngle = ui.condAngle->value(); |
| 367 |
367 |
| 368 QTemporaryFile indat, outdat; |
368 QTemporaryFile indat, outdat; |
| 369 str inDATName, outDATName; |
369 QString inDATName, outDATName; |
| 370 |
370 |
| 371 // Make temp files for the input and output files |
371 // Make temp files for the input and output files |
| 372 if (!mkTempFile (indat, inDATName) || !mkTempFile (outdat, outDATName)) |
372 if (!mkTempFile (indat, inDATName) || !mkTempFile (outdat, outDATName)) |
| 373 return; |
373 return; |
| 374 |
374 |
| 375 // Compose the command-line arguments |
375 // Compose the command-line arguments |
| 376 str argv = join ( |
376 QString argv = join ( |
| 377 { |
377 { |
| 378 (axis == X) ? "-x" : (axis == Y) ? "-y" : "-z", |
378 (axis == X) ? "-x" : (axis == Y) ? "-y" : "-z", |
| 379 (mode == Distance) ? "-d" : (mode == Symmetry) ? "-s" : (mode == Projection) ? "-p" : "-r", |
379 (mode == Distance) ? "-d" : (mode == Symmetry) ? "-s" : (mode == Projection) ? "-p" : "-r", |
| 380 depth, |
380 depth, |
| 381 "-a", |
381 "-a", |
| 408 |
408 |
| 409 if (!dlg->exec()) |
409 if (!dlg->exec()) |
| 410 return; |
410 return; |
| 411 |
411 |
| 412 QTemporaryFile indat, outdat; |
412 QTemporaryFile indat, outdat; |
| 413 str inDATName, outDATName; |
413 QString inDATName, outDATName; |
| 414 |
414 |
| 415 // Make temp files for the input and output files |
415 // Make temp files for the input and output files |
| 416 if (!mkTempFile (indat, inDATName) || !mkTempFile (outdat, outDATName)) |
416 if (!mkTempFile (indat, inDATName) || !mkTempFile (outdat, outDATName)) |
| 417 return; |
417 return; |
| 418 |
418 |
| 419 // Compose arguments |
419 // Compose arguments |
| 420 str argv = join ( |
420 QString argv = join ( |
| 421 { |
421 { |
| 422 (!ui.cb_condense->isChecked()) ? "-q" : "", |
422 (!ui.cb_condense->isChecked()) ? "-q" : "", |
| 423 (!ui.cb_subst->isChecked()) ? "-r" : "", |
423 (!ui.cb_subst->isChecked()) ? "-r" : "", |
| 424 (ui.cb_condlineCheck->isChecked()) ? "-a" : "", |
424 (ui.cb_condlineCheck->isChecked()) ? "-a" : "", |
| 425 (ui.cb_colorize->isChecked()) ? "-c" : "", |
425 (ui.cb_colorize->isChecked()) ? "-c" : "", |
| 482 // cutdat = cutter group file |
482 // cutdat = cutter group file |
| 483 // outdat = primary output |
483 // outdat = primary output |
| 484 // outdat2 = inverse output |
484 // outdat2 = inverse output |
| 485 // edgesdat = edges output (isecalc) |
485 // edgesdat = edges output (isecalc) |
| 486 QTemporaryFile indat, cutdat, outdat, outdat2, edgesdat; |
486 QTemporaryFile indat, cutdat, outdat, outdat2, edgesdat; |
| 487 str inDATName, cutDATName, outDATName, outDAT2Name, edgesDATName; |
487 QString inDATName, cutDATName, outDATName, outDAT2Name, edgesDATName; |
| 488 |
488 |
| 489 if (!mkTempFile (indat, inDATName) || !mkTempFile (cutdat, cutDATName) || |
489 if (!mkTempFile (indat, inDATName) || !mkTempFile (cutdat, cutDATName) || |
| 490 !mkTempFile (outdat, outDATName) || !mkTempFile (outdat2, outDAT2Name) || |
490 !mkTempFile (outdat, outDATName) || !mkTempFile (outdat2, outDAT2Name) || |
| 491 !mkTempFile (edgesdat, edgesDATName)) |
491 !mkTempFile (edgesdat, edgesDATName)) |
| 492 { |
492 { |
| 493 return; |
493 return; |
| 494 } |
494 } |
| 495 |
495 |
| 496 str parms = join ( |
496 QString parms = join ( |
| 497 { |
497 { |
| 498 (ui.cb_colorize->isChecked()) ? "-c" : "", |
498 (ui.cb_colorize->isChecked()) ? "-c" : "", |
| 499 (ui.cb_nocondense->isChecked()) ? "-t" : "", |
499 (ui.cb_nocondense->isChecked()) ? "-t" : "", |
| 500 "-s", |
500 "-s", |
| 501 ui.dsb_prescale->value() |
501 ui.dsb_prescale->value() |
| 502 }); |
502 }); |
| 503 |
503 |
| 504 str argv_normal = join ( |
504 QString argv_normal = join ( |
| 505 { |
505 { |
| 506 parms, |
506 parms, |
| 507 inDATName, |
507 inDATName, |
| 508 cutDATName, |
508 cutDATName, |
| 509 outDATName |
509 outDATName |
| 510 }); |
510 }); |
| 511 |
511 |
| 512 str argv_inverse = join ( |
512 QString argv_inverse = join ( |
| 513 { |
513 { |
| 514 parms, |
514 parms, |
| 515 cutDATName, |
515 cutDATName, |
| 516 inDATName, |
516 inDATName, |
| 517 outDAT2Name |
517 outDAT2Name |
| 569 |
569 |
| 570 break; |
570 break; |
| 571 } |
571 } |
| 572 |
572 |
| 573 QTemporaryFile in1dat, in2dat, outdat; |
573 QTemporaryFile in1dat, in2dat, outdat; |
| 574 str in1DATName, in2DATName, outDATName; |
574 QString in1DATName, in2DATName, outDATName; |
| 575 |
575 |
| 576 if (!mkTempFile (in1dat, in1DATName) || !mkTempFile (in2dat, in2DATName) || !mkTempFile (outdat, outDATName)) |
576 if (!mkTempFile (in1dat, in1DATName) || !mkTempFile (in2dat, in2DATName) || !mkTempFile (outdat, outDATName)) |
| 577 return; |
577 return; |
| 578 |
578 |
| 579 str argv = join ( |
579 QString argv = join ( |
| 580 { |
580 { |
| 581 (ui.cb_oldsweep->isChecked() ? "-s" : ""), |
581 (ui.cb_oldsweep->isChecked() ? "-s" : ""), |
| 582 (ui.cb_reverse->isChecked() ? "-r" : ""), |
582 (ui.cb_reverse->isChecked() ? "-r" : ""), |
| 583 (ui.dsb_segsplit->value() != 0 ? fmt ("-l %1", ui.dsb_segsplit->value()) : ""), |
583 (ui.dsb_segsplit->value() != 0 ? fmt ("-l %1", ui.dsb_segsplit->value()) : ""), |
| 584 (ui.sb_bias->value() != 0 ? fmt ("-s %1", ui.sb_bias->value()) : ""), |
584 (ui.sb_bias->value() != 0 ? fmt ("-s %1", ui.sb_bias->value()) : ""), |
| 631 |
631 |
| 632 break; |
632 break; |
| 633 } |
633 } |
| 634 |
634 |
| 635 QTemporaryFile in1dat, in2dat, outdat; |
635 QTemporaryFile in1dat, in2dat, outdat; |
| 636 str in1DATName, in2DATName, outDATName; |
636 QString in1DATName, in2DATName, outDATName; |
| 637 |
637 |
| 638 if (!mkTempFile (in1dat, in1DATName) || !mkTempFile (in2dat, in2DATName) || !mkTempFile (outdat, outDATName)) |
638 if (!mkTempFile (in1dat, in1DATName) || !mkTempFile (in2dat, in2DATName) || !mkTempFile (outdat, outDATName)) |
| 639 return; |
639 return; |
| 640 |
640 |
| 641 str argv = join ( |
641 QString argv = join ( |
| 642 { |
642 { |
| 643 in1DATName, |
643 in1DATName, |
| 644 in2DATName, |
644 in2DATName, |
| 645 outDATName |
645 outDATName |
| 646 }); |
646 }); |
| 666 |
666 |
| 667 if (!dlg->exec()) |
667 if (!dlg->exec()) |
| 668 return; |
668 return; |
| 669 |
669 |
| 670 QTemporaryFile in, out; |
670 QTemporaryFile in, out; |
| 671 str inName, outName; |
671 QString inName, outName; |
| 672 |
672 |
| 673 if (!mkTempFile (in, inName) || !mkTempFile (out, outName)) |
673 if (!mkTempFile (in, inName) || !mkTempFile (out, outName)) |
| 674 return; |
674 return; |
| 675 |
675 |
| 676 int unmatched = ui.unmatched->currentIndex(); |
676 int unmatched = ui.unmatched->currentIndex(); |
| 677 |
677 |
| 678 str argv = join ( |
678 QString argv = join ( |
| 679 { |
679 { |
| 680 fmt ("-p %1", ui.precision->value()), |
680 fmt ("-p %1", ui.precision->value()), |
| 681 fmt ("-af %1", ui.flatAngle->value()), |
681 fmt ("-af %1", ui.flatAngle->value()), |
| 682 fmt ("-ac %1", ui.condAngle->value()), |
682 fmt ("-ac %1", ui.condAngle->value()), |
| 683 fmt ("-ae %1", ui.edgeAngle->value()), |
683 fmt ("-ae %1", ui.edgeAngle->value()), |