def uninstall_plugin(plugin, version=None): """Uninstall a Rhino Python Command Plugin. Parameters ---------- plugin : str The name of the plugin. version : str, optional The version of Rhino for which the plugin should be uninstalled. Default is ``'6.0'``. Notes ----- The version info is only relevant for Rhino on Windows. Examples -------- .. code-block:: bash $ python -m compas_rhino.uninstall_plugin XXX{520ddb34-e56d-4a37-9c58-1da10edd1d62} """ if version not in ('5.0', '6.0'): version = '6.0' python_plugins_path = compas_rhino._get_python_plugins_path(version) destination = os.path.join(python_plugins_path, plugin) print('Uninstalling PlugIn {} from Rhino PythonPlugIns.'.format(plugin)) remove_symlink(destination) print('PlugIn {} Uninstalled.'.format(plugin))
def uninstall_plugin(plugin, version=None): """Uninstall a Rhino Python Command Plugin. Parameters ---------- plugin : str The name of the plugin. version : {'5.0', '6.0', '7.0', '8.0'}, optional The version of Rhino for which the plugin should be uninstalled. Default is ``'7.0'``. Notes ----- The version info is only relevant for Rhino on Windows. Examples -------- .. code-block:: bash python -m compas_rhino.uninstall_plugin XXX """ version = compas_rhino._check_rhino_version(version) python_plugins_path = compas_rhino._get_rhino_pythonplugins_path(version) plugin_name = plugin.split('{')[0] symlinks = [] dirs = [] for name in os.listdir(python_plugins_path): path = os.path.join(python_plugins_path, name) if os.path.islink(path): if name.split('{')[0] == plugin_name: symlinks.append(name) elif os.path.isdir(path): if name.split('{')[0] == plugin_name: dirs.append(name) print('\nUninstalling PlugIn {} from Rhino PythonPlugIns:'.format(plugin_name)) if not symlinks and not dirs: print('Nothing to uninstall...\n') else: for name in symlinks: print('- {}'.format(name)) destination = os.path.join(python_plugins_path, name) remove_symlink(destination) for name in dirs: print('- {}'.format(name)) destination = os.path.join(python_plugins_path, name) os.rmdir(destination) print('\nPlugIn {} Uninstalled.\n'.format(plugin_name))
def uninstall(version='5.0', packages=None): """Uninstall COMPAS from Rhino. Parameters ---------- version : {'5.0', '6.0'} The version number of Rhino. packages : list of str List of packages to uninstall or None to use default package list. Examples -------- .. code-block:: python >>> import compas_rhino >>> compas_rhino.uninstall('5.0') .. code-block:: python $ python -m compas_rhino.uninstall 5.0 """ print('Uninstalling COMPAS packages from Rhino IronPython lib:') ipylib_path = compas_rhino._get_ironpython_lib_path(version) results = [] exit_code = 0 for package in packages: symlink_path = os.path.join(ipylib_path, package) if not os.path.exists(symlink_path): continue try: remove_symlink(symlink_path) results.append((package, 'OK')) except OSError: results.append( (package, 'Cannot remove symlink, try to run as administrator.')) for package, status in results: print(' {} {}'.format(package.ljust(20), status)) if status is not 'OK': exit_code = -1 print('\nCompleted.') sys.exit(exit_code)
def uninstall(blender_path): """Uninstall COMPAS from Blender. Parameters ---------- blender_path : str The path to the folder with the version number of Blender. For example, on Mac: ``'/Applications/blender.app/Contents/Resources/2.80'``. On Windows: ``'%PROGRAMFILES%\\Blender Foundation\\Blender\\2.80'``. Examples -------- .. code-block:: bash $ python -m compas_blender.uninstall /Applications/blender.app/Contents/Resources/2.80 """ if not os.environ.get('CONDA_PREFIX'): print('Conda environment not found. The installation into Blender requires an active conda environment with a matching Python version to continue.') sys.exit(-1) path, version = os.path.split(blender_path) print('Uninstalling COMPAS for Blender {}'.format(version)) startup = os.path.join(blender_path, 'scripts', 'startup') blenderpython_src = os.path.join(blender_path, 'python') blenderpython_dst = os.path.join(blender_path, 'original_python') compas_bootstrapper = os.path.join(startup, 'compas_bootstrapper.py') if os.path.exists(blenderpython_dst): print('Found existing installation, restoring bundled python installation...') if os.path.exists(blenderpython_src): remove_symlink(blenderpython_src) print(' Renaming original_python back to bundled python folder: {} => {}'.format(blenderpython_dst, blenderpython_src)) rename(blenderpython_dst, blenderpython_src) if os.path.exists(compas_bootstrapper): print(' Removing compas bootstrapper...') remove(compas_bootstrapper) print() print('COMPAS has been uninstalled from Blender {}.'.format(version))
def install(blender_path): """Install COMPAS for Blender. Parameters ---------- blender_path : str The path to the folder with the version number of Blender. For example, on Mac: ``'/Applications/blender.app/Contents/Resources/2.80'``. On Windows: ``'%PROGRAMFILES%\\Blender Foundation\\Blender\\2.80'``. Examples -------- .. code-block:: bash $ python -m compas_blender.install /Applications/blender.app/Contents/Resources/2.80 """ if not os.environ.get('CONDA_PREFIX'): print( 'Conda environment not found. The installation into Blender requires an active conda environment with a matching Python version to continue.' ) sys.exit(-1) path, version = os.path.split(blender_path) print('Installing COMPAS for Blender {}'.format(version)) startup = os.path.join(blender_path, 'scripts', 'startup') blenderpython_src = os.path.join(blender_path, 'python') blenderpython_dst = os.path.join(blender_path, 'original_python') compas_bootstrapper = os.path.join(startup, 'compas_bootstrapper.py') if os.path.exists(blenderpython_dst): print( 'Found existing installation, restoring bundled python installation...' ) if os.path.exists(blenderpython_src): remove_symlink(blenderpython_src) print( ' Renaming original_python back to bundled python folder: {} => {}' .format(blenderpython_dst, blenderpython_src)) rename(blenderpython_dst, blenderpython_src) if os.path.exists(compas_bootstrapper): print(' Removing compas bootstrapper...') remove(compas_bootstrapper) print('Installing current conda environment into Blender...') print( ' Renaming bundled python folder to original_python: {} => {}'.format( blenderpython_src, blenderpython_dst)) rename(blenderpython_src, blenderpython_dst) create_symlinks([(os.environ['CONDA_PREFIX'], blenderpython_src)]) # Take either the CONDA environment directory or the current Python executable's directory python_directory = os.environ.get('CONDA_PREFIX', None) or os.path.dirname( sys.executable) environment_name = os.environ.get('CONDA_DEFAULT_ENV', '') # Get current sys.version value, we will override it inside Blender # because it seems Blender overrides it as well, but doing so breaks many things after having replaced the Python interpreter sys_version = "\\n".join(sys.version.split("\n")) _handle, bootstrapper_temp_path = tempfile.mkstemp(suffix='.py', text=True) with open(bootstrapper_temp_path, 'w') as f: f.write( BOOTSTRAPPER_TEMPLATE.format(environment_name, python_directory, sys_version)) print(' Creating bootstrap script: {}'.format(compas_bootstrapper)) copy(bootstrapper_temp_path, compas_bootstrapper) print() print('COMPAS for Blender {} has been installed.'.format(version))
def install(version=None, packages=None): """Install COMPAS for Rhino. Parameters ---------- version : {'5.0', '6.0'}, optional The version number of Rhino. Default is ``'6.0'``. packages : list of str, optional List of packages to install or None to use default package list. Default is ``['compas', 'compas_rhino', 'compas_ghpython']``. Examples -------- .. code-block:: python >>> import compas_rhino >>> compas_rhino.install('6.0') .. code-block:: python $ python -m compas_rhino.install -v 6.0 """ if version not in ('5.0', '6.0'): version = '6.0' if system == 'win32': print('Installing COMPAS packages to Rhino {0} IronPython lib:'.format(version)) elif system == 'darwin': print('Installing COMPAS packages to Rhino IronPython lib.') if not packages: packages = INSTALLABLE_PACKAGES ipylib_path = compas_rhino._get_ironpython_lib_path(version) results = [] exit_code = 0 for package in packages: package_path = _get_package_path(importlib.import_module(package)) symlink_path = os.path.join(ipylib_path, package) if os.path.exists(symlink_path): try: remove_symlink(symlink_path) except OSError: results.append((package, 'ERROR: Cannot remove symlink, try to run as administrator.')) try: create_symlink(package_path, symlink_path) results.append((package, 'OK')) except OSError: results.append((package, 'ERROR: Cannot create symlink, try to run as administrator.')) for _, status in results: if status is not 'OK': exit_code = -1 if exit_code == -1: results.append(('compas_bootstrapper', 'WARNING: One or more packages failed, will not install bootstrapper, try uninstalling first')) else: # Take either the CONDA environment directory or the current Python executable's directory python_directory = os.environ.get('CONDA_PREFIX', None) or os.path.dirname(sys.executable) environment_name = os.environ.get('CONDA_DEFAULT_ENV', '') compas_bootstrapper = os.path.join(ipylib_path, 'compas_bootstrapper.py') try: bootstrapper_data = _get_bootstrapper_data(compas_bootstrapper) installed_packages = bootstrapper_data.get('INSTALLED_PACKAGES', []) installed_packages = list(set(installed_packages + list(packages))) with open(compas_bootstrapper, 'w') as f: f.write('ENVIRONMENT_NAME = r"{}"\n'.format(environment_name)) f.write('PYTHON_DIRECTORY = r"{}"\n'.format(python_directory)) f.write('INSTALLED_PACKAGES = {}'.format(repr(installed_packages))) results.append(('compas_bootstrapper', 'OK')) except: results.append(('compas_bootstrapper', 'ERROR: Could not create compas_bootstrapper to auto-determine Python environment')) for package, status in results: print(' {} {}'.format(package.ljust(20), status)) if status is not 'OK': exit_code = -1 print('\nCompleted.') sys.exit(exit_code)
def install(blender_path, version=None): """Install COMPAS for Blender. Parameters ---------- blender_path : str The path to the folder with the version number of Blender. For example, on Mac: ``'/Applications/Blender.app/Contents/Resources/2.83'``. On Windows: ``'%PROGRAMFILES%/Blender Foundation/Blender 2.83/2.83'``. version : {'2.83', '2.93'}, optional The version number of Blender. Default is ``'2.93'``. Examples -------- .. code-block:: bash $ python -m compas_blender.install .. code-block:: bash $ python -m compas_blender.install -v 2.93 .. code-block:: bash $ python -m compas_blender.install /Applications/Blender.app/Contents/Resources/2.93 """ if not os.environ.get('CONDA_PREFIX'): print('Conda environment not found. The installation into Blender requires an active conda environment with a matching Python version to continue.') sys.exit(-1) if not version and not blender_path: version = '2.93' if version and blender_path: print('Both options cannot be provided simultaneously. Provide the full installation path, or the version with flag -v.') sys.exit(-1) if version: if compas.LINUX: print('Version-based installs are currently not supported for Linux. Please provide the full installation path with the -p option.') sys.exit(-1) blender_path = compas_blender._get_default_blender_installation_path(version) if not os.path.exists(blender_path): raise FileNotFoundError('Blender version folder not found.') path, version = os.path.split(blender_path) print('Installing COMPAS for Blender {}'.format(version)) startup = os.path.join(blender_path, 'scripts', 'startup') blenderpython_src = os.path.join(blender_path, 'python') blenderpython_dst = os.path.join(blender_path, 'original_python') compas_bootstrapper = os.path.join(startup, 'compas_bootstrapper.py') if os.path.exists(blenderpython_dst): print('Found existing installation, restoring bundled python installation...') if os.path.exists(blenderpython_src): remove_symlink(blenderpython_src) print(' Renaming original_python back to bundled python folder: {} => {}'.format(blenderpython_dst, blenderpython_src)) rename(blenderpython_dst, blenderpython_src) if os.path.exists(compas_bootstrapper): print(' Removing compas bootstrapper...') remove(compas_bootstrapper) print('Installing current conda environment into Blender...') print(' Renaming bundled python folder to original_python: {} => {}'.format(blenderpython_src, blenderpython_dst)) rename(blenderpython_src, blenderpython_dst) create_symlinks([(os.environ['CONDA_PREFIX'], blenderpython_src)]) # Take either the CONDA environment directory or the current Python executable's directory python_directory = os.environ.get('CONDA_PREFIX', None) or os.path.dirname(sys.executable) environment_name = os.environ.get('CONDA_DEFAULT_ENV', '') # Get current sys.version value, we will override it inside Blender # because it seems Blender overrides it as well, but doing so breaks many things after having replaced the Python interpreter sys_version = "\\n".join(sys.version.split("\n")) _handle, bootstrapper_temp_path = tempfile.mkstemp(suffix='.py', text=True) with open(bootstrapper_temp_path, 'w') as f: f.write(BOOTSTRAPPER_TEMPLATE.format(environment_name, python_directory, sys_version)) print(' Creating bootstrap script: {}'.format(compas_bootstrapper)) copy(bootstrapper_temp_path, compas_bootstrapper) print() print('COMPAS for Blender {} has been installed.'.format(version))
def uninstall(version=None, packages=None): """Uninstall COMPAS from Rhino. Parameters ---------- version : {'5.0', '6.0'}, optional The version number of Rhino. Default is ``'6.0'``. packages : list of str, optional List of packages to uninstall. Default is to uninstall all packages installed by the COMPAS installer. Examples -------- .. code-block:: python >>> import compas_rhino >>> compas_rhino.uninstall('6.0') .. code-block:: python $ python -m compas_rhino.uninstall -v 6.0 """ if version not in ('5.0', '6.0'): version = '6.0' if system == 'win32': print('Uninstalling COMPAS packages from Rhino {0} IronPython lib:'. format(version)) elif system == 'darwin': print('Uninstalling COMPAS packages from Rhino IronPython lib.') ipylib_path = compas_rhino._get_ironpython_lib_path(version) compas_bootstrapper = os.path.join(ipylib_path, 'compas_bootstrapper.py') bootstrapper_data = compas_rhino.install._get_bootstrapper_data( compas_bootstrapper) if not packages: try: packages = bootstrapper_data.get('INSTALLED_PACKAGES', None) except: pass # No info, fall back to installable packages list if packages is None: packages = compas_rhino.install.INSTALLABLE_PACKAGES environment_name = bootstrapper_data.get('ENVIRONMENT_NAME', '') if environment_name: print( 'Packages installed from environment: {}'.format(environment_name)) results = [] exit_code = 0 for package in packages: symlink_path = os.path.join(ipylib_path, package) if not (os.path.exists(symlink_path) or os.path.islink(symlink_path)): continue try: remove_symlink(symlink_path) results.append((package, 'OK')) except OSError: results.append( (package, 'ERROR: Cannot remove symlink, try to run as administrator.')) for _, status in results: if status is not 'OK': exit_code = -1 if exit_code == -1: results.append(( 'compas_bootstrapper', 'WARNING: One or more packages failed, will not uninstall bootstrapper.' )) else: compas_bootstrapper = os.path.join(ipylib_path, 'compas_bootstrapper.py') try: if os.path.exists(compas_bootstrapper): os.remove(compas_bootstrapper) results.append(('compas_bootstrapper', 'OK')) except: results.append(('compas_bootstrapper', 'ERROR: Could not delete compas_bootstrapper')) for package, status in results: print(' {} {}'.format(package.ljust(20), status)) if status is not 'OK': exit_code = -1 print('\nCompleted.') sys.exit(exit_code)
def install_plugin(plugin, version=None): """Install a Rhino Python Command Plugin. Parameters ---------- plugin : str The path to the plugin folder. version : str, optional The version of Rhino for which the plugin should be installed. Default is ``'6.0'``. Notes ----- The version info is only relevant for Rhino on Windows. The function creates an *editable install*, which means that the plugin folder is *symlinked* into the correct location so Rhino can find and load it. The contents of the source folder can still be edited and next time you start Rhino those canges will be reflected in the loaded plugin. Examples -------- Assuming the plugin folder is at the following location on your computer .. code-block:: none ~/Code/compas_xxx/ui/XXX{520ddb34-e56d-4a37-9c58-1da10edd1d62} It can be installed with the following command .. code-block:: bash $ cd ~/Code/compas_xxx/ui $ python -m compas_rhino.install_plugin XXX{520ddb34-e56d-4a37-9c58-1da10edd1d62} """ if version not in ('5.0', '6.0'): version = '6.0' plugin_path, plugin_name = os.path.split(plugin) if not plugin_path: plugin_path = os.getcwd() source = os.path.join(plugin_path, plugin_name) if not os.path.isdir(source): raise Exception('Cannot find the plugin: {}'.format(source)) if not os.path.isdir(os.path.join(source, 'dev')): raise Exception('The plugin does not contain a dev folder.') if not os.path.isfile(os.path.join(source, 'dev', '__plugin__.py')): raise Exception('The plugin does not contain plugin info.') python_plugins_path = compas_rhino._get_python_plugins_path(version) if not os.path.exists(python_plugins_path): os.mkdir(python_plugins_path) destination = os.path.join(python_plugins_path, plugin_name) print('Installing PlugIn {} to Rhino PythonPlugIns.'.format(plugin_name)) if os.path.exists(destination): remove_symlink(destination) create_symlink(source, destination) print('PlugIn {} Installed.'.format(plugin_name)) print() print('Restart Rhino and open the Python editor at least once to make it available.')