BowlerKernel
CadFileExporter.java
Go to the documentation of this file.
1 package com.neuronrobotics.bowlerstudio.creature;
2 
3 import java.io.File;
4 import java.io.IOException;
5 import java.nio.file.Paths;
6 import java.util.ArrayList;
7 import java.util.Collection;
8 import java.util.List;
9 import java.util.Set;
10 import org.apache.commons.io.FilenameUtils;
11 
12 import eu.mihosoft.vrl.v3d.CSG;
13 import eu.mihosoft.vrl.v3d.FileUtil;
14 import eu.mihosoft.vrl.v3d.JavaFXInitializer;
15 import eu.mihosoft.vrl.v3d.Transform;
16 import eu.mihosoft.vrl.v3d.svg.SVGExporter;
17 import javafx.scene.transform.Affine;
18 
19 public class CadFileExporter {
20 
21  IMobileBaseUI ui;
23  ui=myUI;
24  }
25  public CadFileExporter(){
26  ui=new IMobileBaseUI() {
27 
28  @Override
29  public void setSelectedCsg(Collection<CSG> selectedCsg) {
30  // TODO Auto-generated method stub
31 
32  }
33 
34  @Override
35  public void setAllCSG(Collection<CSG> toAdd, File source) {
36  // TODO Auto-generated method stub
37 
38  }
39 
40  @Override
41  public void highlightException(File fileEngineRunByName, Throwable ex) {
42  // TODO Auto-generated method stub
43 
44  }
45 
46  @Override
47  public Set<CSG> getVisibleCSGs() {
48  // TODO Auto-generated method stub
49  return null;
50  }
51 
52  @Override
53  public void addCSG(Collection<CSG> toAdd, File source) {
54  // TODO Auto-generated method stub
55 
56  }
57 
58  @Override
59  public void setSelected(Affine rootListener) {
60  // TODO Auto-generated method stub
61 
62  }
63  };
64  }
65  public ArrayList<File> generateManufacturingParts(List<CSG> totalAssembly , File baseDirForFiles) throws IOException {
66  ArrayList<File> allCadStl = new ArrayList<>();
67  if(!baseDirForFiles.isDirectory()){
68  String fileNameWithOutExt = FilenameUtils.removeExtension(baseDirForFiles.getAbsolutePath());
69  baseDirForFiles = new File(fileNameWithOutExt);
70  if (!baseDirForFiles.exists())
71  baseDirForFiles.mkdirs();
72  }
73  File dir;
74  if(!baseDirForFiles.getName().contentEquals("manufacturing")){
75  dir = new File(baseDirForFiles.getAbsolutePath() + "/manufacturing/");
76  if (!dir.exists())
77  dir.mkdirs();
78  }else{
79  dir=baseDirForFiles;
80  }
81  int index=0;
82  ArrayList<CSG> svgParts = new ArrayList<>();
83  String svgName =null;
84  String nameBase ="";
85  for(CSG part: totalAssembly){
86  String name = part.getName();
87  CSG manufactured = part.prepForManufacturing();
88  if( manufactured==null){
89  continue;
90  }
91  manufactured.setName(part.getName());
92  if(name.length()==0)
93  name="Part-Num-"+index;
94  nameBase = dir.getAbsolutePath()+"/"+name;
95  index++;
96  if(part.getExportFormats()==null){
97  try {
98  allCadStl.add(makeStl(nameBase,manufactured));// default to stl
99  }catch(Throwable t) {
100  System.err.println("Failed to generate "+part.getName());
101  t.printStackTrace();
102  }
103  }else{
104 
105  for(String format:part.getExportFormats()){
106  if(format.toLowerCase().contains("obj")){
107  allCadStl.add(makeObj(nameBase,manufactured));// default to stl
108  ui.setCsg(manufactured , null);
109  }
110  if(format.toLowerCase().contains("stl")){
111  allCadStl.add(makeStl(nameBase,manufactured));// default to stl
112  ui.setCsg(manufactured , null);
113  }
114  if(format.toLowerCase().contains("svg")){
115  if(svgName==null){
116  svgName =part.toString();
117  }
118  svgParts.add(manufactured);
119  ui.setAllCSG(svgParts , null);
120  }
121  }
122 
123  }
124  }
125  if(svgParts.size()>0){
126  allCadStl.add(makeSvg(nameBase,svgParts));// default to stl
127  }
128 
129  return allCadStl;
130  }
131  private File makeStl(String nameBase,CSG tmp ) throws IOException{
132  File stl = new File(nameBase + ".stl");
133 
134  FileUtil.write(Paths.get(stl.getAbsolutePath()), tmp.toStlString());
135  System.out.println("Writing "+stl.getAbsolutePath());
136  return stl;
137  }
138  private File makeObj(String nameBase,CSG tmp ) throws IOException{
139  File stl = new File(nameBase + ".obj");
140 
141  FileUtil.write(Paths.get(stl.getAbsolutePath()), tmp.toObjString());
142  System.out.println("Writing "+stl.getAbsolutePath());
143  return stl;
144  }
145 
146  private File makeSvg(String nameBase, List<CSG> currentCsg) throws IOException {
147  File stl = new File(nameBase + ".svg");
148 
149 
150  for (CSG csg : currentCsg) {
151  if (csg.getSlicePlanes() == null) {
152  csg.addSlicePlane(new Transform());
153  }
154  }
155  try {
156  try {
157  SVGExporter.export(currentCsg, stl);
158  } catch (Exception e) {
159  ArrayList<CSG> movedDown = new ArrayList<>();
160  for (CSG csg : currentCsg) {
161  CSG movez = csg.toZMin().movez(-0.01);
162  if (movez.getSlicePlanes() == null)
163  movez.addSlicePlane(new Transform());
164  movez.setName(csg.getName());
165  movedDown.add(movez);
166  }
167  SVGExporter.export(movedDown, stl);
168 
169  }
170 
171  System.out.println("Writing " + stl.getAbsolutePath());
172  } catch (Throwable t) {
173  System.err.println("ERROR, NO pixelization engine availible for slicing");
174  t.printStackTrace();
175  }
176 
177  return stl;
178  }
179 
180 }
File makeSvg(String nameBase, List< CSG > currentCsg)
ArrayList< File > generateManufacturingParts(List< CSG > totalAssembly, File baseDirForFiles)
CSG movez(Number howFarToMove)
Definition: CSG.java:439
CSG setName(String name)
Definition: CSG.java:2382
void addSlicePlane(Transform slicePlane)
Definition: CSG.java:2398
CSG prepForManufacturing()
Definition: CSG.java:179
CSG toZMin(CSG target)
Definition: CSG.java:298
ArrayList< Transform > getSlicePlanes()
Definition: CSG.java:2394
static void write(Path p, String s)
Definition: FileUtil.java:63
static void export(List< Polygon > polygons, File defaultDir, boolean groupAll)
default void setCsg(CSG toAdd, File source)
void setAllCSG(Collection< CSG > toAdd, File source)