Revit二開--視圖同步 帶源碼

Revit二開–視圖同步

之前有同學問我,視圖同步怎麼做。其實這個功能不復雜,直接上代碼。
代碼已集成到 唐僧解瓦項目
唐僧解瓦 項目 github地址:https://github.com/binbinstrong/tangsengjiewa

   [Transaction(TransactionMode.Manual)]
    class Cmd_ViewSimultaneous : IExternalCommand
    {
        public static ElementId Id_view1;
        public static ElementId Id_view2;
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var uiapp = commandData.Application;
            var uidoc = uiapp.ActiveUIDocument;
            var doc = uidoc.Document;
            var sel = uidoc.Selection; 

            var planviewfilter = new ElementClassFilter(typeof(ViewPlan));
            var view3dfilter = new ElementClassFilter(typeof(View3D));
            var viewdraftingfilter = new ElementClassFilter(typeof(ViewDrafting));

            var logicfilter = new LogicalOrFilter(new List<ElementFilter>(){planviewfilter,view3dfilter,viewdraftingfilter});

            var views = new FilteredElementCollector(doc).WhereElementIsNotElementType().WherePasses(logicfilter)
                .Where(m => !(m as View).IsTemplate).ToList();
             
            //1.選擇 聯動的兩個窗口
            var selector = ViewSemutaneousSelector.Instance;
            selector.combo1.ItemsSource = views;
            selector.combo1.DisplayMemberPath = "Name";
            selector.combo1.SelectedIndex = 0;

            views.Remove(selector.combo1.SelectionBoxItem as View);

            selector.combo2.ItemsSource = views  ;
            selector.combo2.DisplayMemberPath = "Name";
            selector.combo2.SelectedIndex = 0;
            selector.ShowDialog();

            Id_view1 = (selector.combo1.SelectionBoxItem as View).Id;
            Id_view2 = (selector.combo2.SelectionBoxItem as View).Id;
             

            //激活兩個窗口 並關閉其餘窗口
            uidoc.ActiveView = doc.GetElement(Id_view2) as View;
            uidoc.ActiveView = doc.GetElement(Id_view1) as View;
            var uiviews = uidoc.GetOpenUIViews();
            foreach (var uiview in uiviews)
            {
                if (uiview.ViewId == Id_view1 || uiview.ViewId == Id_view2)
                {
                    continue;
                }
                else
                {
                    uiview.Close();
                }
            }

            //2.平鋪窗口
            var tileviewcommand = RevitCommandId.LookupPostableCommandId(PostableCommand.TileViews);
            uiapp.PostCommand(tileviewcommand);

            //在空閒事件中 同步視圖
            uiapp.Idling += OnIdling;
            //視圖激活事件中 檢測目標視圖是否關閉 若關閉則退出視圖同步功能
            uiapp.ViewActivated += OnviewActivated;

            return Result.Succeeded;
        }

        private void OnviewActivated(object sender, ViewActivatedEventArgs e)
        {
            var uiapp = sender as UIApplication;
            var uidoc = uiapp.ActiveUIDocument;
            var doc = uidoc.Document;

            var acview = doc.ActiveView;
            if (acview.Id != Id_view1 && acview.Id != Id_view2)
            {
                uiapp.Idling -= OnIdling;
            }
        }

        private void OnIdling(object sender, IdlingEventArgs e)
        {
            var uiapp = sender as UIApplication;

            var uidoc = uiapp.ActiveUIDocument;
            var doc = uidoc.Document;
            var sel = uidoc.Selection;

            //var acview = doc.ActiveView;
            var view1 = doc.GetElement(Id_view1) as View;
            var view2 = doc.GetElement(Id_view2) as View;

            var uiview1 = uidoc.GetOpenUIViews().Where(m => m.ViewId == Id_view1).FirstOrDefault();
            var uiview2 = uidoc.GetOpenUIViews().Where(m => m.ViewId == Id_view2).FirstOrDefault();


            var viewcorners = uiview1.GetZoomCorners();
            var corner1 = viewcorners.First();
            var corner2 = viewcorners.Last();
             
            //LogHelper.LogWrite(corner1.ToString()+"::"+corner2.ToString(),@"c:\aaa.txt");
            uiview2.ZoomAndCenterRectangle(corner1, corner2);

        }
    }
  • 實現效果如下:

在這裏插入圖片描述

更多解密盡在唐僧課堂!

唐僧課堂BIM開發

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章