diff options
Diffstat (limited to 'test-code')
| -rw-r--r-- | test-code/csgtexttest.cc | 164 | ||||
| -rw-r--r-- | test-code/csgtexttest.pro | 101 | 
2 files changed, 265 insertions, 0 deletions
| diff --git a/test-code/csgtexttest.cc b/test-code/csgtexttest.cc new file mode 100644 index 0000000..837f442 --- /dev/null +++ b/test-code/csgtexttest.cc @@ -0,0 +1,164 @@ +/* + *  OpenSCAD (www.openscad.at) + *  Copyright (C) 2009  Clifford Wolf <clifford@clifford.at> + * + *  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 "openscad.h" +#include "node.h" +#include "module.h" +#include "context.h" +#include "value.h" +#include "export.h" +#include "builtin.h" +#include "nodedumper.h" +#include "CGALRenderer.h" + +#include <QApplication> +#include <QFile> +#include <QDir> +#include <QSet> +#include <getopt.h> +#include <iostream> + +QString commandline_commands; +const char *make_command = NULL; +QSet<QString> dependencies; +QString currentdir; +QString examplesdir; +QString librarydir; + +void handle_dep(QString filename) +{ +	if (filename.startsWith("/")) +		dependencies.insert(filename); +	else +		dependencies.insert(QDir::currentPath() + QString("/") + filename); +	if (!QFile(filename).exists() && make_command) { +		char buffer[4096]; +		snprintf(buffer, 4096, "%s '%s'", make_command, filename.replace("'", "'\\''").toUtf8().data()); +		system(buffer); // FIXME: Handle error +	} +} + +int main(int argc, char **argv) +{ +	if (argc != 2) { +		fprintf(stderr, "Usage: %s <file.scad>\n", argv[0]); +		exit(1); +	} + +	const char *filename = argv[1]; + +	int rc = 0; + +	initialize_builtin_functions(); +	initialize_builtin_modules(); + +	QApplication app(argc, argv, false); +	QDir original_path = QDir::current(); + +	currentdir = QDir::currentPath(); + +	QDir libdir(QApplication::instance()->applicationDirPath()); +#ifdef Q_WS_MAC +	libdir.cd("../Resources"); // Libraries can be bundled +	if (!libdir.exists("libraries")) libdir.cd("../../.."); +#elif defined(Q_OS_UNIX) +	if (libdir.cd("../share/openscad/libraries")) { +		librarydir = libdir.path(); +	} else +	if (libdir.cd("../../share/openscad/libraries")) { +		librarydir = libdir.path(); +	} else +	if (libdir.cd("../../libraries")) { +		librarydir = libdir.path(); +	} else +#endif +	if (libdir.cd("libraries")) { +		librarydir = libdir.path(); +	} + +	Context root_ctx; +	root_ctx.functions_p = &builtin_functions; +	root_ctx.modules_p = &builtin_modules; +	root_ctx.set_variable("$fn", Value(0.0)); +	root_ctx.set_variable("$fs", Value(1.0)); +	root_ctx.set_variable("$fa", Value(12.0)); +	root_ctx.set_variable("$t", Value(0.0)); + +	Value zero3; +	zero3.type = Value::VECTOR; +	zero3.vec.append(new Value(0.0)); +	zero3.vec.append(new Value(0.0)); +	zero3.vec.append(new Value(0.0)); +	root_ctx.set_variable("$vpt", zero3); +	root_ctx.set_variable("$vpr", zero3); + + +	AbstractModule *root_module; +	ModuleInstantiation root_inst; +	AbstractNode *root_node; + +	QFileInfo fileInfo(filename); +	handle_dep(filename); +	FILE *fp = fopen(filename, "rt"); +	if (!fp) { +		fprintf(stderr, "Can't open input file `%s'!\n", filename); +		exit(1); +	} else { +		QString text; +		char buffer[513]; +		int ret; +		while ((ret = fread(buffer, 1, 512, fp)) > 0) { +			buffer[ret] = 0; +			text += buffer; +		} +		fclose(fp); +		root_module = parse((text+commandline_commands).toAscii().data(), fileInfo.absolutePath().toLocal8Bit(), false); +		if (!root_module) { +			exit(1); +		} +	} + +	QDir::setCurrent(fileInfo.absolutePath()); + +	AbstractNode::resetIndexCounter(); +	root_node = root_module->evaluate(&root_ctx, &root_inst); + + +	NodeDumper dumper; +	Traverser trav(dumper, *root_node, Traverser::PRE_AND_POSTFIX); +	trav.execute(); + 	std::string dumpstdstr = dumper.getDump() + "\n"; + 	std::cout << dumpstdstr << "\n"; + +	CGALRenderer renderer(dumper.getCache()); +	Traverser render(renderer, *root_node, Traverser::PRE_AND_POSTFIX); +	render.execute(); +	std::cout << renderer.getCGALMesh() << "\n"; + +	destroy_builtin_functions(); +	destroy_builtin_modules(); + +	return rc; +} diff --git a/test-code/csgtexttest.pro b/test-code/csgtexttest.pro new file mode 100644 index 0000000..94942da --- /dev/null +++ b/test-code/csgtexttest.pro @@ -0,0 +1,101 @@ +DEFINES += OPENSCAD_VERSION=test +TEMPLATE = app + +OBJECTS_DIR = objects +MOC_DIR = objects +UI_DIR = objects +RCC_DIR = objects +INCLUDEPATH += ../src + +DEFINES += REMOVE_DUMP +macx { +  CONFIG -= app_bundle +  LIBS += -framework Carbon +} + +CONFIG += qt +QT += opengl + +# Optionally specify location of Eigen2 using the  +# EIGEN2DIR env. variable +EIGEN2_DIR = $$(EIGEN2DIR) +!isEmpty(EIGEN2_DIR) { +  INCLUDEPATH += $$EIGEN2_DIR +} +else { +  macx { +    INCLUDEPATH += /opt/local/include/eigen2 +  } +  else { +    INCLUDEPATH += /usr/include/eigen2 +  } +} + +LEXSOURCES += ../src/lexer.l +YACCSOURCES += ../src/parser.y + +HEADERS += ../src/builtin.h \ +           ../src/cgal.h \ +           ../src/context.h \ +           ../src/csgterm.h \ +           ../src/dxfdata.h \ +           ../src/dxfdim.h \ +           ../src/dxftess.h \ +           ../src/export.h \ +           ../src/expression.h \ +           ../src/function.h \ +           ../src/grid.h \ +           ../src/module.h \ +           ../src/node.h \ +           ../src/dxflinextrudenode.h \ +           ../src/dxfrotextrudenode.h \ +           ../src/projectionnode.h \ +           ../src/importnode.h \ +           ../src/csgnode.h \ +           ../src/transformnode.h \ +           ../src/rendernode.h \ +           ../src/openscad.h \ +           ../src/polyset.h \ +           ../src/printutils.h \ +           ../src/value.h \ +           ../src/progress.h \ +           ../src/traverser.h \ +           ../src/csgnode.h \ +           ../src/visitor.h \ +           ../src/nodedumper.h \ +           ../src/CGALRenderer.h \ +           ../src/nodecache.h \ +           ../src/importnode.h \ +           ../src/state.h + +SOURCES += cgaltest.cc \ +           ../src/export.cc \ +           ../src/value.cc \ +           ../src/expr.cc \ +           ../src/func.cc \ +           ../src/module.cc \ +           ../src/node.cc \ +           ../src/context.cc \ +           ../src/csgterm.cc \ +           ../src/polyset.cc \ +           ../src/csgops.cc \ +           ../src/transform.cc \ +           ../src/primitives.cc \ +           ../src/projection.cc \ +           ../src/cgaladv.cc \ +           ../src/surface.cc \ +           ../src/control.cc \ +           ../src/render.cc \ +           ../src/import.cc \ +           ../src/dxfdata.cc \ +           ../src/dxftess.cc \ +           ../src/dxftess-glu.cc \ +           ../src/dxftess-cgal.cc \ +           ../src/dxfdim.cc \ +           ../src/dxflinextrude.cc \ +           ../src/dxfrotextrude.cc \ +           ../src/printutils.cc \ +           ../src/progress.cc \ +           ../src/nodedumper.cc \ +           ../src/CGALRenderer.cc \ +           ../src/traverser.cc | 
