using System; using System.Windows; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Windows; using Nice3point.Revit.Toolkit.External.Handlers; using Sai.RvKits.Properties; using Sai.RvKits.RvView; using adWin = Autodesk.Windows; namespace Sai.RvKits.UIRibbon; public class DrawingViewApp { private static readonly string TabName = Properties.Settings.Default.TabName; public DrawingViewApp(UIControlledApplication application) { CreateAnnotationsTools(application); RegisterDockPaneAndEvent(application); } private readonly ActionEventHandler zoomElementHandler = new(); private void CreateAnnotationsTools(UIControlledApplication application) { var ribbonPanel = application.CreateRibbonPanel(TabName, "视图与出图"); var autoAlignTags = UIAssist.NewPushButtonData( "对齐标记", Resources.align_tags_32px, Resources.align_tags_16px ).SetAvailability(); var arrangeTags = UIAssist.NewPushButtonData( "整理标记", Resources.arrange_tags_32px, Resources.arrange_tags_16px ).SetAvailability(); var dim2Line = UIAssist.NewPushButtonData( "双线标注", Resources.two_lines_32px, Resources.two_lines_16px, "选择要标注的两条平行的几何模型边缘线进行标注。" ); var visibilityControl = UIAssist.NewPushButtonData( "可见性", Resources.visibility_control_32px, Resources.visibility_control_16px, "可见性控制" ).SetAvailability(); var sectionBox = UIAssist.NewPushButtonData( "剖面框", Resources.sectionBox_32px, Resources.sectionBox_16px ); var filter = UIAssist.NewPushButtonData( "过滤器", Resources.filter_32px, Resources.filter_16px, "创建当前视图的结构模型区分的过滤" ); var panelSchedule = UIAssist.NewPushButtonData( "铺砖明细表", Resources.schedule_32px, Resources.schedule_16px ); var exportSchedulesPbd = UIAssist.NewPushButtonData( "导出明细表", Resources.export_excel_32px, Resources.export_excel_16px, "导出明细表为Excel文件" ); var systemDisplay = UIAssist.NewPushButtonData( "系统显示", Resources.system_display_32px, Resources.system_display_16px ); var viewManager = UIAssist.NewPushButtonData( "视图管理", Resources.view_manager_32px, Resources.view_manager_16px ); var quickViewSection = UIAssist.NewPushButtonData( "快速剖面", Resources.view_section_32px, Resources.view_section_16px ); var elementsControlCmd = UIAssist.NewPushButtonData( "元素控制", Resources.open_pane_32px, Resources.open_pane_32px, "元素菜单控制" ); ribbonPanel.AddStackedItems(dim2Line, autoAlignTags, arrangeTags); ribbonPanel.AddStackedItems(visibilityControl, sectionBox, filter); //ribbonPanel.AddSplitButton(splitBtn1, dim2Line, autoAlignTags, arrangeTags); ribbonPanel.AddItem(elementsControlCmd); ribbonPanel.AddStackedItems(systemDisplay, viewManager, quickViewSection); var tab = ComponentManager.Ribbon.Tabs.First(t => t.Name == TabName); CreateToggleButton(tab, "视图与出图"); //面板下拉展开 ribbonPanel.AddSlideOut(); ribbonPanel.AddStackedItems(panelSchedule, exportSchedulesPbd); //SplitButtonData splitBtn3 = new(nameof(splitBtn3), "显示设置"); //ribbonPanel.AddPushButton("系统显示", Resources.system_display_32px, "系统显示"); //ribbonPanel.AddPushButton("视图管理", Resources.view_manager_32px, "视图管理"); } private void CreateToggleButton(Autodesk.Windows.RibbonTab rt, string panelName) { try { var panel = rt.Panels.FirstOrDefault(p => p.Source.Name == panelName); var tog = UIAssist.NewAwToggleButton( "最大化", Resources.zoom_32px, "根据视图的图元是否可见,在切换视图时,对当前选中的图元进行快速缩放定位"); //var tog = new Autodesk.Windows.RibbonToggleButton() //{ // LargeImage = Resources.zoom_32px.ToBitmapSource(), // Size = RibbonItemSize.Large, // Name = "ZoomElement", // Text = "最大化", // ShowText = true, // ToolTip = "根据视图的图元是否可见,在切换视图时,对当前选中的图元进行快速缩放定位", // IsCheckable = true, // Orientation = System.Windows.Controls.Orientation.Vertical, //}; tog.CheckStateChanged += (s, e) => { zoomElementHandler.Raise( uiapp => { if (tog.CheckState == true) { uiapp.ViewActivated -= UiApp_ViewActivated; uiapp.ViewActivated += UiApp_ViewActivated; } else { uiapp.ViewActivated -= UiApp_ViewActivated; } }); }; //Autodesk.Windows.RibbonItemControl panel.Source.Items.Add(tog); tog.IsChecked = true; } catch (Exception exception) { MessageBox.Show(exception.Message, "添加TogButton错误"); } } private static void RegisterDockPaneAndEvent(UIControlledApplication application) { ElementsControlDock pane = new(); application.RegisterDockablePane(Variables.PaneId, "元素控制菜单", pane); } private static void UiApp_ViewActivated(object sender, Autodesk.Revit.UI.Events.ViewActivatedEventArgs e) { try { if (sender is not UIApplication uiApp) { return; } var uidoc = uiApp.ActiveUIDocument; var elemIdsSelected = uidoc.Selection.GetElementIds(); if (uidoc.Selection.GetElementIds().Count != 1) { return; } var elem = uidoc.Document.GetElement(elemIdsSelected.FirstOrDefault()); e.CurrentActiveView.ZoomElement(uidoc, elem.Id); } catch (Exception) { throw; } //if (elem.IsVisible(e.CurrentActiveView)) //{ // var box = elem.get_BoundingBox(UiDocument.ActiveGraphicalView); // const int extend = 5; // var uiView = UiDocument.GetOpenUIViews().FirstOrDefault(v => v.ViewId == UiDocument.ActiveGraphicalView.Id); // uiView?.ZoomAndCenterRectangle( // box.Min + (extend * box.Min.Normalize()), // box.Max - (extend * box.Min.Normalize()) // ); //} } }