extprogs.cpp

changeset 167
df78c894ae24
parent 166
72ec7b60da54
child 168
96691a009dff
--- a/extprogs.cpp	Mon May 06 03:32:00 2013 +0300
+++ b/extprogs.cpp	Mon May 06 12:50:20 2013 +0300
@@ -16,15 +16,20 @@
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <qprocess.h>
+#include <qtemporaryfile.h>
+#include <qeventloop.h>
+#include <qdialog.h>
+#include <qdialogbuttonbox.h>
+#include <qspinbox.h>
 #include "common.h"
 #include "config.h"
 #include "misc.h"
 #include "extprogs.h"
 #include "gui.h"
 #include "file.h"
-#include <qprocess.h>
-#include <qtemporaryfile.h>
-#include <qeventloop.h>
+#include "radiobox.h"
+#include "history.h"
 
 // =============================================================================
 cfg (str, prog_isecalc, "");
@@ -109,6 +114,40 @@
 		return;
 	}
 	
+	QDialog* dlg = new QDialog (g_win);
+	
+	RadioBox* rb_mode = new RadioBox ("Extrusion mode", {"Distance", "Symmetry", "Projection", "Radial"}, 0, Qt::Horizontal, dlg);
+	RadioBox* rb_axis = new RadioBox ("Axis", {"X", "Y", "Z"}, 0, Qt::Horizontal, dlg);
+	LabeledWidget<QDoubleSpinBox>* dsb_depth = new LabeledWidget<QDoubleSpinBox> ("Plane depth", dlg),
+		*dsb_condAngle = new LabeledWidget<QDoubleSpinBox> ("Conditional line threshold", dlg);
+	QDialogButtonBox* bbx_buttons = new QDialogButtonBox (QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+	
+	QWidget::connect (bbx_buttons, SIGNAL (accepted ()), dlg, SLOT (accept ()));
+	QWidget::connect (bbx_buttons, SIGNAL (rejected ()), dlg, SLOT (reject ()));
+	
+	rb_axis->setValue (Y);
+	dsb_depth->w ()->setMinimum (-10000.0);
+	dsb_depth->w ()->setMaximum (10000.0);
+	dsb_depth->w ()->setDecimals (3);
+	dsb_condAngle->w ()->setValue (30.0f);
+	
+	QVBoxLayout* layout = new QVBoxLayout (dlg);
+	layout->addWidget (rb_mode);
+	layout->addWidget (rb_axis);
+	layout->addWidget (dsb_depth);
+	layout->addWidget (dsb_condAngle);
+	layout->addWidget (bbx_buttons);
+	
+	dlg->setWindowIcon (getIcon ("extrude"));
+	
+	if (!dlg->exec ())
+		return;
+	
+	const enum modetype { Distance, Symmetry, Projection, Radial } mode = (modetype) rb_mode->value ();
+	const Axis axis = (Axis) rb_axis->value ();
+	const double depth = dsb_depth->w ()->value (),
+		condAngle = dsb_condAngle->w ()->value ();
+	
 	QTemporaryFile in, out, input;
 	str inname, outname, inputname;
 	FILE* fp;
@@ -117,7 +156,14 @@
 		return;
 	
 	QProcess proc;
-	QStringList argv ({"-p", "0", "-y", inname, outname});
+	QStringList argv ({(axis == X) ? "-x" : (axis == Y) ? "-y" : "-z",
+		(mode == Distance) ? "-d" : (mode == Symmetry) ? "-s" : (mode == Projection) ? "-p" : "-r",
+		fmt ("%f", depth), "-a", fmt ("%f", condAngle), inname, outname});
+	
+	printf ("cmdline: %s ", prog_ytruder.value.chars ());
+	for (QString& arg : argv)
+		printf ("%s ", qchars (arg));
+	printf ("\n");
 	
 	// Write the input file
 	fp = fopen (inname, "w");
@@ -157,13 +203,20 @@
 	if (!fp)
 		fprintf (stderr, "couldn't read %s\n", outname.chars ());
 	
-	char line[1024];
-	while (fgets (line, sizeof line, fp)) {
-		printf ("%s", line);
-		LDObject* obj = parseLine (str (line).strip ({'\n', '\r'}));
-		g_curfile->addObject (obj);
+	std::vector<LDObject*> objs = loadFileContents (fp, null),
+		copies;
+	std::vector<ulong> indices;
+	
+	g_win->sel ().clear ();
+	for (LDObject* obj : objs) {
+		ulong idx = g_curfile->addObject (obj);
+		indices.push_back (idx);
+		copies.push_back (obj->clone ());
 	}
+	
+	History::addEntry (new AddHistory ({indices, copies}));
+	
 	fclose (fp);
-	
+	g_win->sel () = objs;
 	g_win->refresh ();
 }
\ No newline at end of file

mercurial