using System.Windows; using Nice3point.Revit.Toolkit.External; using Nice3point.Revit.Toolkit.External.Handlers; using ShrlAlgoToolkit.RevitAddins.FamMaster; using ShrlAlgoToolkit.RevitAddins.ModelManager; using ShrlAlgoToolkit.RevitAddins.Properties; using ShrlAlgoToolkit.RevitAddins.RvCivil; namespace ShrlAlgoToolkit.RevitAddins.Entry; //[Obfuscation(Exclude = true, ApplyToMembers = true)] public class RvApp : ExternalApplication { private static readonly string TabName = Settings.Default.TabName; private AsyncEventHandler saveHandler; readonly System.Timers.Timer saveTimer = Variables.AutoSaveTimer; private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e) { saveHandler.RaiseAsync(app => { var doc = app.ActiveUIDocument.Document; #if REVIT2018 if (doc.IsModified && !string.IsNullOrEmpty(doc.PathName) && !doc.IsReadOnlyFile) #else if (!doc.IsBackgroundCalculationInProgress() && doc.IsModified && !string.IsNullOrEmpty(doc.PathName)&&!doc.IsReadOnlyFile) #endif { try { doc.Save(); } catch (Autodesk.Revit.Exceptions.OperationCanceledException) { MessageBox.Show("已手动取消本次保存", "提示"); } catch (Exception) { var command = RevitCommandId.LookupPostableCommandId(PostableCommand.Save); app.PostCommand(command); //MessageBox.Show("本次自动保存失败,将重新计时", "提示"); } } }); } public override void OnStartup() { saveHandler = new(); UiApplication.CreateRibbonTab(Settings.Default.TabName); var versionNumber = UiApplication.Application.VersionNumber; var subVersionNumber = UiApplication.Application.SubVersionNumber; var subVersion = new Version(subVersionNumber); var minVersion = new Version("2018.1"); if (versionNumber == "2018" && subVersion < minVersion) { MessageBox.Show("版本小于2018.1,部分功能可能无法使用,请使用升级补丁升级Revit软件", "提示"); } var ribbon = Autodesk.Windows.ComponentManager.Ribbon; var rt = ribbon.Tabs.FirstOrDefault(tab => tab.Name == Settings.Default.TabName); ribbon.Tabs.Remove(rt); //foreach (var tab in ribbon.Tabs) //{ // if (tab.Name == Settings.Default.TabName) // { // rt = tab; // ribbon.Tabs.Remove(tab); // break; // } //} ribbon.Tabs.Insert(0, rt); CivilApp(Application); MEPApp(Application); _ = new ModifyTabApp(UiApplication); _ = new DrawingViewApp(Application); CreateCommonTools(Application); _ = new TabManagerApp(Application); _ = new FamilyApp(Application, UiApplication); if (Settings.Default.IsActiveAutoSave) { var interval = Settings.Default.AutoSaveIntervalTime * 60_000; saveTimer.Interval = interval; saveTimer.Elapsed -= OnTimedEvent; saveTimer.Elapsed += OnTimedEvent; saveTimer.Start(); } } // private static NavigateUri FontUri => new NavigateUri( //"pack://application:,,,/ShrlAlgoToolkit.RevitAddins;component/"); // private static FontFamily FontFamily => new FontFamily(FontUri, "./Fonts/#BoxIcons"); public static void CivilApp(UIControlledApplication application) { var ribbonPanel = application.CreateRibbonPanel(TabName, "土建装饰"); var floorFinishesPbd = UIAssist.NewPushButtonData( "房间饰面", Resources.tites_32px, Resources.tites_16px, "创建房间饰面" ); var curtainFinishesPbd = UIAssist.NewPushButtonData( "铺贴饰面", Resources.finishes_32px, Resources.finishes_16px ); var wallFinishesPbd = UIAssist.NewPushButtonData( text: "墙饰面", Resources.bricks_32px, Resources.bricks_16px ); var slopeFloorPbd = UIAssist.NewPushButtonData( "坡度楼板", Resources.slope_floor_32px, Resources.slope_floor_16px, "分别选择两个楼板的两条平行线创建坡度楼板" ); var createOpeningsPbd = UIAssist.NewPushButtonData( "创建洞口", Resources.openings_32px, Resources.openings_16px, "根据管线创建洞口" ).SetAvailability(); var modelSplitPbd = UIAssist.NewPushButtonData( "模型拆分", Resources.separation_32px, Resources.separation_16px, "按标高拆分为单独的文件" ); var splitComPbd = UIAssist.NewPushButtonData( "分割墙柱", Resources.model_split_32px, Resources.model_split_16px, "按标高拆分墙、柱" ); var connectPbd = UIAssist.NewPushButtonData( "土建连接", Resources.connect_32px, Resources.connect_16px, "土建构件连接处理" ); ribbonPanel.AddStackedItems(slopeFloorPbd, connectPbd, createOpeningsPbd); ribbonPanel.AddStackedItems(splitComPbd, modelSplitPbd); ribbonPanel.AddStackedItems(wallFinishesPbd, floorFinishesPbd, curtainFinishesPbd); } private static void MEPApp(UIControlledApplication application) { var panel = application.CreateRibbonPanel(TabName, "机电"); var standMepCurve = UIAssist.NewButtonData( "创建立管", null, Resources.stand_mepcurve_16px ).SetAvailability(); var bloomConnector = UIAssist.NewPushButtonData("引出管线", null, Resources.bloom_16px, "从连接件生成管线"); var anyConnect = UIAssist.NewPushButtonData("任意连接", null, Resources.any_connect_16px, "选择任意管线进行连接"); var moveConnect = UIAssist.NewPushButtonData( "移动连接", null, Resources.move_connect_16px, "根据最近距离的未连接的连接件,将其连接或角度过大则对齐连接" ); var breakMepCurveBtn = UIAssist.NewPushButtonData( "打断管线", null, Resources.break_mepcurve_16px, "将管线打断成两根管线并保留打断后的连接关系" ); var disConnect = UIAssist.NewPushButtonData( "取消连接", null, Resources.disconnect_16px, "取消设备、管线之间的连接" ); var correctSlope = UIAssist.NewPushButtonData( "坡度修正", null, Resources.correct_mep_16px, "修正管线的坡度" ); var moveMEP = UIAssist.NewPushButtonData( "移动管线", Resources.move_MEP_32px, Resources.move_MEP_16px, "基于管线底部参照或距离,上下移动管线" ); var clashReport = UIAssist.NewPushButtonData( "碰撞报告", Resources.clash_report_32px, Resources.clash_report_16px, "根据Revit生成的报告,快速定位碰撞构件" ); var terminalConnect = UIAssist.NewPushButtonData( "连接风口", Resources.air_terminal_32px, Resources.air_terminal_16px ); var clashResolve = UIAssist.NewPushButtonData( "碰撞处理", Resources.clash_resolve_32px, Resources.clash_resolve_16px ); var headroomCheck = UIAssist.NewPushButtonData( "净高检查", Resources.head_room_32px, Resources.head_room_16px ); var flipWorkplane = UIAssist.NewPushButtonData( "翻转工作平面", Resources.flip_workplane_32px, Resources.flip_workplane_16px, "将可以翻转工作平面的族实例,翻转其工作平面" ); var rotateInstance = UIAssist.NewPushButtonData( "旋转管件实例", Resources.rotate_instance_32px, Resources.rotate_instance_16px, "将管件族实例根据已连接的情况进行旋转" ); var addInsulation = UIAssist.NewPushButtonData( "保温层", Resources.add_insulation_32px, Resources.add_insulation_16px, "对水管和风管添加保温层" ); var arrangeMEPCurve = UIAssist.NewPushButtonData( "整理管线", Resources.arrange_mep_32px, Resources.arrange_mep_16px, "根据相对位置排布管线" ); panel.AddStackedItems(standMepCurve, anyConnect, moveConnect); panel.AddStackedItems(correctSlope, moveMEP, bloomConnector); panel.AddStackedItems(breakMepCurveBtn, disConnect, terminalConnect); panel.AddStackedItems(flipWorkplane, rotateInstance); panel.AddStackedItems(addInsulation, arrangeMEPCurve); panel.AddStackedItems(clashResolve, clashReport, headroomCheck); } private static void CreateCommonTools(UIControlledApplication application) { var ribbonPanel = application.CreateRibbonPanel(TabName, "通用工具"); //PushButtonData setAllViewDisplayPbd = // new PushButtonData("视图显示", "视图显示", AddInPath, typeof(SetAllViewDisplayCmd).FullName) // { // ImageUtil.ConvertToBitmapSource(Resources.cmd_16px), // ImageUtil.ConvertToBitmapSource(Resources.cmd_16px), // "以当前视图的设置,应用到其他视图显示样式" // }; //PushButtonData dataStoragePbd = // new PushButtonData("扩展数据", "扩展数据", AddInPath, typeof(DataStorageCmd).FullName) // { // ImageUtil.ConvertToBitmapSource(Resources.entity_32px), // ImageUtil.ConvertToBitmapSource(Resources.entity_32px), // "存储内容到扩展数据" // }; var modelCheckPbd = UIAssist.NewPushButtonData( "模型检查", Resources.model_check_16px, Resources.model_check_32px, "对模型进行多项要求的检查" ); var templateManager = UIAssist.NewPushButtonData( "样板定制", Resources.template_32px, Resources.template_16px, "对项目样板进行批量处理" ); var autoSavePbd = UIAssist.NewPushButtonData("定时保存", Resources.save_32px, Resources.save_16px); var purgeBtn = UIAssist.NewPushButtonData( "清理模型", Resources.purge_32px, Resources.purge_16px, "清理并压缩模型文件大小" ); var pipesCreatorPbd = UIAssist.NewPushButtonData( "管线生成", Resources.pipe_creator_32px, Resources.pipe_creator_16px, "根据dwg图纸生成管线" ); var instanceCreatorPbd = UIAssist.NewPushButtonData( "实例布置", Resources.instance_creator_32px, Resources.instance_creator_16px, "根据dwg块进行族实例布置" ); var modelByCurveCreatorPbd = UIAssist.NewPushButtonData( "曲线布置", Resources.model_by_curve_32px, Resources.model_by_curve_16px, "根据dwg曲线或模型线对轮廓族放样或者布置族实例" ); var toggleBackgroundPbd = UIAssist.NewPushButtonData( "切换背景", Resources.background_32px, Resources.background_16px, "切换视口背景颜色" ); ribbonPanel.AddItem(modelCheckPbd); ribbonPanel.AddItem(templateManager); ribbonPanel.AddStackedItems(instanceCreatorPbd, modelByCurveCreatorPbd, pipesCreatorPbd); ribbonPanel.AddStackedItems(toggleBackgroundPbd, purgeBtn, autoSavePbd); //ribbonPanel.AddAwItem(toggleBackgroundPbd); //ribbonPanel.AddAwItem(autoSavePbd); //RadioButtonGroupData groupData = new RadioButtonGroupData("定位"); //RadioButtonGroup radioBtnGroup = ribbonPanel.AddAwItem(groupData) as RadioButtonGroup; //radioBtnGroup.AddAwItem(updateViewBySelectElemPbd); //var tg2 = radioBtnGroup.AddAwItem(updateViewBySelectElemPbd); //tg2.Visible = false; //var group = ribbonPanel.AddRadioButtonGroup(groupData, updateViewBySelectElemPbd, updateViewBySelectElemPbd1); } }