/// <summary> /// Whether the DynamoCore and DynamoRevit are in Revit's internal Addin folder /// </summary> /// <param name="application"></param> /// <returns>True is that Dynamo and DynamoRevit are in Revit internal Addins folder</returns> private static Boolean IsRevitInternalAddin(UIControlledApplication application) { if (application == null) { return(false); } var revitVersion = application.ControlledApplication.VersionNumber; var dynamoRevitRoot = Path.GetDirectoryName(Path.GetDirectoryName(assemblyName)); var RevitRoot = Path.GetDirectoryName(application.GetType().Assembly.Location); if (dynamoRevitRoot.StartsWith(RevitRoot)) { if (File.Exists(Path.Combine(dynamoRevitRoot, "DynamoInstallDetective.dll")) && File.Exists(Path.Combine(dynamoRevitRoot, "DynamoCore.dll"))) { var version_DynamoInstallDetective = FileVersionInfo.GetVersionInfo(Path.Combine(dynamoRevitRoot, "DynamoInstallDetective.dll")); var version_DynamoCore = FileVersionInfo.GetVersionInfo(Path.Combine(dynamoRevitRoot, "DynamoCore.dll")); if (version_DynamoCore.FileMajorPart == version_DynamoInstallDetective.FileMajorPart && version_DynamoCore.FileMinorPart == version_DynamoInstallDetective.FileMinorPart && version_DynamoCore.FileBuildPart == version_DynamoInstallDetective.FileBuildPart ) { return(true); } } } return(false); }
//UIApplication _uiapp; public Result OnStartup(UIControlledApplication a) { #region Retrieving UIApplication from UIControlledApplication // These attempts to access a UIApplication // or Application instance are all in vain: // //_uiapp = (UIApplication) a; //_uiapp = (UIApplication) a.ControlledApplication; //Application app = (Application) a; //Application app2 = (Application) a.ControlledApplication; //Application app3 = a.m_application; // Using Reflection works, though: Type type = a.GetType(); // Not useful in this case, but interesting: MemberInfo[] publicMembers = type.GetMembers(); MemberInfo[] nonPublicMembers = type.GetMembers(BindingFlags.NonPublic); MemberInfo[] staticMembers = type.GetMembers(BindingFlags.Static); // This is the call that finally yields useful results: BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance; MemberInfo[] propertyMembers = type.GetMembers( flags); // Note that the field "m_application" is listed // in the propertyMembers array, and also the // method "getUIApp"... let's grab the field: string propertyName = "m_application"; flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance; Binder binder = null; object[] args = null; object result = type.InvokeMember( propertyName, flags, binder, a, args); UIApplication _uiapp; _uiapp = (UIApplication)result; #endregion // Retrieving UIApplication from UIControlledApplication a.ControlledApplication.ApplicationInitialized += OnApplicationInitialized; return(Result.Succeeded); }
/// <summary> /// 注册元素监控,并指定是否立即监控. /// </summary> public static void Register(UIControlledApplication uiControllApp) { if (uiControllApp == null) { throw new ArgumentNullException(nameof(uiControllApp)); } var flag = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod; var uiApp = (UIApplication)uiControllApp.GetType().InvokeMember("getUIApplication", flag, Type.DefaultBinder, uiControllApp, null); Register(uiApp); }
void OnBefore(UIControlledApplication application) { AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; var flags = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod; if (m_Application == null) { m_Application = (UIApplication)application.GetType().InvokeMember("getUIApplication", flags, Type.DefaultBinder, application, null); } if (RevitCommandHelper.Instance == null) { RevitCommandHelper.Instance = new RevitCommandHelper(); } RevitCommandHelper.Instance.RegisterCommand <RevitCommandInvoke>(); }
private static void ExecuteStartupScript(UIControlledApplication uiControlledApplication) { // we need a UIApplication object to assign as `__revit__` in python... var fi = uiControlledApplication.GetType().GetField("m_application", BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript var startupScript = GetStartupScript(); if (startupScript != null) { var executor = new ScriptExecutor(GetConfig(), uiApplication, uiControlledApplication); var result = executor.ExecuteScript(startupScript, GetStartupScriptPath()); if (result == (int)Result.Failed) { TaskDialog.Show("RevitPythonShell - StartupScript", executor.Message); } } }
/// <summary> /// Execute the startup script (specified under /RpsAddin/StartupScript/@src) /// </summary> /// <param name="uiControlledApplication"></param> private void ExecuteStartupScript(UIControlledApplication uiControlledApplication, XDocument addinXml, Assembly addinAssembly) { // we need a UIApplication object to assign as `__revit__` in python... var fi = uiControlledApplication.GetType().GetField("m_application", BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript var startupScript = GetStartupScript(addinXml, addinAssembly); if (startupScript != null) { var executor = new ScriptExecutor(GetConfig(), uiApplication, uiControlledApplication); var result = executor.ExecuteScript(startupScript); if (result == (int)Result.Failed) { // FIXME: make the TaskDialog show the addins name. TaskDialog.Show("RevitPythonShell - StartupScript", executor.Message); } } }
private static void ExecuteStartupScript(UIControlledApplication uiControlledApplication) { // we need a UIApplication object to assign as `__revit__` in python... var versionNumber = uiControlledApplication.ControlledApplication.VersionNumber; var fieldName = versionNumber == "2017" ? "m_uiapplication": "m_application"; var fi = uiControlledApplication.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript var startupScript = GetStartupScriptPath(); if (startupScript != null) { var executor = new ScriptExecutor(uiApplication, uiControlledApplication); var result = executor.ExecuteScript(startupScript); if (result == (int)Result.Failed) { TaskDialog.Show("PyRevitLoader", executor.Message); } } }
/// <summary> /// Execute the startup script (specified under /RpsAddin/StartupScript/@src) /// </summary> /// <param name="uiControlledApplication"></param> private void ExecuteStartupScript(UIControlledApplication uiControlledApplication, XDocument addinXml, Assembly addinAssembly) { // we need a UIApplication object to assign as `__revit__` in python... var versionNumber = uiControlledApplication.ControlledApplication.VersionNumber; var fieldName = int.Parse(versionNumber) >= 2017 ? "m_uiapplication" : "m_application"; var fi = uiControlledApplication.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript var scriptName = GetStartupScriptName(addinXml); var startupScript = GetEmbeddedScript(scriptName, addinAssembly); if (startupScript != null) { var executor = new ScriptExecutor(GetConfig(), uiApplication, uiControlledApplication); var result = executor.ExecuteScript(startupScript, Path.Combine(addinAssembly.Location, scriptName)); if (result == (int)Result.Failed) { // FIXME: make the TaskDialog show the addins name. TaskDialog.Show("RevitPythonShell - StartupScript", executor.Message); } } }
private static UIApplication GetUiApplication() { var versionNumber = UIContApp.ControlledApplication.VersionNumber; var fieldName = string.Empty; switch (versionNumber) { case "2017": fieldName = "m_uiapplication"; break; case "2018": fieldName = "m_uiapplication"; break; case "2019": fieldName = "m_uiapplication"; break; case "2020": fieldName = "m_uiapplication"; break; } var fieldInfo = UIContApp.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fieldInfo?.GetValue(UIContApp); return(uiApplication); }
private static Result ExecuteStartupScript(UIControlledApplication uiControlledApplication) { // we need a UIApplication object to assign as `__revit__` in python... var versionNumber = uiControlledApplication.ControlledApplication.VersionNumber; var fieldName = int.Parse(versionNumber) >= 2017 ? "m_uiapplication" : "m_application"; var fi = uiControlledApplication.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript Result result = Result.Succeeded; var startupScript = GetStartupScriptPath(); if (startupScript != null) { var executor = new ScriptExecutor(uiApplication); // uiControlledApplication); result = executor.ExecuteScript(startupScript); if (result == Result.Failed) { TaskDialog.Show("Error Loading pyRevit", executor.Message); } } return(result); }
public Result OnStartup(UIControlledApplication application) { try { // Get the revit version Version = Convert.ToInt32(application.ControlledApplication.VersionNumber); // Get the revit handle RevitHandle = IntPtr.Zero; if (Version < 2019) { RevitHandle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; } else { RevitHandle = application.GetType().GetProperty("MainWindowHandle") != null ? (IntPtr)application.GetType().GetProperty("MainWindowHandle")?.GetValue(application) : IntPtr.Zero; } application.ControlledApplication.DocumentOpened += DocumentOpened; ScheduleDeleteUpdater excelSchedUpdater = new ScheduleDeleteUpdater(application.ActiveAddInId); UpdaterRegistry.RegisterUpdater(excelSchedUpdater, true); //ElementCategoryFilter ecf = new ElementCategoryFilter(BuiltInCategory.OST_Views); ElementClassFilter ecf = new ElementClassFilter(typeof(ViewSchedule), false); UpdaterRegistry.AddTrigger(excelSchedUpdater.GetUpdaterId(), ecf, Element.GetChangeTypeElementDeletion()); // create the buttons string path = typeof(UpdateExcelApp).Assembly.Location; // pushbutton for the import command PushButtonData excelImportPushButtonData = new PushButtonData( "Import Excel As Schedule", "Import Excel", path, typeof(ImportExcelCmd).FullName) { LargeImage = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Properties.Resources.ExcelScheduleIcon.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()), Image = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(Properties.Resources.ExcelScheduleIcon_16x16.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()), ToolTip = "Import data from an Excel worksheet into Revit as a schedule.", }; // Pushbutton for the settings command PushButtonData settingsPushButtonData = new PushButtonData( "Import Lineweights", "Settings", path, typeof(SettingsCmd).FullName) { ToolTip = "Set the line styles to use for different lineweight settings.", }; // PushButtonData for the Manage Links window PushButtonData manageLinksPushButtonData = new PushButtonData( "Manage Links", "Manage Links", path, typeof(ManageLinksCmd).FullName) { ToolTip = "Manage linked excel files", }; SplitButtonData excelSBD = new SplitButtonData("Import Excel", "Import\nExcel"); // Set default config values string helpPath = Path.Combine(Path.GetDirectoryName(typeof(UpdateExcelApp).Assembly.Location), "help\\ImportExcel.pdf"); string tabName = "Add-Ins"; string panelName = "Views"; if (RevitCommon.FileUtils.GetPluginSettings(typeof(UpdateExcelApp).Assembly.GetName().Name, out Dictionary <string, string> settings)) { // Settings retrieved, lets try to use them. if (settings.ContainsKey("help-path") && !string.IsNullOrWhiteSpace(settings["help-path"])) { // Check to see if it's relative path string hp = Path.Combine(Path.GetDirectoryName(typeof(UpdateExcelApp).Assembly.Location), settings["help-path"]); if (File.Exists(hp)) { helpPath = hp; } else { helpPath = settings["help-path"]; } } if (settings.ContainsKey("tab-name") && !string.IsNullOrWhiteSpace(settings["tab-name"])) { tabName = settings["tab-name"]; } if (settings.ContainsKey("panel-name") && !string.IsNullOrWhiteSpace(settings["panel-name"])) { panelName = settings["panel-name"]; } } // Create the SplitButton. SplitButton excelSB = RevitCommon.UI.AddToRibbon(application, tabName, panelName, excelSBD); // Setup the help ContextualHelp help = null; if (File.Exists(helpPath)) { help = new ContextualHelp(ContextualHelpType.ChmFile, helpPath); } else if (Uri.TryCreate(helpPath, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)) { help = new ContextualHelp(ContextualHelpType.Url, helpPath); } if (help != null) { excelImportPushButtonData.SetContextualHelp(help); manageLinksPushButtonData.SetContextualHelp(help); settingsPushButtonData.SetContextualHelp(help); excelSBD.SetContextualHelp(help); excelSB.SetContextualHelp(help); } PushButton importPB = excelSB.AddPushButton(excelImportPushButtonData) as PushButton; PushButton managePB = excelSB.AddPushButton(manageLinksPushButtonData) as PushButton; PushButton settingPB = excelSB.AddPushButton(settingsPushButtonData) as PushButton; excelSB.IsSynchronizedWithCurrentItem = false; return(Result.Succeeded); } catch { return(Result.Failed); } }
private static void ExecuteStartupScript(UIControlledApplication uiControlledApplication) { // we need a UIApplication object to assign as `__revit__` in python... var fi = uiControlledApplication.GetType().GetField("m_application", BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript var startupScript = GetStartupScript(); if (startupScript != null) { var executor = new ScriptExecutor(uiApplication, uiControlledApplication); var result = executor.ExecuteScript(startupScript, GetStartupScriptPath() ); if (result == (int)Result.Failed) { TaskDialog.Show("RevitPythonLoader", executor.Message); } } }
/// <summary> /// Execute the startup script (specified under /RpsAddin/StartupScript/@src) /// </summary> /// <param name="uiControlledApplication"></param> private void ExecuteStartupScript(UIControlledApplication uiControlledApplication, XDocument addinXml, Assembly addinAssembly) { // we need a UIApplication object to assign as `__revit__` in python... var fi = uiControlledApplication.GetType().GetField("m_application", BindingFlags.NonPublic | BindingFlags.Instance); var uiApplication = (UIApplication)fi.GetValue(uiControlledApplication); // execute StartupScript var scriptName = GetStartupScriptName(addinXml); var startupScript = GetEmbeddedScript(scriptName, addinAssembly); if (startupScript != null) { var executor = new ScriptExecutor(GetConfig(), uiApplication, uiControlledApplication); var result = executor.ExecuteScript(startupScript, Path.Combine(addinAssembly.Location, scriptName)); if (result == (int)Result.Failed) { // FIXME: make the TaskDialog show the addins name. TaskDialog.Show("RevitPythonShell - StartupScript", executor.Message); } } }