diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 88990aed..aeb9a1a4 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -56,17 +56,17 @@ jobs: run: xvfb-run -s '-screen 0 1024x768x24' ./gradlew test - name: Test Bezier - run: xvfb-run -s '-screen 0 1024x768x24' java -Dprism.order=sw -Dprism.verbose=true -jar build/libs/bowler-kernel.jar -g https://gist.github.com/4aeeaa49bd3a807eed8f8ff3dea84c48.git BezierEditorDemo.groovy + run: xvfb-run -s '-screen 0 1024x768x24' java --enable-preview -Dprism.order=sw -Dprism.verbose=true -jar build/libs/bowler-kernel.jar -g https://gist.github.com/4aeeaa49bd3a807eed8f8ff3dea84c48.git BezierEditorDemo.groovy - name: start xvfb run: Xvfb :0 & - name: Test Local - run: xvfb-run -s '-screen 0 1024x768x24' java -Dprism.order=sw -Dprism.verbose=true -jar build/libs/bowler-kernel.jar -f kernel-return-test.groovy + run: xvfb-run -s '-screen 0 1024x768x24' java --enable-preview -Dprism.order=sw -Dprism.verbose=true -jar build/libs/bowler-kernel.jar -f kernel-return-test.groovy - name: Clean Cad run: rm -rf $HOME/bowler-workspace/gitcache/github.com/Hephaestus-Arm/HephaestusArm2 - name: build Cad - run: xvfb-run -s '-screen 0 1024x768x24' java -Dprism.order=sw -Dprism.verbose=true -jar build/libs/bowler-kernel.jar -g https://github.com/Hephaestus-Arm/HephaestusArm2.git hephaestus.xml + run: xvfb-run -s '-screen 0 1024x768x24' java --enable-preview -Dprism.order=sw -Dprism.verbose=true -jar build/libs/bowler-kernel.jar -g https://github.com/Hephaestus-Arm/HephaestusArm2.git hephaestus.xml diff --git a/GithubPasswordManager b/GithubPasswordManager index 9da2226c..3d25d7c7 160000 --- a/GithubPasswordManager +++ b/GithubPasswordManager @@ -1 +1 @@ -Subproject commit 9da2226c2553c0ede08a62bcf18c69e43175c2a6 +Subproject commit 3d25d7c7369b2c125db5f3235dfcd3a4d2ae5f90 diff --git a/JCSG b/JCSG index afceaf4a..17ad885f 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit afceaf4aac3a38b95435951071ed0e3650c76d28 +Subproject commit 17ad885fd1ac184cdd74f1ceb4be9c08a18543a7 diff --git a/build.gradle b/build.gradle index 58411e15..b5b485e0 100755 --- a/build.gradle +++ b/build.gradle @@ -385,7 +385,17 @@ task sourcesJar(type: Jar) { artifacts { archives javadocJar, sourcesJar, jar } +tasks.withType(JavaCompile).configureEach { + options.compilerArgs += ['--enable-preview'] +} +tasks.withType(Test).configureEach { + jvmArgs '--enable-preview' +} + +tasks.withType(JavaExec).configureEach { + jvmArgs '--enable-preview' +} //test { // testLogging.showExceptions = true // testLogging.showCauses = true diff --git a/java-bowler b/java-bowler index 5cd8a738..6e574848 160000 --- a/java-bowler +++ b/java-bowler @@ -1 +1 @@ -Subproject commit 5cd8a738c19534a0920f8588e20aa969e8400f9f +Subproject commit 6e574848d91bcf6653fe88d2c44922bae49b2384 diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/BowlerKernel.java b/src/main/java/com/neuronrobotics/bowlerstudio/BowlerKernel.java index b54c06f0..2c12253a 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/BowlerKernel.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/BowlerKernel.java @@ -56,6 +56,7 @@ import com.neuronrobotics.sdk.common.Log; import eu.mihosoft.vrl.v3d.CSG; +import eu.mihosoft.vrl.v3d.CSG.OptType; import eu.mihosoft.vrl.v3d.CSGServer; import eu.mihosoft.vrl.v3d.ICSGProgress; import eu.mihosoft.vrl.v3d.JavaFXInitializer; @@ -434,7 +435,7 @@ public static void startupProcedures() com.neuronrobotics.sdk.common.Log.error("ERROR No UI engine available"); } ScriptingEngine.waitForLogin(); - + CSG.setDefaultOptType(OptType.Manifold3d); CSGDatabase.setInstance(new CSGDatabaseInstance( new File(ScriptingEngine.getWorkspace().getAbsoluteFile() + "/csgDatabase.json"))); File logfile = new File(ScriptingEngine.getWorkspace().getAbsoluteFile() + "/kernelLog.txt"); diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java index fc69b5e0..13a5ccd1 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java @@ -26,6 +26,7 @@ import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; import com.neuronrobotics.sdk.addons.kinematics.VitaminLocation; import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR; +import com.neuronrobotics.sdk.common.Log; import eu.mihosoft.vrl.v3d.CSG; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabase; @@ -83,26 +84,31 @@ public void build(CaDoodleFile f) { dir.mkdirs(); stlFile = new File(absolutePath + delim() + type + ".stl"); if (stlFile.exists()) { - indicator = Vitamins.get(f.getCsgDBinstance(), stlFile); - getIndicator().setColor(Color.WHITE); - return; - } else { - AddRobotController arc = new AddRobotController().setController(this); - arc.setCaDoodleFile(f); - List so = arc.process(new ArrayList<>()); - for (CSG c : so) { - for (String s : c.getParameters(f.getCsgDBinstance())) { - f.getCsgDBinstance().delete(s); - } + try { + indicator = Vitamins.get(f.getCsgDBinstance(), false, stlFile); + getIndicator().setColor(Color.WHITE); + return; + } catch (Exception e) { + Log.error(e); + stlFile.delete(); } - indicator = so.get(0); - if (so.size() > 1) { - for (int i = 1; i < so.size(); i++) { - indicator = getIndicator().dumbUnion(so.get(i)); - } + + } + AddRobotController arc = new AddRobotController().setController(this); + arc.setCaDoodleFile(f); + List so = arc.process(new ArrayList<>()); + for (CSG c : so) { + for (String s : c.getParameters(f.getCsgDBinstance())) { + f.getCsgDBinstance().delete(s); + } + } + indicator = so.get(0); + if (so.size() > 1) { + for (int i = 1; i < so.size(); i++) { + indicator = getIndicator().dumbUnion(so.get(i)); } - getIndicator().setColor(Color.WHITE); } + getIndicator().setColor(Color.WHITE); } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java index 7f63af8b..8806800d 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java @@ -126,11 +126,17 @@ public void build(CaDoodleFile f) throws IOException { File imageFile = new File(absolutePath + delim() + type + name + ".png"); File stlFile = new File(absolutePath + delim() + type + name + ".stl"); if (imageFile.exists() && stlFile.exists()) { - indicator = Vitamins.get(f.getCsgDBinstance(), stlFile); - indicator = indicator.transformed(TransformFactory.nrToCSG(LimbRotationOffset)); - indicator.setColor(Color.WHITE); - image = new Image(imageFile.toURI().toString()); - return; + try { + indicator = Vitamins.get(f.getCsgDBinstance(), false, stlFile); + indicator = indicator.transformed(TransformFactory.nrToCSG(LimbRotationOffset)); + indicator.setColor(Color.WHITE); + image = new Image(imageFile.toURI().toString()); + return; + } catch (Exception e) { + Log.error("Failed to load cached STL, deleting " + stlFile.getAbsolutePath()); + Log.error(e); + stlFile.delete(); + } } AddRobotLimb add = new AddRobotLimb().setLimb(this).setLocation(new TransformNR()); add.setCaDoodleFile(f); diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java index 840fa503..066b9b82 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java @@ -11,8 +11,10 @@ import org.eclipse.jgit.api.errors.TransportException; import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; +import com.neuronrobotics.manifold3d.NonManifoldShapeError; import eu.mihosoft.vrl.v3d.CSG; +import eu.mihosoft.vrl.v3d.ColinearPointsException; import eu.mihosoft.vrl.v3d.FileUtil; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstance; import javafx.scene.paint.Color; @@ -24,7 +26,7 @@ public Object inlineScriptRun(CSGDatabaseInstance db, File code, ArrayList toCSG(CSGDatabaseInstance db, ArrayList params) - throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException { + throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException, + NonManifoldShapeError, ColinearPointsException { Path tempDir = Files.createTempDirectory("build123d-"); return toCSG(db, null, tempDir, params); } public static List toCSG(CSGDatabaseInstance db, Path stl, ArrayList params) - throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException { + throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException, + NonManifoldShapeError, ColinearPointsException { return toCSG(db, null, stl, params); } public static List toCSG(CSGDatabaseInstance db, File code, Path stl, ArrayList params) - throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException { + throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException, + NonManifoldShapeError, ColinearPointsException { toSTLFile(code, stl, params); ArrayList back = new ArrayList(); for (File f : stl.toFile().listFiles()) { Log.debug("Loading " + f); if (f.getName().toLowerCase().endsWith(".stl")) { - CSG b = Vitamins.get(db, f, true); + CSG b = Vitamins.get(db, true, f, true); b.setColor(Color.ANTIQUEWHITE); back.add(b); } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/FreecadLoader.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/FreecadLoader.java index c0f9c16b..d5cb267b 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/FreecadLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/FreecadLoader.java @@ -29,6 +29,7 @@ import com.google.gson.reflect.TypeToken; import com.neuronrobotics.bowlerstudio.physics.TransformFactory; import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; +import com.neuronrobotics.manifold3d.NonManifoldShapeError; import com.neuronrobotics.sdk.addons.kinematics.math.RotationNR; import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR; @@ -52,7 +53,7 @@ public Object inlineScriptRun(eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstanc File stl = File.createTempFile(code.getName(), ".stl"); stl.deleteOnExit(); toSTLFile(code, stl); - CSG back = Vitamins.get(db, stl, true); + CSG back = Vitamins.get(db, true, stl, true); //back.snapPoints(); back.setColor(Color.BLUE); back.setNoScale(true); @@ -237,9 +238,11 @@ public static void open(File freecadModel) { * @throws GitAPIException * @throws TransportException * @throws InvalidRemoteException + * @throws ColinearPointsException + * @throws NonManifoldShapeError */ - public static void main(String[] args) - throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException { + public static void main(String[] args) throws InvalidRemoteException, TransportException, GitAPIException, + IOException, InterruptedException, NonManifoldShapeError, ColinearPointsException { JavaFXInitializer.go(); PasswordManager.login(); FreecadLoader l = new FreecadLoader(); @@ -249,7 +252,7 @@ public static void main(String[] args) l.getDefaultContents(test); File stlToImport = ScriptingEngine.fileFromGit("https://github.com/NeuronRobotics/NASACurisoity.git", "STL/upper-arm.STL"); - CSG toSlice = Vitamins.get(null, stlToImport, true); + CSG toSlice = Vitamins.get(null, true, stlToImport, true); // toSlice=toSlice.union( // new Cube(20).toCSG() // .toXMin() diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/ObjLoader.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/ObjLoader.java index c107ea33..51a7b323 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/ObjLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/ObjLoader.java @@ -13,7 +13,7 @@ public class ObjLoader implements IScriptingLanguage { @Override public Object inlineScriptRun(eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstance db, File code, ArrayList args) throws Exception { - CSG sllLoaded = Vitamins.get(db, code); + CSG sllLoaded = Vitamins.get(db, true, code); return sllLoaded; } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/OpenSCADLoader.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/OpenSCADLoader.java index 82574062..98fb884c 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/OpenSCADLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/OpenSCADLoader.java @@ -31,7 +31,7 @@ public Object inlineScriptRun(eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstanc } toSTLFile(code, stl, params); - CSG back = Vitamins.get(db, stl, true); + CSG back = Vitamins.get(db, true, stl, true); back.setColor(Color.YELLOW); return back; } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/StlLoader.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/StlLoader.java index d205fb98..ef96c598 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/StlLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/StlLoader.java @@ -13,7 +13,7 @@ public class StlLoader implements IScriptingLanguage { @Override public Object inlineScriptRun(eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstance db, File code, ArrayList args) throws Exception { - CSG sllLoaded = Vitamins.get(db, code); + CSG sllLoaded = Vitamins.get(db, true, code); return sllLoaded; } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/cadoodle/CaDoodleFile.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/cadoodle/CaDoodleFile.java index 5c22337e..a5374804 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/cadoodle/CaDoodleFile.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/cadoodle/CaDoodleFile.java @@ -1286,6 +1286,8 @@ public void setOperations(ArrayList operations) { public TransformNR getWorkplane() { if (workplane == null) workplane = new TransformNR(); + RotationNR r = workplane.getRotation(); + r.normalize(); return workplane; } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java index 5612461f..22e9c241 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java @@ -11,10 +11,10 @@ import com.neuronrobotics.sdk.common.Log; import eu.mihosoft.vrl.v3d.CSG; +import eu.mihosoft.vrl.v3d.ColinearPointsException; import eu.mihosoft.vrl.v3d.Cube; import eu.mihosoft.vrl.v3d.STL; import eu.mihosoft.vrl.v3d.Transform; -import eu.mihosoft.vrl.v3d.parametrics.CSGDatabase; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstance; import eu.mihosoft.vrl.v3d.parametrics.StringParameter; import javafx.scene.paint.Color; @@ -27,6 +27,7 @@ //import com.neuronrobotics.bowlerstudio.util.FileChangeWatcher; //import com.neuronrobotics.bowlerstudio.util.IFileChangeListener; //import com.neuronrobotics.bowlerstudio.util.FileChangeWatcher; +import com.neuronrobotics.manifold3d.NonManifoldShapeError; import java.io.InputStream; import java.lang.reflect.Type; @@ -80,28 +81,30 @@ public static void clear() { fileLastLoaded.clear(); } - @Deprecated - public static CSG get(File resource) { - return get(CSGDatabase.getInstance(), resource, false); + public static CSG get(CSGDatabaseInstance db, File resource) throws NonManifoldShapeError, ColinearPointsException { + return get(db, true, resource, false); } - @Deprecated - public static CSG get(File resource, boolean forceRefresh) { - return get(CSGDatabase.getInstance(), resource, forceRefresh); + public static CSG get(CSGDatabaseInstance db, boolean fix, File resource) + throws NonManifoldShapeError, ColinearPointsException { + return get(db, fix, resource, false); } - public static CSG get(CSGDatabaseInstance db, File resource) { - return get(db, resource, false); + public static CSG get(CSGDatabaseInstance db, File resource, boolean forceRefresh) + throws NonManifoldShapeError, ColinearPointsException { + return get(db, true, resource, forceRefresh); + } - public static CSG get(CSGDatabaseInstance db, File resource, boolean forceRefresh) { + public static CSG get(CSGDatabaseInstance db, boolean fix, File resource, boolean forceRefresh) + throws NonManifoldShapeError, ColinearPointsException { if (fileLastLoaded.get(resource.getAbsolutePath()) == null || forceRefresh) { // forces the first time the files is accessed by the application tou pull an // update try { if (resource.getName().toLowerCase().endsWith(".stl")) - fileLastLoaded.put(resource.getAbsolutePath(), STL.file(resource.toPath())); + fileLastLoaded.put(resource.getAbsolutePath(), STL.file(resource.toPath(), fix)); // if(resource.getName().toLowerCase().endsWith(".obj")) // fileLastLoaded.put(resource.getAbsolutePath(), new ObjImporter(new // FileInputStream(resource)).); @@ -363,8 +366,13 @@ public static boolean saveDatabase(String type) throws Exception { + "\n\nAuto-save inside com.neuronrobotics.bowlerstudio.vitamins.Vitamins inside bowler-scripting-kernel");// commit // message // com.neuronrobotics.sdk.common.Log.error(jsonString); - // com.neuronrobotics.sdk.common.Log.error("Database saved " + - // getVitaminFile(type, null, false).getAbsolutePath()); + // com.neuronrobotics.sdk.common.Log.error("Database + // saved + // " + // + + // getVitaminFile(type, + // null, + // false).getAbsolutePath()); } catch (Exception ex) { if (ex.getMessage().contains("Cannot commit on a repo with state: MERGING")) { ScriptingEngine.deleteRepo(getGitRepoDatabase());