From befa992ddc1ba5a926f63c3a553aa7ec683b0029 Mon Sep 17 00:00:00 2001 From: aymanhab Date: Fri, 22 May 2026 10:39:49 -0700 Subject: [PATCH 01/18] Refactor loading of data files to preview to facilitate reuse --- .../view/motions/FileLoadDataAction.java | 65 ++------------ .../org/opensim/view/motions/MotionsDB.java | 84 +++++++++++++++++++ 2 files changed, 89 insertions(+), 60 deletions(-) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java b/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java index 85d77b325..900e7ce81 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java @@ -26,24 +26,10 @@ * * @author ayman */ -import java.io.File; -import java.io.IOException; -import org.openide.DialogDisplayer; -import org.openide.NotifyDescriptor; -import org.openide.util.Exceptions; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; -import org.opensim.modeling.DataTable; -import org.opensim.modeling.MarkerData; -import org.opensim.view.experimentaldata.ModelForExperimentalData; -import org.opensim.modeling.Storage; -import org.opensim.modeling.TimeSeriesTableQuaternion; -import org.opensim.modeling.Units; -import org.opensim.utils.ErrorDialog; import org.opensim.utils.FileUtils; -import org.opensim.view.experimentaldata.AnnotatedMotion; -import org.opensim.view.pub.OpenSimDB; public final class FileLoadDataAction extends CallableSystemAction { static int nextNumber=0; @@ -52,57 +38,16 @@ public void performAction() { String fileName = FileUtils.getInstance().browseForFilename(".trc,.mot,.sto", "Experimental data file"); if (fileName != null){ if (fileName.toLowerCase().endsWith(".trc")){ - MarkerData markerData; - try { - markerData = new MarkerData(fileName); - Storage newStorage = new Storage(); - markerData.makeRdStorage(newStorage); - AnnotatedMotion amot = new AnnotatedMotion(newStorage, markerData.getMarkerNames()); - amot.setUnitConversion(markerData.getUnits().convertTo(Units.UnitType.Meters)); - amot.setName(new File(fileName).getName()); - amot.setDataRate(markerData.getDataRate()); - amot.setCameraRate(markerData.getCameraRate()); - amot.setUnits(markerData.getUnits()); - // Add the visuals to support it - ModelForExperimentalData modelForDataImport = new ModelForExperimentalData(nextNumber++, amot); - modelForDataImport.initSystem(); - amot.setModel(modelForDataImport); - modelForDataImport.addMotionObjects(amot.getClassified()); - OpenSimDB.getInstance().addModel(modelForDataImport); - MotionsDB.getInstance().addMotion(modelForDataImport, amot, null); - MotionsDB.getInstance().saveStorageFileName(amot, fileName); - } catch (IOException ex) { - NotifyDescriptor.Message dlg = - new NotifyDescriptor.Message("Couldn't load data and/or model for display.\n"+ - "Possible reasons: data file has incorrect format or issues with file path."); - DialogDisplayer.getDefault().notify(dlg); - } + MotionsDB.getInstance().loadTrcFile(fileName); } else if (fileName.toLowerCase().endsWith(".mot")||fileName.toLowerCase().endsWith(".sto")){ - Storage newStorage=null; - try { - newStorage = new Storage(fileName); - } catch (IOException ex) { - System.out.println("Failed to construct storage from "+fileName+". Previewing is aborted."); - ex.printStackTrace(); - } - AnnotatedMotion amot = new AnnotatedMotion(newStorage); - - amot.setName(new File(fileName).getName()); - ModelForExperimentalData modelForDataImport=null; - try { - modelForDataImport = new ModelForExperimentalData(nextNumber++, amot); - OpenSimDB.getInstance().addModel(modelForDataImport); - } catch (IOException ex) { - ErrorDialog.displayExceptionDialog(ex); - return; - } - amot.setModel(modelForDataImport); - MotionsDB.getInstance().addMotion(modelForDataImport, amot, null); - MotionsDB.getInstance().saveStorageFileName(amot, fileName); + if (MotionsDB.getInstance().loadMotFile(fileName)) { + return; + } } } } + public String getName() { return NbBundle.getMessage(FileLoadDataAction.class, "CTL_FileLoadDataAction"); diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index b9ddb80d9..5a941d7ee 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -29,6 +29,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.BitSet; @@ -42,12 +43,15 @@ import org.openide.NotifyDescriptor; import org.openide.awt.StatusDisplayer; import org.openide.nodes.Node; +import org.openide.util.Exceptions; import org.opensim.modeling.Model; import org.opensim.modeling.ArrayStr; import org.opensim.modeling.CoordinateSet; +import org.opensim.modeling.MarkerData; import org.opensim.view.experimentaldata.ModelForExperimentalData; import org.opensim.modeling.OpenSimObject; import org.opensim.modeling.Storage; +import org.opensim.modeling.Units; import org.opensim.utils.ErrorDialog; import org.opensim.utils.FileUtils; import org.opensim.view.ExplorerTopComponent; @@ -188,6 +192,34 @@ public void loadMotionStorage(Storage newMotion, boolean primary, String filePat MotionsDB.getInstance().saveStorageFileName(aMot, filePath); } } + else { // Use current motion, we maybe doing this thru a script + if (currentMotions.size()==1){ + Model model = currentMotions.get(0).model; + Storage primaryMot = currentMotions.get(0).motion; + if (filePath.endsWith(".trc")){ + try { + MarkerData markerData = new MarkerData(filePath); + Storage newStorage = new Storage(); + markerData.makeRdStorage(newStorage); + AnnotatedMotion amot = new AnnotatedMotion(newStorage, markerData.getMarkerNames()); + amot.setUnitConversion(markerData.getUnits().convertTo(Units.UnitType.Meters)); + amot.setName(new File(filePath).getName()); + amot.setDataRate(markerData.getDataRate()); + amot.setCameraRate(markerData.getCameraRate()); + addMotion(model, newMotion, primaryMot); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } + else { + AnnotatedMotion aMot = new AnnotatedMotion(newMotion); + aMot.setModel(model); + addMotion(model, aMot, primaryMot); + MotionsDB.getInstance().saveStorageFileName(aMot, filePath); + } + } + + } } } @@ -613,4 +645,56 @@ else if (numMotions==1) } } + + + public boolean loadMotFile(String fileName) { + Storage newStorage = null; + try { + newStorage = new Storage(fileName); + } catch (IOException ex) { + System.out.println("Failed to construct storage from " + fileName + ". Previewing is aborted."); + ex.printStackTrace(); + } + AnnotatedMotion amot = new AnnotatedMotion(newStorage); + amot.setName(new File(fileName).getName()); + ModelForExperimentalData modelForDataImport = null; + try { + modelForDataImport = new ModelForExperimentalData(FileLoadDataAction.nextNumber++, amot); + OpenSimDB.getInstance().addModel(modelForDataImport); + } catch (IOException ex) { + ErrorDialog.displayExceptionDialog(ex); + return true; + } + amot.setModel(modelForDataImport); + MotionsDB.getInstance().addMotion(modelForDataImport, amot, null); + MotionsDB.getInstance().saveStorageFileName(amot, fileName); + return false; + } + + public void loadTrcFile(String fileName) { + MarkerData markerData; + try { + markerData = new MarkerData(fileName); + Storage newStorage = new Storage(); + markerData.makeRdStorage(newStorage); + AnnotatedMotion amot = new AnnotatedMotion(newStorage, markerData.getMarkerNames()); + amot.setUnitConversion(markerData.getUnits().convertTo(Units.UnitType.Meters)); + amot.setName(new File(fileName).getName()); + amot.setDataRate(markerData.getDataRate()); + amot.setCameraRate(markerData.getCameraRate()); + amot.setUnits(markerData.getUnits()); + // Add the visuals to support it + ModelForExperimentalData modelForDataImport = new ModelForExperimentalData(FileLoadDataAction.nextNumber++, amot); + modelForDataImport.initSystem(); + amot.setModel(modelForDataImport); + modelForDataImport.addMotionObjects(amot.getClassified()); + OpenSimDB.getInstance().addModel(modelForDataImport); + MotionsDB.getInstance().addMotion(modelForDataImport, amot, null); + MotionsDB.getInstance().saveStorageFileName(amot, fileName); + } catch (IOException ex) { + NotifyDescriptor.Message dlg = new NotifyDescriptor.Message("Couldn't load data and/or model for display.\n" + "Possible reasons: data file has incorrect format or issues with file path."); + DialogDisplayer.getDefault().notify(dlg); + } + } + } From dc4f78a1ce6089e64ec73ac142804f99e24efa89 Mon Sep 17 00:00:00 2001 From: aymanhab Date: Thu, 4 Jun 2026 10:00:29 -0700 Subject: [PATCH 02/18] Fix handling of trc files when associating through API calls --- Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index 5a941d7ee..cf6bfb8ca 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -206,7 +206,7 @@ public void loadMotionStorage(Storage newMotion, boolean primary, String filePat amot.setName(new File(filePath).getName()); amot.setDataRate(markerData.getDataRate()); amot.setCameraRate(markerData.getCameraRate()); - addMotion(model, newMotion, primaryMot); + addMotion(model, amot, primaryMot); } catch (IOException ex) { Exceptions.printStackTrace(ex); } From abb8d9232142d00f993010af82034735b10364ba Mon Sep 17 00:00:00 2001 From: aymanhab Date: Thu, 4 Jun 2026 13:47:08 -0700 Subject: [PATCH 03/18] Select motion node before associating so that associated motions show properly in navigator --- Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index cf6bfb8ca..856cc9e05 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -196,6 +196,7 @@ public void loadMotionStorage(Storage newMotion, boolean primary, String filePat if (currentMotions.size()==1){ Model model = currentMotions.get(0).model; Storage primaryMot = currentMotions.get(0).motion; + ExplorerTopComponent.findInstance().selectNodeForObject(primaryMot); if (filePath.endsWith(".trc")){ try { MarkerData markerData = new MarkerData(filePath); From ce66dc16bc356bb10a767e53ff1b4d67339c3608 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 10 Jun 2026 12:06:23 -0700 Subject: [PATCH 04/18] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index 856cc9e05..543796d2f 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -207,6 +207,7 @@ public void loadMotionStorage(Storage newMotion, boolean primary, String filePat amot.setName(new File(filePath).getName()); amot.setDataRate(markerData.getDataRate()); amot.setCameraRate(markerData.getCameraRate()); + amot.setModel(model); addMotion(model, amot, primaryMot); } catch (IOException ex) { Exceptions.printStackTrace(ex); From 72a8c624a4c1d785c74e9dc37ceadff953d13fb1 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 10 Jun 2026 12:06:39 -0700 Subject: [PATCH 05/18] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index 543796d2f..6376e51bf 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -197,7 +197,7 @@ public void loadMotionStorage(Storage newMotion, boolean primary, String filePat Model model = currentMotions.get(0).model; Storage primaryMot = currentMotions.get(0).motion; ExplorerTopComponent.findInstance().selectNodeForObject(primaryMot); - if (filePath.endsWith(".trc")){ + if (filePath.toLowerCase().endsWith(".trc")){ try { MarkerData markerData = new MarkerData(filePath); Storage newStorage = new Storage(); From 7afd6ad9bf676634ba7d259cb2ebc7fd41ec0e87 Mon Sep 17 00:00:00 2001 From: aymanhab Date: Wed, 10 Jun 2026 12:10:54 -0700 Subject: [PATCH 06/18] minor cleanup per PR review --- .../src/org/opensim/view/motions/FileLoadDataAction.java | 4 +--- .../view/src/org/opensim/view/motions/MotionsDB.java | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java b/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java index 900e7ce81..34d28a4ee 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/FileLoadDataAction.java @@ -41,9 +41,7 @@ public void performAction() { MotionsDB.getInstance().loadTrcFile(fileName); } else if (fileName.toLowerCase().endsWith(".mot")||fileName.toLowerCase().endsWith(".sto")){ - if (MotionsDB.getInstance().loadMotFile(fileName)) { - return; - } + MotionsDB.getInstance().loadMotFile(fileName); } } } diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index 856cc9e05..ab27b3c49 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -648,13 +648,14 @@ else if (numMotions==1) } - public boolean loadMotFile(String fileName) { + public void loadMotFile(String fileName) { Storage newStorage = null; try { newStorage = new Storage(fileName); } catch (IOException ex) { System.out.println("Failed to construct storage from " + fileName + ". Previewing is aborted."); - ex.printStackTrace(); + ErrorDialog.displayExceptionDialog(ex); + return; } AnnotatedMotion amot = new AnnotatedMotion(newStorage); amot.setName(new File(fileName).getName()); @@ -664,12 +665,11 @@ public boolean loadMotFile(String fileName) { OpenSimDB.getInstance().addModel(modelForDataImport); } catch (IOException ex) { ErrorDialog.displayExceptionDialog(ex); - return true; + return; } amot.setModel(modelForDataImport); MotionsDB.getInstance().addMotion(modelForDataImport, amot, null); MotionsDB.getInstance().saveStorageFileName(amot, fileName); - return false; } public void loadTrcFile(String fileName) { From 83a5f12d06913f710542041a6afd693b70b0e9e9 Mon Sep 17 00:00:00 2001 From: aymanhab Date: Wed, 10 Jun 2026 12:26:38 -0700 Subject: [PATCH 07/18] Undo change made by during merge --- Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java index 874d611b6..50ef3e1b7 100644 --- a/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java +++ b/Gui/opensim/view/src/org/opensim/view/motions/MotionsDB.java @@ -207,7 +207,7 @@ public void loadMotionStorage(Storage newMotion, boolean primary, String filePat amot.setName(new File(filePath).getName()); amot.setDataRate(markerData.getDataRate()); amot.setCameraRate(markerData.getCameraRate()); - amot.setModel(model); + addMotion(model, amot, primaryMot); } catch (IOException ex) { Exceptions.printStackTrace(ex); From b517747de6205488bfa5a2696c8b9a92d87624c3 Mon Sep 17 00:00:00 2001 From: aymanhab Date: Wed, 10 Jun 2026 17:31:24 -0700 Subject: [PATCH 08/18] Update browser commit --- opensim-visualizer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensim-visualizer b/opensim-visualizer index 68cc40bb9..5f6ec09f0 160000 --- a/opensim-visualizer +++ b/opensim-visualizer @@ -1 +1 @@ -Subproject commit 68cc40bb9da6f4f4f267b8323df829c96f172915 +Subproject commit 5f6ec09f0916f4bdf13f6af3691e187be411f1b1 From 4edbaf7fb806b10f966ad9f97ce2e1c86eff5f46 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 10 Jun 2026 18:41:45 -0700 Subject: [PATCH 09/18] Update NBM download links in CI workflow Updated download links for the NBM file to include both versioned and untagged releases. --- .github/workflows/continuous-integration.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 84e574025..fb0a377b3 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -163,7 +163,7 @@ jobs: New-Item -ItemType Directory -Force -Path $nbmDir # Download the NBM file - Invoke-WebRequest -Uri "https://github.com/opensim-org/opensim-visualizer/releases/download/v4.6.0/org-opensim-javabrowser.nbm" ` + Invoke-WebRequest -Uri "https://github.com/opensim-org/opensim-visualizer/releases/download/untagged-d792989149341bdcb7b7/org-opensim-javabrowser.nbm" ` -OutFile "$nbmDir\org-opensim-javabrowser.nbm" # Extract the NBM @@ -354,7 +354,7 @@ jobs: mkdir -p "$NBM_DIR" # Download the NBM file - curl -L "https://github.com/opensim-org/opensim-visualizer/releases/download/v4.6.0/org-opensim-javabrowser.nbm" \ + curl -L "https://github.com/opensim-org/opensim-visualizer/releases/download/untagged-d792989149341bdcb7b7/org-opensim-javabrowser.nbm" \ -o "$NBM_DIR/org-opensim-javabrowser.nbm" # Extract the NBM (nbm is a zip) @@ -517,7 +517,7 @@ jobs: # Download the NBM file pinned to version v4.6.0 wget -O "$NBM_DIR/org-opensim-javabrowser.nbm" \ - "https://github.com/opensim-org/opensim-visualizer/releases/download/v4.6.0/org-opensim-javabrowser.nbm" + "https://github.com/opensim-org/opensim-visualizer/releases/download/untagged-d792989149341bdcb7b7/org-opensim-javabrowser.nbm" # Extract the NBM (nbm is a zip) mkdir -p "$EXTRACT_DIR" From 8689fccc3a03404f854cd1486acd7c4e3016c993 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Mon, 15 Jun 2026 09:41:47 -0700 Subject: [PATCH 10/18] Update NBM download URLs to latest version --- .github/workflows/continuous-integration.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index fb0a377b3..89cb41d20 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -163,7 +163,7 @@ jobs: New-Item -ItemType Directory -Force -Path $nbmDir # Download the NBM file - Invoke-WebRequest -Uri "https://github.com/opensim-org/opensim-visualizer/releases/download/untagged-d792989149341bdcb7b7/org-opensim-javabrowser.nbm" ` + Invoke-WebRequest -Uri "https://github.com/opensim-org/opensim-visualizer/releases/download/v4.6.1.dev/org-opensim-javabrowser.nbm" ` -OutFile "$nbmDir\org-opensim-javabrowser.nbm" # Extract the NBM @@ -354,7 +354,7 @@ jobs: mkdir -p "$NBM_DIR" # Download the NBM file - curl -L "https://github.com/opensim-org/opensim-visualizer/releases/download/untagged-d792989149341bdcb7b7/org-opensim-javabrowser.nbm" \ + curl -L "https://github.com/opensim-org/opensim-visualizer/releases/download/v4.6.1.dev/org-opensim-javabrowser.nbm" \ -o "$NBM_DIR/org-opensim-javabrowser.nbm" # Extract the NBM (nbm is a zip) @@ -517,7 +517,7 @@ jobs: # Download the NBM file pinned to version v4.6.0 wget -O "$NBM_DIR/org-opensim-javabrowser.nbm" \ - "https://github.com/opensim-org/opensim-visualizer/releases/download/untagged-d792989149341bdcb7b7/org-opensim-javabrowser.nbm" + "https://github.com/opensim-org/opensim-visualizer/releases/download/v4.6.1.dev/org-opensim-javabrowser.nbm" # Extract the NBM (nbm is a zip) mkdir -p "$EXTRACT_DIR" From 6d2e72b49335fed59c76ad8709fccaeb79f188d2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Jun 2026 18:06:28 +0000 Subject: [PATCH 11/18] Fix Windows CI installer step: explicitly copy make_installer.nsi --- .github/workflows/continuous-integration.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 89cb41d20..a70d4ae74 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -193,6 +193,17 @@ jobs: - name: Build GUI installer run: | + $version = "${{ steps.build-gui.outputs.version }}" + $installerDir = "$env:GITHUB_WORKSPACE\Gui\opensim\dist\installer" + + # Ensure make_installer.nsi is present (copy-installer-files may have failed silently) + if (-not (Test-Path "$installerDir\make_installer.nsi")) { + Copy-Item "Gui\opensim\installer_files\Windows\make_installer.nsi" ` + "$installerDir\make_installer.nsi" -Force + (Get-Content "$installerDir\make_installer.nsi") -replace '@VERSION@', $version | ` + Set-Content "$installerDir\make_installer.nsi" + } + cd Gui/opensim/dist/installer makensis.exe make_installer.nsi mv OpenSim-${{ steps.build-gui.outputs.version }}-win64.exe $env:GITHUB_WORKSPACE From b905a356e929a45dcf1393ad6c60c1a9e8501e5c Mon Sep 17 00:00:00 2001 From: aymanhab Date: Mon, 15 Jun 2026 11:32:45 -0700 Subject: [PATCH 12/18] update opensim-visualizer commit --- opensim-visualizer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensim-visualizer b/opensim-visualizer index 5f6ec09f0..097c005a3 160000 --- a/opensim-visualizer +++ b/opensim-visualizer @@ -1 +1 @@ -Subproject commit 5f6ec09f0916f4bdf13f6af3691e187be411f1b1 +Subproject commit 097c005a3412e1e8f8bdc3c6098511f620deba7b From 3c3665e7c26a635bd2b14a904aa47d9f2e993104 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Mon, 15 Jun 2026 13:14:55 -0700 Subject: [PATCH 13/18] Simplify GUI installer build process Removed unnecessary steps for copying and modifying make_installer.nsi in the build process. --- .github/workflows/continuous-integration.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index a70d4ae74..89cb41d20 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -193,17 +193,6 @@ jobs: - name: Build GUI installer run: | - $version = "${{ steps.build-gui.outputs.version }}" - $installerDir = "$env:GITHUB_WORKSPACE\Gui\opensim\dist\installer" - - # Ensure make_installer.nsi is present (copy-installer-files may have failed silently) - if (-not (Test-Path "$installerDir\make_installer.nsi")) { - Copy-Item "Gui\opensim\installer_files\Windows\make_installer.nsi" ` - "$installerDir\make_installer.nsi" -Force - (Get-Content "$installerDir\make_installer.nsi") -replace '@VERSION@', $version | ` - Set-Content "$installerDir\make_installer.nsi" - } - cd Gui/opensim/dist/installer makensis.exe make_installer.nsi mv OpenSim-${{ steps.build-gui.outputs.version }}-win64.exe $env:GITHUB_WORKSPACE From a9ce911eaa2f52f3e3fa58d135ece27410a494fd Mon Sep 17 00:00:00 2001 From: aymanhab Date: Tue, 16 Jun 2026 12:26:26 -0700 Subject: [PATCH 14/18] backport fix to jdk finding on windows --- .github/workflows/continuous-integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 89cb41d20..1b7ad4f85 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -55,7 +55,7 @@ jobs: $expectedHash = "c3d7a34184c4021486751fbc3878eb2376677674ff8d6d4bf87017fd2434122c8438072aa891e535fa0fa9aeafcb49ad833a61903180772369d99571b073baac" $hashFromFile = Get-FileHash -Algorithm SHA512 -Path .\Apache-NetBeans-17-bin-windows-x64.exe if (($hashFromFile.Hash) -ne ($expectedHash)) { Write-Error "Hash doesn't match." } - .\Apache-NetBeans-17-bin-windows-x64.exe --silent | Out-Null # This installer is gregarious. + .\Apache-NetBeans-17-bin-windows-x64.exe --silent --javahome "$env:JAVA_HOME"| Out-Null # This installer is gregarious. echo "ANT_HOME=C:\\Program Files\\NetBeans-17.0\\netbeans\\extide\\ant" >> $GITHUB_ENV - name: Checkout opensim-core main From b3cada5917930eaf7dae8860955f9dd05a87d79c Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 17 Jun 2026 15:14:57 -0700 Subject: [PATCH 15/18] Log JAR copy operation in CI workflow on osx Add echo statement to log file copy operation --- .github/workflows/continuous-integration.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 82fe8e51c..d42cab70c 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -367,7 +367,8 @@ jobs: # Copy the main JAR cp "$EXTRACT_DIR/netbeans/modules/org-opensim-javabrowser.jar" "$INSTALLER_CONTENT/modules/" - + echo "++++++++++++++++++++++++++++++++++++++++++++++++++++" + echo "cp " "$EXTRACT_DIR/netbeans/modules/org-opensim-javabrowser.jar" " to " "$INSTALLER_CONTENT/modules/" # Copy macOS-specific JARs with exact names cp "$EXTRACT_DIR/netbeans/modules/ext/jxbrowser-7.44.1.jar" "$INSTALLER_CONTENT/modules/ext/" cp "$EXTRACT_DIR/netbeans/modules/ext/jxbrowser-swing-7.44.1.jar" "$INSTALLER_CONTENT/modules/ext/" From b20650a9809507eb7d526262d426a58df9a4e01b Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 17 Jun 2026 17:16:17 -0700 Subject: [PATCH 16/18] Update NBM_DIR to point to prebuilt_jxb461 on osx --- .github/workflows/continuous-integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index d42cab70c..dbf849239 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -346,7 +346,7 @@ jobs: run: | # Set root and directories ROOT="$GITHUB_WORKSPACE" - NBM_DIR="$ROOT/prebuilt_jxb" + NBM_DIR="$ROOT/prebuilt_jxb461" EXTRACT_DIR="$NBM_DIR/extracted" INSTALLER_CONTENT="$ROOT/Gui/opensim/dist/installer/opensim/opensim" From 66659dd049c3748a926c0e2a7fede3f67404d804 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Wed, 17 Jun 2026 21:57:32 -0700 Subject: [PATCH 17/18] Update jxBrowser jar download URL in build.xml --- Gui/opensim/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gui/opensim/build.xml b/Gui/opensim/build.xml index 9ad77ed12..4e8478240 100644 --- a/Gui/opensim/build.xml +++ b/Gui/opensim/build.xml @@ -146,7 +146,7 @@ - From c1e6a41e8bc3c093fe14348bfadcf3b91ef5eca7 Mon Sep 17 00:00:00 2001 From: Ayman Habib Date: Thu, 18 Jun 2026 01:16:16 -0700 Subject: [PATCH 18/18] Fix download URL for jxBrowser jar in build.xml --- Gui/opensim/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gui/opensim/build.xml b/Gui/opensim/build.xml index 4e8478240..7b92a19ac 100644 --- a/Gui/opensim/build.xml +++ b/Gui/opensim/build.xml @@ -146,7 +146,7 @@ -