Merge branch 'master' into new-csg-export

This commit is contained in:
Marius Kintel 2017-02-08 23:55:16 -05:00
commit f6238c18a9
48 changed files with 775 additions and 128 deletions

View file

@ -2,7 +2,7 @@
flex.name = Flex ${QMAKE_FILE_IN}
flex.input = FLEXSOURCES
flex.output = ${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx
flex.commands = flex -P ${QMAKE_FILE_BASE} -o ${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx --header-file=${OBJECTS_DIR}/${QMAKE_FILE_BASE}.hxx ${QMAKE_FILE_IN}
flex.commands = flex -o ${OBJECTS_DIR}/${QMAKE_FILE_BASE}.cxx --header-file=${OBJECTS_DIR}/${QMAKE_FILE_BASE}.hxx ${QMAKE_FILE_IN}
flex.CONFIG += target_predeps
flex.variable_out = GENERATED_SOURCES
silent:flex.commands = @echo Lex ${QMAKE_FILE_IN} && $$flex.commands

View file

@ -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 \
@ -440,6 +441,7 @@ SOURCES += \
src/hash.cc \
src/GroupModule.cc \
src/FileModule.cc \
src/StatCache.cc \
src/builtin.cc \
src/calc.cc \
src/export.cc \

View file

@ -574,7 +574,7 @@ build_opencsg()
cp src/Makefile src/Makefile.bak
cat Makefile.bak | sed s/example// |sed s/glew// > Makefile
cat src/Makefile.bak | sed s@^INCPATH.*@INCPATH\ =\ -I$BASEDIR/include\ -I../include\ -I..\ -I$GLU_INCLUDE -I.@ > src/Makefile
cat src/Makefile.bak | sed s@^INCPATH.*@INCPATH\ =\ -I$BASEDIR/include\ -I../include\ -I..\ -I$GLU_INCLUDE\ -I.@ > src/Makefile
cp src/Makefile src/Makefile.bak2
cat src/Makefile.bak2 | sed s@^LIBS.*@LIBS\ =\ -L$BASEDIR/lib\ -L/usr/X11R6/lib\ -lGLU\ -lGL@ > src/Makefile
tmp=$version

View file

@ -31,6 +31,7 @@
#include "exceptions.h"
#include "modcontext.h"
#include "parsersettings.h"
#include "StatCache.h"
#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
@ -65,16 +66,14 @@ void FileModule::registerUse(const std::string path) {
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;
@ -82,12 +81,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;
@ -109,7 +105,7 @@ 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(auto filename : this->usedlibs) {
for (auto filename : this->usedlibs) {
bool wasmissing = false;
bool found = true;
@ -137,6 +133,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) {
@ -145,9 +144,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<std::string,std::string> stringpair;
for(const auto &files : updates) {
for (const auto &files : updates) {
this->usedlibs.erase(files.first);
this->usedlibs.insert(files.second);
}
@ -155,17 +154,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 {

View file

@ -15,13 +15,13 @@ public:
FileModule() : is_handling_dependencies(false) {}
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 std::string dump(const std::string &indent, const std::string &name) const;
AbstractNode *instantiateWithFileContext(class FileContext *ctx, const ModuleInstantiation *inst, EvalContext *evalctx) const;
void setModulePath(const std::string &path) { this->path = path; }
void setModulePath(const std::string &path) { this->path = path; }
const std::string &modulePath() const { return this->path; }
void registerUse(const std::string path);
void registerUse(const std::string path);
void registerInclude(const std::string &localpath, const std::string &fullpath);
bool includesChanged() const;
bool handleDependencies();

View file

@ -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;
}
}
@ -105,7 +106,7 @@ bool ModuleCache::evaluate(const std::string &filename, FileModule *&module)
FileModule *oldmodule = lib_mod;
fs::path pathname = fs::path(filename);
fs::path pathname = fs::path(filename);
lib_mod = parse(textbuf.str().c_str(), pathname, false);
PRINTDB(" compiled module: %p", lib_mod);
@ -131,11 +132,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();
}

64
src/StatCache.cc Normal file
View file

@ -0,0 +1,64 @@
/*
* OpenSCAD (www.openscad.org)
* Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
* Marius Kintel <marius@kintel.net>
*
* 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 <sys/stat.h>
#include <string>
#include <unordered_map>
#include <ctime>
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<std::string, CacheEntry> 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;
}

32
src/StatCache.h Normal file
View file

@ -0,0 +1,32 @@
/*
* OpenSCAD (www.openscad.org)
* Copyright (C) 2009-2011 Clifford Wolf <clifford@clifford.at> and
* Marius Kintel <marius@kintel.net>
*
* 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 *);
};

View file

@ -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
*/

View file

@ -1,3 +1,5 @@
%option prefix="comment_lexer"
%{
#include "Assignment.h"
#include "expression.h"

View file

@ -24,6 +24,8 @@
*
*/
%option prefix="lexer"
%{
#include <glib.h>

View file

@ -2,6 +2,7 @@
#include "modcontext.h"
#include "module.h"
#include "ModuleInstantiation.h"
#include "UserModule.h"
#include "expression.h"
#include "function.h"
#include "annotation.h"
@ -12,24 +13,43 @@ LocalScope::LocalScope()
LocalScope::~LocalScope()
{
for(auto &v : children) delete v;
for(auto &f : functions) delete f.second;
for(auto &m : modules) delete m.second;
for (auto &v : children) delete v;
for (auto &f : functions) delete f.second;
for (auto &m : modules) delete m.second;
}
void LocalScope::addChild(ModuleInstantiation *ch)
void LocalScope::addChild(ModuleInstantiation *modinst)
{
assert(ch != NULL);
this->children.push_back(ch);
assert(modinst);
this->children.push_back(modinst);
}
void LocalScope::addModule(const std::string &name, class UserModule *module)
{
assert(module);
this->modules[name] = module;
this->astModules.push_back({name, module});
}
void LocalScope::addFunction(class UserFunction *func)
{
assert(func);
this->functions[func->name] = func;
this->astFunctions.push_back({func->name, func});
}
void LocalScope::addAssignment(const Assignment &ass)
{
this->assignments.push_back(ass);
}
std::string LocalScope::dump(const std::string &indent) const
{
std::stringstream dump;
for (const auto &f : this->functions) {
for (const auto &f : this->astFunctions) {
dump << f.second->dump(indent, f.first);
}
for (const auto &m : this->modules) {
for (const auto &m : this->astModules) {
dump << m.second->dump(indent, m.first);
}
for (const auto &ass : this->assignments) {

View file

@ -12,13 +12,21 @@ public:
size_t numElements() const { return assignments.size() + children.size(); }
std::string dump(const std::string &indent) const;
std::vector<class AbstractNode*> instantiateChildren(const class Context *evalctx) const;
void addChild(class ModuleInstantiation *ch);
void addChild(class ModuleInstantiation *astnode);
void addModule(const std::string &name, class UserModule *module);
void addFunction(class UserFunction *function);
void addAssignment(const class Assignment &ass);
void apply(Context &ctx) const;
AssignmentList assignments;
std::vector<ModuleInstantiation*> children;
// Modules and functions are stored twice; once for lookup and once for AST serialization
typedef std::unordered_map<std::string, class AbstractFunction*> FunctionContainer;
FunctionContainer functions;
std::vector<std::pair<std::string, AbstractFunction*>> astFunctions;
typedef std::unordered_map<std::string, class AbstractModule*> AbstractModuleContainer;
AbstractModuleContainer modules;
std::vector<std::pair<std::string, AbstractModule*>> astModules;
};

View file

@ -455,7 +455,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();
}
}

View file

@ -72,7 +72,7 @@ void ParameterWidget::onSetDelete()
{
if (root.empty()) return;
std::string setName=comboBox->itemData(this->comboBox->currentIndex()).toString().toStdString();
root.get_child(ParameterSet::parameterSetsKey).erase(setName);
root.get_child(ParameterSet::parameterSetsKey).erase(pt::ptree::key_type(setName));
writeParameterSet(this->jsonFile);
this->comboBox->clear();
setComboBoxForSet();
@ -101,7 +101,7 @@ void ParameterWidget::readFile(QString scadFile)
this->deleteButton->setDisabled(true);
this->deleteButton->setToolTip("JSON file read only");
}
disconnect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSetChanged(int)));
disconnect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSetChanged(int)));
this->comboBox->clear();
setComboBoxForSet();
connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSetChanged(int)));

View file

@ -35,18 +35,22 @@ boost::optional<pt::ptree &> ParameterSet::getParameterSet(const std::string &se
return sets;
}
boost::optional<pt::ptree &> set = sets.get().get_child_optional(setName);
return set;
pt::ptree::assoc_iterator set = sets.get().find(pt::ptree::key_type(setName));
if(set!=sets.get().not_found()) {
return set->second;
}
return sets;
}
void ParameterSet::addParameterSet(const std::string setName, const pt::ptree & set)
{
boost::optional<pt::ptree &> sets = parameterSets();
if (sets.is_initialized()) {
sets.get().erase(setName);
sets.get().erase(pt::ptree::key_type(setName));
}
root.add_child(ParameterSet::parameterSetsKey + "." + setName, set);
sets.get().push_back(pt::ptree::value_type(setName,set));
}
/*!
@ -88,9 +92,9 @@ void ParameterSet::applyParameterSet(FileModule *fileModule, const std::string &
if (fileModule == NULL || this->root.empty()) return;
try {
ModuleContext ctx;
std::string path = parameterSetsKey + "." + setName;
boost::optional<pt::ptree &> set = getParameterSet(setName);
for (auto &assignment : fileModule->scope.assignments) {
for (auto &v : root.get_child(path)) {
for (auto &v : set.get()) {
if (v.first == assignment.name) {
const ValuePtr defaultValue = assignment.expr->evaluate(&ctx);
if (defaultValue->type() == Value::STRING) {

View file

@ -165,17 +165,17 @@ statement:
| '{' inner_input '}'
| module_instantiation
{
if ($1) scope_stack.top()->addChild($1);
if ($1) scope_stack.top()->addChild($1);
}
| assignment
| TOK_MODULE TOK_ID '(' arguments_decl optional_commas ')'
{
UserModule *newmodule = new UserModule(LOC(@$));
newmodule->definition_arguments = *$4;
scope_stack.top()->modules[$2] = newmodule;
scope_stack.push(&newmodule->scope);
free($2);
delete $4;
newmodule->definition_arguments = *$4;
scope_stack.top()->addModule($2, newmodule);
scope_stack.push(&newmodule->scope);
free($2);
delete $4;
}
statement
{
@ -184,9 +184,9 @@ statement:
| TOK_FUNCTION TOK_ID '(' arguments_decl optional_commas ')' '=' expr
{
UserFunction *func = UserFunction::create($2, *$4, shared_ptr<Expression>($8), LOC(@$));
scope_stack.top()->functions[$2] = func;
free($2);
delete $4;
scope_stack.top()->addFunction(func);
free($2);
delete $4;
}
';'
;
@ -209,7 +209,7 @@ assignment:
}
}
if (!found) {
scope_stack.top()->assignments.push_back(Assignment($1, shared_ptr<Expression>($3), LOC(@$)));
scope_stack.top()->addAssignment(Assignment($1, shared_ptr<Expression>($3), LOC(@$)));
}
free($1);
}

View file

@ -1,8 +1,6 @@
{
"parameterSets":
{
"firstSet":
{
"parameterSets": {
"firstSet": {
"Labeled_value": " \/*New *\/ ",
"Labeled_values": "100",
"Numbers": "1",
@ -14,10 +12,9 @@
"Vector2": "[12,4, 45, 23]",
"slider": "38",
"stepSlider": "12",
"stringVector":"[hello, new, 12]"
"stringVector": "[hello, new, 12]"
},
"wrongSetValues":
{
"wrongSetValues": {
"Labeled_value": "S new",
"Labeled_values": "wrong type",
"Numbers": "2",
@ -30,12 +27,27 @@
"slider": "34",
"stepSlider": "2"
},
"thirdSet":
{
"Labeled_value":"S new",
"non existing":"value",
"nonparameter" : "second",
"stringVector":"[ \" hello\",\" new \"]"
"thirdSet": {
"Labeled_value": "S new",
"non existing": "value",
"nonparameter": "second",
"stringVector": "[ \" hello\",\" new \"]"
},
"Name.dot": {
"Labeled_value": "S",
"Labeled_values": "10",
"Numbers": "2",
"Spinbox": "5",
"String": "withDotInSetName",
"Strings": "foo",
"Variable": "false",
"Vector": "[12, 34, 44, 43, 23, 23]",
"Vector2": "[12, 34, 45, 23]",
"nonparameter": "newWithDot",
"slider": "80",
"stepSlider": "2",
"stringVector": "[\"1\", \"2\"]"
}
}
},
"fileFormatVersion": "1"
}

View file

@ -442,7 +442,7 @@ find_package(FLEX REQUIRED)
if (WIN32)
set(FLEX_UNISTD_FLAG "-DYY_NO_UNISTD_H")
endif()
FLEX_TARGET(OpenSCADlexer ../src/lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.cxx COMPILE_FLAGS "-Plexer ${FLEX_UNISTD_FLAG}")
FLEX_TARGET(OpenSCADlexer ../src/lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.cxx COMPILE_FLAGS "${FLEX_UNISTD_FLAG}")
BISON_TARGET(OpenSCADparser ../src/parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cxx COMPILE_FLAGS "-p parser")
ADD_FLEX_BISON_DEPENDENCY(OpenSCADlexer OpenSCADparser)
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/parser_yacc.c PROPERTIES LANGUAGE "CXX")
@ -699,6 +699,7 @@ set(CORE_SOURCES
../src/AST.cc
../src/ModuleInstantiation.cc
../src/ModuleCache.cc
../src/StatCache.cc
../src/node.cc
../src/NodeVisitor.cc
../src/context.cc
@ -1148,15 +1149,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
@ -1187,7 +1197,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
@ -1196,17 +1205,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})
@ -1347,7 +1358,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
@ -1369,6 +1381,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
@ -1381,7 +1394,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
@ -1583,10 +1601,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(moduledumptest EXE ${OPENSCAD_BINPATH} ARGS -o SUFFIX ast FILES
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allmodules.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allfunctions.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/allexpressions.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
@ -1672,7 +1687,8 @@ add_cmdline_test(customizertest EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer
add_cmdline_test(customizertest-first EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer -p ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.json -P firstSet -o SUFFIX ast FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.scad)
add_cmdline_test(customizertest-wrong EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer -p ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.json -P wrongSetValues -o SUFFIX ast FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.scad)
add_cmdline_test(customizertest-incomplete EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer -p ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.json -P thirdSet -o SUFFIX ast FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.scad)
add_cmdline_test(customizertest-imgset EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer -p ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.json -P imagine -o SUFFIX ast FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.scad)
add_cmdline_test(customizertest-imgset EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer -p ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.json -P imagine -o SUFFIX ast FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.scad)
add_cmdline_test(customizertest-setNameWithDot EXE ${OPENSCAD_BINPATH} ARGS --enable=customizer -p ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.json -P Name.dot -o SUFFIX ast FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/customizer/setofparameter.scad)
# Tests using the actual OpenSCAD binary
# non-ASCII filenames

View file

@ -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)]];

View file

@ -31,4 +31,3 @@ zb = cross();
zc = parent_module();
w = dxf_dim();
x = dxf_cross();

View file

@ -0,0 +1,2 @@
v = assert(false);
echo(v);

View file

@ -0,0 +1,4 @@
a = 10;
b = 20;
v = assert(((a < 20) && (b < 20)), "Test! <html>&</html>");
echo(v);

View file

@ -0,0 +1,5 @@
function f(x) = sin(x);
module m(angle) {
v = assert((f(angle) > 0)) 10;
}
m(270);

View file

@ -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);

View file

@ -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");

View file

@ -0,0 +1,28 @@
function f1(x) = [for(a = x) (echo(a = a) a)];
function f2(x, i = 0) = ((echo(i) len(x) > i) ? (x[i] + f2(x, (i + 1))) : 0);
function f3(x, i = 0) = ((len(x) > i) ? let(a = (x[i] + f3(x, (i + 1)))) echo(a) a : 0);
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));

View file

@ -0,0 +1 @@
import(file = "B-\" C-\t D-\n E-'", layer = "A:\\ B:\" C:\t D:\n E:' F:\\\\");

View file

@ -0,0 +1,69 @@
function deg(angle) = ((360 * angle) / TAU);
module test3() {
cylinder(r1 = 0.7, r2 = 0.2, center = true);
}
module test4() {
cylinder(r = 0.5, $fn = 10, center = true);
}
module test2() {
cube(center = true);
}
module test5() {
sphere(r = 0.5, $fn = 8);
}
module test5() {
sphere(r = 0.5, $fn = 8);
}
module test6() {
difference() {
cube(center = true);
cylinder(r = 0.4, h = 2, center = true);
}
}
module test7() {
cube([0.5, 0.5, 1], 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 test_alignds420() {
alignds420(screws = 1);
}
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]);
}
test2_variable = 0.7;
TAU = 6.28319;
PI = (TAU / 2);
mm_per_inch = 25.4;
echo("included.scad");
echo("included2.scad");
test1();

View file

@ -0,0 +1,14 @@
a = 1;
b = 2;
c = 3;
echo(a, b, c);
let(a = 5, b = (a + 8), c = (a + b)) {
echo(a, b, c);
difference() {
cube([a, b, c], center = true);
let(b = (2 * a), c = (b * 2)) {
echo(a, b, c);
rotate([0, 90, 0]) cylinder(d = b, h = c, center = true);
}
}
}

View file

@ -0,0 +1,2 @@
c = let(c = 1) [c];
echo(c);

View file

@ -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])]);

View file

@ -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]);

View file

@ -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]]);

View file

@ -0,0 +1 @@
localfiles_submodule();

View file

@ -0,0 +1 @@
localfiles_module();

View file

@ -0,0 +1,56 @@
function deg(angle) = ((360 * angle) / TAU);
module test7() {
cube([0.5, 0.5, 1], center = true);
}
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 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 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_alignds420() {
alignds420(screws = 1);
}
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]);
}
TAU = 6.28319;
PI = (TAU / 2);
mm_per_inch = 25.4;
test1();

View file

@ -0,0 +1,51 @@
//Group("Drop down box:")
//Description("combo box for nunber")
//Parameter([0, 1, 2, 3])
Numbers = 2;
//Group("Drop down box:")
//Description("combo box for string")
//Parameter("")
Strings = "foo";
//Group("Drop down box:")
//Description("labeled combo box for numbers")
//Parameter([[10, "L"], [20, "M"], [30, "L"]])
Labeled_values = 10;
//Group("Drop down box:")
//Description("labeled combo box for string")
//Parameter([["S", "Small"], ["M", "Medium"], ["L", "Large"]])
Labeled_value = "S";
//Group(" Slider ")
//Description("slider widget for number")
//Parameter([10 : 100])
slider = 80;
//Group(" Slider ")
//Description("step slider for number")
//Parameter([0 : 5 : 100])
stepSlider = 2;
//Group("Checkbox")
//Description("description")
//Parameter("comment")
Variable = false;
//Group("Spinbox")
//Description("spinbox with step size 23")
//Parameter(23)
Spinbox = 5;
//Group("Textbox")
//Description("Text box for vector with more than 4 elements")
//Parameter("comment")
Vector = [12, 34, 44, 43, 23, 23];
//Group("Textbox")
//Description("Text box for string")
//Parameter("comment")
String = "withDotInSetName";
//Group("Special vector")
//Description("Text box for vector with less than or equal to 4 elements")
//Parameter("any thing")
Vector2 = [12, 34, 45, 23];
//Group("Special vector")
//Parameter("")
nonparameter = "newWithDot";
//Group("Special vector")
//Parameter("")
stringVector = ["1", "2"];
echo(String);

View file

@ -0,0 +1 @@
ERROR: Experimental feature not enabled: 'lc-else'. Please check preferences.

View file

@ -0,0 +1,6 @@
WARNING: Invalid number of parameters for cross()
WARNING: Parent module index (1) greater than the number of modules on the stack
WARNING: Can't open DXF file ''.
WARNING: Can't find dimension '' in '', layer ''!
WARNING: Can't open DXF file ''.
WARNING: Can't find cross in '', layer ''!

View file

@ -0,0 +1,8 @@
DEPRECATED: child() will be removed in future releases. Use children() instead.
ECHO:
DEPRECATED: The assign() module will be removed in future releases. Use a regular assignment instead.
DEPRECATED: The dxf_linear_extrude() module will be removed in future releases. Use linear_extrude() instead.
DEPRECATED: The dxf_rotate_extrude() module will be removed in future releases. Use rotate_extrude() instead.
DEPRECATED: The import_stl() module will be removed in future releases. Use import() instead.
DEPRECATED: The import_off() module will be removed in future releases. Use import() instead.
DEPRECATED: The import_dxf() module will be removed in future releases. Use import() instead.

View file

@ -0,0 +1,3 @@
ECHO: 1, 2, 3
ECHO: 5, 13, 18
ECHO: 5, 10, 20

View file

@ -0,0 +1,4 @@
DEPRECATED: Imported file (localfile.dxf) found in document root instead of relative to the importing module. This behavior is deprecated
DEPRECATED: Support for reading files in linear_extrude will be removed in future releases. Use a child import() instead.
DEPRECATED: Support for reading files in rotate_extrude will be removed in future releases. Use a child import() instead.
DEPRECATED: Imported file (localfile.dat) found in document root instead of relative to the importing module. This behavior is deprecated

View file

@ -0,0 +1,2 @@
DEPRECATED: Support for reading files in linear_extrude will be removed in future releases. Use a child import() instead.
DEPRECATED: Support for reading files in rotate_extrude will be removed in future releases. Use a child import() instead.

View file

@ -0,0 +1,7 @@
WARNING: Can't open library ''.
WARNING: Can't open library 'non/existent/path/non-file'.
WARNING: Can't open library 'test/'.
WARNING: Can't open library '/'.
WARNING: Ignoring unknown module 'test3'.
WARNING: Ignoring unknown module 'test4'.
WARNING: Ignoring unknown variable 'test2_variable'.

View file

@ -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'

View file

@ -119,12 +119,6 @@
E05FBE9817C30A05004F525B /* CsgInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CsgInfo.h; sourceTree = "<group>"; };
E05FBE9917C30A05004F525B /* csgnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgnode.h; sourceTree = "<group>"; };
E05FBE9A17C30A05004F525B /* csgops.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgops.cc; sourceTree = "<group>"; };
E05FBE9B17C30A05004F525B /* csgterm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgterm.cc; sourceTree = "<group>"; };
E05FBE9C17C30A05004F525B /* csgterm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgterm.h; sourceTree = "<group>"; };
E05FBE9D17C30A05004F525B /* CSGTermEvaluator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSGTermEvaluator.cc; sourceTree = "<group>"; };
E05FBE9E17C30A06004F525B /* CSGTermEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSGTermEvaluator.h; sourceTree = "<group>"; };
E05FBE9F17C30A06004F525B /* csgtermnormalizer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgtermnormalizer.cc; sourceTree = "<group>"; };
E05FBEA017C30A06004F525B /* csgtermnormalizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgtermnormalizer.h; sourceTree = "<group>"; };
E05FBEA117C30A06004F525B /* dxfdata.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dxfdata.cc; sourceTree = "<group>"; };
E05FBEA217C30A06004F525B /* dxfdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dxfdata.h; sourceTree = "<group>"; };
E05FBEA317C30A06004F525B /* dxfdim.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dxfdim.cc; sourceTree = "<group>"; };
@ -170,8 +164,6 @@
E05FBED017C30A06004F525B /* mainwin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mainwin.cc; sourceTree = "<group>"; };
E05FBED117C30A06004F525B /* MainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainWindow.h; sourceTree = "<group>"; };
E05FBED217C30A06004F525B /* MainWindow.ui */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = MainWindow.ui; sourceTree = "<group>"; };
E05FBED317C30A06004F525B /* mathc99.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mathc99.cc; sourceTree = "<group>"; };
E05FBED417C30A06004F525B /* mathc99.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mathc99.h; sourceTree = "<group>"; };
E05FBED517C30A06004F525B /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = "<group>"; };
E05FBED617C30A06004F525B /* modcontext.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = modcontext.cc; sourceTree = "<group>"; };
E05FBED717C30A06004F525B /* modcontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modcontext.h; sourceTree = "<group>"; };
@ -249,16 +241,12 @@
E05FBF2817C30A06004F525B /* ThrownTogetherRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThrownTogetherRenderer.h; sourceTree = "<group>"; };
E05FBF2A17C30A06004F525B /* transform.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transform.cc; sourceTree = "<group>"; };
E05FBF2B17C30A06004F525B /* transformnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformnode.h; sourceTree = "<group>"; };
E05FBF2C17C30A06004F525B /* traverser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = traverser.cc; sourceTree = "<group>"; };
E05FBF2D17C30A06004F525B /* traverser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = traverser.h; sourceTree = "<group>"; };
E05FBF2E17C30A06004F525B /* Tree.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tree.cc; sourceTree = "<group>"; };
E05FBF2F17C30A06004F525B /* Tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tree.h; sourceTree = "<group>"; };
E05FBF3017C30A06004F525B /* typedefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typedefs.h; sourceTree = "<group>"; };
E05FBF3117C30A06004F525B /* value.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = value.cc; sourceTree = "<group>"; };
E05FBF3217C30A06004F525B /* value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = value.h; sourceTree = "<group>"; };
E05FBF3317C30A06004F525B /* version_check.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = version_check.cc; sourceTree = "<group>"; };
E05FBF3417C30A06004F525B /* version_check.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version_check.h; sourceTree = "<group>"; };
E05FBF3517C30A06004F525B /* visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = visitor.h; sourceTree = "<group>"; };
E08B63DC1955EEF40061A6E4 /* Camera.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Camera.cc; sourceTree = "<group>"; };
E091574819AA58C900D699E9 /* calc.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = calc.cc; sourceTree = "<group>"; };
E091574919AA58C900D699E9 /* calc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = calc.h; sourceTree = "<group>"; };
@ -295,6 +283,83 @@
E09A1CB31A9DAE64000021A3 /* scintillaeditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scintillaeditor.h; sourceTree = "<group>"; };
E09A1CB41A9DAE64000021A3 /* settings.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = settings.cc; sourceTree = "<group>"; };
E09A1CB51A9DAE64000021A3 /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = settings.h; sourceTree = "<group>"; };
E0B9CA351E418FE400B90C7A /* annotation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = annotation.cc; sourceTree = "<group>"; };
E0B9CA361E418FE400B90C7A /* annotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = annotation.h; sourceTree = "<group>"; };
E0B9CA371E418FE400B90C7A /* assignment.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = assignment.cc; sourceTree = "<group>"; };
E0B9CA381E418FE400B90C7A /* Assignment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Assignment.h; sourceTree = "<group>"; };
E0B9CA391E418FE400B90C7A /* AST.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AST.cc; sourceTree = "<group>"; };
E0B9CA3A1E418FE400B90C7A /* AST.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AST.h; sourceTree = "<group>"; };
E0B9CA3B1E418FE400B90C7A /* BaseVisitable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseVisitable.h; sourceTree = "<group>"; };
E0B9CA3C1E418FE400B90C7A /* cgalutils-applyops.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "cgalutils-applyops.cc"; sourceTree = "<group>"; };
E0B9CA3D1E418FE400B90C7A /* cgalutils-project.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "cgalutils-project.cc"; sourceTree = "<group>"; };
E0B9CA3E1E418FE400B90C7A /* comment_lexer.l */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.lex; path = comment_lexer.l; sourceTree = "<group>"; };
E0B9CA3F1E418FE400B90C7A /* comment_parser.y */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.yacc; path = comment_parser.y; sourceTree = "<group>"; };
E0B9CA401E418FE400B90C7A /* comment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = comment.cpp; sourceTree = "<group>"; };
E0B9CA411E418FF800B90C7A /* UserModule.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserModule.cc; sourceTree = "<group>"; };
E0B9CA421E418FF800B90C7A /* UserModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserModule.h; sourceTree = "<group>"; };
E0B9CA431E418FF800B90C7A /* WindowManager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WindowManager.cc; sourceTree = "<group>"; };
E0B9CA441E418FF800B90C7A /* WindowManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowManager.h; sourceTree = "<group>"; };
E0B9CA451E41902600B90C7A /* csgnode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = csgnode.cc; sourceTree = "<group>"; };
E0B9CA461E41902600B90C7A /* csgops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = csgops.h; sourceTree = "<group>"; };
E0B9CA471E41902600B90C7A /* CSGTreeEvaluator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSGTreeEvaluator.cc; sourceTree = "<group>"; };
E0B9CA481E41902600B90C7A /* CSGTreeEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSGTreeEvaluator.h; sourceTree = "<group>"; };
E0B9CA491E41902600B90C7A /* CSGTreeNormalizer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSGTreeNormalizer.cc; sourceTree = "<group>"; };
E0B9CA4A1E41902600B90C7A /* CSGTreeNormalizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSGTreeNormalizer.h; sourceTree = "<group>"; };
E0B9CA4B1E41902600B90C7A /* export_amf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_amf.cc; sourceTree = "<group>"; };
E0B9CA4C1E41902700B90C7A /* export_dxf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_dxf.cc; sourceTree = "<group>"; };
E0B9CA4D1E41902700B90C7A /* export_nef.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_nef.cc; sourceTree = "<group>"; };
E0B9CA4E1E41902700B90C7A /* export_off.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_off.cc; sourceTree = "<group>"; };
E0B9CA4F1E41902700B90C7A /* export_stl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_stl.cc; sourceTree = "<group>"; };
E0B9CA501E41902700B90C7A /* export_svg.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = export_svg.cc; sourceTree = "<group>"; };
E0B9CA511E41902700B90C7A /* FileModule.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileModule.cc; sourceTree = "<group>"; };
E0B9CA521E41902700B90C7A /* FileModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileModule.h; sourceTree = "<group>"; };
E0B9CA531E41902700B90C7A /* function.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = function.cc; sourceTree = "<group>"; };
E0B9CA541E41902700B90C7A /* GroupModule.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GroupModule.cc; sourceTree = "<group>"; };
E0B9CA551E41902700B90C7A /* GroupModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupModule.h; sourceTree = "<group>"; };
E0B9CA561E41902700B90C7A /* hash.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hash.cc; sourceTree = "<group>"; };
E0B9CA571E41902700B90C7A /* hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = "<group>"; };
E0B9CA581E41902700B90C7A /* import_amf.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_amf.cc; sourceTree = "<group>"; };
E0B9CA591E41902700B90C7A /* import_nef.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_nef.cc; sourceTree = "<group>"; };
E0B9CA5A1E41902700B90C7A /* import_off.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_off.cc; sourceTree = "<group>"; };
E0B9CA5B1E41902700B90C7A /* import_stl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_stl.cc; sourceTree = "<group>"; };
E0B9CA5C1E41902700B90C7A /* import_svg.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = import_svg.cc; sourceTree = "<group>"; };
E0B9CA5D1E41902700B90C7A /* import.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import.h; sourceTree = "<group>"; };
E0B9CA5E1E41902700B90C7A /* ModuleInstantiation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModuleInstantiation.cc; sourceTree = "<group>"; };
E0B9CA5F1E41902700B90C7A /* ModuleInstantiation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleInstantiation.h; sourceTree = "<group>"; };
E0B9CA601E41902700B90C7A /* NodeVisitor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodeVisitor.cc; sourceTree = "<group>"; };
E0B9CA611E41902700B90C7A /* NodeVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeVisitor.h; sourceTree = "<group>"; };
E0B9CA621E41902700B90C7A /* OpenSCADApp.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenSCADApp.cc; sourceTree = "<group>"; };
E0B9CA631E41902700B90C7A /* OpenSCADApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenSCADApp.h; sourceTree = "<group>"; };
E0B9CA641E41902700B90C7A /* Package.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Package.h; sourceTree = "<group>"; };
E0B9CA651E41902700B90C7A /* polyset-gl.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "polyset-gl.cc"; sourceTree = "<group>"; };
E0B9CA661E41904400B90C7A /* groupwidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = groupwidget.cpp; path = parameter/groupwidget.cpp; sourceTree = "<group>"; };
E0B9CA671E41904400B90C7A /* groupwidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = groupwidget.h; path = parameter/groupwidget.h; sourceTree = "<group>"; };
E0B9CA681E41904400B90C7A /* parametercheckbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametercheckbox.cpp; path = parameter/parametercheckbox.cpp; sourceTree = "<group>"; };
E0B9CA691E41904400B90C7A /* parametercheckbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametercheckbox.h; path = parameter/parametercheckbox.h; sourceTree = "<group>"; };
E0B9CA6A1E41904400B90C7A /* parametercombobox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametercombobox.cpp; path = parameter/parametercombobox.cpp; sourceTree = "<group>"; };
E0B9CA6B1E41904400B90C7A /* parametercombobox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametercombobox.h; path = parameter/parametercombobox.h; sourceTree = "<group>"; };
E0B9CA6C1E41904400B90C7A /* ParameterEntryWidget.ui */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ParameterEntryWidget.ui; path = parameter/ParameterEntryWidget.ui; sourceTree = "<group>"; };
E0B9CA6D1E41904400B90C7A /* parameterextractor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterextractor.cpp; path = parameter/parameterextractor.cpp; sourceTree = "<group>"; };
E0B9CA6E1E41904400B90C7A /* parameterextractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterextractor.h; path = parameter/parameterextractor.h; sourceTree = "<group>"; };
E0B9CA6F1E41904400B90C7A /* parameterobject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterobject.cpp; path = parameter/parameterobject.cpp; sourceTree = "<group>"; };
E0B9CA701E41904400B90C7A /* parameterobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterobject.h; path = parameter/parameterobject.h; sourceTree = "<group>"; };
E0B9CA711E41904400B90C7A /* parameterset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterset.cpp; path = parameter/parameterset.cpp; sourceTree = "<group>"; };
E0B9CA721E41904400B90C7A /* parameterset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterset.h; path = parameter/parameterset.h; sourceTree = "<group>"; };
E0B9CA731E41904400B90C7A /* parameterslider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterslider.cpp; path = parameter/parameterslider.cpp; sourceTree = "<group>"; };
E0B9CA741E41904400B90C7A /* parameterslider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterslider.h; path = parameter/parameterslider.h; sourceTree = "<group>"; };
E0B9CA751E41904400B90C7A /* parameterspinbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parameterspinbox.cpp; path = parameter/parameterspinbox.cpp; sourceTree = "<group>"; };
E0B9CA761E41904400B90C7A /* parameterspinbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parameterspinbox.h; path = parameter/parameterspinbox.h; sourceTree = "<group>"; };
E0B9CA771E41904400B90C7A /* parametertext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametertext.cpp; path = parameter/parametertext.cpp; sourceTree = "<group>"; };
E0B9CA781E41904400B90C7A /* parametertext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametertext.h; path = parameter/parametertext.h; sourceTree = "<group>"; };
E0B9CA791E41904400B90C7A /* parametervector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametervector.cpp; path = parameter/parametervector.cpp; sourceTree = "<group>"; };
E0B9CA7A1E41904400B90C7A /* parametervector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametervector.h; path = parameter/parametervector.h; sourceTree = "<group>"; };
E0B9CA7B1E41904400B90C7A /* parametervirtualwidget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = parametervirtualwidget.cpp; path = parameter/parametervirtualwidget.cpp; sourceTree = "<group>"; };
E0B9CA7C1E41904400B90C7A /* parametervirtualwidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parametervirtualwidget.h; path = parameter/parametervirtualwidget.h; sourceTree = "<group>"; };
E0B9CA7D1E41904400B90C7A /* ParameterWidget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ParameterWidget.cc; path = parameter/ParameterWidget.cc; sourceTree = "<group>"; };
E0B9CA7E1E41904400B90C7A /* ParameterWidget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ParameterWidget.h; path = parameter/ParameterWidget.h; sourceTree = "<group>"; };
E0B9CA7F1E41904400B90C7A /* ParameterWidget.ui */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = ParameterWidget.ui; path = parameter/ParameterWidget.ui; sourceTree = "<group>"; };
E0B9CA801E41904400B90C7A /* clipper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = clipper.cpp; path = polyclipping/clipper.cpp; sourceTree = "<group>"; };
E0B9CA811E41904400B90C7A /* clipper.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = clipper.hpp; path = polyclipping/clipper.hpp; sourceTree = "<group>"; };
E0BD02071979C2D90020CC1B /* FontCache.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontCache.cc; sourceTree = "<group>"; };
E0BD02081979C2D90020CC1B /* FontCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontCache.h; sourceTree = "<group>"; };
E0BD02091979C2D90020CC1B /* FontListDialog.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontListDialog.cc; sourceTree = "<group>"; };
@ -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;