diff --git a/dxfdata.cc b/dxfdata.cc index 773f8d92..7247e002 100644 --- a/dxfdata.cc +++ b/dxfdata.cc @@ -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) diff --git a/dxfdim.cc b/dxfdim.cc index 0ae879a9..d97f6c3c 100644 --- a/dxfdim.cc +++ b/dxfdim.cc @@ -33,7 +33,7 @@ Value builtin_dxf_dim(const QVector &argnames, const QVector &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 &argnames, const QVector &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 &argnames, const QVector &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 &argnames, const QVector &ar return Value(); } +Value builtin_dxf_cross(const QVector &argnames, const QVector &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); }