From 7b332487d2e7ba7a85c1e030d5def1648e7d0e34 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Fri, 16 Feb 2024 11:01:40 -0700 Subject: [PATCH 1/8] Fixed cursor select sprite, still working on original bug --- .../SynthesisFusionAddin/src/UI/ConfigCommand.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py index 37c387f5e6..18fb882e56 100644 --- a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py +++ b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py @@ -1753,17 +1753,20 @@ def notify(self, args): try: design = adsk.fusion.Design.cast(gm.app.activeProduct) preSelectedOcc = adsk.fusion.Occurrence.cast(args.selection.entity) + preSelectedJoint = adsk.fusion.Joint.cast(args.selection.entity) onSelect = gm.handlers[3] # select handler - if not preSelectedOcc or not design: + if (not preSelectedOcc and not preSelectedJoint) or not design: self.cmd.setCursor("", 0, 0) return + + preSelected = preSelectedOcc if preSelectedOcc else preSelectedJoint dropdownExportMode = INPUTS_ROOT.itemById("mode") - if preSelectedOcc and design: + if preSelected and design: if dropdownExportMode.selectedItem.index == 0: - if preSelectedOcc.entityToken in onSelect.allWheelPreselections: + if preSelected.entityToken in onSelect.allWheelPreselections: self.cmd.setCursor( IconPaths.mouseIcons["remove"], 0, @@ -1777,7 +1780,7 @@ def notify(self, args): ) elif dropdownExportMode.selectedItem.index == 1: - if preSelectedOcc.entityToken in onSelect.allGamepiecePreselections: + if preSelected.entityToken in onSelect.allGamepiecePreselections: self.cmd.setCursor( IconPaths.mouseIcons["remove"], 0, @@ -1811,8 +1814,9 @@ def notify(self, args): try: design = adsk.fusion.Design.cast(gm.app.activeProduct) preSelectedOcc = adsk.fusion.Occurrence.cast(args.selection.entity) + preSelectedJoint = adsk.fusion.Joint.cast(args.selection.entity) - if preSelectedOcc and design: + if (preSelectedOcc or preSelectedJoint) and design: self.cmd.setCursor( "", 0, 0 ) # if preselection ends (mouse off of design), reset the mouse icon to default From e7324390353e0ef9649742a56f2b6c200dc634c2 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Tue, 20 Feb 2024 13:59:47 -0700 Subject: [PATCH 2/8] Fixed icons and identified race condition with SelectionEvent and InputChangedEvent --- .../MousePreselectIcons/mouse-add-icon.png | Bin 3402 -> 4566 bytes .../MousePreselectIcons/mouse-remove-icon.png | Bin 3182 -> 4342 bytes .../src/UI/ConfigCommand.py | 9 +++------ 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/exporter/SynthesisFusionAddin/src/Resources/MousePreselectIcons/mouse-add-icon.png b/exporter/SynthesisFusionAddin/src/Resources/MousePreselectIcons/mouse-add-icon.png index bcc57f5284ad661c12b91ce168a77f91a4b356c3..8b98d13a1789d3fdcd135a15c826c3b8c576d8bd 100644 GIT binary patch literal 4566 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 delta 3399 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 diff --git a/exporter/SynthesisFusionAddin/src/Resources/MousePreselectIcons/mouse-remove-icon.png b/exporter/SynthesisFusionAddin/src/Resources/MousePreselectIcons/mouse-remove-icon.png index a2c6f978c21902b95527b7b43b29ffbdcc669ee9..be7667ed6ad7e1abd47c5b4fb2b752beedfd6ed2 100644 GIT binary patch literal 4342 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 delta 3177 zcmV-v43_iuA?_HEB!2{RLP=Bz2nYy#2xN!=01PEbL_t(|ob8%>a8%cQ$3N%ZySv)e z?&^uKu!BG#B{T*CShk}UI|L?aaLmK?7$^47#x5|eooTV#`Z28^w4O{I24iRZD&R?N zCjsmh$T(xo0F7wY&G;U;kJ=%zt}#wZahdo!yz8z31F> zKKGpSJHOxWT)3hux}q!kBb5#qAAR)E&Hcas=#>wQJ9+YCWc&8*3;7B_R|1O~8yh8& zNW{Jh(ANP^9y)YLY}>wUp|v#18YHJRrfH&Sn)9ZcZd$*6`}TQUM$qX1LlT-mAVB@@ z-NfVZ%MLnSV1EGG0|D0l#~OaWefwnxoe?m=!2<_)>4g{BT~~)?S(goT#=rmv4jkZ> zb?eyE(12~*mj!gHzzR^4Cr>Wa^;21D->YTanl+^k*=#6PUUK zNl6KN_wMcK?(R;A$T{mAJa`Zhv2${A5(NbXy?^E9<-xqXJohCJd^+r|UAvB~TD7XC zxw*O9wrv2EQnq0j5yLQInx%~`W%nOUJbi!uiG=lPj6d-mzD|5{U1vppOR_W<(NTW@)NKHoLK__DIH8HI&~ zQw+lxtCY%9N(}(VHBAd@ns!{%w4K2FBGLr31EK!ekTqol?D2S*H-7(W6K62$Jp@812ZSFc{NWy_YW z4?g%{@YY*zE%W>RKNvM?)Q^C1RwQEgY~5NI+WJ4v$RBnP-@6Yhaf)4XqibJxTz@?d zcXbus?|wH@v}jSO!|#7U)3mkhZ+@=P_~P#v_{3*$6xc98yZ9 zymnGu!xj(%I)E@>mzI{^2+Z%^wym)Hm#<@mIuRK0Z)nSJ`TXgBFMk830Y3ozsluiM z49RtD1Jcsc;sKV}(Wo!5`Z;H!>3BMA4qNTd{lZ8zH+KPxf$`~B?TpO(s8OS?N96j> z->fg{t8W;#HBMJ%pq-|te)e^s2>1?g{&@5YN*h>2lwlb2Y}532Zg|r$18wQvA}b31 zYJ)O+dU}CdfZ|l^Wq&flUf@rA>+AjTBS$X!=nlvXcF?|I!#H3PFh)dDI-zJ1tt>$Z_SMbRBFPI~=BO{{bSk z?;#`ur^x#|v12hy&&l~FkULVqWeSKNKY>{BA=t`FiXMNgYxHfm)fp~VJxXC^3k>C-KeJAaGKkfUG&^3 za8(Ym*?oPG9Nm;yG6A*~NxL&}Xe=UVBJCuX$jzx*%yc9oE}-05R)*ah9&B4_8l1XJ z&Z|t;a7ek`U>JifD1nAY9$7Z^>8Bfjzb5JZ%mlu7T3wsuLl%<$xdt=>hfgb~PW!EZ zBX%q{H-FZ6n7)Ib3;`4rL`X(YDeaG$0JrL1uVv)t>uMk}6R=jU{NX;4o344_f!Dny zCF6BnKMK4kiG*%OA`UB&&;ilS8--}uHr!Y_W7zGemZh<|dqx}B93Me2V)z>fE)k_BQbSNRXG zTJ^VR8p`PerI4Z`tcnVxs7M5CrIaNgO4mh{Qkv7LiHK4n8kVI0FDBEBL%!iDHZZuH=`)HX$yASQ0`oi{_(RAGn)J}96>*R z0)LXDr<2A@YZtP7o#pKdnVZEVbMd-mD<@V0kJ96gF{rsVYv-CXGyqekPJI+>Dx zSRT%wGp7elYXBYxJ|0f^nbid+B2M6L;9jw;%3y76ZpW*?cK7YB$7*ZC>VN7!=cp^) ziSEloFDk?_p`3yr-(eNqetWx?n;QZ)0lxs6GMUDwv@@K_=aPs_1nvR8FP2pnJ#@&| zyK9#-vhzb?pEhE3cY|pn0!r6VZa2>HWw^gJ1^>*ManH1ALCxg~0=r0VJ!xCxb7@5P z5fP~*nK%9(B4xH|7E2=GwPHdc!w!WUB7$ Date: Tue, 20 Feb 2024 14:02:17 -0700 Subject: [PATCH 3/8] Removed sticky selection cursor --- exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py index c504cedaa9..1c0f275ea2 100644 --- a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py +++ b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py @@ -1690,6 +1690,9 @@ def notify(self, args: adsk.core.SelectionEventArgs): # indicator = INPUTS_ROOT.itemById("algorithmic_indicator") if self.selectedOcc: + self.cmd.setCursor( + "", 0, 0 + ) if dropdownExportMode.selectedItem.index == 1: occurrenceList = gm.app.activeDocument.design.rootComponent.allOccurrencesByComponent( self.selectedOcc.component @@ -1704,6 +1707,9 @@ def notify(self, args: adsk.core.SelectionEventArgs): selectionInput.isVisible = False elif self.selectedJoint: + self.cmd.setCursor( + "", 0, 0 + ) jointType = self.selectedJoint.jointMotion.jointType if ( jointType == JointMotions.REVOLUTE.value @@ -1792,6 +1798,10 @@ def notify(self, args): 0, 0, ) + else: + self.cmd.setCursor( + "", 0, 0 + ) except: if gm.ui: gm.ui.messageBox("Failed:\n{}".format(traceback.format_exc())) From 05175cfa9f33352436f475212577f17092624ccd Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Tue, 20 Feb 2024 16:22:39 -0700 Subject: [PATCH 4/8] Very temporary Windows installer for only the exporter --- installer/exporter/.gitignore | 2 ++ installer/exporter/README.md | 11 +++++++++++ installer/exporter/install.bat | 10 ++++++++++ installer/exporter/setup.bat | 9 +++++++++ 4 files changed, 32 insertions(+) create mode 100644 installer/exporter/.gitignore create mode 100644 installer/exporter/README.md create mode 100644 installer/exporter/install.bat create mode 100644 installer/exporter/setup.bat diff --git a/installer/exporter/.gitignore b/installer/exporter/.gitignore new file mode 100644 index 0000000000..d7086cea15 --- /dev/null +++ b/installer/exporter/.gitignore @@ -0,0 +1,2 @@ +/Synthesis + diff --git a/installer/exporter/README.md b/installer/exporter/README.md new file mode 100644 index 0000000000..4487e7517a --- /dev/null +++ b/installer/exporter/README.md @@ -0,0 +1,11 @@ +# Synthesis Exporter Installer +NOTE: Currently only supports Windows + +## Creating the installer +1. Run `setup.bat`. This will copy the Synthesis exporter into the current directory. +2. Zip together the `install.bat` script and the `Synthesis` directory. + +## Using the installer +1. Download the zip file. +2. Unzip it anywhere (likely your Downloads folder). +3. Run the `install.bat` script. diff --git a/installer/exporter/install.bat b/installer/exporter/install.bat new file mode 100644 index 0000000000..293bac431a --- /dev/null +++ b/installer/exporter/install.bat @@ -0,0 +1,10 @@ +@echo off + +if exist "%AppData%\Autodesk\Autodesk Fusion 360\API\AddIns\Synthesis\" ( + echo "Removing existing Synthesis exporter..." + rmdir "%AppData%\Autodesk\Autodesk Fusion 360\API\AddIns\Synthesis\" /Q/S +) + +echo "Copying to %AppData%\Autodesk\Autodesk Fusion 360\API\AddIns\Synthesis..." +xcopy Synthesis "%AppData%\Autodesk\Autodesk Fusion 360\API\AddIns\Synthesis\" /E +echo "Synthesis Exporter Successfully Installed!" diff --git a/installer/exporter/setup.bat b/installer/exporter/setup.bat new file mode 100644 index 0000000000..a6ec90bb68 --- /dev/null +++ b/installer/exporter/setup.bat @@ -0,0 +1,9 @@ +@echo off + +if exist Synthesis\ ( + rmdir Synthesis /Q/S + echo Removed .\Synthesis +) + +xcopy ..\..\exporter\SynthesisFusionAddin Synthesis\ /E +echo Copied exporter into .\Synthesis From d8c2a55a5b832e623697e5224a0f3907bbf34911 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Tue, 20 Feb 2024 16:30:40 -0700 Subject: [PATCH 5/8] Updated gitignore in new installer and formatted exporter --- .../SynthesisFusionAddin/src/UI/ConfigCommand.py | 16 +++++----------- installer/exporter/.gitignore | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py index 1c0f275ea2..f0e5f17a91 100644 --- a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py +++ b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py @@ -1690,9 +1690,7 @@ def notify(self, args: adsk.core.SelectionEventArgs): # indicator = INPUTS_ROOT.itemById("algorithmic_indicator") if self.selectedOcc: - self.cmd.setCursor( - "", 0, 0 - ) + self.cmd.setCursor("", 0, 0) if dropdownExportMode.selectedItem.index == 1: occurrenceList = gm.app.activeDocument.design.rootComponent.allOccurrencesByComponent( self.selectedOcc.component @@ -1707,9 +1705,7 @@ def notify(self, args: adsk.core.SelectionEventArgs): selectionInput.isVisible = False elif self.selectedJoint: - self.cmd.setCursor( - "", 0, 0 - ) + self.cmd.setCursor("", 0, 0) jointType = self.selectedJoint.jointMotion.jointType if ( jointType == JointMotions.REVOLUTE.value @@ -1766,8 +1762,8 @@ def notify(self, args): if (not preSelectedOcc and not preSelectedJoint) or not design: self.cmd.setCursor("", 0, 0) return - - preSelected = preSelectedOcc if preSelectedOcc else preSelectedJoint + + preSelected = preSelectedOcc if preSelectedOcc else preSelectedJoint dropdownExportMode = INPUTS_ROOT.itemById("mode") if preSelected and design: @@ -1799,9 +1795,7 @@ def notify(self, args): 0, ) else: - self.cmd.setCursor( - "", 0, 0 - ) + self.cmd.setCursor("", 0, 0) except: if gm.ui: gm.ui.messageBox("Failed:\n{}".format(traceback.format_exc())) diff --git a/installer/exporter/.gitignore b/installer/exporter/.gitignore index d7086cea15..290dfd77ff 100644 --- a/installer/exporter/.gitignore +++ b/installer/exporter/.gitignore @@ -1,2 +1,2 @@ /Synthesis - +/*.zip From 97930b20ceb01f724a314ab0fe10b5dafe08ad30 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Tue, 20 Feb 2024 16:34:11 -0700 Subject: [PATCH 6/8] Black was out of date. Reformatted with Black v24.2.0 --- .../src/Analytics/poster.py | 6 +++--- .../SynthesisFusionAddin/src/Analyzer/sniff.py | 1 + .../SynthesisFusionAddin/src/Analyzer/timer.py | 1 + .../SynthesisFusionAddin/src/GlobalManager.py | 1 + .../SynthesisParser/PhysicalProperties.py | 1 + .../src/Parser/SynthesisParser/RigidGroup.py | 1 + .../src/UI/ConfigCommand.py | 18 +++++++++--------- exporter/SynthesisFusionAddin/src/configure.py | 1 + 8 files changed, 18 insertions(+), 12 deletions(-) diff --git a/exporter/SynthesisFusionAddin/src/Analytics/poster.py b/exporter/SynthesisFusionAddin/src/Analytics/poster.py index a50c817b7b..5c80138eb4 100644 --- a/exporter/SynthesisFusionAddin/src/Analytics/poster.py +++ b/exporter/SynthesisFusionAddin/src/Analytics/poster.py @@ -158,9 +158,9 @@ def __send(self, body) -> bool: try: # define user agent so this works headers = {} - headers[ - "User-Agent" - ] = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17" + headers["User-Agent"] = ( + "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17" + ) # print(f"{self.url}/collect?{body}") diff --git a/exporter/SynthesisFusionAddin/src/Analyzer/sniff.py b/exporter/SynthesisFusionAddin/src/Analyzer/sniff.py index 27215ff530..83200053c4 100644 --- a/exporter/SynthesisFusionAddin/src/Analyzer/sniff.py +++ b/exporter/SynthesisFusionAddin/src/Analyzer/sniff.py @@ -1,5 +1,6 @@ """ Takes in a given function call and times and tests the memory allocations to get data """ + from ..general_imports import * from time import time import tracemalloc, time, linecache, os, inspect diff --git a/exporter/SynthesisFusionAddin/src/Analyzer/timer.py b/exporter/SynthesisFusionAddin/src/Analyzer/timer.py index d108ec4eeb..b89099ee7c 100644 --- a/exporter/SynthesisFusionAddin/src/Analyzer/timer.py +++ b/exporter/SynthesisFusionAddin/src/Analyzer/timer.py @@ -1,5 +1,6 @@ """ Takes in a given function call and times and tests the memory allocations to get data """ + from ..general_imports import * from time import time import os, inspect diff --git a/exporter/SynthesisFusionAddin/src/GlobalManager.py b/exporter/SynthesisFusionAddin/src/GlobalManager.py index e8076d94a4..33ccdbfa71 100644 --- a/exporter/SynthesisFusionAddin/src/GlobalManager.py +++ b/exporter/SynthesisFusionAddin/src/GlobalManager.py @@ -1,4 +1,5 @@ """ Initializes the global variables that are set in the run method to reduce hanging commands. """ + import adsk.core, adsk.fusion, traceback import inspect diff --git a/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/PhysicalProperties.py b/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/PhysicalProperties.py index a658e6def5..4ff71be8b7 100644 --- a/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/PhysicalProperties.py +++ b/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/PhysicalProperties.py @@ -15,6 +15,7 @@ - Z """ + import adsk, logging, traceback from proto.proto_out import types_pb2 diff --git a/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/RigidGroup.py b/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/RigidGroup.py index 615049e621..be14c4a4e0 100644 --- a/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/RigidGroup.py +++ b/exporter/SynthesisFusionAddin/src/Parser/SynthesisParser/RigidGroup.py @@ -11,6 +11,7 @@ Returns: - Success """ + import adsk.core, adsk.fusion, logging from typing import * diff --git a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py index f0e5f17a91..4c540f5bd5 100644 --- a/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py +++ b/exporter/SynthesisFusionAddin/src/UI/ConfigCommand.py @@ -1940,22 +1940,22 @@ def notify(self, args): gamepieceConfig.isVisible = False weightTableInput.isVisible = True - addFieldInput.isEnabled = ( - wheelConfig.isVisible - ) = jointConfig.isVisible = True + addFieldInput.isEnabled = wheelConfig.isVisible = ( + jointConfig.isVisible + ) = True elif modeDropdown.selectedItem.index == 1: if gamepieceConfig: gm.ui.activeSelections.clear() gm.app.activeDocument.design.rootComponent.opacity = 1 - addWheelInput.isEnabled = ( - addJointInput.isEnabled - ) = gamepieceConfig.isVisible = True + addWheelInput.isEnabled = addJointInput.isEnabled = ( + gamepieceConfig.isVisible + ) = True - jointConfig.isVisible = ( - wheelConfig.isVisible - ) = weightTableInput.isVisible = False + jointConfig.isVisible = wheelConfig.isVisible = ( + weightTableInput.isVisible + ) = False elif cmdInput.id == "joint_config": gm.app.activeDocument.design.rootComponent.opacity = 1 diff --git a/exporter/SynthesisFusionAddin/src/configure.py b/exporter/SynthesisFusionAddin/src/configure.py index bd91b1dd9a..5226a2acce 100644 --- a/exporter/SynthesisFusionAddin/src/configure.py +++ b/exporter/SynthesisFusionAddin/src/configure.py @@ -1,4 +1,5 @@ """ Stores data and fields from config.ini """ + from configparser import ConfigParser from .Types.OString import OString from .strings import INTERNAL_ID From 308ca1885b5e6982acafa23804ec97b1800450f1 Mon Sep 17 00:00:00 2001 From: Hunter Barclay Date: Tue, 20 Feb 2024 18:31:31 -0700 Subject: [PATCH 7/8] Added MacOS exporter installer --- installer/exporter/README.md | 7 +++++-- installer/exporter/create.sh | 11 +++++++++++ installer/exporter/install.sh | 10 ++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100755 installer/exporter/create.sh create mode 100755 installer/exporter/install.sh diff --git a/installer/exporter/README.md b/installer/exporter/README.md index 4487e7517a..631eb3527b 100644 --- a/installer/exporter/README.md +++ b/installer/exporter/README.md @@ -1,11 +1,14 @@ # Synthesis Exporter Installer -NOTE: Currently only supports Windows ## Creating the installer +### Windows 1. Run `setup.bat`. This will copy the Synthesis exporter into the current directory. 2. Zip together the `install.bat` script and the `Synthesis` directory. +### MacOS +1. Run `create.sh`. This will copy the Synthesis exporter into the current directory and create a zip file with the necessary files. + ## Using the installer 1. Download the zip file. 2. Unzip it anywhere (likely your Downloads folder). -3. Run the `install.bat` script. +3. Run the `install.bat` (`install.sh` for MacOS) script. diff --git a/installer/exporter/create.sh b/installer/exporter/create.sh new file mode 100755 index 0000000000..22efb4ac4b --- /dev/null +++ b/installer/exporter/create.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +if test -d ./Synthesis; then + rm -rf ./Synthesis +fi + +cp -r ../../exporter/SynthesisFusionAddin/ ./Synthesis +echo "Copied over Synthesis exporter!" + +zip -r SynthesisExporter Synthesis/ install.sh +echo "Created zip installer!" diff --git a/installer/exporter/install.sh b/installer/exporter/install.sh new file mode 100755 index 0000000000..4ab0801918 --- /dev/null +++ b/installer/exporter/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if test -d ~/Library/Application\ Support/Autodesk/Autodesk\ Fusion\ 360/API/AddIns/SynthesisFusionAddin; then + echo "Removing existing Synthesis exporter..." + rm -rf ~/Library/Application\ Support/Autodesk/Autodesk\ Fusion\ 360/API/AddIns/SynthesisFusionAddin +fi + +cp -r Synthesis/ ~/Library/Application\ Support/Autodesk/Autodesk\ Fusion\ 360/API/AddIns/SynthesisFusionAddin + +echo "Synthesis successfully copied!" From bf14d6fdadaa157e463a21f206c899bfd8fef4f2 Mon Sep 17 00:00:00 2001 From: Hunter Barclay Date: Tue, 27 Feb 2024 16:00:19 -0700 Subject: [PATCH 8/8] Change in behavior resulting in install command breaking --- exporter/SynthesisFusionAddin/proto/deps.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/exporter/SynthesisFusionAddin/proto/deps.py b/exporter/SynthesisFusionAddin/proto/deps.py index e5208aa31e..05c270302e 100644 --- a/exporter/SynthesisFusionAddin/proto/deps.py +++ b/exporter/SynthesisFusionAddin/proto/deps.py @@ -52,7 +52,8 @@ def executeCommand(command: tuple) -> int: ) else: # Uses os.system because I was unable to get subprocess.call to work on MacOS - executionResult = os.system(str.join(' ', command)) + installComm = str.join(' ', command) + executionResult = os.system(installComm) return executionResult @@ -104,7 +105,7 @@ def installCross(pipDeps: list) -> bool: progressBar.message = f"Installing {depName}..." adsk.doEvents() # os.path.join needed for varying system path separators - installResult = executeCommand([os.path.join(pythonFolder, 'python'), '-m', 'pip', 'install', depName]) + installResult = executeCommand([f"\"{os.path.join(pythonFolder, 'python')}\"", '-m', 'pip', 'install', depName]) if installResult != 0: logging.getLogger(f'{INTERNAL_ID}').warn(f'Dep installation "{depName}" exited with code "{installResult}"') @@ -116,7 +117,7 @@ def installCross(pipDeps: list) -> bool: progressBar.message = f"Uninstalling {depName}..." progressBar.progressValue += 1 adsk.doEvents() - uninstallResult = executeCommand([os.path.join(pythonFolder, 'python'), '-m', 'pip', 'uninstall', f'{depName}', '-y']) + uninstallResult = executeCommand([f"\"{os.path.join(pythonFolder, 'python')}\"", '-m', 'pip', 'uninstall', f'{depName}', '-y']) if uninstallResult != 0: logging.getLogger(f'{INTERNAL_ID}').warn(f'AntiDep uninstallation "{depName}" exited with code "{uninstallResult}"')