summaryrefslogtreecommitdiff
path: root/dxfdim.cc
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-07-24 20:50:30 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2009-07-24 20:50:30 (GMT)
commitc66c51ce1e97c146a6f05cafdea213f880760b83 (patch)
tree91d7d1af4bf8fdd6530e66beb3fe3759fb2d9843 /dxfdim.cc
parent92debc11399fd8cf856913508edaa8154d495ca4 (diff)
Clifford Wolf:
Added dxf dimension function (still incomplete) git-svn-id: http://svn.clifford.at/openscad/trunk@73 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'dxfdim.cc')
-rw-r--r--dxfdim.cc92
1 files changed, 92 insertions, 0 deletions
diff --git a/dxfdim.cc b/dxfdim.cc
new file mode 100644
index 0000000..0ae879a
--- /dev/null
+++ b/dxfdim.cc
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ *
+ * 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"
+
+Value builtin_dxf_dim(const QVector<QString> &argnames, const QVector<Value> &args)
+{
+ QString filename;
+ QString layername;
+ QString name;
+ 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")
+ filename = args[i].text;
+ if (argnames[i] == "origin")
+ args[i].getv2(xorigin, yorigin);
+ if (argnames[i] == "scale")
+ args[i].getnum(scale);
+ if (argnames[i] == "name")
+ name = args[i].text;
+ }
+
+ DxfData dxf(36, 0, 0, filename, layername, xorigin, yorigin, scale);
+
+ for (int i = 0; i < dxf.dims.count(); i++)
+ {
+ if (!name.isNull() && dxf.dims[i].name != name)
+ continue;
+
+ DxfData::Dim *d = &dxf.dims[i];
+ int type = d->type & 7;
+
+ if (type == 0) {
+ // Rotated, horizontal or vertical
+ 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));
+ return Value(distance_projected_on_line);
+ }
+ if (type == 1) {
+ // Aligned
+ }
+ if (type == 2) {
+ // Angular
+ }
+ if (type == 3) {
+ // Diameter
+ }
+ if (type == 4) {
+ // Radius
+ }
+ if (type == 5) {
+ // Angular 3 Point
+ }
+
+ PRINTA("WARINING: Dimension `%1' in `%2', layer `%3' has unsupported type!", name, filename, layername);
+ return Value();
+ }
+
+ PRINTA("WARINING: Can't find dimension `%1' in `%2', layer `%3'!", name, filename, layername);
+
+ return Value();
+}
+
+void initialize_builtin_dxf_dim()
+{
+ builtin_functions["dxf_dim"] = new BuiltinFunction(&builtin_dxf_dim);
+}
+
contact: Jan Huwald // Impressum