summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkintel <kintel@cb376a5e-1013-0410-a455-b6b1f9ac8223>2009-05-11 04:37:12 +0000
committerkintel <kintel@cb376a5e-1013-0410-a455-b6b1f9ac8223>2009-05-11 04:37:12 +0000
commit7001b7f4b460afe576bcc3e84f143ce71b77092f (patch)
treeb43317fc25a32119d32d2820077b71676af1a480
parent35e3ad08f4580391193e951f0f50141e4162d7d4 (diff)
downloadreprap-backup-7001b7f4b460afe576bcc3e84f143ce71b77092f.tar.gz
reprap-backup-7001b7f4b460afe576bcc3e84f143ce71b77092f.zip
Made it possible to import DXF files programatically
git-svn-id: https://reprap.svn.sourceforge.net/svnroot/reprap@2953 cb376a5e-1013-0410-a455-b6b1f9ac8223
-rw-r--r--trunk/users/metalab/misc/DXFImporter.java217
1 files changed, 124 insertions, 93 deletions
diff --git a/trunk/users/metalab/misc/DXFImporter.java b/trunk/users/metalab/misc/DXFImporter.java
index 52c4b621..eb0d114d 100644
--- a/trunk/users/metalab/misc/DXFImporter.java
+++ b/trunk/users/metalab/misc/DXFImporter.java
@@ -4,21 +4,58 @@
package klynn.aoi.translators;
-import klynn.aoi.util.*;
-
-import artofillusion.*;
-import artofillusion.object.*;
+import java.awt.Color;
+import java.awt.FileDialog;
+import java.awt.Frame;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import klynn.aoi.util.AWTMessageDialog;
+import klynn.aoi.util.MeshTools;
+import klynn.aoi.util.ProgressDialog;
+import artofillusion.ModellingApp;
+import artofillusion.Scene;
+import artofillusion.animation.PositionTrack;
+import artofillusion.animation.RotationTrack;
+import artofillusion.math.CoordinateSystem;
+import artofillusion.math.RGBColor;
+import artofillusion.math.Vec3;
+import artofillusion.object.Curve;
+import artofillusion.object.DirectionalLight;
+import artofillusion.object.Mesh;
+import artofillusion.object.Object3D;
+import artofillusion.object.ObjectInfo;
+import artofillusion.object.SceneCamera;
+import artofillusion.object.TriangleMesh;
import artofillusion.texture.Texture;
import artofillusion.texture.UniformTexture;
-import artofillusion.animation.*;
-import artofillusion.math.*;
-
-import java.awt.*;
-import java.io.*;
-import java.util.*;
-import com.ysystems.ycad.lib.ydxf.*;
-import com.ysystems.ycad.lib.yxxf.*;
+import com.ysystems.ycad.lib.ydxf.YdxfGet;
+import com.ysystems.ycad.lib.ydxf.YdxfGetBuffer;
+import com.ysystems.ycad.lib.yxxf.Yxxf;
+import com.ysystems.ycad.lib.yxxf.YxxfEnt;
+import com.ysystems.ycad.lib.yxxf.YxxfEnt3Dface;
+import com.ysystems.ycad.lib.yxxf.YxxfEntArc;
+import com.ysystems.ycad.lib.yxxf.YxxfEntBlock;
+import com.ysystems.ycad.lib.yxxf.YxxfEntCircle;
+import com.ysystems.ycad.lib.yxxf.YxxfEntHeader;
+import com.ysystems.ycad.lib.yxxf.YxxfEntInsert;
+import com.ysystems.ycad.lib.yxxf.YxxfEntLine;
+import com.ysystems.ycad.lib.yxxf.YxxfEntLwpolyline;
+import com.ysystems.ycad.lib.yxxf.YxxfEntPolyline;
+import com.ysystems.ycad.lib.yxxf.YxxfEntVertex;
+import com.ysystems.ycad.lib.yxxf.YxxfGfxContext;
+import com.ysystems.ycad.lib.yxxf.YxxfGfxMatrix;
+import com.ysystems.ycad.lib.yxxf.YxxfGfxPointW;
+import com.ysystems.ycad.lib.yxxf.YxxfTblLayer;
class DXFLayer {
@@ -50,12 +87,68 @@ public class DXFImporter {
Boolean enableMeshRepair;
Hashtable<YxxfTblLayer, DXFLayer> layers;
YxxfGfxContext gc;
+ List<ObjectInfo> importedobjects;
public DXFImporter(Frame parent, Boolean enableMeshRepair) {
this.parent = parent;
this.enableMeshRepair = enableMeshRepair;
this.gc = new YxxfGfxContext();
this.layers = new Hashtable<YxxfTblLayer, DXFLayer>();
+ this.importedobjects = new LinkedList<ObjectInfo>();
+ }
+
+ public static List<ObjectInfo> importFile(String filename, boolean enableMeshRepair) throws Exception {
+
+ File f = new File(filename);
+
+ String objName = f.getName();
+ if (objName.lastIndexOf('.') > 0) objName = objName.substring(0, objName.lastIndexOf('.'));
+ if (debug) System.out.println("Object name: " + objName);
+
+ // open file:
+ BufferedInputStream in = null;
+ try {
+ // read file using ycad lib:
+ in = new BufferedInputStream(new FileInputStream(f));
+ Yxxf drawing = new Yxxf();
+ YdxfGetBuffer buffer = new YdxfGetBuffer();
+ int type = YdxfGetBuffer.GET_TYPE_MAIN; // drawing (versus font) get this
+ // from file somehow?
+ buffer.setInput(type, in, drawing);
+ YdxfGet.get(buffer);
+ drawing = buffer.getDrawing();
+ String blockName = drawing.secEntities.insMSpace.block.getBlockname2();
+ if (debug) System.out.println("blockName: [" + blockName + "]");
+
+ DXFImporter importer = new DXFImporter(null, enableMeshRepair);
+ for (int nextToDraw = 0;;) {
+ YxxfEnt ent = (YxxfEnt) drawing.secEntities.insMSpace.block.nextEntity(nextToDraw);
+ if (!(ent instanceof YxxfEntHeader)) break;
+ importer.addEntity((YxxfEntHeader)ent);
+ nextToDraw++;
+ }
+ Boolean geometryfound = false;
+ Enumeration<YxxfTblLayer> keys = importer.layers.keys();
+ while (keys.hasMoreElements()) {
+ YxxfTblLayer layer = keys.nextElement();
+ DXFLayer mylayer = importer.layers.get(layer);
+ Color col = importer.gc.getPalette().jcolorarr[layer.aci];
+ if (importer.createMesh(mylayer, objName, col) != null) geometryfound = true;
+ if (importer.createCurve(mylayer, objName)) geometryfound = true;
+ }
+ if (!geometryfound) {
+ throw new Exception("Import of file: \"" + f + "\" failed. No supported geometry found.");
+ }
+ return importer.importedobjects;
+ } catch (Exception ex) {
+ throw ex;
+ } finally {
+ try {
+ in.close();
+ } catch (Exception ex2) {
+ throw new Exception("Unable to close file: \"" + f + "\"." + ex2.getMessage());
+ }
+ }
}
/**
@@ -74,10 +167,8 @@ public class DXFImporter {
fd.show();
if (fd.getFile() == null) return;
f = new File(fd.getDirectory(), fd.getFile());
+ String filename = f.getPath();
ModellingApp.currentDirectory = fd.getDirectory();
- String objName = fd.getFile();
- if (objName.lastIndexOf('.') > 0) objName = objName.substring(0, objName.lastIndexOf('.'));
- if (debug) System.out.println("Object name: " + objName);
// ask user to enable/disable mesh repair tools:
String msgText = "WARNING: This option can be extremely slow!";
@@ -89,13 +180,6 @@ public class DXFImporter {
if (choice == 2) return;
dialog.dispose();
- ProgressDialog pdialog = null;
- /*
- * KEVIN threading is backwards! This won't work pdialog = new
- * ProgressDialog(parent, 100, "Importing...");
- * pdialog.setPriority(Thread.MAX_PRIORITY); pdialog.start();
- */
-
// create an AOI Scene to add objects to:
if (theScene == null) {
theScene = new Scene();
@@ -112,62 +196,20 @@ public class DXFImporter {
theScene.addObject(info, null);
}
- // open file:
- BufferedInputStream in = null;
- String line = null;
- String formName = null;
+ List<ObjectInfo> importedobjects;
try {
- // read file using ycad lib:
- in = new BufferedInputStream(new FileInputStream(f));
- java.util.Vector faces = new java.util.Vector();
- Yxxf drawing = new Yxxf();
- YdxfGetBuffer buffer = new YdxfGetBuffer();
- int type = YdxfGetBuffer.GET_TYPE_MAIN; // drawing (versus font) get this
- // from file somehow?
- buffer.setInput(type, in, drawing);
- YdxfGet.get(buffer);
- drawing = buffer.getDrawing();
- String blockName = drawing.secEntities.insMSpace.block.getBlockname2();
- if (debug) System.out.println("blockName: [" + blockName + "]");
-
- DXFImporter importer = new DXFImporter(parent, enableMeshRepair);
- for (int nextToDraw = 0;;) {
- YxxfEnt ent = (YxxfEnt) drawing.secEntities.insMSpace.block.nextEntity(nextToDraw);
- if (!(ent instanceof YxxfEntHeader)) break;
- importer.addEntity((YxxfEntHeader)ent);
- nextToDraw++;
- }
- Boolean geometryfound = false;
- Enumeration<YxxfTblLayer> keys = importer.layers.keys();
- while (keys.hasMoreElements()) {
- YxxfTblLayer layer = keys.nextElement();
- DXFLayer mylayer = importer.layers.get(layer);
- Color col = importer.gc.getPalette().jcolorarr[layer.aci];
- if (importer.createMesh(mylayer, objName, col) != null) geometryfound = true;
- if (importer.createCurve(mylayer, objName)) geometryfound = true;
- }
- if (!geometryfound) {
- new AWTMessageDialog(parent, new String[] { "Import of file: [" + f +
- "] failed. No supported geometry found." });
- }
-
- } catch (Exception ex) {
- new AWTMessageDialog(parent, new String[] {
- "Import of file: [" + f + "] failed with exception:", ex.getMessage() });
- return;
- } finally {
- try {
- in.close();
- } catch (Exception ex2) {
- new AWTMessageDialog(parent, new String[] { "Unable to close file: [" + f + "]. ",
- ex2.getMessage() });
- }
+ importedobjects = importFile(filename, enableMeshRepair);
+ addObjects(importedobjects);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
+
if (!appendFlag) ModellingApp.newWindow(theScene);
return;
}
- private void createAndAddObjectInfo(String objName, Object3D obj3d, Color col) {
+ private void createObjectInfo(String objName, Object3D obj3d, Color col) {
Texture tex;
if (col != null) {
tex = new UniformTexture();
@@ -180,7 +222,14 @@ public class DXFImporter {
info.setTexture(tex, tex.getDefaultMapping(obj3d));
info.addTrack(new PositionTrack(info), 0);
info.addTrack(new RotationTrack(info), 1);
- theScene.addObject(info, null);
+ this.importedobjects.add(info);
+ }
+
+ private static void addObjects(List<ObjectInfo> objects)
+ {
+ for (ObjectInfo info : objects) {
+ theScene.addObject(info, null);
+ }
}
private Boolean createCurve(DXFLayer mylayer, String objName) {
@@ -189,7 +238,7 @@ public class DXFImporter {
float smoothness[] = new float[verts.length];
Arrays.fill(smoothness, 0.0f);
Curve curve = new Curve(verts, smoothness, Mesh.NO_SMOOTHING, false);
- createAndAddObjectInfo(objName + "_curve" + i, curve, null);
+ createObjectInfo(objName + "_curve" + i, curve, null);
}
if (mylayer.polylines.size() > 0) return true;
else return false;
@@ -248,7 +297,7 @@ public class DXFImporter {
if (this.enableMeshRepair) mutil.fixCirality(fc);
TriangleMesh mesh = new TriangleMesh(vert, fc);
- createAndAddObjectInfo(objName, mesh, col);
+ createObjectInfo(objName, mesh, col);
return mesh;
}
return null;
@@ -392,22 +441,4 @@ public class DXFImporter {
}
return coords;
}
-
- /**
- * Separate a line into pieces divided by whitespace.
- *
- * @param line
- * an input String
- * @return String[] array of tokens
- */
- private static String[] splitLine(String line) {
- StringTokenizer st = new StringTokenizer(line);
- Vector v = new Vector();
-
- while (st.hasMoreTokens())
- v.addElement(st.nextToken());
- String result[] = new String[v.size()];
- v.copyInto(result);
- return result;
- }
}