KennanChan / Revit.Async

Use task-based asynchronous pattern (TAP) to run Revit API code from any execution context.
MIT License
221 stars 52 forks source link

RevitTask.Initialize() Two Addin #28

Open grizoood opened 6 months ago

grizoood commented 6 months ago

Hello,

I'm having a problem, I have 2 addins that use RevitTask when I do

RevitTask.Initialize(application);

Addin 1 Application :

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Revit.Async;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RevitTaskAddin1
{
    public class Application : IExternalApplication
    {
        public static AddInId ActiveAddInId { get; private set; }

        public static string PluginName { get; set; }

        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }

        public Result OnStartup(UIControlledApplication application)
        {
            ActiveAddInId = application.ActiveAddInId;

            PluginName = application.ActiveAddInId.GetAddInName();

            var tabName = "Custom Tab";

            RevitUIFactory.AddRibbonTab(application, tabName);

            RibbonPanel detailingPanel = RevitUIFactory.AddRibbonPanel
                            (application, tabName, "Custom Panel", true);

            RevitUIFactory.AddRibbonButton
              (PluginName, tabName, detailingPanel,
              typeof(MainCommand),
              Properties.Resources.Icon_32x32,
              Properties.Resources.Icon_16x16,
              "Custom command discription.");

            RevitTask.Initialize(application);

            return Result.Succeeded;
        }
    }

    public class CommandAvailability : IExternalCommandAvailability
    {
        public bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
        {
            if (applicationData.ActiveUIDocument != null && applicationData.ActiveUIDocument.Document != null &&
              !applicationData.ActiveUIDocument.Document.IsFamilyDocument)
                return true;
            return false;
        }
    }
}

Command in UI of Addin 1

using Revit.Async;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace RevitTaskAddin1
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            txtBlockGuidAddin.Text = Application.ActiveAddInId.GetGUID().ToString();
            await RevitTask.RunAsync(
             app =>
             {
                 string guid = app.ActiveAddInId.GetGUID().ToString();
                 txtBlockRevitAsync.Text = guid;
             });
        }
    }
}

Addin 2 Application :

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Revit.Async;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RevitTaskAddin2
{
    public class Application : IExternalApplication
    {
        public static AddInId ActiveAddInId { get; private set; }

        public static string PluginName { get; set; }

        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }

        public Result OnStartup(UIControlledApplication application)
        {
            ActiveAddInId = application.ActiveAddInId;

            PluginName = application.ActiveAddInId.GetAddInName();

            var tabName = "Custom Tab";

            RevitUIFactory.AddRibbonTab(application, tabName);

            RibbonPanel detailingPanel = RevitUIFactory.AddRibbonPanel
                            (application, tabName, "Custom Panel", true);

            RevitUIFactory.AddRibbonButton
              (PluginName, tabName, detailingPanel,
              typeof(MainCommand),
              Properties.Resources.Icon_32x32,
              Properties.Resources.Icon_16x16,
              "Custom command discription.");

            RevitTask.Initialize(application);

            return Result.Succeeded;
        }
    } 

    public class CommandAvailability : IExternalCommandAvailability
    {
        public bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
        {
            if (applicationData.ActiveUIDocument != null && applicationData.ActiveUIDocument.Document != null &&
              !applicationData.ActiveUIDocument.Document.IsFamilyDocument)
                return true;
            return false;
        }
    }
}

Command in UI of Addin 2

using Revit.Async;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace RevitTaskAddin2
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            txtBlockGuidAddin.Text = Application.ActiveAddInId.GetGUID().ToString();
            await RevitTask.RunAsync(
             app =>
             {
                 string guid = app.ActiveAddInId.GetGUID().ToString();
                 txtBlockRevitAsync.Text = guid;
             });
        }
    }
}

image

The Revit task Guid is identical between the two addins.

grizoood commented 6 months ago

I need to have the right GUID depending on the application because I'm doing registers via the IUpdater in Revit.

KennanChan commented 6 months ago

How about using the foundamental ExternalEvent to do the same thing? I doubt it is a problem caused by the ExternalEvent machenism.