diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-07-24 21:57:46 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-07-24 21:57:46 (GMT) |
commit | 4c84928e4b9360b8b46c60dc57ca6b6571bd088e (patch) | |
tree | 2472fd65ed4059c121f2a7bea6ee00610b6dc280 | |
parent | c66c51ce1e97c146a6f05cafdea213f880760b83 (diff) |
Clifford Wolf:
More dxf_dim stuff
git-svn-id: http://svn.clifford.at/openscad/trunk@74 b57f626f-c46c-0410-a088-ec61d464b74c
-rw-r--r-- | dxfdata.cc | 4 | ||||
-rw-r--r-- | dxfdim.cc | 64 |
2 files changed, 64 insertions, 4 deletions
@@ -77,9 +77,9 @@ DxfData::DxfData(double fn, double fs, double fa, QString filename, QString laye if (id >= 20 && id <= 26) { if (id == 21 || id == 22 || id == 26) - coords[id-20][0] = data.toDouble() * scale; + coords[id-20][1] = data.toDouble() * scale; else - coords[id-20][0] = (data.toDouble() - yorigin) * scale; + coords[id-20][1] = (data.toDouble() - yorigin) * scale; } switch (id) @@ -33,7 +33,7 @@ Value builtin_dxf_dim(const QVector<QString> &argnames, const QVector<Value> &ar if (argnames[i] == "file") filename = args[i].text; if (argnames[i] == "layer") - filename = args[i].text; + layername = args[i].text; if (argnames[i] == "origin") args[i].getv2(xorigin, yorigin); if (argnames[i] == "scale") @@ -57,7 +57,7 @@ Value builtin_dxf_dim(const QVector<QString> &argnames, const QVector<Value> &ar double x = d->coords[4][0] - d->coords[3][0]; double y = d->coords[4][1] - d->coords[3][1]; double angle = d->angle; - double distance_projected_on_line = fabs(x * sin(angle*M_PI/180) + y * cos(angle*M_PI/180)); + double distance_projected_on_line = fabs(x * cos(angle*M_PI/180) + y * sin(angle*M_PI/180)); return Value(distance_projected_on_line); } if (type == 1) { @@ -65,6 +65,9 @@ Value builtin_dxf_dim(const QVector<QString> &argnames, const QVector<Value> &ar } if (type == 2) { // Angular + double a1 = atan2(d->coords[0][0] - d->coords[5][0], d->coords[0][1] - d->coords[5][1]); + double a2 = atan2(d->coords[4][0] - d->coords[3][0], d->coords[4][1] - d->coords[3][1]); + return Value(fabs(a1 - a2) * 180 / M_PI); } if (type == 3) { // Diameter @@ -85,8 +88,65 @@ Value builtin_dxf_dim(const QVector<QString> &argnames, const QVector<Value> &ar return Value(); } +Value builtin_dxf_cross(const QVector<QString> &argnames, const QVector<Value> &args) +{ + QString filename; + QString layername; + double xorigin = 0; + double yorigin = 0; + double scale = 1; + + for (int i = 0; i < argnames.count() && i < args.count(); i++) { + if (argnames[i] == "file") + filename = args[i].text; + if (argnames[i] == "layer") + layername = args[i].text; + if (argnames[i] == "origin") + args[i].getv2(xorigin, yorigin); + if (argnames[i] == "scale") + args[i].getnum(scale); + } + + DxfData dxf(36, 0, 0, filename, layername, xorigin, yorigin, scale); + + double coords[4][2]; + + for (int i = 0, j = 0; i < dxf.paths.count(); i++) { + if (dxf.paths[i].points.count() != 2) + continue; + coords[j][0] = dxf.paths[i].points[0]->x; + coords[j++][1] = dxf.paths[i].points[0]->y; + coords[j][0] = dxf.paths[i].points[1]->x; + coords[j++][1] = dxf.paths[i].points[1]->y; + + if (j == 4) { + double x1 = coords[0][0], y1 = coords[0][1]; + double x2 = coords[1][0], y2 = coords[1][1]; + double x3 = coords[2][0], y3 = coords[2][1]; + double x4 = coords[3][0], y4 = coords[3][1]; + double dem = (y4 - y3)*(x2 - x1) - (x4 - x3)*(y2 - y1); + if (dem == 0) + break; + double ua = ((x4 - x3)*(y1 - y3) - (y4 - y3)*(x1 - x3)) / dem; + // double ub = ((x2 - x1)*(y1 - y3) - (y2 - y1)*(x1 - x3)) / dem; + double x = x1 + ua*(x2 - x1); + double y = y1 + ua*(y2 - y1); + Value ret; + ret.type = Value::VECTOR; + ret.vec.append(new Value(x)); + ret.vec.append(new Value(y)); + return ret; + } + } + + PRINTA("WARINING: Can't find cross in `%1', layer `%2'!", filename, layername); + + return Value(); +} + void initialize_builtin_dxf_dim() { builtin_functions["dxf_dim"] = new BuiltinFunction(&builtin_dxf_dim); + builtin_functions["dxf_cross"] = new BuiltinFunction(&builtin_dxf_cross); } |