Skip to content

Commit

Permalink
Unified read_dxf(), read_image() and read_stl() into single read()
Browse files Browse the repository at this point in the history
  • Loading branch information
clothbot committed Jun 28, 2012
1 parent 4a49823 commit c63d08d
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 44 deletions.
19 changes: 5 additions & 14 deletions examples/example024.scad
@@ -1,14 +1,11 @@
// example024 rendering an image via read_* and polyset().
// example024 rendering an image via read() and polyset().

render_obj=1;

// echo usage
tmp_image=read_image();
tmp_dxf=read_dxf();
tmp_stl=read_stl();
tmp_rgb=read_rgb();
tmp_read=read();

if(render_obj==0 || render_obj==1) translate([0,40,0]) assign(readImg=read_image("example024.png",true,0.5) ) {
if(render_obj==0 || render_obj==1) translate([0,40,0]) assign(readImg=read("example024.png",true,0.5) ) {
echo(str("Number of polygons: ",len(readImg)));
echo(str(" First polygon: ",readImg[0]));
//numPolys=len(readImg);
Expand All @@ -19,15 +16,9 @@ if(render_obj==0 || render_obj==1) translate([0,40,0]) assign(readImg=read_image
}

if(render_obj==0 || render_obj==2) translate([0,15,0]) {
polyset(data=read_stl("example012.stl",4));
polyset(data=read("example012.stl",4));
}

if(render_obj==0 || render_obj==3) translate([20,-50,0]) {
polyset(data=read_dxf("example008.dxf","G"),convexity=2);
polyset(data=read("example008.dxf","G"),convexity=2);
}

if(render_obj==0 || render_obj=4) translate([-50,-50,0]) assign(readImg=read_rgb("example024_10x10.png")) {
scale([5,5,5]) polyset(data=readImg,convexity=2);
echo(str("read_rgb: ",readImg));
}

79 changes: 49 additions & 30 deletions src/func.cc
Expand Up @@ -483,7 +483,30 @@ Value builtin_search(const Context *, const std::vector<std::string>&, const std
return Value(returnvec);
}

Value builtin_read_dxf(const Context *c, const std::vector<std::string>&, const std::vector<Value> &args)
Value builtin_read(const Context *c, const std::vector<std::string>&s, const std::vector<Value> &args)
{
if(args.size() ==0 || args[0].type() != Value::STRING ) {
PRINT( "Usage:");
PRINT( " DXF: read(file_name[,layername[,origin[,scale[,convexity]]])");
PRINT( " Image: read(file_name[,center[,scale[,convexity]]])");
PRINT( " STL: read(file_name[,convexity])");
return Value();
}
Value fname=args[0];
Filename filename=fname.toString();
if( is_image(filename) ) {
return read_image(c,s,args);
}
if( is_stl(filename)) {
return read_stl(c,s,args);
}
if( is_dxf(filename)) {
return read_dxf(c,s,args);
}
return Value();
}

Value read_dxf(const Context *c, const std::vector<std::string>&, const std::vector<Value> &args)
{
double fn=c->lookup_variable("$fn").toDouble();
double fs=c->lookup_variable("$fs").toDouble();
Expand All @@ -499,8 +522,6 @@ Value builtin_read_dxf(const Context *c, const std::vector<std::string>&, const
std::string layername="";
double origin_x,origin_y;
origin_x = origin_y = 0;
//Value returnPoly;
// returnPoly.type = Value::POLYSET;

if ( args.size() >1 && args[1].type() == Value::STRING ) {
layername = args[1].toString();
Expand All @@ -516,12 +537,10 @@ Value builtin_read_dxf(const Context *c, const std::vector<std::string>&, const
}

PolySet *p = readPolySetFromDXF( filename, layername, origin_x, origin_y, scale, fn, fs, fa, convexity );
//PRINTB(" builtin_read_dxf, p.polygons.size(): %s", p->polygons.size());
//returnPoly=p;
return Value(p);
}

Value builtin_read_image(const Context *, const std::vector<std::string>&, const std::vector<Value> &args)
Value read_image(const Context *, const std::vector<std::string>&, const std::vector<Value> &args)
{
double center=false;
double scale=1.0;
Expand All @@ -536,7 +555,6 @@ Value builtin_read_image(const Context *, const std::vector<std::string>&, const
Value fname=args[0];
Filename filename=fname.toString();
Value returnPoly;
//returnPoly.type = Value::POLYSET;
if ( args.size() >3 && args[3].type() == Value::NUMBER ) {
convexity = args[3].toDouble();
}
Expand All @@ -553,13 +571,32 @@ Value builtin_read_image(const Context *, const std::vector<std::string>&, const
return returnPoly;
}

Value read_stl(const Context *, const std::vector<std::string>&, const std::vector<Value> &args)
{
int convexity = 2;
if(args.size() ==0 || args[0].type() != Value::STRING ) {
PRINT( "Usage: read_stl(file_name[,convexity])" );
return Value();
}
Value fname=args[0];
Filename filename=fname.toString();
Value returnPoly;
//returnPoly.type = Value::POLYSET;
if ( args.size() >1 && args[1].type() == Value::NUMBER ) {
convexity = args[1].toDouble();
}
PolySet *p = readPolySetFromSTL( filename, convexity );
returnPoly=p;
return returnPoly;
}

Value builtin_read_rgb(const Context *, const std::vector<std::string>&, const std::vector<Value> &args)
{
double center=false;
double scale=1.0;
int convexity = 2;
if(args.size() ==0 || args[0].type() != Value::STRING ) {
PRINT( "Usage: read_rgb(file_name[,center[,scale[,convexity]]])" );
PRINT( "**EXPERIMENTAL** Usage: read_rgb(file_name[,center[,scale[,convexity]]])" );
PRINT( " Defaults:");
PRINTB(" center : %s",center);
PRINTB(" scale : %s",scale);
Expand All @@ -585,25 +622,6 @@ Value builtin_read_rgb(const Context *, const std::vector<std::string>&, const s
return returnPoly;
}

Value builtin_read_stl(const Context *, const std::vector<std::string>&, const std::vector<Value> &args)
{
int convexity = 2;
if(args.size() ==0 || args[0].type() != Value::STRING ) {
PRINT( "Usage: read_stl(file_name[,convexity])" );
return Value();
}
Value fname=args[0];
Filename filename=fname.toString();
Value returnPoly;
//returnPoly.type = Value::POLYSET;
if ( args.size() >1 && args[1].type() == Value::NUMBER ) {
convexity = args[1].toDouble();
}
PolySet *p = readPolySetFromSTL( filename, convexity );
returnPoly=p;
return returnPoly;
}

#define QUOTE(x__) # x__
#define QUOTED(x__) QUOTE(x__)

Expand Down Expand Up @@ -656,10 +674,11 @@ void register_builtin_functions()
Builtins::init("str", new BuiltinFunction(&builtin_str));
Builtins::init("lookup", new BuiltinFunction(&builtin_lookup));
Builtins::init("search", new BuiltinFunction(&builtin_search));
Builtins::init("read_dxf", new BuiltinFunction(&builtin_read_dxf));
Builtins::init("read_image", new BuiltinFunction(&builtin_read_image));
Builtins::init("read", new BuiltinFunction(&builtin_read));
// Builtins::init("read_dxf", new BuiltinFunction(&builtin_read_dxf));
// Builtins::init("read_image", new BuiltinFunction(&builtin_read_image));
Builtins::init("read_rgb", new BuiltinFunction(&builtin_read_rgb));
Builtins::init("read_stl", new BuiltinFunction(&builtin_read_stl));
// Builtins::init("read_stl", new BuiltinFunction(&builtin_read_stl));
Builtins::init("version", new BuiltinFunction(&builtin_version));
Builtins::init("version_num", new BuiltinFunction(&builtin_version_num));
}
6 changes: 6 additions & 0 deletions src/function.h
Expand Up @@ -41,4 +41,10 @@ class Function : public AbstractFunction
virtual std::string dump(const std::string &indent, const std::string &name) const;
};

Value read_image(const Context *, const std::vector<std::string>&, const std::vector<Value> &);
Value read_dxf(const Context *, const std::vector<std::string>&, const std::vector<Value> &);
Value read_stl(const Context *, const std::vector<std::string>&, const std::vector<Value> &);

Value builtin_read_rgb(const Context *, const std::vector<std::string>&, const std::vector<Value> &);

#endif
34 changes: 34 additions & 0 deletions src/handle_dep.cc
Expand Up @@ -8,6 +8,8 @@
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
#include "boosty.h"
#include <Magick++.h>


boost::unordered_set<std::string> dependencies;
const char *make_command = NULL;
Expand Down Expand Up @@ -44,3 +46,35 @@ bool write_deps(const std::string &filename, const std::string &output_file)
fclose(fp);
return true;
}

bool is_image(const std::string &filename) {
Magick::Image image;
bool isImage;
try {
image.read( filename );
isImage=true;
} catch( Magick::Exception &error_ ) {
isImage=false;
}
return isImage;
}

bool is_stl(const std::string &filename) {
boost::regex expression(".*\\.([Ss][Tt][Ll])$");
// path file_ext = path(filename).extension();
if( boost::regex_match(filename, expression) ) {
return true;
} else {
return false;
}
}

bool is_dxf(const std::string &filename) {
boost::regex expression(".*\\.([Dd][Xx][Ff])$");
// path file_ext = path(filename).extension();
if( boost::regex_match(filename, expression) ) {
return true;
} else {
return false;
}
}
4 changes: 4 additions & 0 deletions src/handle_dep.h
Expand Up @@ -7,4 +7,8 @@ extern const char *make_command;
void handle_dep(const std::string &filename);
bool write_deps(const std::string &filename, const std::string &output_file);

bool is_image(const std::string &filename);
bool is_stl(const std::string &filename);
bool is_dxf(const std::string &filename);

#endif

0 comments on commit c63d08d

Please sign in to comment.