mirror of https://github.com/vitalif/openscad
Added support for an untyped import() module, deprecating the explicitly typed import_*() ones
parent
9ec9111dcb
commit
f40f7ef072
|
@ -153,9 +153,18 @@ AbstractNode *Context::evaluate_module(const ModuleInstantiation &inst) const
|
||||||
if (m == builtin_modules["dxf_linear_extrude"]) {
|
if (m == builtin_modules["dxf_linear_extrude"]) {
|
||||||
PRINTF("DEPRECATED: The dxf_linear_extrude() module will be removed in future releases. Use a linear_extrude() instead.");
|
PRINTF("DEPRECATED: The dxf_linear_extrude() module will be removed in future releases. Use a linear_extrude() instead.");
|
||||||
}
|
}
|
||||||
if (m == builtin_modules["dxf_rotate_extrude"]) {
|
else if (m == builtin_modules["dxf_rotate_extrude"]) {
|
||||||
PRINTF("DEPRECATED: The dxf_rotate_extrude() module will be removed in future releases. Use a rotate_extrude() instead.");
|
PRINTF("DEPRECATED: The dxf_rotate_extrude() module will be removed in future releases. Use a rotate_extrude() instead.");
|
||||||
}
|
}
|
||||||
|
else if (m == builtin_modules["import_stl"]) {
|
||||||
|
PRINTF("DEPRECATED: The import_stl() module will be removed in future releases. Use import() instead.");
|
||||||
|
}
|
||||||
|
else if (m == builtin_modules["import_dxf"]) {
|
||||||
|
PRINTF("DEPRECATED: The import_dxf() module will be removed in future releases. Use import() instead.");
|
||||||
|
}
|
||||||
|
else if (m == builtin_modules["import_off"]) {
|
||||||
|
PRINTF("DEPRECATED: The import_off() module will be removed in future releases. Use import() instead.");
|
||||||
|
}
|
||||||
return m->evaluate(this, &inst);
|
return m->evaluate(this, &inst);
|
||||||
}
|
}
|
||||||
if (this->usedlibs_p) {
|
if (this->usedlibs_p) {
|
||||||
|
|
|
@ -49,20 +49,14 @@ class ImportModule : public AbstractModule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
import_type_e type;
|
import_type_e type;
|
||||||
ImportModule(import_type_e type) : type(type) { }
|
ImportModule(import_type_e type = TYPE_UNKNOWN) : type(type) { }
|
||||||
virtual AbstractNode *evaluate(const Context *ctx, const ModuleInstantiation *inst) const;
|
virtual AbstractNode *evaluate(const Context *ctx, const ModuleInstantiation *inst) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const
|
AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiation *inst) const
|
||||||
{
|
{
|
||||||
ImportNode *node = new ImportNode(inst, type);
|
|
||||||
|
|
||||||
std::vector<std::string> argnames;
|
std::vector<std::string> argnames;
|
||||||
if (this->type == TYPE_DXF) {
|
argnames += "file", "layer", "convexity", "origin", "scale";
|
||||||
argnames += "file", "layer", "convexity", "origin", "scale";
|
|
||||||
} else {
|
|
||||||
argnames += "file", "convexity";
|
|
||||||
}
|
|
||||||
std::vector<Expression*> argexpr;
|
std::vector<Expression*> argexpr;
|
||||||
|
|
||||||
// Map old argnames to new argnames for compatibility
|
// Map old argnames to new argnames for compatibility
|
||||||
|
@ -77,13 +71,23 @@ AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiati
|
||||||
Context c(ctx);
|
Context c(ctx);
|
||||||
c.args(argnames, argexpr, inst_argnames, inst->argvalues);
|
c.args(argnames, argexpr, inst_argnames, inst->argvalues);
|
||||||
|
|
||||||
|
Value v = c.lookup_variable("file");
|
||||||
|
std::string filename = c.getAbsolutePath(v.text);
|
||||||
|
import_type_e actualtype = this->type;
|
||||||
|
if (actualtype == TYPE_UNKNOWN) {
|
||||||
|
QFileInfo fi(QString::fromStdString(filename));
|
||||||
|
if (fi.suffix().toLower() == "stl") actualtype = TYPE_STL;
|
||||||
|
else if (fi.suffix().toLower() == "off") actualtype = TYPE_OFF;
|
||||||
|
else if (fi.suffix().toLower() == "dxf") actualtype = TYPE_DXF;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImportNode *node = new ImportNode(inst, actualtype);
|
||||||
|
|
||||||
node->fn = c.lookup_variable("$fn").num;
|
node->fn = c.lookup_variable("$fn").num;
|
||||||
node->fs = c.lookup_variable("$fs").num;
|
node->fs = c.lookup_variable("$fs").num;
|
||||||
node->fa = c.lookup_variable("$fa").num;
|
node->fa = c.lookup_variable("$fa").num;
|
||||||
|
|
||||||
Value v = c.lookup_variable("file");
|
node->filename = filename;
|
||||||
node->filename = c.getAbsolutePath(v.text);
|
|
||||||
// node->filename = c.getAbsolutePath(c.lookup_variable("file").text);
|
|
||||||
node->layername = c.lookup_variable("layer", true).text;
|
node->layername = c.lookup_variable("layer", true).text;
|
||||||
node->convexity = c.lookup_variable("convexity", true).num;
|
node->convexity = c.lookup_variable("convexity", true).num;
|
||||||
|
|
||||||
|
@ -102,13 +106,6 @@ AbstractNode *ImportModule::evaluate(const Context *ctx, const ModuleInstantiati
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_builtin_import()
|
|
||||||
{
|
|
||||||
builtin_modules["import_stl"] = new ImportModule(TYPE_STL);
|
|
||||||
builtin_modules["import_off"] = new ImportModule(TYPE_OFF);
|
|
||||||
builtin_modules["import_dxf"] = new ImportModule(TYPE_DXF);
|
|
||||||
}
|
|
||||||
|
|
||||||
PolySet *ImportNode::evaluate_polyset(render_mode_e, class PolySetEvaluator *) const
|
PolySet *ImportNode::evaluate_polyset(render_mode_e, class PolySetEvaluator *) const
|
||||||
{
|
{
|
||||||
PolySet *p = new PolySet();
|
PolySet *p = new PolySet();
|
||||||
|
@ -191,18 +188,22 @@ PolySet *ImportNode::evaluate_polyset(render_mode_e, class PolySetEvaluator *) c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->type == TYPE_OFF)
|
else if (this->type == TYPE_OFF)
|
||||||
{
|
{
|
||||||
PRINTF("WARNING: OFF import is not implemented yet.");
|
PRINTF("WARNING: OFF import is not implemented yet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->type == TYPE_DXF)
|
else if (this->type == TYPE_DXF)
|
||||||
{
|
{
|
||||||
DxfData dd(this->fn, this->fs, this->fa, this->filename, this->layername, this->origin_x, this->origin_y, this->scale);
|
DxfData dd(this->fn, this->fs, this->fa, this->filename, this->layername, this->origin_x, this->origin_y, this->scale);
|
||||||
p->is2d = true;
|
p->is2d = true;
|
||||||
dxf_tesselate(p, dd, 0, true, false, 0);
|
dxf_tesselate(p, dd, 0, true, false, 0);
|
||||||
dxf_border_to_ps(p, dd);
|
dxf_border_to_ps(p, dd);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PRINTF("ERROR: Unsupported file format while trying to import file '%s'", this->filename.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
@ -217,46 +218,27 @@ std::string ImportNode::toString() const
|
||||||
stat(this->filename.c_str(), &st);
|
stat(this->filename.c_str(), &st);
|
||||||
|
|
||||||
stream << this->name();
|
stream << this->name();
|
||||||
switch (this->type) {
|
stream << "(file = \"" << this->filename << "\", "
|
||||||
case TYPE_STL:
|
"cache = \"" << std::hex << (int)st.st_mtime << "." << (int)st.st_size << "\", "
|
||||||
stream << "(file = \"" << this->filename << "\", "
|
"layer = \"" << this->layername << "\", "
|
||||||
"cache = \"" << std::hex << (int)st.st_mtime << "." << (int)st.st_size << "\", "
|
"origin = [ " << std::dec << this->origin_x << " " << this->origin_y << " ], "
|
||||||
"convexity = " << std::dec << this->convexity << ")";
|
"scale = " << this->scale << ", "
|
||||||
break;
|
"convexity = " << this->convexity << ", "
|
||||||
case TYPE_OFF:
|
"$fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ")";
|
||||||
stream << "(file = \"" << this->filename << "\", "
|
|
||||||
"cache = \"" << std::hex << (int)st.st_mtime << "." << (int)st.st_size << "\", "
|
|
||||||
"convexity = " << std::dec << this->convexity << ")";
|
|
||||||
break;
|
|
||||||
case TYPE_DXF:
|
|
||||||
stream << "(file = \"" << this->filename << "\", "
|
|
||||||
"cache = \"" << std::hex << (int)st.st_mtime << "." << (int)st.st_size << "\", "
|
|
||||||
"layer = \"" << this->layername << "\", "
|
|
||||||
"origin = [ " << std::dec << this->origin_x << " " << this->origin_y << " ], "
|
|
||||||
"scale = " << this->scale << ", "
|
|
||||||
"convexity = " << this->convexity << ", "
|
|
||||||
"$fn = " << this->fn << ", $fa = " << this->fa << ", $fs = " << this->fs << ")";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return stream.str();
|
return stream.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ImportNode::name() const
|
std::string ImportNode::name() const
|
||||||
{
|
{
|
||||||
switch (this->type) {
|
return "import";
|
||||||
case TYPE_STL:
|
|
||||||
return "import_stl";
|
|
||||||
break;
|
|
||||||
case TYPE_OFF:
|
|
||||||
return "import_off";
|
|
||||||
break;
|
|
||||||
case TYPE_DXF:
|
|
||||||
return "import_dxf";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void register_builtin_import()
|
||||||
|
{
|
||||||
|
builtin_modules["import_stl"] = new ImportModule(TYPE_STL);
|
||||||
|
builtin_modules["import_off"] = new ImportModule(TYPE_OFF);
|
||||||
|
builtin_modules["import_dxf"] = new ImportModule(TYPE_DXF);
|
||||||
|
builtin_modules["import"] = new ImportModule();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "visitor.h"
|
#include "visitor.h"
|
||||||
|
|
||||||
enum import_type_e {
|
enum import_type_e {
|
||||||
|
TYPE_UNKNOWN,
|
||||||
TYPE_STL,
|
TYPE_STL,
|
||||||
TYPE_OFF,
|
TYPE_OFF,
|
||||||
TYPE_DXF
|
TYPE_DXF
|
||||||
|
|
Loading…
Reference in New Issue