Revit二次开发:使用DMU(Dynamic Model Update)实现联动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;

namespace DMU开发
{
    [Transaction(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //可以使用addinmanager调试的DMU
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            ElementCategoryFilter genericmodelFilter = new ElementCategoryFilter(BuiltInCategory.OST_GenericModel);//常规模型过滤器
            AddInId addin = commandData.Application.ActiveAddInId;//获取应用程序的GUID值
            MyUpdater _updater = new MyUpdater(addin, addin.GetGUID());//创建更新器
            //UpdaterRegistry.RegisterUpdater(_updater, true);//应用层级应用
            UpdaterRegistry.RegisterUpdater(_updater, doc);//文档级别应用
            ChangeType changeTwo = ChangeType.ConcatenateChangeTypes(Element.GetChangeTypeGeometry(), Element.GetChangeTypeElementAddition());
            //       改变类别                                                  几何变化引发更新                   元素增加引发更新
            //几何引发更新:位置的变更也会引发几何变化
            UpdaterRegistry.AddTrigger(_updater.GetUpdaterId(), doc, genericmodelFilter, changeTwo);//更新器引发


            return Result.Succeeded;
        }
    }

    public class MyUpdater : IUpdater
    {
        UpdaterId _uid;
        public MyUpdater(AddInId Adin, Guid guid)
        {
            _uid = new UpdaterId(Adin, guid);

        }
        public void Execute(UpdaterData data)
        //Execute函数是主要的回调函数,它会在DMU触发的时候被调用,通过该函数的参数UpdaterData,
        //我们可以获取很多内容,比如UpdaterData..GetDocument()可以获取Document, GetAddedElementIds()可以获取被添加的元素id。
        //我们可以在此函数里面做很多事情,例如,修改其他元素实现关联修改。这完全可以取决于我们自己。
        //在Execute函数里面不能使用Transaction,因为它本身就在Transaction里面
        {
            try
            {
                TaskDialog.Show("1", "1");
            }
            catch (Exception ee)
            {
                TaskDialog.Show("1", ee.Message.ToString());
            }
        }

        public string GetAdditionalInformation()
        {
            return "N/A";
        }

        public ChangePriority GetChangePriority()
        {
            return ChangePriority.FreeStandingComponents;
        }

        public UpdaterId GetUpdaterId()
        {
            return _uid;
        }

        public string GetUpdaterName()
        {
            return "MyUpdater";
        }
    }


}
引用:https://blog.csdn.net/lushibi/article/details/50629022

你可能感兴趣的:(Revit二次开发:使用DMU(Dynamic Model Update)实现联动)