diff options
-rw-r--r-- | doc/TODO.txt | 7 | ||||
-rw-r--r-- | src/export.cc | 53 | ||||
-rw-r--r-- | src/lexer.l | 1 | ||||
-rw-r--r-- | src/mainwin.cc | 8 | ||||
-rw-r--r-- | testdata/scad/dxf-export.scad | 12 | ||||
-rw-r--r-- | testdata/scad/include test6.scad | 4 | ||||
-rw-r--r-- | testdata/scad/include-test.scad | 40 | ||||
-rw-r--r-- | testdata/scad/include-test5.scad | 4 | ||||
-rw-r--r-- | testdata/scad/string-test.scad | 1 | ||||
-rw-r--r-- | testdata/scad/sub1/sub2/sub3/include-test4.scad | 4 | ||||
-rw-r--r-- | testdata/scad/sub1/sub2/sub3/sub4/include-test2.scad | 10 | ||||
-rw-r--r-- | testdata/scad/sub1/sub2/sub3/sub4/include-test3.scad | 4 |
12 files changed, 125 insertions, 23 deletions
diff --git a/doc/TODO.txt b/doc/TODO.txt index 6d608ee..0e1576a 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -58,8 +58,6 @@ o Preferences - Default language feature settings - Auto-view CSG/thrown together on load - Make the library search path configurable? -o Export etc.: - - Remember document name and suggest that as export filename o MDI - Think about how to do MDI the right way - Ctrl-W should close the current dialog, not the current main window @@ -175,6 +173,11 @@ o Hollow donut problem +IDEAS FOR LANGUAGE CHANGES +-------------------------- +o More strict checking of module parameters to make e.g. this fail: + module test(a,b) { a=1; b=2; echo(a,b,c); } test(c=3); + CODE ---- diff --git a/src/export.cc b/src/export.cc index 71ebe8f..215f936 100644 --- a/src/export.cc +++ b/src/export.cc @@ -154,6 +154,20 @@ void export_off(CGAL_Nef_polyhedron*, QTextStream&, QProgressDialog*) void export_dxf(CGAL_Nef_polyhedron *root_N, QTextStream &output, QProgressDialog *) { setlocale(LC_NUMERIC, "C"); // Ensure radix is . (not ,) in output + + // Some importers (e.g. QCAD) needs a HEADER section specifying AutoCAD 2000 as + // the file format for LWPOLYLINE entities to work + output << " 0\n" + << "SECTION\n" + << " 2\n" + << "HEADER\n" + << " 9\n" + << "$ACADVER\n" + << " 1\n" + << "AC1015\n" + << " 0\n" + << "ENDSEC\n"; + // Some importers (e.g. Inkscape) needs a BLOCKS section to be present output << " 0\n" << "SECTION\n" @@ -169,26 +183,27 @@ void export_dxf(CGAL_Nef_polyhedron *root_N, QTextStream &output, QProgressDialo DxfData dd(*root_N); for (int i=0; i<dd.paths.size(); i++) { - for (int j=1; j<dd.paths[i].points.size(); j++) { - DxfData::Point *p1 = dd.paths[i].points[j-1]; - DxfData::Point *p2 = dd.paths[i].points[j]; - double x1 = p1->x; - double y1 = p1->y; - double x2 = p2->x; - double y2 = p2->y; - output << " 0\n" - << "LINE\n"; - // Some importers (e.g. Inkscape) needs a layer to be specified - output <<" 8\n" - << "0\n" - << " 10\n" - << x1 << "\n" - << " 11\n" - << x2 << "\n" + if (dd.paths[i].points.size() < 2) { + // not a valid polygon + continue; + } + // Use the LWPOLYLINE class - this makes it easier to handle complete + // objects (as paths) in Inkscape. + output << " 0\n" + << "LWPOLYLINE\n" + << " 8\n" // Some importers (e.g. Inkscape) need a layer to be specified + << "0\n" + << " 90\n" // number of vertices + << dd.paths[i].points.size() << "\n" + << " 70\n" // polygon flag (closed, ...) + << (dd.paths[i].is_closed ? 1 : 0) << "\n"; + // add all points + for (int j=0; j<dd.paths[i].points.size(); j++) { + DxfData::Point *p = dd.paths[i].points[j]; + output <<" 10\n" + << p->x << "\n" << " 20\n" - << y1 << "\n" - << " 21\n" - << y2 << "\n"; + << p->y << "\n"; } } diff --git a/src/lexer.l b/src/lexer.l index 9e8aaf8..932711b 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -202,6 +202,7 @@ void includefile() yyin = fopen(finfo.absoluteFilePath().toLocal8Bit(), "r"); if (!yyin) { PRINTA("WARNING: Can't open input file `%1'.", filename); + path_stack.pop(); return; } filename.clear(); diff --git a/src/mainwin.cc b/src/mainwin.cc index eeb7923..e7014fa 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -1311,8 +1311,10 @@ void MainWindow::actionExportSTLorOFF(bool) return; } + QString suffix = stl_mode ? ".stl" : ".off"; QString stl_filename = QFileDialog::getSaveFileName(this, - stl_mode ? "Export STL File" : "Export OFF File", "", + stl_mode ? "Export STL File" : "Export OFF File", + this->fileName.isEmpty() ? "Untitled"+suffix : QFileInfo(this->fileName).baseName()+suffix, stl_mode ? "STL Files (*.stl)" : "OFF Files (*.off)"); if (stl_filename.isEmpty()) { PRINTF("No filename specified. %s export aborted.", stl_mode ? "STL" : "OFF"); @@ -1374,7 +1376,9 @@ void MainWindow::actionExportDXF() } QString dxf_filename = QFileDialog::getSaveFileName(this, - "Export DXF File", "", "DXF Files (*.dxf)"); + "Export DXF File", + this->fileName.isEmpty() ? "Untitled.dxf" : QFileInfo(this->fileName).baseName()+".dxf", + "DXF Files (*.dxf)"); if (dxf_filename.isEmpty()) { PRINTF("No filename specified. DXF export aborted."); clearCurrentOutput(); diff --git a/testdata/scad/dxf-export.scad b/testdata/scad/dxf-export.scad new file mode 100644 index 0000000..7f4b8cb --- /dev/null +++ b/testdata/scad/dxf-export.scad @@ -0,0 +1,12 @@ +circle(r=5); + +translate([15,0,0]) square(size=[10,10], center=true); + +translate([30,0,0]) polygon(points=[[-5,-5],[5,-5],[0,5]], paths=[[0,1,2]]); + +translate([0,-15,0]) { + difference() { + circle(r=5); + translate([0,-6,0]) square([12,12], center=true); + } +}
\ No newline at end of file diff --git a/testdata/scad/include test6.scad b/testdata/scad/include test6.scad new file mode 100644 index 0000000..7a79456 --- /dev/null +++ b/testdata/scad/include test6.scad @@ -0,0 +1,4 @@ +module test6() +{ + echo("included from include test6.scad"); +} diff --git a/testdata/scad/include-test.scad b/testdata/scad/include-test.scad new file mode 100644 index 0000000..5db02d7 --- /dev/null +++ b/testdata/scad/include-test.scad @@ -0,0 +1,40 @@ +//Test that the entire path is pushed onto the stack upto the last '/' +include <sub1/sub2/sub3/sub4/include-test2.scad> + +//Test that a non existent path/file doesn't screw things up +include <non/existent/path/non-file> + +//Test with empty path +include <include-test5.scad> + +//Test without preceeding space +include<include-test5.scad> + +//Test with other strange character that is allowed +include>>>>><include-test5.scad> + +//Test that filenames with spaces work +include <include test6.scad> + +//Test with empty file +include<test/> + +//Test with empty path and file +include </> + +//Test with empty +include <> + +module test1() +{ + test2(); + test3(); + test4(); + test5(); + test6(); + + //Just to give a top level object + sphere(1); +} + +test1(); diff --git a/testdata/scad/include-test5.scad b/testdata/scad/include-test5.scad new file mode 100644 index 0000000..4f6e656 --- /dev/null +++ b/testdata/scad/include-test5.scad @@ -0,0 +1,4 @@ +module test5() +{ + echo("included from include-test5.scad"); +} diff --git a/testdata/scad/string-test.scad b/testdata/scad/string-test.scad new file mode 100644 index 0000000..5ec4cfb --- /dev/null +++ b/testdata/scad/string-test.scad @@ -0,0 +1 @@ +echo("The quick brown fox \tjumps \"over\" the lazy dog.\rThe quick brown fox.\nThe \\lazy\\ dog."); diff --git a/testdata/scad/sub1/sub2/sub3/include-test4.scad b/testdata/scad/sub1/sub2/sub3/include-test4.scad new file mode 100644 index 0000000..1cb7eab --- /dev/null +++ b/testdata/scad/sub1/sub2/sub3/include-test4.scad @@ -0,0 +1,4 @@ +module test4() +{ + echo("included from include-test4.scad"); +} diff --git a/testdata/scad/sub1/sub2/sub3/sub4/include-test2.scad b/testdata/scad/sub1/sub2/sub3/sub4/include-test2.scad new file mode 100644 index 0000000..9f4c963 --- /dev/null +++ b/testdata/scad/sub1/sub2/sub3/sub4/include-test2.scad @@ -0,0 +1,10 @@ +//Test nested include +include <include-test3.scad> + +//Test relative file location +include <../include-test4.scad> + +module test2 () +{ + echo("included from include-test2.scad"); +} diff --git a/testdata/scad/sub1/sub2/sub3/sub4/include-test3.scad b/testdata/scad/sub1/sub2/sub3/sub4/include-test3.scad new file mode 100644 index 0000000..2f67e93 --- /dev/null +++ b/testdata/scad/sub1/sub2/sub3/sub4/include-test3.scad @@ -0,0 +1,4 @@ +module test3() +{ + echo("included from include-test3.scad"); +} |