diff --git a/openscad.pro b/openscad.pro index 9cfb8a2a..83eb52b0 100644 --- a/openscad.pro +++ b/openscad.pro @@ -255,6 +255,7 @@ HEADERS += src/version_check.h \ src/FontListTableView.h \ src/GroupModule.h \ src/FileModule.h \ + src/StatCache.h \ src/builtin.h \ src/calc.h \ src/context.h \ @@ -438,6 +439,7 @@ SOURCES += \ src/hash.cc \ src/GroupModule.cc \ src/FileModule.cc \ + src/StatCache.cc \ src/builtin.cc \ src/calc.cc \ src/export.cc \ diff --git a/src/FileModule.cc b/src/FileModule.cc index f59bd6fd..719a9c47 100644 --- a/src/FileModule.cc +++ b/src/FileModule.cc @@ -31,6 +31,7 @@ #include "exceptions.h" #include "modcontext.h" #include "parsersettings.h" +#include "StatCache.h" #include #include @@ -74,16 +75,14 @@ void FileModule::registerUse(const UseNode &usenode) { void FileModule::registerInclude(const std::string &localpath, const std::string &fullpath) { - struct stat st; - memset(&st, 0, sizeof(struct stat)); + struct stat st{}; bool valid = stat(fullpath.c_str(), &st) == 0; - IncludeFile inc = {fullpath, valid, st.st_mtime}; - this->includes[localpath] = inc; + this->includes[localpath] = {fullpath, valid, st.st_mtime}; } bool FileModule::includesChanged() const { - for(const auto &item : this->includes) { + for (const auto &item : this->includes) { if (include_modified(item.second)) return true; } return false; @@ -91,12 +90,9 @@ bool FileModule::includesChanged() const bool FileModule::include_modified(const IncludeFile &inc) const { - struct stat st; - memset(&st, 0, sizeof(struct stat)); + struct stat st{}; - fs::path fullpath = find_valid_path(this->path, inc.filename); - bool valid = !fullpath.empty() ? (stat(fullpath.generic_string().c_str(), &st) == 0) : false; - + bool valid = (StatCache::stat(inc.filename.c_str(), &st) == 0); if (valid && !inc.valid) return true; // Detect appearance of file but not removal if (valid && st.st_mtime > inc.mtime) return true; @@ -118,10 +114,9 @@ bool FileModule::handleDependencies() // If a lib in usedlibs was previously missing, we need to relocate it // by searching the applicable paths. We can identify a previously missing module // as it will have a relative path. - for(const auto &lib : this->usedlibs) { + for (const auto &lib : this->usedlibs) { std::string filename = lib.first; const auto &usenode = lib.second; - bool wasmissing = false; bool found = true; @@ -148,6 +143,9 @@ bool FileModule::handleDependencies() if (changed) { PRINTDB(" %s: %p -> %p", filename % oldmodule % newmodule); } + else { + PRINTDB(" %s: %p", filename % oldmodule); + } somethingchanged |= changed; // Only print warning if we're not part of an automatic reload if (!newmodule && !wascached && !wasmissing) { @@ -156,9 +154,9 @@ bool FileModule::handleDependencies() } } - // Relative filenames which were located is reinserted as absolute filenames + // Relative filenames which were located are reinserted as absolute filenames typedef std::pair stringpair; - for(const auto &files : updates) { + for (const auto &files : updates) { this->usedlibs.insert({files.second, this->usedlibs.at(files.first)}); this->usedlibs.erase(files.first); } @@ -166,17 +164,19 @@ bool FileModule::handleDependencies() return somethingchanged; } -AbstractNode *FileModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const +AbstractNode *FileModule::instantiate(const Context *ctx, const ModuleInstantiation *inst, + EvalContext *evalctx) const { - assert(evalctx == NULL); + assert(evalctx == nullptr); FileContext context(ctx); return this->instantiateWithFileContext(&context, inst, evalctx); } -AbstractNode *FileModule::instantiateWithFileContext(FileContext *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const +AbstractNode *FileModule::instantiateWithFileContext(FileContext *ctx, const ModuleInstantiation *inst, + EvalContext *evalctx) const { - assert(evalctx == NULL); + assert(evalctx == nullptr); AbstractNode *node = new RootNode(inst); try { diff --git a/src/FileModule.h b/src/FileModule.h index 601630da..593f4bc0 100644 --- a/src/FileModule.h +++ b/src/FileModule.h @@ -15,10 +15,11 @@ public: FileModule(const std::string &path, const std::string &filename); virtual ~FileModule(); - virtual AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx = NULL) const; + virtual AbstractNode *instantiate(const Context *ctx, const ModuleInstantiation *inst, EvalContext *evalctx = nullptr) const; virtual void print(std::ostream &stream, const std::string &indent) const; AbstractNode *instantiateWithFileContext(class FileContext *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const; + void setModulePath(const std::string &path) { this->path = path; } const std::string &modulePath() const { return this->path; } void registerUse(const UseNode &usenode); void registerInclude(const std::string &localpath, const std::string &fullpath); diff --git a/src/ModuleCache.cc b/src/ModuleCache.cc index 84bd3fa3..058c03e8 100644 --- a/src/ModuleCache.cc +++ b/src/ModuleCache.cc @@ -1,4 +1,5 @@ #include "ModuleCache.h" +#include "StatCache.h" #include "FileModule.h" #include "printutils.h" #include "openscad.h" @@ -18,21 +19,22 @@ namespace fs=boost::filesystem; FIXME: Implement an LRU scheme to avoid having an ever-growing module cache */ -ModuleCache *ModuleCache::inst = NULL; +ModuleCache *ModuleCache::inst = nullptr; /*! Reevaluate the given file and all it's dependencies and recompile anything needing reevaluation. Updates the cache if necessary. The given filename must be absolute. - Sets the module reference to the new module, or NULL on any error (e.g. compile + Sets the module reference to the new module, or nullptr on any error (e.g. compile error or file not found). Returns true if anything was compiled (module or dependencies) and false otherwise. */ bool ModuleCache::evaluate(const std::string &filename, FileModule *&module) { - FileModule *lib_mod = NULL; + module = nullptr; + FileModule *lib_mod = nullptr; bool found = false; if (this->entries.find(filename) != this->entries.end()) { found = true; @@ -44,9 +46,8 @@ bool ModuleCache::evaluate(const std::string &filename, FileModule *&module) if (lib_mod && lib_mod->isHandlingDependencies()) return false; // Create cache ID - struct stat st; - memset(&st, 0, sizeof(struct stat)); - bool valid = (stat(filename.c_str(), &st) == 0); + struct stat st{}; + bool valid = (StatCache::stat(filename.c_str(), &st) == 0); // If file isn't there, just return and let the cache retain the old module if (!valid) return false; @@ -57,7 +58,7 @@ bool ModuleCache::evaluate(const std::string &filename, FileModule *&module) cache_entry &entry = this->entries[filename]; // Initialize entry, if new if (!found) { - entry.module = NULL; + entry.module = nullptr; entry.cache_id = cache_id; } @@ -68,7 +69,7 @@ bool ModuleCache::evaluate(const std::string &filename, FileModule *&module) shouldCompile = false; // Recompile if includes changed if (lib_mod && lib_mod->includesChanged()) { - lib_mod = NULL; + lib_mod = nullptr; shouldCompile = true; } } @@ -130,11 +131,10 @@ void ModuleCache::clear() FileModule *ModuleCache::lookup(const std::string &filename) { - return isCached(filename) ? this->entries[filename].module : NULL; + return isCached(filename) ? this->entries[filename].module : nullptr; } bool ModuleCache::isCached(const std::string &filename) { return this->entries.find(filename) != this->entries.end(); } - diff --git a/src/StatCache.cc b/src/StatCache.cc new file mode 100644 index 00000000..9eb11c79 --- /dev/null +++ b/src/StatCache.cc @@ -0,0 +1,64 @@ +/* + * OpenSCAD (www.openscad.org) + * Copyright (C) 2009-2011 Clifford Wolf and + * Marius Kintel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * As a special exception, you have permission to link this program + * with the CGAL library and distribute executables, as long as you + * follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from CGAL. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "StatCache.h" +#include "printutils.h" + +#include +#include +#include +#include + +const float stale = 0.190; // Maximum lifetime of a cache entry chosen to be shorter than the automatic reload poll time + +struct CacheEntry { + struct stat st; // result from stat + clock_t timestamp; // the time stat was called +}; + +typedef std::unordered_map StatMap; + +static StatMap statMap; + +int StatCache::stat(const char *path, struct stat *st) +{ + StatMap::iterator iter = statMap.find(path); + if (iter != statMap.end()) { // Have we got an entry for this file? + clock_t age = clock() - iter->second.timestamp; // How old is it? + if(float(age) / CLOCKS_PER_SEC < stale) { // Not stale yet so return it + *st = iter->second.st; + return 0; + } + statMap.erase(iter); // Remove state entry + } + CacheEntry entry; // Make a new entry + if (int rv = ::stat(path, &entry.st)) return rv; // stat failed + entry.timestamp = clock(); // Add the current time + statMap[path] = entry; + *st = entry.st; + return 0; +} + diff --git a/src/StatCache.h b/src/StatCache.h new file mode 100644 index 00000000..1c684e65 --- /dev/null +++ b/src/StatCache.h @@ -0,0 +1,32 @@ +/* + * OpenSCAD (www.openscad.org) + * Copyright (C) 2009-2011 Clifford Wolf and + * Marius Kintel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * As a special exception, you have permission to link this program + * with the CGAL library and distribute executables, as long as you + * follow the requirements of the GNU GPL in regard to all of the + * software in the executable aside from CGAL. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#pragma once + +class StatCache { +public: + static int stat(const char *, struct stat *); +}; diff --git a/src/boost-utils.cc b/src/boost-utils.cc index 73824fc0..2b431df7 100644 --- a/src/boost-utils.cc +++ b/src/boost-utils.cc @@ -89,7 +89,7 @@ fs::path boostfs_normalize(const fs::path &path) * iterate path and base * compare all elements so far of path and base * whilst they are the same, no write to output -x2 * when they change, or one runs out: + * when they change, or one runs out: * write to output, ../ times the number of remaining elements in base * write to output, the remaining elements in path */ diff --git a/src/openscad.cc b/src/openscad.cc index ef60ce2f..520a8faf 100644 --- a/src/openscad.cc +++ b/src/openscad.cc @@ -447,7 +447,7 @@ int cmdline(const char *deps_output_file, const std::string &filename, Camera &c } else { fs::current_path(fparent); // Force exported filenames to be relative to document path - fstream << root_module->dump("") << "\n"; + fstream << root_module->dump(""); fstream.close(); } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9664380d..e4ed9805 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -700,6 +700,7 @@ set(CORE_SOURCES ../src/Assignment.cc ../src/ModuleInstantiation.cc ../src/ModuleCache.cc + ../src/StatCache.cc ../src/node.cc ../src/NodeVisitor.cc ../src/context.cc @@ -1149,15 +1150,24 @@ list(APPEND EXAMPLE_2D_FILES list(APPEND EXAMPLE_FILES ${EXAMPLE_3D_FILES} ${EXAMPLE_2D_FILES}) -list(APPEND ECHO_FILES ${FUNCTION_FILES} +list(APPEND MISC_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/escape-test.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/use-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/assert-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/let-module-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles-test.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles_dir/localfiles-compatibility-test.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allexpressions.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allfunctions.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allmodules.scad) + +list(APPEND ECHO_FILES ${FUNCTION_FILES} ${MISC_FILES} ${CMAKE_SOURCE_DIR}/../testdata/scad/3D/features/for-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/expression-evaluation-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/echo-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/assert-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/assert-fail1-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/assert-fail2-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/assert-fail3-test.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/escape-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/parser-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/builtin-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/dim-all.scad @@ -1188,7 +1198,6 @@ list(APPEND ECHO_FILES ${FUNCTION_FILES} ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/nbsp-utf8-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/nbsp-latin1-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/concat-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-recursive-test.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/operators-tests.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/issues/issue1472.scad @@ -1197,17 +1206,19 @@ list(APPEND ECHO_FILES ${FUNCTION_FILES} ${CMAKE_SOURCE_DIR}/../testdata/scad/issues/issue1528.scad ) -list(APPEND DUMPTEST_FILES ${FEATURES_2D_FILES} ${FEATURES_3D_FILES} ${DEPRECATED_3D_FILES}) -list(APPEND DUMPTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/escape-test.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/use-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/assert-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/let-module-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles-test.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles_dir/localfiles-compatibility-test.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allexpressions.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allfunctions.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allmodules.scad) +list(APPEND ASTDUMPTEST_FILES ${MISC_FILES} + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/assert-expression-fail1-test.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/assert-expression-fail2-test.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/assert-expression-fail3-test.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/assert-expression-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/echo-expression-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/let-test-single.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/let-tests.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/list-comprehensions-experimental.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/functions/list-comprehensions.scad + ) + +list(APPEND DUMPTEST_FILES ${FEATURES_2D_FILES} ${FEATURES_3D_FILES} ${DEPRECATED_3D_FILES} ${MISC_FILES}) list(APPEND CGALPNGTEST_2D_FILES ${FEATURES_2D_FILES} ${SCAD_DXF_FILES} ${EXAMPLE_2D_FILES}) list(APPEND CGALPNGTEST_3D_FILES ${FEATURES_3D_FILES} ${SCAD_AMF_FILES} ${DEPRECATED_3D_FILES} ${ISSUES_3D_FILES} ${EXAMPLE_3D_FILES}) @@ -1348,7 +1359,8 @@ disable_tests(csgpngtest_primitive-inf-tests cgalpngtest_empty-shape-tests csgpngtest_issue1258) -experimental_tests(echotest_list-comprehensions-experimental +experimental_tests(astdumptest_list-comprehensions-experimental + echotest_list-comprehensions-experimental cgalpngtest_cube-with-hole cgalpngtest_multi-volume-binary cgalpngtest_sphere20face @@ -1370,6 +1382,7 @@ experimental_tests(echotest_list-comprehensions-experimental throwntogethertest_split_pyramid throwntogethertest_tetra_multicolor dumptest_assert-tests + astdumptest_assert-tests echotest_assert-tests cgalpngtest_assert-tests opencsgtest_assert-tests @@ -1382,7 +1395,12 @@ experimental_tests(echotest_list-comprehensions-experimental echotest_assert-expression-tests echotest_assert-expression-fail1-test echotest_assert-expression-fail2-test - echotest_assert-expression-fail3-test) + echotest_assert-expression-fail3-test + astdumptest_echo-expression-tests + astdumptest_assert-expression-tests + astdumptest_assert-expression-fail1-test + astdumptest_assert-expression-fail2-test + astdumptest_assert-expression-fail3-test) # Test config handling @@ -1584,11 +1602,7 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake ${TMP}) # o dxfpngtest: Export to DXF, Re-import and render to PNG (--render=cgal) # -add_cmdline_test(astdumptest EXE ${OPENSCAD_BINPATH} ARGS -o SUFFIX ast FILES - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/let-module-tests.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allexpressions.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allfunctions.scad - ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allmodules.scad) +add_cmdline_test(astdumptest EXE ${OPENSCAD_BINPATH} ARGS -o SUFFIX ast FILES ${ASTDUMPTEST_FILES}) add_cmdline_test(csgtexttest SUFFIX txt FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allexpressions.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allfunctions.scad diff --git a/tests/regression/astdumptest/allexpressions-expected.ast b/tests/regression/astdumptest/allexpressions-expected.ast index d34cfd7b..5963714f 100644 --- a/tests/regression/astdumptest/allexpressions-expected.ast +++ b/tests/regression/astdumptest/allexpressions-expected.ast @@ -35,4 +35,3 @@ ff = [for(a = [0, 1]) (if((a == 0)) ("A") else ("B"))]; gg = [each (["a", 0, false])]; hh = [for(a = [0 : 3]) (if((a < 2)) (if((a < 1)) (["+", a])) else (["-", a]))]; ii = [for(a = 0, b = 1;(a < 5);a = (a + 1), b = (b + 2)) [a, (b * b)]]; - diff --git a/tests/regression/astdumptest/assert-expression-fail1-test-expected.ast b/tests/regression/astdumptest/assert-expression-fail1-test-expected.ast new file mode 100644 index 00000000..81dd6d72 --- /dev/null +++ b/tests/regression/astdumptest/assert-expression-fail1-test-expected.ast @@ -0,0 +1,2 @@ +v = assert(false); +echo(v); diff --git a/tests/regression/astdumptest/assert-expression-fail2-test-expected.ast b/tests/regression/astdumptest/assert-expression-fail2-test-expected.ast new file mode 100644 index 00000000..e9e7cde0 --- /dev/null +++ b/tests/regression/astdumptest/assert-expression-fail2-test-expected.ast @@ -0,0 +1,4 @@ +a = 10; +b = 20; +v = assert(((a < 20) && (b < 20)), "Test! &"); +echo(v); diff --git a/tests/regression/astdumptest/assert-expression-fail3-test-expected.ast b/tests/regression/astdumptest/assert-expression-fail3-test-expected.ast new file mode 100644 index 00000000..1241a021 --- /dev/null +++ b/tests/regression/astdumptest/assert-expression-fail3-test-expected.ast @@ -0,0 +1,5 @@ +function f(x) = sin(x); +module m(angle) { + v = assert((f(angle) > 0)) 10; +} +m(270); diff --git a/tests/regression/astdumptest/assert-expression-tests-expected.ast b/tests/regression/astdumptest/assert-expression-tests-expected.ast new file mode 100644 index 00000000..e38d2948 --- /dev/null +++ b/tests/regression/astdumptest/assert-expression-tests-expected.ast @@ -0,0 +1,22 @@ +a = 3; +b = 6; +t0 = assert(true); +t1 = assert("t1"); +t2 = assert((a * b)); +t3 = assert(condition = (a * b)); +t4 = (assert(true) a * b); +c = 2; +t5 = ((assert(condition = 2) a * b) * c); +d = (c + 9); +t6 = (((assert(condition = ((d + 5) > 15), message = str("value: ", (d + 5))) a * b) * c) * d); +t7 = assert(true) [a, b]; +t8 = assert(true) [for(i = [1 : a]) ([i, b])]; +echo(t0 = t0); +echo(t1 = t1); +echo(t2 = t2); +echo(t3 = t3); +echo(t4 = t4); +echo(t5 = t5); +echo(t6 = t6); +echo(t7 = t7); +echo(t8 = t8); diff --git a/tests/regression/astdumptest/assert-tests-expected.ast b/tests/regression/astdumptest/assert-tests-expected.ast new file mode 100644 index 00000000..4f7f54e7 --- /dev/null +++ b/tests/regression/astdumptest/assert-tests-expected.ast @@ -0,0 +1,12 @@ +a = 3; +b = 6; +c = 2; +d = (c + 9); +assert(true); +assert("t1"); +assert((a * b)); +assert(condition = (a * b)); +assert(true) cube(8, center = true); +translate([0, 20, 0]) assert(condition = 2) sphere(5); +assert(condition = ((d + 5) > 15), message = str("value: ", (d + 5))) translate([15, 0, 0]) cylinder(8, 5, center = true); +echo("assert-tests"); diff --git a/tests/regression/astdumptest/echo-expression-tests-expected.ast b/tests/regression/astdumptest/echo-expression-tests-expected.ast new file mode 100644 index 00000000..70268bf3 --- /dev/null +++ b/tests/regression/astdumptest/echo-expression-tests-expected.ast @@ -0,0 +1,28 @@ +function f3(x, i = 0) = ((len(x) > i) ? let(a = (x[i] + f3(x, (i + 1)))) echo(a) a : 0); +function f2(x, i = 0) = ((echo(i) len(x) > i) ? (x[i] + f2(x, (i + 1))) : 0); +function f1(x) = [for(a = x) (echo(a = a) a)]; +a = 3; +b = 6; +c = 8; +v = [2, 5, 7]; +t0 = echo(); +t1 = echo() undef; +t2 = echo("t2"); +t3 = echo((a * b)); +t4 = echo(c = (a * b)); +t5 = (echo() a * b); +t6 = ((echo(c = 2) a * b) * c); +t7 = echo() [a, b]; +t8 = echo() [for(i = [1 : a]) ([i, b])]; +echo(t0 = t0); +echo(t1 = t1); +echo(t2 = t2); +echo(t3 = t3); +echo(t4 = t4); +echo(t5 = t5); +echo(t6 = t6); +echo(t7 = t7); +echo(t8 = t8); +echo("f1(v) = ", f1(v)); +echo("f2(v) = ", f2(v)); +echo("f3(v) = ", f3(v)); diff --git a/tests/regression/astdumptest/escape-test-expected.ast b/tests/regression/astdumptest/escape-test-expected.ast new file mode 100644 index 00000000..493e04c0 --- /dev/null +++ b/tests/regression/astdumptest/escape-test-expected.ast @@ -0,0 +1 @@ +import(file = "B-\" C-\t D-\n E-'", layer = "A:\\ B:\" C:\t D:\n E:' F:\\\\"); diff --git a/tests/regression/astdumptest/include-tests-expected.ast b/tests/regression/astdumptest/include-tests-expected.ast new file mode 100644 index 00000000..714db2b7 --- /dev/null +++ b/tests/regression/astdumptest/include-tests-expected.ast @@ -0,0 +1,66 @@ +function deg(angle) = ((360 * angle) / TAU); +module test1() { + test2(); + translate([2, 0, 0]) test3(); + translate([2, -2, 0]) test4(); + translate([-2, 0, 0]) test5(); + translate([-2, -2, 0]) test6(); + translate([0, 2, 0]) test7(); + translate([0, -2, 0]) sphere(test2_variable, $fn = 16); + translate([0, -4, 0]) cube([(TAU / 4), 0.5, 0.5], center = true); + translate([-2, -4, 0]) cube([(deg(0.5) / 20), 0.5, 0.5], center = true); + translate([2, -4, -0.5]) scale(0.05) alignds420([0, 0, 0], [0, 0, 0]); +} +module test_alignds420() { + alignds420(screws = 1); +} +module test7() { + cube([0.5, 0.5, 1], center = true); +} +module test2() { + cube(center = true); +} +module test6() { + difference() { + cube(center = true); + cylinder(r = 0.4, h = 2, center = true); + } +} +module alignds420(position, rotation, screws = 0, axle_lenght = 0) { + translate(position) rotate(rotation) { + union() { + translate([0, 0, 17]) { + cylinder(r = 6, h = 8, $fn = 30); + cylinder(r = 2.5, h = 10.5, $fn = 20); + } + translate([-6, -6, 0]) { + cube([12, 22.8, 19.5], false); + translate([0, -5, 17]) cube([12, 7, 2.5]); + translate([0, 20.8, 17]) cube([12, 7, 2.5]); + } + if((screws > 0)) { + translate([0, (-10.2 + 1.8), 11.5]) cylinder(r = (1.8 / 2), h = 6, $fn = 6); + translate([0, (21 - 1.8), 11.5]) cylinder(r = (1.8 / 2), h = 6, $fn = 6); + } + translate([-6, 0, 19]) rotate([90, 0, 90]) triangle(4, 18, 12); + translate([-6, -6, 19]) cube([12, 6.5, 4]); + } + if((axle_lenght > 0)) cylinder(r = 0.9, h = axle_lenght, center = true, $fn = 8); + } +} +module test5() { + sphere(r = 0.5, $fn = 8); +} +module test4() { + cylinder(r = 0.5, $fn = 10, center = true); +} +module test3() { + cylinder(r1 = 0.7, r2 = 0.2, center = true); +} +test2_variable = 0.7; +TAU = 6.28319; +PI = (TAU / 2); +mm_per_inch = 25.4; +echo("included.scad"); +echo("included2.scad"); +test1(); diff --git a/tests/regression/astdumptest/let-module-tests-expected.ast b/tests/regression/astdumptest/let-module-tests-expected.ast index 79273331..2530215b 100644 --- a/tests/regression/astdumptest/let-module-tests-expected.ast +++ b/tests/regression/astdumptest/let-module-tests-expected.ast @@ -12,4 +12,3 @@ let(a = 5, b = (a + 8), c = (a + b)) { } } } - diff --git a/tests/regression/astdumptest/let-test-single-expected.ast b/tests/regression/astdumptest/let-test-single-expected.ast new file mode 100644 index 00000000..84367176 --- /dev/null +++ b/tests/regression/astdumptest/let-test-single-expected.ast @@ -0,0 +1,2 @@ +c = let(c = 1) [c]; +echo(c); diff --git a/tests/regression/astdumptest/let-tests-expected.ast b/tests/regression/astdumptest/let-tests-expected.ast new file mode 100644 index 00000000..acdeccfc --- /dev/null +++ b/tests/regression/astdumptest/let-tests-expected.ast @@ -0,0 +1,16 @@ +$a = 1; +b = 1; +echo(let() ($a * b)); +echo(let($a = 2, b = 3) ($a * b)); +echo(let(b = 2, $a = 3) ($a * b)); +echo(let($a = 2) ($a * b)); +echo(let(b = 3) ($a * b)); +echo(let($a = 2, b = 3, $a = 4) ($a * b)); +echo(let($a = 2, b = 3, b = 5) ($a * b)); +echo(let($a = 2, b = 3, $a = 4, b = 5) ($a * b)); +echo(let($a = 2, b = ($a * 3)) ($a * b)); +echo(let($a = (2 * b), b = 3) ($a * b)); +echo(let($a = (2 * b), b = ($a * 3)) ($a * b)); +echo(let(b = ($a * 3), $a = (2 * b)) ($a * b)); +echo(let(b = $a, $a = b) [$a, b]); +echo(let(b = (2 * $a), $a = b) [for(i = [1 : b]) ([i, $a])]); diff --git a/tests/regression/astdumptest/list-comprehensions-expected.ast b/tests/regression/astdumptest/list-comprehensions-expected.ast new file mode 100644 index 00000000..6fee8c10 --- /dev/null +++ b/tests/regression/astdumptest/list-comprehensions-expected.ast @@ -0,0 +1,31 @@ +y = 0; +z = 1; +a = [for(x = [0 : 3]) ([for(y = [10 : 13]) ([x, y])])]; +echo([]); +echo([let(x = 2) 1]); +echo([let(x = 2) x]); +echo([let(x = 2) x]); +echo([if(y) (1)]); +echo([if(z) (1)]); +echo([for(x = [y, z]) (x)]); +echo([for(x = [y : z]) (x)]); +echo([for(x = [0 : -1 : 10]) (x)]); +echo([for(x = [10 : 1 : 0]) (x)]); +echo([for(x = [0 : 10]) (x)]); +echo([for(x = [0 : 3]) (for(y = [10 : 13]) ([x, y]))]); +echo([for(x = [0 : 3]) (for(y = [10 : 13]) ([x, y]))]); +echo([for(x = [0 : 3]) ([for(y = [10 : 13]) ([x, y])])]); +echo([for(x = [0 : 3]) (if((x == 1)) ([for(y = [10 : 13]) (if((y != 11)) ([x, y]))]))]); +echo(a); +echo([for(i = a) (for(j = i) (j))]); +echo([for(i = a) (for(j = i) (for(k = j) (k)))]); +echo([for(i = a) (for(j = i) (j))]); +echo([for(i = a) (for(j = i) (for(k = j) (k)))]); +echo([for(a = [0 : 1]) (a)]); +echo([for(a = [0 : 1]) (if(true) (a))]); +echo([for(a = [0 : 1]) (if(true) (if(true) (a)))]); +echo([for(a = [0 : 1]) (for(b = [a : 2]) ([b, a]))]); +echo([for(a = [0 : 1]) (if(true) (for(b = [a : 2]) ([b, a])))]); +echo([for(a = [0 : 1]) (if(true) (if(true) (for(b = [a : 2]) ([b, a]))))]); +echo([-1, for(a = [0 : 1 : 3]) (a), for(b = [3 : -1 : 0]) (b), -1]); +echo([for(a = [2 : 3]) ((a * 2)), for(a = [5 : 9]) (if(((a % 2) == 0)) ([a, (a + 1)])), -1]); diff --git a/tests/regression/astdumptest/list-comprehensions-experimental-expected.ast b/tests/regression/astdumptest/list-comprehensions-experimental-expected.ast new file mode 100644 index 00000000..f995ca5f --- /dev/null +++ b/tests/regression/astdumptest/list-comprehensions-experimental-expected.ast @@ -0,0 +1,10 @@ +function f() = [for(a = [0 : 4]) (pow(2, a))]; +echo([for(a = [0, 1, 2]) (if((a == 1)) ("-") else ("+"))]); +echo([for(a = [0, 1, 2]) (if((a > 0)) (if((a == 1)) ("A") else ("B")))]); +echo([for(a = [0, 1, 2]) (if((a > 0)) (if((a == 1)) ("A") else ("B")) else ("-"))]); +echo([for(a = [0 : 3]) (if((a < 2)) (if((a < 1)) (["+", a]) else (["-", a])))]); +echo([for(a = [0 : 3]) (if((a < 2)) (if((a < 1)) (["+", a])) else (["-", a]))]); +echo([for(a = [2 : 4]) (each ([a, (a * a)]))]); +echo([each (["a", "b"]), each ([-5 : -2 : -9]), each (f()), each ("c"), each (42), each (true)]); +echo([for(i = 2;(i <= 10);i = (i + 2)) i]); +echo([for(i = 1, n = 1;(i <= 4);i = (i + 1), n = ((n + i) * i)) [i, n]]); diff --git a/tests/regression/astdumptest/localfiles-compatibility-test-expected.ast b/tests/regression/astdumptest/localfiles-compatibility-test-expected.ast new file mode 100644 index 00000000..f71427dd --- /dev/null +++ b/tests/regression/astdumptest/localfiles-compatibility-test-expected.ast @@ -0,0 +1 @@ +localfiles_submodule(); diff --git a/tests/regression/astdumptest/localfiles-test-expected.ast b/tests/regression/astdumptest/localfiles-test-expected.ast new file mode 100644 index 00000000..a7c6dce7 --- /dev/null +++ b/tests/regression/astdumptest/localfiles-test-expected.ast @@ -0,0 +1 @@ +localfiles_module(); diff --git a/tests/regression/astdumptest/use-tests-expected.ast b/tests/regression/astdumptest/use-tests-expected.ast new file mode 100644 index 00000000..c06b8d8f --- /dev/null +++ b/tests/regression/astdumptest/use-tests-expected.ast @@ -0,0 +1,56 @@ +function deg(angle) = ((360 * angle) / TAU); +module test1() { + test2(); + translate([4, 0, 0]) test3(); + translate([4, -2, 0]) test4(); + translate([-2, 0, 0]) test5(); + translate([-2, -2, 0]) test6(); + translate([0, 2, 0]) test7(); + translate([0, -2, 0]) sphere(test2_variable, $fn = 16); + translate([0, -4, 0]) teardrop(0.3, 1.5, 90); + translate([-2, -4, 0]) cube([(deg(0.5) / 20), 0.5, 0.5], center = true); + translate([2, -4, -0.5]) scale(0.05) alignds420([0, 0, 0], [0, 0, 0]); +} +module test_alignds420() { + alignds420(screws = 1); +} +module alignds420(position, rotation, screws = 0, axle_lenght = 0) { + translate(position) rotate(rotation) { + union() { + translate([0, 0, 17]) { + cylinder(r = 6, h = 8, $fn = 30); + cylinder(r = 2.5, h = 10.5, $fn = 20); + } + translate([-6, -6, 0]) { + cube([12, 22.8, 19.5], false); + translate([0, -5, 17]) cube([12, 7, 2.5]); + translate([0, 20.8, 17]) cube([12, 7, 2.5]); + } + if((screws > 0)) { + translate([0, (-10.2 + 1.8), 11.5]) cylinder(r = (1.8 / 2), h = 6, $fn = 6); + translate([0, (21 - 1.8), 11.5]) cylinder(r = (1.8 / 2), h = 6, $fn = 6); + } + translate([-6, 0, 19]) rotate([90, 0, 90]) triangle(4, 18, 12); + translate([-6, -6, 19]) cube([12, 6.5, 4]); + } + if((axle_lenght > 0)) cylinder(r = 0.9, h = axle_lenght, center = true, $fn = 8); + } +} +module test_teardrop() { + translate([0, -15, 0]) teardrop(5, 20, 90); + translate([0, 0, 0]) teardrop(5, 20, 60); + translate([0, 15, 0]) teardrop(5, 20, 45); +} +module teardrop(radius, length, angle) { + rotate([0, angle, 0]) union() { + linear_extrude(height = length, center = true, convexity = radius, twist = 0) circle(r = radius, center = true, $fn = 30); + linear_extrude(height = length, center = true, convexity = radius, twist = 0) projection(cut = false) rotate([0, -angle, 0]) translate([0, 0, ((radius * sin(45)) * 1.5)]) cylinder(h = (radius * sin(45)), r1 = (radius * sin(45)), r2 = 0, center = true, $fn = 30); +} +} +module test7() { + cube([0.5, 0.5, 1], center = true); +} +TAU = 6.28319; +PI = (TAU / 2); +mm_per_inch = 25.4; +test1(); diff --git a/tests/virtualfb.sh b/tests/virtualfb.sh index f56f9a85..2c83fabc 100755 --- a/tests/virtualfb.sh +++ b/tests/virtualfb.sh @@ -117,8 +117,9 @@ stop() if [ -e $LOCKFILE ]; then rm $LOCKFILE fi - cat virtualfb1.log - cat virtualfb2.log +# Very verbose debug output: +# cat virtualfb1.log +# cat virtualfb2.log echo 'dump ~/.xession-errors:' cat ~/.xsession-errors echo 'end ~/.xession-errors' diff --git a/xcode/OpenSCAD.xcodeproj/project.pbxproj b/xcode/OpenSCAD.xcodeproj/project.pbxproj index 1872cbdc..d8734e16 100644 --- a/xcode/OpenSCAD.xcodeproj/project.pbxproj +++ b/xcode/OpenSCAD.xcodeproj/project.pbxproj @@ -119,12 +119,6 @@ E05FBE9817C30A05004F525B /* CsgInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CsgInfo.h; sourceTree = ""; }; E05FBE9917C30A05004F525B /* csgnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgnode.h; sourceTree = ""; }; E05FBE9A17C30A05004F525B /* csgops.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgops.cc; sourceTree = ""; }; - E05FBE9B17C30A05004F525B /* csgterm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgterm.cc; sourceTree = ""; }; - E05FBE9C17C30A05004F525B /* csgterm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgterm.h; sourceTree = ""; }; - E05FBE9D17C30A05004F525B /* CSGTermEvaluator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSGTermEvaluator.cc; sourceTree = ""; }; - E05FBE9E17C30A06004F525B /* CSGTermEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSGTermEvaluator.h; sourceTree = ""; }; - E05FBE9F17C30A06004F525B /* csgtermnormalizer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgtermnormalizer.cc; sourceTree = ""; }; - E05FBEA017C30A06004F525B /* csgtermnormalizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgtermnormalizer.h; sourceTree = ""; }; E05FBEA117C30A06004F525B /* dxfdata.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dxfdata.cc; sourceTree = ""; }; E05FBEA217C30A06004F525B /* dxfdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dxfdata.h; sourceTree = ""; }; E05FBEA317C30A06004F525B /* dxfdim.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dxfdim.cc; sourceTree = ""; }; @@ -170,8 +164,6 @@ E05FBED017C30A06004F525B /* mainwin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mainwin.cc; sourceTree = ""; }; E05FBED117C30A06004F525B /* MainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainWindow.h; sourceTree = ""; }; E05FBED217C30A06004F525B /* MainWindow.ui */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = MainWindow.ui; sourceTree = ""; }; - E05FBED317C30A06004F525B /* mathc99.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mathc99.cc; sourceTree = ""; }; - E05FBED417C30A06004F525B /* mathc99.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mathc99.h; sourceTree = ""; }; E05FBED517C30A06004F525B /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; E05FBED617C30A06004F525B /* modcontext.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = modcontext.cc; sourceTree = ""; }; E05FBED717C30A06004F525B /* modcontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modcontext.h; sourceTree = ""; }; @@ -249,16 +241,12 @@ E05FBF2817C30A06004F525B /* ThrownTogetherRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThrownTogetherRenderer.h; sourceTree = ""; }; E05FBF2A17C30A06004F525B /* transform.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transform.cc; sourceTree = ""; }; E05FBF2B17C30A06004F525B /* transformnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformnode.h; sourceTree = ""; }; - E05FBF2C17C30A06004F525B /* traverser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = traverser.cc; sourceTree = ""; }; - E05FBF2D17C30A06004F525B /* traverser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = traverser.h; sourceTree = ""; }; E05FBF2E17C30A06004F525B /* Tree.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tree.cc; sourceTree = ""; }; E05FBF2F17C30A06004F525B /* Tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tree.h; sourceTree = ""; }; - E05FBF3017C30A06004F525B /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = ""; }; E05FBF3117C30A06004F525B /* value.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = value.cc; sourceTree = ""; }; E05FBF3217C30A06004F525B /* value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = value.h; sourceTree = ""; }; E05FBF3317C30A06004F525B /* version_check.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = version_check.cc; sourceTree = ""; }; E05FBF3417C30A06004F525B /* version_check.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version_check.h; sourceTree = ""; }; - E05FBF3517C30A06004F525B /* visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = visitor.h; sourceTree = ""; }; E08B63DC1955EEF40061A6E4 /* Camera.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Camera.cc; sourceTree = ""; }; E091574819AA58C900D699E9 /* calc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = calc.cc; sourceTree = ""; }; E091574919AA58C900D699E9 /* calc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = calc.h; sourceTree = ""; }; @@ -295,6 +283,83 @@ E09A1CB31A9DAE64000021A3 /* scintillaeditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scintillaeditor.h; sourceTree = ""; }; E09A1CB41A9DAE64000021A3 /* settings.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = settings.cc; sourceTree = ""; }; E09A1CB51A9DAE64000021A3 /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = settings.h; sourceTree = ""; }; + E0B9CA351E418FE400B90C7A /* annotation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = annotation.cc; sourceTree = ""; }; + E0B9CA361E418FE400B90C7A /* annotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = annotation.h; sourceTree = ""; }; + E0B9CA371E418FE400B90C7A /* assignment.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assignment.cc; sourceTree = ""; }; + E0B9CA381E418FE400B90C7A /* Assignment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Assignment.h; sourceTree = ""; }; + E0B9CA391E418FE400B90C7A /* AST.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AST.cc; sourceTree = ""; }; + E0B9CA3A1E418FE400B90C7A /* AST.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AST.h; sourceTree = ""; }; + E0B9CA3B1E418FE400B90C7A /* BaseVisitable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseVisitable.h; sourceTree = ""; }; + E0B9CA3C1E418FE400B90C7A /* cgalutils-applyops.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "cgalutils-applyops.cc"; sourceTree = ""; }; + E0B9CA3D1E418FE400B90C7A /* cgalutils-project.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "cgalutils-project.cc"; sourceTree = ""; }; + E0B9CA3E1E418FE400B90C7A /* comment_lexer.l */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lex; path = comment_lexer.l; sourceTree = ""; }; + E0B9CA3F1E418FE400B90C7A /* comment_parser.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; path = comment_parser.y; sourceTree = ""; }; + E0B9CA401E418FE400B90C7A /* comment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = comment.cpp; sourceTree = ""; }; + E0B9CA411E418FF800B90C7A /* UserModule.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserModule.cc; sourceTree = ""; }; + E0B9CA421E418FF800B90C7A /* UserModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserModule.h; sourceTree = ""; }; + E0B9CA431E418FF800B90C7A /* WindowManager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WindowManager.cc; sourceTree = ""; }; + E0B9CA441E418FF800B90C7A /* WindowManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowManager.h; sourceTree = ""; }; + E0B9CA451E41902600B90C7A /* csgnode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgnode.cc; sourceTree = ""; }; + E0B9CA461E41902600B90C7A /* csgops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgops.h; sourceTree = ""; }; + E0B9CA471E41902600B90C7A /* CSGTreeEvaluator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSGTreeEvaluator.cc; sourceTree = ""; }; + E0B9CA481E41902600B90C7A /* CSGTreeEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSGTreeEvaluator.h; sourceTree = ""; }; + E0B9CA491E41902600B90C7A /* CSGTreeNormalizer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSGTreeNormalizer.cc; sourceTree = ""; }; + E0B9CA4A1E41902600B90C7A /* CSGTreeNormalizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSGTreeNormalizer.h; sourceTree = ""; }; + E0B9CA4B1E41902600B90C7A /* export_amf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_amf.cc; sourceTree = ""; }; + E0B9CA4C1E41902700B90C7A /* export_dxf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_dxf.cc; sourceTree = ""; }; + E0B9CA4D1E41902700B90C7A /* export_nef.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_nef.cc; sourceTree = ""; }; + E0B9CA4E1E41902700B90C7A /* export_off.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_off.cc; sourceTree = ""; }; + E0B9CA4F1E41902700B90C7A /* export_stl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_stl.cc; sourceTree = ""; }; + E0B9CA501E41902700B90C7A /* export_svg.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_svg.cc; sourceTree = ""; }; + E0B9CA511E41902700B90C7A /* FileModule.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileModule.cc; sourceTree = ""; }; + E0B9CA521E41902700B90C7A /* FileModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileModule.h; sourceTree = ""; }; + E0B9CA531E41902700B90C7A /* function.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cc; sourceTree = ""; }; + E0B9CA541E41902700B90C7A /* GroupModule.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GroupModule.cc; sourceTree = ""; }; + E0B9CA551E41902700B90C7A /* GroupModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupModule.h; sourceTree = ""; }; + E0B9CA561E41902700B90C7A /* hash.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hash.cc; sourceTree = ""; }; + E0B9CA571E41902700B90C7A /* hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = ""; }; + E0B9CA581E41902700B90C7A /* import_amf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_amf.cc; sourceTree = ""; }; + E0B9CA591E41902700B90C7A /* import_nef.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_nef.cc; sourceTree = ""; }; + E0B9CA5A1E41902700B90C7A /* import_off.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_off.cc; sourceTree = ""; }; + E0B9CA5B1E41902700B90C7A /* import_stl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_stl.cc; sourceTree = ""; }; + E0B9CA5C1E41902700B90C7A /* import_svg.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_svg.cc; sourceTree = ""; }; + E0B9CA5D1E41902700B90C7A /* import.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import.h; sourceTree = ""; }; + E0B9CA5E1E41902700B90C7A /* ModuleInstantiation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModuleInstantiation.cc; sourceTree = ""; }; + E0B9CA5F1E41902700B90C7A /* ModuleInstantiation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleInstantiation.h; sourceTree = ""; }; + E0B9CA601E41902700B90C7A /* NodeVisitor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodeVisitor.cc; sourceTree = ""; }; + E0B9CA611E41902700B90C7A /* NodeVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeVisitor.h; sourceTree = ""; }; + E0B9CA621E41902700B90C7A /* OpenSCADApp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenSCADApp.cc; sourceTree = ""; }; + E0B9CA631E41902700B90C7A /* OpenSCADApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenSCADApp.h; sourceTree = ""; }; + E0B9CA641E41902700B90C7A /* Package.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Package.h; sourceTree = ""; }; + E0B9CA651E41902700B90C7A /* polyset-gl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "polyset-gl.cc"; sourceTree = ""; }; + E0B9CA661E41904400B90C7A /* groupwidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = groupwidget.cpp; path = parameter/groupwidget.cpp; sourceTree = ""; }; + E0B9CA671E41904400B90C7A /* groupwidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = groupwidget.h; path = parameter/groupwidget.h; sourceTree = ""; }; + E0B9CA681E41904400B90C7A /* parametercheckbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametercheckbox.cpp; path = parameter/parametercheckbox.cpp; sourceTree = ""; }; + E0B9CA691E41904400B90C7A /* parametercheckbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametercheckbox.h; path = parameter/parametercheckbox.h; sourceTree = ""; }; + E0B9CA6A1E41904400B90C7A /* parametercombobox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametercombobox.cpp; path = parameter/parametercombobox.cpp; sourceTree = ""; }; + E0B9CA6B1E41904400B90C7A /* parametercombobox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametercombobox.h; path = parameter/parametercombobox.h; sourceTree = ""; }; + E0B9CA6C1E41904400B90C7A /* ParameterEntryWidget.ui */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ParameterEntryWidget.ui; path = parameter/ParameterEntryWidget.ui; sourceTree = ""; }; + E0B9CA6D1E41904400B90C7A /* parameterextractor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterextractor.cpp; path = parameter/parameterextractor.cpp; sourceTree = ""; }; + E0B9CA6E1E41904400B90C7A /* parameterextractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterextractor.h; path = parameter/parameterextractor.h; sourceTree = ""; }; + E0B9CA6F1E41904400B90C7A /* parameterobject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterobject.cpp; path = parameter/parameterobject.cpp; sourceTree = ""; }; + E0B9CA701E41904400B90C7A /* parameterobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterobject.h; path = parameter/parameterobject.h; sourceTree = ""; }; + E0B9CA711E41904400B90C7A /* parameterset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterset.cpp; path = parameter/parameterset.cpp; sourceTree = ""; }; + E0B9CA721E41904400B90C7A /* parameterset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterset.h; path = parameter/parameterset.h; sourceTree = ""; }; + E0B9CA731E41904400B90C7A /* parameterslider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterslider.cpp; path = parameter/parameterslider.cpp; sourceTree = ""; }; + E0B9CA741E41904400B90C7A /* parameterslider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterslider.h; path = parameter/parameterslider.h; sourceTree = ""; }; + E0B9CA751E41904400B90C7A /* parameterspinbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterspinbox.cpp; path = parameter/parameterspinbox.cpp; sourceTree = ""; }; + E0B9CA761E41904400B90C7A /* parameterspinbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterspinbox.h; path = parameter/parameterspinbox.h; sourceTree = ""; }; + E0B9CA771E41904400B90C7A /* parametertext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametertext.cpp; path = parameter/parametertext.cpp; sourceTree = ""; }; + E0B9CA781E41904400B90C7A /* parametertext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametertext.h; path = parameter/parametertext.h; sourceTree = ""; }; + E0B9CA791E41904400B90C7A /* parametervector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametervector.cpp; path = parameter/parametervector.cpp; sourceTree = ""; }; + E0B9CA7A1E41904400B90C7A /* parametervector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametervector.h; path = parameter/parametervector.h; sourceTree = ""; }; + E0B9CA7B1E41904400B90C7A /* parametervirtualwidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametervirtualwidget.cpp; path = parameter/parametervirtualwidget.cpp; sourceTree = ""; }; + E0B9CA7C1E41904400B90C7A /* parametervirtualwidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametervirtualwidget.h; path = parameter/parametervirtualwidget.h; sourceTree = ""; }; + E0B9CA7D1E41904400B90C7A /* ParameterWidget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ParameterWidget.cc; path = parameter/ParameterWidget.cc; sourceTree = ""; }; + E0B9CA7E1E41904400B90C7A /* ParameterWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ParameterWidget.h; path = parameter/ParameterWidget.h; sourceTree = ""; }; + E0B9CA7F1E41904400B90C7A /* ParameterWidget.ui */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ParameterWidget.ui; path = parameter/ParameterWidget.ui; sourceTree = ""; }; + E0B9CA801E41904400B90C7A /* clipper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = clipper.cpp; path = polyclipping/clipper.cpp; sourceTree = ""; }; + E0B9CA811E41904400B90C7A /* clipper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = clipper.hpp; path = polyclipping/clipper.hpp; sourceTree = ""; }; E0BD02071979C2D90020CC1B /* FontCache.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontCache.cc; sourceTree = ""; }; E0BD02081979C2D90020CC1B /* FontCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontCache.h; sourceTree = ""; }; E0BD02091979C2D90020CC1B /* FontListDialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontListDialog.cc; sourceTree = ""; }; @@ -382,10 +447,17 @@ E05FBE6B17C30A05004F525B /* AboutDialog.h */, E05FBE6C17C30A05004F525B /* AboutDialog.html */, E05FBE6D17C30A05004F525B /* AboutDialog.ui */, + E0B9CA351E418FE400B90C7A /* annotation.cc */, + E0B9CA361E418FE400B90C7A /* annotation.h */, E05FBE6E17C30A05004F525B /* AppleEvents.cc */, E05FBE6F17C30A05004F525B /* AppleEvents.h */, + E0B9CA371E418FE400B90C7A /* assignment.cc */, + E0B9CA381E418FE400B90C7A /* Assignment.h */, + E0B9CA391E418FE400B90C7A /* AST.cc */, + E0B9CA3A1E418FE400B90C7A /* AST.h */, E05FBE7017C30A05004F525B /* AutoUpdater.cc */, E05FBE7117C30A05004F525B /* AutoUpdater.h */, + E0B9CA3B1E418FE400B90C7A /* BaseVisitable.h */, E05FBE7217C30A05004F525B /* boost-utils.cc */, E05FBE7317C30A05004F525B /* boost-utils.h */, E05FBE7417C30A05004F525B /* boosty.h */, @@ -409,7 +481,9 @@ E05FBE8717C30A05004F525B /* cgalfwd.h */, E05FBE8817C30A05004F525B /* CGALRenderer.cc */, E05FBE8917C30A05004F525B /* CGALRenderer.h */, + E0B9CA3C1E418FE400B90C7A /* cgalutils-applyops.cc */, E0F8E5411A5B02AB004723C5 /* cgalutils-polyhedron.cc */, + E0B9CA3D1E418FE400B90C7A /* cgalutils-project.cc */, E091574D19AA58C900D699E9 /* cgalutils-tess.cc */, E05FBE8A17C30A05004F525B /* cgalutils.cc */, E05FBE8B17C30A05004F525B /* cgalutils.h */, @@ -417,25 +491,30 @@ E05FBE8D17C30A05004F525B /* cgalworker.h */, E0FCDD621A27B96C0024E633 /* clipper-utils.cc */, E091574E19AA58C900D699E9 /* clipper-utils.h */, + E0B9CA801E41904400B90C7A /* clipper.cpp */, + E0B9CA811E41904400B90C7A /* clipper.hpp */, E05FBE8E17C30A05004F525B /* CocoaUtils.h */, E05FBE8F17C30A05004F525B /* CocoaUtils.mm */, E05FBE9017C30A05004F525B /* color.cc */, E091574F19AA58C900D699E9 /* colormap.cc */, E05FBE9117C30A05004F525B /* colormap.h */, E05FBE9217C30A05004F525B /* colornode.h */, + E0B9CA3E1E418FE400B90C7A /* comment_lexer.l */, + E0B9CA3F1E418FE400B90C7A /* comment_parser.y */, + E0B9CA401E418FE400B90C7A /* comment.cpp */, E05FBE9317C30A05004F525B /* context.cc */, E05FBE9517C30A05004F525B /* context.h */, E05FBE9717C30A05004F525B /* control.cc */, E001A3361AAD51F2001E2678 /* convex_hull_3_bugfix.h */, E05FBE9817C30A05004F525B /* CsgInfo.h */, + E0B9CA451E41902600B90C7A /* csgnode.cc */, E05FBE9917C30A05004F525B /* csgnode.h */, E05FBE9A17C30A05004F525B /* csgops.cc */, - E05FBE9B17C30A05004F525B /* csgterm.cc */, - E05FBE9C17C30A05004F525B /* csgterm.h */, - E05FBE9D17C30A05004F525B /* CSGTermEvaluator.cc */, - E05FBE9E17C30A06004F525B /* CSGTermEvaluator.h */, - E05FBE9F17C30A06004F525B /* csgtermnormalizer.cc */, - E05FBEA017C30A06004F525B /* csgtermnormalizer.h */, + E0B9CA461E41902600B90C7A /* csgops.h */, + E0B9CA471E41902600B90C7A /* CSGTreeEvaluator.cc */, + E0B9CA481E41902600B90C7A /* CSGTreeEvaluator.h */, + E0B9CA491E41902600B90C7A /* CSGTreeNormalizer.cc */, + E0B9CA4A1E41902600B90C7A /* CSGTreeNormalizer.h */, E001A3371AAD51F2001E2678 /* Dock.cc */, E001A3381AAD51F2001E2678 /* Dock.h */, E091575019AA58C900D699E9 /* DrawingCallback.cc */, @@ -451,7 +530,13 @@ E05FBEAC17C30A06004F525B /* evalcontext.h */, E05FBEAD17C30A06004F525B /* EventFilter.h */, E001A3391AAD51F2001E2678 /* exceptions.h */, + E0B9CA4B1E41902600B90C7A /* export_amf.cc */, + E0B9CA4C1E41902700B90C7A /* export_dxf.cc */, + E0B9CA4D1E41902700B90C7A /* export_nef.cc */, + E0B9CA4E1E41902700B90C7A /* export_off.cc */, E05FBEB017C30A06004F525B /* export_png.cc */, + E0B9CA4F1E41902700B90C7A /* export_stl.cc */, + E0B9CA501E41902700B90C7A /* export_svg.cc */, E05FBEAE17C30A06004F525B /* export.cc */, E05FBEAF17C30A06004F525B /* export.h */, E05FBEB117C30A06004F525B /* expr.cc */, @@ -460,6 +545,8 @@ E05FBEB417C30A06004F525B /* fbo.h */, E091575319AA58C900D699E9 /* feature.cc */, E091575419AA58C900D699E9 /* feature.h */, + E0B9CA511E41902700B90C7A /* FileModule.cc */, + E0B9CA521E41902700B90C7A /* FileModule.h */, E05FBEB517C30A06004F525B /* fileutils.cc */, E05FBEB617C30A06004F525B /* fileutils.h */, E001A3511AAD5242001E2678 /* findversion.h */, @@ -473,6 +560,7 @@ E0BD020B1979C2D90020CC1B /* FreetypeRenderer.cc */, E0BD020C1979C2D90020CC1B /* FreetypeRenderer.h */, E05FBEB717C30A06004F525B /* func.cc */, + E0B9CA531E41902700B90C7A /* function.cc */, E05FBEB817C30A06004F525B /* function.h */, E0348EF3194E49B800CAB791 /* Geometry.cc */, E0348EF4194E49B800CAB791 /* Geometry.h */, @@ -486,15 +574,27 @@ E05FBEBA17C30A06004F525B /* GLView.h */, E001A33C1AAD51F2001E2678 /* grid.cc */, E05FBEBB17C30A06004F525B /* grid.h */, + E0B9CA541E41902700B90C7A /* GroupModule.cc */, + E0B9CA551E41902700B90C7A /* GroupModule.h */, + E0B9CA661E41904400B90C7A /* groupwidget.cpp */, + E0B9CA671E41904400B90C7A /* groupwidget.h */, E05FBEBC17C30A06004F525B /* handle_dep.cc */, E05FBEBD17C30A06004F525B /* handle_dep.h */, + E0B9CA561E41902700B90C7A /* hash.cc */, + E0B9CA571E41902700B90C7A /* hash.h */, E05FBEBE17C30A06004F525B /* highlighter.cc */, E05FBEBF17C30A06004F525B /* highlighter.h */, E05FBEC017C30A06004F525B /* imageutils-lodepng.cc */, E05FBEC117C30A06004F525B /* imageutils-macosx.cc */, E05FBEC217C30A06004F525B /* imageutils.cc */, E05FBEC317C30A06004F525B /* imageutils.h */, + E0B9CA581E41902700B90C7A /* import_amf.cc */, + E0B9CA591E41902700B90C7A /* import_nef.cc */, + E0B9CA5A1E41902700B90C7A /* import_off.cc */, + E0B9CA5B1E41902700B90C7A /* import_stl.cc */, + E0B9CA5C1E41902700B90C7A /* import_svg.cc */, E05FBEC417C30A06004F525B /* import.cc */, + E0B9CA5D1E41902700B90C7A /* import.h */, E05FBEC517C30A06004F525B /* importnode.h */, E0377C3E1A9CFE4E0016D52D /* launchingscreen.cc */, E0377C3F1A9CFE4E0016D52D /* launchingscreen.h */, @@ -519,8 +619,6 @@ E05FBED017C30A06004F525B /* mainwin.cc */, E05FBED117C30A06004F525B /* MainWindow.h */, E05FBED217C30A06004F525B /* MainWindow.ui */, - E05FBED317C30A06004F525B /* mathc99.cc */, - E05FBED417C30A06004F525B /* mathc99.h */, E05FBED517C30A06004F525B /* memory.h */, E05FBED617C30A06004F525B /* modcontext.cc */, E05FBED717C30A06004F525B /* modcontext.h */, @@ -528,12 +626,16 @@ E05FBED917C30A06004F525B /* module.h */, E05FBEDA17C30A06004F525B /* ModuleCache.cc */, E05FBEDB17C30A06004F525B /* ModuleCache.h */, + E0B9CA5E1E41902700B90C7A /* ModuleInstantiation.cc */, + E0B9CA5F1E41902700B90C7A /* ModuleInstantiation.h */, E05FBEDC17C30A06004F525B /* namedcolors.cpp */, E05FBEDD17C30A06004F525B /* node.cc */, E05FBEDE17C30A06004F525B /* node.h */, E05FBEDF17C30A06004F525B /* nodecache.h */, E05FBEE017C30A06004F525B /* nodedumper.cc */, E05FBEE117C30A06004F525B /* nodedumper.h */, + E0B9CA601E41902700B90C7A /* NodeVisitor.cc */, + E0B9CA611E41902700B90C7A /* NodeVisitor.h */, E091575719AA58C900D699E9 /* NULLGL.cc */, E05FBEE217C30A06004F525B /* OffscreenContext.h */, E05FBEE317C30A06004F525B /* OffscreenContextAll.hpp */, @@ -554,6 +656,33 @@ E05FBEEE17C30A06004F525B /* OpenCSGWarningDialog.ui */, E05FBEEF17C30A06004F525B /* openscad.cc */, E05FBEF017C30A06004F525B /* openscad.h */, + E0B9CA621E41902700B90C7A /* OpenSCADApp.cc */, + E0B9CA631E41902700B90C7A /* OpenSCADApp.h */, + E0B9CA641E41902700B90C7A /* Package.h */, + E0B9CA681E41904400B90C7A /* parametercheckbox.cpp */, + E0B9CA691E41904400B90C7A /* parametercheckbox.h */, + E0B9CA6A1E41904400B90C7A /* parametercombobox.cpp */, + E0B9CA6B1E41904400B90C7A /* parametercombobox.h */, + E0B9CA6C1E41904400B90C7A /* ParameterEntryWidget.ui */, + E0B9CA6D1E41904400B90C7A /* parameterextractor.cpp */, + E0B9CA6E1E41904400B90C7A /* parameterextractor.h */, + E0B9CA6F1E41904400B90C7A /* parameterobject.cpp */, + E0B9CA701E41904400B90C7A /* parameterobject.h */, + E0B9CA711E41904400B90C7A /* parameterset.cpp */, + E0B9CA721E41904400B90C7A /* parameterset.h */, + E0B9CA731E41904400B90C7A /* parameterslider.cpp */, + E0B9CA741E41904400B90C7A /* parameterslider.h */, + E0B9CA751E41904400B90C7A /* parameterspinbox.cpp */, + E0B9CA761E41904400B90C7A /* parameterspinbox.h */, + E0B9CA771E41904400B90C7A /* parametertext.cpp */, + E0B9CA781E41904400B90C7A /* parametertext.h */, + E0B9CA791E41904400B90C7A /* parametervector.cpp */, + E0B9CA7A1E41904400B90C7A /* parametervector.h */, + E0B9CA7B1E41904400B90C7A /* parametervirtualwidget.cpp */, + E0B9CA7C1E41904400B90C7A /* parametervirtualwidget.h */, + E0B9CA7D1E41904400B90C7A /* ParameterWidget.cc */, + E0B9CA7E1E41904400B90C7A /* ParameterWidget.h */, + E0B9CA7F1E41904400B90C7A /* ParameterWidget.ui */, E05FBEF217C30A06004F525B /* parser.y */, E05FBEF317C30A06004F525B /* parser.y.new */, E05FBEF617C30A06004F525B /* parsersettings.cc */, @@ -567,6 +696,7 @@ E091575D19AA58C900D699E9 /* Polygon2d-CGAL.h */, E091575E19AA58C900D699E9 /* Polygon2d.cc */, E091575F19AA58C900D699E9 /* Polygon2d.h */, + E0B9CA651E41902700B90C7A /* polyset-gl.cc */, E091576019AA58C900D699E9 /* polyset-utils.cc */, E091576119AA58C900D699E9 /* polyset-utils.h */, E05FBEFD17C30A06004F525B /* polyset.cc */, @@ -621,18 +751,18 @@ E05FBF2817C30A06004F525B /* ThrownTogetherRenderer.h */, E05FBF2A17C30A06004F525B /* transform.cc */, E05FBF2B17C30A06004F525B /* transformnode.h */, - E05FBF2C17C30A06004F525B /* traverser.cc */, - E05FBF2D17C30A06004F525B /* traverser.h */, E05FBF2E17C30A06004F525B /* Tree.cc */, E05FBF2F17C30A06004F525B /* Tree.h */, - E05FBF3017C30A06004F525B /* typedefs.h */, E001A3571AAD5242001E2678 /* UIUtils.cc */, E001A3581AAD5242001E2678 /* UIUtils.h */, + E0B9CA411E418FF800B90C7A /* UserModule.cc */, + E0B9CA421E418FF800B90C7A /* UserModule.h */, E05FBF3117C30A06004F525B /* value.cc */, E05FBF3217C30A06004F525B /* value.h */, E05FBF3317C30A06004F525B /* version_check.cc */, E05FBF3417C30A06004F525B /* version_check.h */, - E05FBF3517C30A06004F525B /* visitor.h */, + E0B9CA431E418FF800B90C7A /* WindowManager.cc */, + E0B9CA441E418FF800B90C7A /* WindowManager.h */, ); name = src; path = ../src;