Files
Shrlalgo.RvKits/ShrlAlgoToolkit.RevitAddins/UIRibbon/RvApp.cs
2026-02-18 21:41:30 +08:00

340 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Diagnostics;
using System.Reflection;
using System.Windows;
using System.Windows.Media;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External;
using Nice3point.Revit.Toolkit.External.Handlers;
using ShrlAlgoToolkit.Core.Assists;
using ShrlAlgoToolkit.RevitAddins.Fonts;
using ShrlAlgoToolkit.RevitAddins.ModelManager;
using ShrlAlgoToolkit.RevitAddins.Properties;
using ShrlAlgoToolkit.RevitAddins.RvCivil;
using ShrlAlgoToolkit.RevitAddins.RvCommon;
using ShrlAlgoToolkit.RevitAddins.RvMEP;
using ShrlAlgoToolkit.RevitAddins.RvView;
namespace ShrlAlgoToolkit.RevitAddins.UIRibbon;
//[Obfuscation(Exclude = true, ApplyToMembers = true)]
public class RvApp : ExternalApplication
{
private static readonly string TabName = Properties.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(Properties.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 == Properties.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 (RevitAddins.Properties.Settings.Default.IsActiveAutoSave)
{
var interval = RevitAddins.Properties.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<FloorFinishesCmd>(
"房间饰面",
Resources.tites_32px,
Resources.tites_16px,
"创建房间饰面"
);
var curtainFinishesPbd = UIAssist.NewPushButtonData<BricksFinishesCmd>(
"铺贴饰面",
Resources.finishes_32px,
Resources.finishes_16px
);
var wallFinishesPbd = UIAssist.NewPushButtonData<WallFinishesCmd>(
text: "墙饰面",
Resources.bricks_32px,
Resources.bricks_16px
);
var slopeFloorPbd = UIAssist.NewPushButtonData<SlopedFloorCmd>(
"坡度楼板",
Resources.slope_floor_32px,
Resources.slope_floor_16px,
"分别选择两个楼板的两条平行线创建坡度楼板"
);
var createOpeningsPbd = UIAssist.NewPushButtonData<CreateOpeningsCmd>(
"创建洞口",
Resources.openings_32px,
Resources.openings_16px,
"根据管线创建洞口"
).SetAvailability<EnableInView3D>();
var modelSplitPbd = UIAssist.NewPushButtonData<ModelSplitterCmd>(
"模型拆分",
Resources.separation_32px,
Resources.separation_16px,
"按标高拆分为单独的文件"
);
var splitComPbd = UIAssist.NewPushButtonData<SplitComsByLevelCmd>(
"分割墙柱",
Resources.model_split_32px,
Resources.model_split_16px,
"按标高拆分墙、柱"
);
var connectPbd = UIAssist.NewPushButtonData<CivilConnectionCmd>(
"土建连接",
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<StandMepCurveCmd, EnableInViewPlan>(
"创建立管",
null,
Resources.stand_mepcurve_16px
).SetAvailability<EnableInViewPlan>();
var bloomConnector = UIAssist.NewPushButtonData<BloomConnectorCmd>("引出管线", null, Resources.bloom_16px, "从连接件生成管线");
var anyConnect = UIAssist.NewPushButtonData<AnyConnectCmd>("任意连接", null, Resources.any_connect_16px, "选择任意管线进行连接");
var moveConnect = UIAssist.NewPushButtonData<MoveConnectCmd>(
"移动连接",
null,
Resources.move_connect_16px,
"根据最近距离的未连接的连接件,将其连接或角度过大则对齐连接"
);
var breakMepCurveBtn = UIAssist.NewPushButtonData<BreakMEPCurveCmd>(
"打断管线",
null,
Resources.break_mepcurve_16px,
"将管线打断成两根管线并保留打断后的连接关系"
);
var disConnect = UIAssist.NewPushButtonData<DisconnectCmd>(
"取消连接",
null,
Resources.disconnect_16px,
"取消设备、管线之间的连接"
);
var correctSlope = UIAssist.NewPushButtonData<CorrectMEPCurveSlopeCmd>(
"坡度修正",
null,
Resources.correct_mep_16px,
"修正管线的坡度"
);
var moveMEP = UIAssist.NewPushButtonData<MoveMEPCmd>(
"移动管线",
Resources.move_MEP_32px,
Resources.move_MEP_16px,
"基于管线底部参照或距离,上下移动管线"
);
var clashReport = UIAssist.NewPushButtonData<ClashReportCmd>(
"碰撞报告",
Resources.clash_report_32px,
Resources.clash_report_16px,
"根据Revit生成的报告快速定位碰撞构件"
);
var terminalConnect = UIAssist.NewPushButtonData<TerminalConnectToDuctCmd>(
"连接风口",
Resources.air_terminal_32px,
Resources.air_terminal_16px
);
var clashResolve = UIAssist.NewPushButtonData<ClashResolveCmd>(
"碰撞处理",
Resources.clash_resolve_32px,
Resources.clash_resolve_16px
);
var headroomCheck = UIAssist.NewPushButtonData<HeadroomCheckCmd>(
"净高检查",
Resources.head_room_32px,
Resources.head_room_16px
);
var flipWorkplane = UIAssist.NewPushButtonData<FlipWorkplaneCmd>(
"翻转工作平面",
Resources.flip_workplane_32px,
Resources.flip_workplane_16px,
"将可以翻转工作平面的族实例,翻转其工作平面"
);
var rotateInstance = UIAssist.NewPushButtonData<RotateInstanceCmd>(
"旋转管件实例",
Resources.rotate_instance_32px,
Resources.rotate_instance_16px,
"将管件族实例根据已连接的情况进行旋转"
);
var addInsulation = UIAssist.NewPushButtonData<AddInsulationCmd>(
"保温层",
Resources.add_insulation_32px,
Resources.add_insulation_16px,
"对水管和风管添加保温层"
);
var arrangeMEPCurve = UIAssist.NewPushButtonData<ArrangeMEPCurveCmd>(
"整理管线",
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<ModelCheckCmd>(
"模型检查",
Resources.model_check_16px,
Resources.model_check_32px,
"对模型进行多项要求的检查"
);
var templateManager = UIAssist.NewPushButtonData<TemplateManagerCmd>(
"样板定制",
Resources.template_32px,
Resources.template_16px,
"对项目样板进行批量处理"
);
var autoSavePbd = UIAssist.NewPushButtonData<AutoSaveCmd>("定时保存", Resources.save_32px, Resources.save_16px);
var purgeBtn = UIAssist.NewPushButtonData<PureModelCmd>(
"清理模型",
Resources.purge_32px,
Resources.purge_16px,
"清理并压缩模型文件大小"
);
var pipesCreatorPbd = UIAssist.NewPushButtonData<PipesCreatorCmd>(
"管线生成",
Resources.pipe_creator_32px,
Resources.pipe_creator_16px,
"根据dwg图纸生成管线"
);
var instanceCreatorPbd = UIAssist.NewPushButtonData<InstanceCreatorCmd>(
"实例布置",
Resources.instance_creator_32px,
Resources.instance_creator_16px,
"根据dwg块进行族实例布置"
);
var modelByCurveCreatorPbd = UIAssist.NewPushButtonData<ModelByCurveCreatorCmd>(
"曲线布置",
Resources.model_by_curve_32px,
Resources.model_by_curve_16px,
"根据dwg曲线或模型线对轮廓族放样或者布置族实例"
);
var toggleBackgroundPbd = UIAssist.NewPushButtonData<SwitchBackgroundCmd>(
"切换背景",
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);
}
}