summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/MainWindow.h1
-rw-r--r--src/MainWindow.ui6
-rw-r--r--src/mainwin.cc33
-rw-r--r--src/openscad.cc156
4 files changed, 124 insertions, 72 deletions
diff --git a/src/MainWindow.h b/src/MainWindow.h
index 37a6a4c..a3c812b 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -115,6 +115,7 @@ private slots:
void actionExportSTL();
void actionExportOFF();
void actionExportDXF();
+ void actionExportCSG();
void actionExportImage();
void actionFlushCaches();
diff --git a/src/MainWindow.ui b/src/MainWindow.ui
index 1741557..4d5ff22 100644
--- a/src/MainWindow.ui
+++ b/src/MainWindow.ui
@@ -178,6 +178,7 @@
<addaction name="designActionExportSTL"/>
<addaction name="designActionExportOFF"/>
<addaction name="designActionExportDXF"/>
+ <addaction name="designActionExportCSG"/>
<addaction name="designActionExportImage"/>
<addaction name="designActionFlushCaches"/>
</widget>
@@ -657,6 +658,11 @@
<string>Export as Image...</string>
</property>
</action>
+ <action name="designActionExportCSG">
+ <property name="text">
+ <string>Export as CSG...</string>
+ </property>
+ </action>
</widget>
<customwidgets>
<customwidget>
diff --git a/src/mainwin.cc b/src/mainwin.cc
index 238bd10..be82d26 100644
--- a/src/mainwin.cc
+++ b/src/mainwin.cc
@@ -283,6 +283,7 @@ MainWindow::MainWindow(const QString &filename)
connect(this->designActionExportSTL, SIGNAL(triggered()), this, SLOT(actionExportSTL()));
connect(this->designActionExportOFF, SIGNAL(triggered()), this, SLOT(actionExportOFF()));
connect(this->designActionExportDXF, SIGNAL(triggered()), this, SLOT(actionExportDXF()));
+ connect(this->designActionExportCSG, SIGNAL(triggered()), this, SLOT(actionExportCSG()));
connect(this->designActionExportImage, SIGNAL(triggered()), this, SLOT(actionExportImage()));
connect(this->designActionFlushCaches, SIGNAL(triggered()), this, SLOT(actionFlushCaches()));
@@ -1474,6 +1475,38 @@ void MainWindow::actionExportDXF()
#endif /* ENABLE_CGAL */
}
+void MainWindow::actionExportCSG()
+{
+ setCurrentOutput();
+
+ if (!this->root_node) {
+ PRINT("Nothing to export. Please try compiling first...");
+ clearCurrentOutput();
+ return;
+ }
+
+ QString csg_filename = QFileDialog::getSaveFileName(this, "Export CSG File",
+ this->fileName.isEmpty() ? "Untitled.csg" : QFileInfo(this->fileName).baseName()+".csg",
+ "CSG Files (*.csg)");
+ if (csg_filename.isEmpty()) {
+ PRINTF("No filename specified. CSG export aborted.");
+ clearCurrentOutput();
+ return;
+ }
+
+ std::ofstream fstream(csg_filename.toUtf8());
+ if (!fstream.is_open()) {
+ PRINTA("Can't open file \"%s\" for export", csg_filename);
+ }
+ else {
+ fstream << this->tree.getString(*this->root_node) << "\n";
+ fstream.close();
+ PRINTF("CSG export finished.");
+ }
+
+ clearCurrentOutput();
+}
+
void MainWindow::actionExportImage()
{
QImage img = this->glview->grabFrameBuffer();
diff --git a/src/openscad.cc b/src/openscad.cc
index 878cb22..f3d28a6 100644
--- a/src/openscad.cc
+++ b/src/openscad.cc
@@ -70,7 +70,7 @@ namespace po = boost::program_options;
static void help(const char *progname)
{
- fprintf(stderr, "Usage: %s [ { -s stl_file | -o off_file | -x dxf_file } [ -d deps_file ] ]\\\n"
+ fprintf(stderr, "Usage: %s [ { -o output_file } [ -d deps_file ] ]\\\n"
"%*s[ -m make_command ] [ -D var=val [..] ] filename\n",
progname, int(strlen(progname))+8, "");
exit(1);
@@ -126,18 +126,14 @@ int main(int argc, char **argv)
QCoreApplication::setApplicationName("OpenSCAD");
const char *filename = NULL;
- const char *stl_output_file = NULL;
- const char *off_output_file = NULL;
- const char *dxf_output_file = NULL;
+ const char *output_file = NULL;
const char *deps_output_file = NULL;
po::options_description desc("Allowed options");
desc.add_options()
("help,h", "help message")
("version,v", "print the version")
- ("s,s", po::value<string>(), "stl-file")
- ("o,o", po::value<string>(), "off-file")
- ("x,x", po::value<string>(), "dxf-file")
+ ("o,o", po::value<string>(), "out-file")
("d,d", po::value<string>(), "deps-file")
("m,m", po::value<string>(), "makefile")
("D,D", po::value<vector<string> >(), "var=val");
@@ -159,20 +155,10 @@ int main(int argc, char **argv)
if (vm.count("help")) help(argv[0]);
if (vm.count("version")) version();
- if (vm.count("s")) {
- if (stl_output_file || off_output_file || dxf_output_file)
- help(argv[0]);
- stl_output_file = vm["s"].as<string>().c_str();
- }
if (vm.count("o")) {
- if (stl_output_file || off_output_file || dxf_output_file)
- help(argv[0]);
- off_output_file = vm["o"].as<string>().c_str();
- }
- if (vm.count("x")) {
- if (stl_output_file || off_output_file || dxf_output_file)
- help(argv[0]);
- dxf_output_file = vm["x"].as<string>().c_str();
+ // FIXME: Allow for multiple output files?
+ if (output_file) help(argv[0]);
+ output_file = vm["o"].as<string>().c_str();
}
if (vm.count("d")) {
if (deps_output_file)
@@ -253,10 +239,24 @@ int main(int argc, char **argv)
PolySetCGALEvaluator psevaluator(cgalevaluator);
#endif
- if (stl_output_file || off_output_file || dxf_output_file)
+ if (output_file)
{
- if (!filename)
- help(argv[0]);
+ const char *stl_output_file = NULL;
+ const char *off_output_file = NULL;
+ const char *dxf_output_file = NULL;
+ const char *csg_output_file = NULL;
+
+ QString suffix = QFileInfo(output_file).suffix().toLower();
+ if (suffix == "stl") stl_output_file = output_file;
+ else if (suffix == "off") off_output_file = output_file;
+ else if (suffix == "dxf") dxf_output_file = output_file;
+ else if (suffix == "csg") csg_output_file = output_file;
+ else {
+ fprintf(stderr, "Unknown suffix for output file %s\n", output_file);
+ exit(1);
+ }
+
+ if (!filename) help(argv[0]);
#ifdef ENABLE_CGAL
Context root_ctx;
@@ -304,68 +304,80 @@ int main(int argc, char **argv)
AbstractNode::resetIndexCounter();
root_node = root_module->evaluate(&root_ctx, &root_inst);
-
tree.setRoot(root_node);
- CGAL_Nef_polyhedron root_N = cgalevaluator.evaluateCGALMesh(*tree.root());
- QDir::setCurrent(original_path.absolutePath());
-
- if (deps_output_file) {
- if (!write_deps(deps_output_file,
- stl_output_file ? stl_output_file : off_output_file)) {
- exit(1);
- }
- }
-
- if (stl_output_file) {
- if (root_N.dim != 3) {
- fprintf(stderr, "Current top level object is not a 3D object.\n");
- exit(1);
- }
- if (!root_N.p3->is_simple()) {
- fprintf(stderr, "Object isn't a valid 2-manifold! Modify your design.\n");
- exit(1);
- }
- std::ofstream fstream(stl_output_file);
+ if (csg_output_file) {
+ QDir::setCurrent(original_path.absolutePath());
+ std::ofstream fstream(csg_output_file);
if (!fstream.is_open()) {
- PRINTF("Can't open file \"%s\" for export", stl_output_file);
+ PRINTF("Can't open file \"%s\" for export", csg_output_file);
}
else {
- export_stl(&root_N, fstream, NULL);
+ fstream << tree.getString(*root_node) << "\n";
fstream.close();
}
}
-
- if (off_output_file) {
- if (root_N.dim != 3) {
- fprintf(stderr, "Current top level object is not a 3D object.\n");
- exit(1);
- }
- if (!root_N.p3->is_simple()) {
- fprintf(stderr, "Object isn't a valid 2-manifold! Modify your design.\n");
- exit(1);
- }
- std::ofstream fstream(off_output_file);
- if (!fstream.is_open()) {
- PRINTF("Can't open file \"%s\" for export", off_output_file);
- }
- else {
- export_off(&root_N, fstream, NULL);
- fstream.close();
+ else {
+ CGAL_Nef_polyhedron root_N = cgalevaluator.evaluateCGALMesh(*tree.root());
+
+ QDir::setCurrent(original_path.absolutePath());
+
+ if (deps_output_file) {
+ if (!write_deps(deps_output_file,
+ stl_output_file ? stl_output_file : off_output_file)) {
+ exit(1);
+ }
}
- }
- if (dxf_output_file) {
- std::ofstream fstream(dxf_output_file);
- if (!fstream.is_open()) {
- PRINTF("Can't open file \"%s\" for export", dxf_output_file);
+ if (stl_output_file) {
+ if (root_N.dim != 3) {
+ fprintf(stderr, "Current top level object is not a 3D object.\n");
+ exit(1);
+ }
+ if (!root_N.p3->is_simple()) {
+ fprintf(stderr, "Object isn't a valid 2-manifold! Modify your design.\n");
+ exit(1);
+ }
+ std::ofstream fstream(stl_output_file);
+ if (!fstream.is_open()) {
+ PRINTF("Can't open file \"%s\" for export", stl_output_file);
+ }
+ else {
+ export_stl(&root_N, fstream, NULL);
+ fstream.close();
+ }
}
- else {
- export_dxf(&root_N, fstream, NULL);
- fstream.close();
+
+ if (off_output_file) {
+ if (root_N.dim != 3) {
+ fprintf(stderr, "Current top level object is not a 3D object.\n");
+ exit(1);
+ }
+ if (!root_N.p3->is_simple()) {
+ fprintf(stderr, "Object isn't a valid 2-manifold! Modify your design.\n");
+ exit(1);
+ }
+ std::ofstream fstream(off_output_file);
+ if (!fstream.is_open()) {
+ PRINTF("Can't open file \"%s\" for export", off_output_file);
+ }
+ else {
+ export_off(&root_N, fstream, NULL);
+ fstream.close();
+ }
+ }
+
+ if (dxf_output_file) {
+ std::ofstream fstream(dxf_output_file);
+ if (!fstream.is_open()) {
+ PRINTF("Can't open file \"%s\" for export", dxf_output_file);
+ }
+ else {
+ export_dxf(&root_N, fstream, NULL);
+ fstream.close();
+ }
}
}
-
delete root_node;
#else
fprintf(stderr, "OpenSCAD has been compiled without CGAL support!\n");
contact: Jan Huwald // Impressum