Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        //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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        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>();
        }
Esempio n. 5
0
        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);
                }
            }
        }
Esempio n. 6
0
        /// <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);
                }
            }
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
         }
     }
 }