From 899d06bcf911e24b9edba340500845d0fa1c2326 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Wed, 15 Apr 2026 19:58:28 -0400 Subject: [PATCH 01/15] Adding Manifold to the kernel --- JCSG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JCSG b/JCSG index 1a8aad39..6196ad1e 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit 1a8aad39fc398395a39d61d85fd2dfd027fb8a9b +Subproject commit 6196ad1efc098fc4ac5e5de4fca65ca8304f1682 From ce5f3d82a3cb17d5aec62f79cb0da4cb15f1a66a Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Thu, 16 Apr 2026 08:48:38 -0400 Subject: [PATCH 02/15] jcsg --- JCSG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JCSG b/JCSG index 6196ad1e..05a26329 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit 6196ad1efc098fc4ac5e5de4fca65ca8304f1682 +Subproject commit 05a26329faf71b06a8afe3d60ca7dcbe80a2c69a From 50990c412f520158c9fcab2db799ec1505914e80 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Thu, 16 Apr 2026 10:39:32 -0400 Subject: [PATCH 03/15] jcsg --- JCSG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JCSG b/JCSG index 05a26329..259e2797 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit 05a26329faf71b06a8afe3d60ca7dcbe80a2c69a +Subproject commit 259e2797132eaeb087069e899a5415cbea5213d4 From b8fbbba7012ce827953fc440af8fbcfa86a244e5 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Thu, 16 Apr 2026 11:37:18 -0400 Subject: [PATCH 04/15] formatting --- JCSG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JCSG b/JCSG index 259e2797..b20876e1 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit 259e2797132eaeb087069e899a5415cbea5213d4 +Subproject commit b20876e1443cfaddc88b29282ec73b65c9b08046 From 6ce8acace156c087a88f084d79cd63b9bbec784d Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Thu, 16 Apr 2026 13:18:18 -0400 Subject: [PATCH 05/15] add the preview feature --- build.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 From d32d2e7ce9f5a30a4a27ef5a19e9cdf8bc17a424 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Fri, 17 Apr 2026 09:58:33 -0400 Subject: [PATCH 06/15] add --enable-preview to launch --- .github/workflows/verify.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 From 9269833c274622789d8b4ba8b5efa1f4e40489cd Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Fri, 17 Apr 2026 10:15:55 -0400 Subject: [PATCH 07/15] make the kernel use manifold --- .../java/com/neuronrobotics/bowlerstudio/BowlerKernel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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"); From e558040632bff8e546d6afd87b52b50b5382306f Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Fri, 17 Apr 2026 10:30:22 -0400 Subject: [PATCH 08/15] update format --- GithubPasswordManager | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GithubPasswordManager b/GithubPasswordManager index 9da2226c..3d25d7c7 160000 --- a/GithubPasswordManager +++ b/GithubPasswordManager @@ -1 +1 @@ -Subproject commit 9da2226c2553c0ede08a62bcf18c69e43175c2a6 +Subproject commit 3d25d7c7369b2c125db5f3235dfcd3a4d2ae5f90 From 0978d7f9a83c9402e058ae8ed378e42d7555b6c2 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Sat, 18 Apr 2026 13:18:37 -0400 Subject: [PATCH 09/15] formatting --- JCSG | 2 +- .../creature/ControllerOption.java | 43 +++++++++++-------- .../bowlerstudio/creature/LimbOption.java | 15 ++++--- .../bowlerstudio/scripting/BlenderLoader.java | 31 ++++++++----- .../scripting/Build123dLoader.java | 10 +++-- .../bowlerstudio/scripting/FreecadLoader.java | 9 ++-- .../bowlerstudio/scripting/ObjLoader.java | 2 +- .../scripting/OpenSCADLoader.java | 2 +- .../bowlerstudio/scripting/StlLoader.java | 2 +- .../bowlerstudio/vitamins/Vitamins.java | 19 +++----- 10 files changed, 77 insertions(+), 58 deletions(-) diff --git a/JCSG b/JCSG index b20876e1..3f8ab493 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit b20876e1443cfaddc88b29282ec73b65c9b08046 +Subproject commit 3f8ab49339dd53d1be9b688d92c4944ed2bfbc5f diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java index fc69b5e0..259c0475 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); } @@ -174,7 +180,8 @@ public static ArrayList getOptions() String content = FileUtils.readFileToString(f, StandardCharsets.UTF_8); return gson.fromJson(content, TT_CaDoodleFile); } catch (Exception ex) { - com.neuronrobotics.sdk.common.Log.error(ex);; + com.neuronrobotics.sdk.common.Log.error(ex); + ; return new ArrayList(); } } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java index 7f63af8b..aab3c575 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java @@ -126,11 +126,16 @@ 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(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..366d6f23 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..9f82e8d8 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 { + 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..0857ffb0 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..2a5e4ecf 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..483b090b 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/vitamins/Vitamins.java b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java index 5612461f..ccb54ee6 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java @@ -11,6 +11,7 @@ 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; @@ -27,6 +28,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 +82,19 @@ public static void clear() { fileLastLoaded.clear(); } - @Deprecated - public static CSG get(File resource) { - return get(CSGDatabase.getInstance(), resource, false); - } - - @Deprecated - public static CSG get(File resource, boolean forceRefresh) { - return get(CSGDatabase.getInstance(), resource, forceRefresh); - } - public static CSG get(CSGDatabaseInstance db, File resource) { - return get(db, resource, false); + 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, 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)).); From a2f873f7d3a30d56f57606009f4897c7385ef9b0 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Sat, 18 Apr 2026 13:27:12 -0400 Subject: [PATCH 10/15] formatting --- JCSG | 2 +- .../bowlerstudio/creature/ControllerOption.java | 3 +-- .../bowlerstudio/creature/LimbOption.java | 4 ++-- .../bowlerstudio/scripting/BlenderLoader.java | 6 +++--- .../bowlerstudio/scripting/Build123dLoader.java | 11 +++++++---- .../bowlerstudio/scripting/FreecadLoader.java | 12 ++++++------ .../bowlerstudio/scripting/ObjLoader.java | 2 +- .../bowlerstudio/scripting/OpenSCADLoader.java | 2 +- .../bowlerstudio/scripting/StlLoader.java | 2 +- .../bowlerstudio/vitamins/Vitamins.java | 11 ++++++----- 10 files changed, 29 insertions(+), 26 deletions(-) diff --git a/JCSG b/JCSG index 3f8ab493..17ad885f 160000 --- a/JCSG +++ b/JCSG @@ -1 +1 @@ -Subproject commit 3f8ab49339dd53d1be9b688d92c4944ed2bfbc5f +Subproject commit 17ad885fd1ac184cdd74f1ceb4be9c08a18543a7 diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java index 259c0475..13a5ccd1 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/ControllerOption.java @@ -180,8 +180,7 @@ public static ArrayList getOptions() String content = FileUtils.readFileToString(f, StandardCharsets.UTF_8); return gson.fromJson(content, TT_CaDoodleFile); } catch (Exception ex) { - com.neuronrobotics.sdk.common.Log.error(ex); - ; + com.neuronrobotics.sdk.common.Log.error(ex);; return new ArrayList(); } } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java index aab3c575..aad774fa 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java @@ -127,12 +127,12 @@ public void build(CaDoodleFile f) throws IOException { File stlFile = new File(absolutePath + delim() + type + name + ".stl"); if (imageFile.exists() && stlFile.exists()) { try { - indicator = Vitamins.get(f.getCsgDBinstance(),false, stlFile); + 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) { + } catch (Exception e) { Log.error(e); stlFile.delete(); } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java index 366d6f23..066b9b82 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/BlenderLoader.java @@ -26,7 +26,7 @@ public Object inlineScriptRun(CSGDatabaseInstance db, File code, ArrayList toCSG(CSGDatabaseInstance db, ArrayList params) - throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException, NonManifoldShapeError, ColinearPointsException { + 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, NonManifoldShapeError, ColinearPointsException { + 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, NonManifoldShapeError, ColinearPointsException { + 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,true, 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 9f82e8d8..d5cb267b 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/scripting/FreecadLoader.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/scripting/FreecadLoader.java @@ -53,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,true, stl, true); + CSG back = Vitamins.get(db, true, stl, true); //back.snapPoints(); back.setColor(Color.BLUE); back.setNoScale(true); @@ -238,11 +238,11 @@ public static void open(File freecadModel) { * @throws GitAPIException * @throws TransportException * @throws InvalidRemoteException - * @throws ColinearPointsException - * @throws NonManifoldShapeError + * @throws ColinearPointsException + * @throws NonManifoldShapeError */ - public static void main(String[] args) - throws InvalidRemoteException, TransportException, GitAPIException, IOException, InterruptedException, NonManifoldShapeError, ColinearPointsException { + public static void main(String[] args) throws InvalidRemoteException, TransportException, GitAPIException, + IOException, InterruptedException, NonManifoldShapeError, ColinearPointsException { JavaFXInitializer.go(); PasswordManager.login(); FreecadLoader l = new FreecadLoader(); @@ -252,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,true, 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 0857ffb0..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, true,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 2a5e4ecf..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,true, 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 483b090b..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, true,code); + CSG sllLoaded = Vitamins.get(db, true, code); return sllLoaded; } diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java index ccb54ee6..f1e7928f 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java @@ -15,7 +15,6 @@ 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; @@ -83,18 +82,20 @@ public static void clear() { } - 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, boolean fix, File resource) + throws NonManifoldShapeError, ColinearPointsException { + return get(db, fix, resource, false); } - public static CSG get(CSGDatabaseInstance db, boolean fix,File resource, boolean forceRefresh ) throws NonManifoldShapeError, ColinearPointsException { + 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(),fix)); + fileLastLoaded.put(resource.getAbsolutePath(), STL.file(resource.toPath(), fix)); // if(resource.getName().toLowerCase().endsWith(".obj")) // fileLastLoaded.put(resource.getAbsolutePath(), new ObjImporter(new // FileInputStream(resource)).); From dbe62f41d0e346625f5bc7331bdc0353872fa85d Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Sat, 18 Apr 2026 14:40:39 -0400 Subject: [PATCH 11/15] add legacy API --- .../bowlerstudio/vitamins/Vitamins.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java index f1e7928f..22e9c241 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/vitamins/Vitamins.java @@ -81,12 +81,21 @@ public static void clear() { fileLastLoaded.clear(); } + public static CSG get(CSGDatabaseInstance db, File resource) throws NonManifoldShapeError, ColinearPointsException { + return get(db, true, resource, false); + } 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, boolean forceRefresh) + throws NonManifoldShapeError, ColinearPointsException { + return get(db, true, resource, forceRefresh); + + } + public static CSG get(CSGDatabaseInstance db, boolean fix, File resource, boolean forceRefresh) throws NonManifoldShapeError, ColinearPointsException { @@ -357,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()); From 03b4581d3e58bc3a3dbd6f5899839b0414982c62 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Tue, 21 Apr 2026 10:19:19 -0400 Subject: [PATCH 12/15] adding prints to cache delete --- .../com/neuronrobotics/bowlerstudio/creature/LimbOption.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java index aad774fa..ee15543f 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java @@ -133,6 +133,7 @@ public void build(CaDoodleFile f) throws IOException { 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(); } From 28c581440eceaf0eea37ce6345a700f8d3bd8e56 Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Tue, 21 Apr 2026 10:24:01 -0400 Subject: [PATCH 13/15] formatting --- .../com/neuronrobotics/bowlerstudio/creature/LimbOption.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java index ee15543f..8806800d 100644 --- a/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java +++ b/src/main/java/com/neuronrobotics/bowlerstudio/creature/LimbOption.java @@ -133,7 +133,7 @@ public void build(CaDoodleFile f) throws IOException { image = new Image(imageFile.toURI().toString()); return; } catch (Exception e) { - Log.error("Failed to load cached STL, deleting "+stlFile.getAbsolutePath()); + Log.error("Failed to load cached STL, deleting " + stlFile.getAbsolutePath()); Log.error(e); stlFile.delete(); } From bb8ae87250b1700ba956ded9e3e8eba582c4132a Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Tue, 21 Apr 2026 15:19:44 -0400 Subject: [PATCH 14/15] ensure teh workplane has a normalised rotation --- java-bowler | 2 +- .../bowlerstudio/scripting/cadoodle/CaDoodleFile.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/java-bowler b/java-bowler index 5cd8a738..a6de96cf 160000 --- a/java-bowler +++ b/java-bowler @@ -1 +1 @@ -Subproject commit 5cd8a738c19534a0920f8588e20aa969e8400f9f +Subproject commit a6de96cfb3a856765b9df0507272aef83944be9e 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..a72d4b62 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; } From 03793e99f9c8e236f04dcc1317309b4dd01b148d Mon Sep 17 00:00:00 2001 From: Kevin Harrington Date: Tue, 21 Apr 2026 15:28:08 -0400 Subject: [PATCH 15/15] formatting --- java-bowler | 2 +- .../bowlerstudio/scripting/cadoodle/CaDoodleFile.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java-bowler b/java-bowler index a6de96cf..6e574848 160000 --- a/java-bowler +++ b/java-bowler @@ -1 +1 @@ -Subproject commit a6de96cfb3a856765b9df0507272aef83944be9e +Subproject commit 6e574848d91bcf6653fe88d2c44922bae49b2384 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 a72d4b62..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,7 +1286,7 @@ public void setOperations(ArrayList operations) { public TransformNR getWorkplane() { if (workplane == null) workplane = new TransformNR(); - RotationNR r=workplane.getRotation(); + RotationNR r = workplane.getRotation(); r.normalize(); return workplane; }