AttachClone(PyRevitClone clone, PyRevitEngineVersion engineVersion, string revitYear, bool installed, bool attached, bool allUsers) { // decide targets revits to attach to int revitYearNumber = 0; if (installed) { foreach (var revit in RevitProduct.ListInstalledProducts()) { PyRevitAttachments.Attach(revit.ProductYear, clone, engineVer: engineVersion, allUsers: allUsers); } } else if (attached) { foreach (var attachment in PyRevitAttachments.GetAttachments()) { PyRevitAttachments.Attach(attachment.Product.ProductYear, clone, engineVer: engineVersion, allUsers: allUsers); } } else if (int.TryParse(revitYear, out revitYearNumber)) { PyRevitAttachments.Attach(revitYearNumber, clone, engineVer: engineVersion, allUsers: allUsers); } }
SwitchAttachment(string cloneName, string revitYear) { var clone = PyRevitClones.GetRegisteredClone(cloneName); if (revitYear != null) { int revitYearNumber = 0; if (int.TryParse(revitYear, out revitYearNumber)) { var attachment = PyRevitAttachments.GetAttached(revitYearNumber); if (attachment != null) { if (attachment.Engine != null) { PyRevitAttachments.Attach(attachment.Product.ProductYear, clone, engineVer: attachment.Engine.Version, allUsers: attachment.AllUsers); } else { throw new PyRevitException( string.Format("Can not determine attachment engine for Revit \"{0}\"", revitYear) ); } } else { throw new PyRevitException( string.Format("Can not determine existing attachment for Revit \"{0}\"", revitYear) ); } } else { throw new PyRevitException(string.Format("Invalid Revit year \"{0}\"", revitYear)); } } else { // read current attachments and reattach using the same config with the new clone foreach (var attachment in PyRevitAttachments.GetAttachments()) { if (attachment.Engine != null) { PyRevitAttachments.Attach( attachment.Product.ProductYear, clone, engineVer: attachment.Engine.Version, allUsers: attachment.AllUsers); } else { throw new PyRevitException("Can not determine attachment engine."); } } } }
CreateEnvJson() { // collecet search paths var searchPaths = new List <string>() { PyRevitConsts.DefaultExtensionsPath }; searchPaths.AddRange(PyRevitExtensions.GetRegisteredExtensionSearchPaths()); // collect list of lookup sources var lookupSrc = new List <string>() { PyRevitExtensions.GetDefaultExtensionLookupSource() }; lookupSrc.AddRange(PyRevitExtensions.GetRegisteredExtensionLookupSources()); // create json data object var jsonData = new Dictionary <string, object>() { { "meta", new Dictionary <string, object>() { { "version", "0.1.0" } } }, { "clones", PyRevitClones.GetRegisteredClones() }, { "attachments", PyRevitAttachments.GetAttachments() }, { "extensions", PyRevitExtensions.GetInstalledExtensions() }, { "searchPaths", searchPaths }, { "lookupSources", lookupSrc }, { "installed", RevitProduct.ListInstalledProducts() }, { "running", RevitController.ListRunningRevits() }, { "pyrevitDataDir", PyRevitLabsConsts.PyRevitPath }, { "userEnv", new Dictionary <string, object>() { { "osVersion", UserEnv.GetWindowsVersion() }, { "execUser", string.Format("{0}\\{1}", Environment.UserDomainName, Environment.UserName) }, { "activeUser", UserEnv.GetLoggedInUserName() }, { "isAdmin", UserEnv.IsRunAsAdmin() }, { "userAppdata", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) }, { "latestFramework", UserEnv.GetInstalledDotNetVersion() }, { "targetPacks", UserEnv.GetInstalledDotnetTargetPacks() }, { "targetPacksCore", UserEnv.GetInstalledDotnetCoreTargetPacks() }, { "cliVersion", PyRevitCLI.CLIVersion }, } }, }; var jsonExportCfg = new JsonSerializerSettings { Error = delegate(object sender, pyRevitLabs.Json.Serialization.ErrorEventArgs args) { args.ErrorContext.Handled = true; }, ContractResolver = new CamelCasePropertyNamesContractResolver() }; jsonExportCfg.Converters.Add(new JsonVersionConverter()); return(JsonConvert.SerializeObject(jsonData, jsonExportCfg)); }
AttachClone(string cloneName, bool latest, bool dynamoSafe, string engineVersion, string revitYear, bool installed, bool attached, bool allUsers) { var clone = PyRevitClones.GetRegisteredClone(cloneName); // grab engine version int engineVer = 0; int.TryParse(engineVersion, out engineVer); if (latest) { logger.Debug("Attaching on latest engine..."); var latestCloneEngine = clone.GetEngines().Where(x => x.Runtime).OrderByDescending(x => x.Version).First(); logger.Debug(string.Format("Latest engine: {0}", latestCloneEngine)); if (latestCloneEngine != null) { engineVer = latestCloneEngine.Version; } else { throw new PyRevitException("Can not determine latest runtime engine for this clone."); } } else if (dynamoSafe) { logger.Debug("Attaching on dynamo-safe engine"); engineVer = PyRevitConsts.ConfigsDynamoCompatibleEnginerVer; } // decide targets revits to attach to int revitYearNumber = 0; if (installed) { foreach (var revit in RevitProduct.ListInstalledProducts()) { PyRevitAttachments.Attach(revit.ProductYear, clone, engineVer: engineVer, allUsers: allUsers); } } else if (attached) { foreach (var attachment in PyRevitAttachments.GetAttachments()) { PyRevitAttachments.Attach(attachment.Product.ProductYear, clone, engineVer: engineVer, allUsers: allUsers); } } else if (int.TryParse(revitYear, out revitYearNumber)) { PyRevitAttachments.Attach(revitYearNumber, clone, engineVer: engineVer, allUsers: allUsers); } }
PrintAttachments(int revitYear = 0) { PyRevitCLIAppCmds.PrintHeader("Attachments"); foreach (var attachment in PyRevitAttachments.GetAttachments().OrderByDescending(x => x.Product.Version)) { if (revitYear == 0) { Console.WriteLine(attachment); } else if (revitYear == attachment.Product.ProductYear) { Console.WriteLine(attachment); } } }
DetachClone(string revitYear, bool all, bool currentAndAllUsers = false) { if (revitYear != null) { int revitYearNumber = 0; if (int.TryParse(revitYear, out revitYearNumber)) { PyRevitAttachments.Detach(revitYearNumber, currentAndAllUsers: true); } else { throw new PyRevitException(string.Format("Invalid Revit year \"{0}\"", revitYear)); } } else if (all) { PyRevitAttachments.DetachAll(currentAndAllUsers); } }
DeleteClone(bool allClones, string cloneName, bool clearConfigs) { if (allClones) { PyRevitClones.DeleteAllClones(clearConfigs: clearConfigs); } else if (cloneName != null) { // lets detach the clone if there is any attachments to it var clone = PyRevitClones.GetRegisteredClone(cloneName); foreach (var attachment in PyRevitAttachments.GetAttachments()) { if (attachment.Clone.Equals(clone)) { logger.Debug($"Detaching existing attachment: {attachment}"); PyRevitAttachments.Detach(attachment.Product.ProductYear, attachment.AllUsers); } } PyRevitClones.Delete(clone, clearConfigs: clearConfigs); } }
RunExtensionCommand(string commandName, string targetFile, string revitYear, PyRevitRunnerOptions runOptions, bool targetIsFileList = false) { // verify command if (commandName is null || commandName == string.Empty) { throw new Exception("Command name must be provided."); } // try target revit year int revitYearNumber = 0; int.TryParse(revitYear, out revitYearNumber); // setup a list of models var modelFiles = new List <string>(); // if target file is a list of model paths if (targetIsFileList) { // attempt at reading the list file and grab the model files only foreach (var modelPath in File.ReadAllLines(targetFile)) { modelFiles.Add(modelPath); } } // otherwise just work on this model else { modelFiles.Add(targetFile); } // verify all models are accessible foreach (string modelFile in modelFiles) { if (!CommonUtils.VerifyFile(modelFile)) { throw new Exception($"Model does not exist at \"{modelFile}\""); } } // determine which Revit version to launch if (revitYearNumber != 0) { foreach (string modelFile in modelFiles) { var modelInfo = new RevitModelFile(modelFile); // if specific revit version is provided, make sure model is not newer if (modelInfo.RevitProduct != null) { if (modelInfo.RevitProduct.ProductYear > revitYearNumber) { throw new Exception($"Model at \"{modelFile}\" is newer than the specified version: {revitYearNumber}"); } } else { throw new Exception($"Can not detect the Revit version of model at \"{modelFile}\". Model might be newer than specified version {revitYearNumber}."); } } } else { // determine revit model version from given files foreach (string modelFile in modelFiles) { var modelInfo = new RevitModelFile(modelFile); if (modelInfo.RevitProduct != null) { if (revitYearNumber == 0) { revitYearNumber = modelInfo.RevitProduct.ProductYear; } else if (modelInfo.RevitProduct.ProductYear > revitYearNumber) { revitYearNumber = modelInfo.RevitProduct.ProductYear; } } } // if could not determine revit version from given files, // use latest version if (revitYearNumber == 0) { revitYearNumber = RevitProduct.ListInstalledProducts().Max(r => r.ProductYear); } } // now run if (revitYearNumber != 0) { // determine attached clone var attachment = PyRevitAttachments.GetAttached(revitYearNumber); if (attachment is null) { logger.Error($"pyRevit is not attached to Revit \"{revitYearNumber}\". " + "Runner needs to use the attached clone and engine to execute the script."); } else { // determine script to run string commandScriptPath = null; if (!CommonUtils.VerifyPythonScript(commandName)) { logger.Debug("Input is not a script file \"{0}\"", commandName); logger.Debug("Attempting to find run command matching \"{0}\"", commandName); // try to find run command in attached clone being used for execution // if not found, try to get run command from all other installed extensions var targetExtensions = new List <PyRevitExtension>(); if (attachment.Clone != null) { targetExtensions.AddRange(attachment.Clone.GetExtensions()); } targetExtensions.AddRange(PyRevitExtensions.GetInstalledExtensions()); foreach (PyRevitExtension ext in targetExtensions) { logger.Debug("Searching for run command in: \"{0}\"", ext.ToString()); if (ext.Type == PyRevitExtensionTypes.UIExtension) { try { var cmdScript = ext.GetCommand(commandName); if (cmdScript != null) { logger.Debug("Run command matching \"{0}\" found: \"{1}\"", commandName, cmdScript); commandScriptPath = cmdScript.Path; break; } } catch { // does not include command continue; } } } } else { commandScriptPath = commandName; } // if command is not found, stop if (commandScriptPath is null) { throw new PyRevitException( string.Format("Run command not found: \"{0}\"", commandName) ); } // RUN! var execEnv = PyRevitRunner.Run( attachment, commandScriptPath, modelFiles, runOptions ); // print results (exec env) PyRevitCLIAppCmds.PrintHeader("Execution Environment"); Console.WriteLine(string.Format("Execution Id: \"{0}\"", execEnv.ExecutionId)); Console.WriteLine(string.Format("Product: {0}", execEnv.Revit)); Console.WriteLine(string.Format("Clone: {0}", execEnv.Clone)); Console.WriteLine(string.Format("Engine: {0}", execEnv.Engine)); Console.WriteLine(string.Format("Script: \"{0}\"", execEnv.Script)); Console.WriteLine(string.Format("Working Directory: \"{0}\"", execEnv.WorkingDirectory)); Console.WriteLine(string.Format("Journal File: \"{0}\"", execEnv.JournalFile)); Console.WriteLine(string.Format("Manifest File: \"{0}\"", execEnv.PyRevitRunnerManifestFile)); Console.WriteLine(string.Format("Log File: \"{0}\"", execEnv.LogFile)); // report whether the env was purge or not if (execEnv.Purged) { Console.WriteLine("Execution env is successfully purged."); } // print target models if (execEnv.ModelPaths.Count() > 0) { PyRevitCLIAppCmds.PrintHeader("Target Models"); foreach (var modelPath in execEnv.ModelPaths) { Console.WriteLine(modelPath); } } // print log file contents if exists if (File.Exists(execEnv.LogFile)) { PyRevitCLIAppCmds.PrintHeader("Execution Log"); Console.WriteLine(File.ReadAllText(execEnv.LogFile)); } } } }
RunPythonCommand(string inputCommand, string targetFile, string revitYear, PyRevitRunnerOptions runOptions) { // determine if script or command var modelFiles = new List <string>(); // make sure file exists if (targetFile != null) { CommonUtils.VerifyFile(targetFile); } if (inputCommand != null) { // determine target revit year int revitYearNumber = 0; // if revit year is not specified try to get from model file if (revitYear is null) { if (targetFile != null) { try { revitYearNumber = new RevitModelFile(targetFile).RevitProduct.ProductYear; // collect model names also modelFiles.Add(targetFile); } catch (Exception ex) { logger.Error( "Revit version must be explicitly specifies if using a model list file. | {0}", ex.Message ); } } // if no revit year and no model, run with latest revit else { revitYearNumber = RevitProduct.ListInstalledProducts().Max(r => r.ProductYear); } } // otherwise, grab the year from argument else { revitYearNumber = int.Parse(revitYear); // prepare model list of provided if (targetFile != null) { try { var modelVer = new RevitModelFile(targetFile).RevitProduct.ProductYear; if (revitYearNumber < modelVer) { logger.Warn("Model is newer than the target Revit version."); } else { modelFiles.Add(targetFile); } } catch { // attempt at reading the list file and grab the model files only foreach (var modelPath in File.ReadAllLines(targetFile)) { if (CommonUtils.VerifyFile(modelPath)) { try { var modelVer = new RevitModelFile(modelPath).RevitProduct.ProductYear; if (revitYearNumber < modelVer) { logger.Warn("Model is newer than the target Revit version."); } else { modelFiles.Add(modelPath); } } catch { logger.Error("File is not a valid Revit file: \"{0}\"", modelPath); } } else { logger.Error("File does not exist: \"{0}\"", modelPath); } } } } } // now run if (revitYearNumber != 0) { // determine attached clone var attachment = PyRevitAttachments.GetAttached(revitYearNumber); if (attachment is null) { logger.Error("pyRevit is not attached to Revit \"{0}\". " + "Runner needs to use the attached clone and engine to execute the script.", revitYear); } else { // determine script to run string commandScriptPath = null; if (!CommonUtils.VerifyPythonScript(inputCommand)) { logger.Debug("Input is not a script file \"{0}\"", inputCommand); logger.Debug("Attempting to find run command matching \"{0}\"", inputCommand); // try to find run command in attached clone being used for execution // if not found, try to get run command from all other installed extensions var targetExtensions = new List <PyRevitExtension>(); if (attachment.Clone != null) { targetExtensions.AddRange(attachment.Clone.GetExtensions()); } targetExtensions.AddRange(PyRevitExtensions.GetInstalledExtensions()); foreach (PyRevitExtension ext in targetExtensions) { logger.Debug("Searching for run command in: \"{0}\"", ext.ToString()); if (ext.Type == PyRevitExtensionTypes.RunnerExtension) { try { var cmdScript = ext.GetRunCommand(inputCommand); if (cmdScript != null) { logger.Debug("Run command matching \"{0}\" found: \"{1}\"", inputCommand, cmdScript); commandScriptPath = cmdScript; break; } } catch { // does not include command continue; } } } } else { commandScriptPath = inputCommand; } // if command is not found, stop if (commandScriptPath is null) { throw new PyRevitException( string.Format("Run command not found: \"{0}\"", inputCommand) ); } // RUN! var execEnv = PyRevitRunner.Run( attachment, commandScriptPath, modelFiles, runOptions ); // print results (exec env) PyRevitCLIAppCmds.PrintHeader("Execution Environment"); Console.WriteLine(string.Format("Execution Id: \"{0}\"", execEnv.ExecutionId)); Console.WriteLine(string.Format("Product: {0}", execEnv.Revit)); Console.WriteLine(string.Format("Clone: {0}", execEnv.Clone)); Console.WriteLine(string.Format("Engine: {0}", execEnv.Engine)); Console.WriteLine(string.Format("Script: \"{0}\"", execEnv.Script)); Console.WriteLine(string.Format("Working Directory: \"{0}\"", execEnv.WorkingDirectory)); Console.WriteLine(string.Format("Journal File: \"{0}\"", execEnv.JournalFile)); Console.WriteLine(string.Format("Manifest File: \"{0}\"", execEnv.PyRevitRunnerManifestFile)); Console.WriteLine(string.Format("Log File: \"{0}\"", execEnv.LogFile)); // report whether the env was purge or not if (execEnv.Purged) { Console.WriteLine("Execution env is successfully purged."); } // print target models if (execEnv.ModelPaths.Count() > 0) { PyRevitCLIAppCmds.PrintHeader("Target Models"); foreach (var modelPath in execEnv.ModelPaths) { Console.WriteLine(modelPath); } } // print log file contents if exists if (File.Exists(execEnv.LogFile)) { PyRevitCLIAppCmds.PrintHeader("Execution Log"); Console.WriteLine(File.ReadAllText(execEnv.LogFile)); } } } } }