362 lines
14 KiB
C#
362 lines
14 KiB
C#
using System.Windows;
|
||
|
||
using Autodesk.Revit.UI;
|
||
|
||
using Nice3point.Revit.Toolkit.External;
|
||
using Nice3point.Revit.Toolkit.External.Handlers;
|
||
|
||
using Sai.RvKits.ModelManager;
|
||
using Sai.RvKits.Properties;
|
||
using Sai.RvKits.RvCivil;
|
||
using Sai.RvKits.RvCommon;
|
||
using Sai.RvKits.RvFamily;
|
||
using Sai.RvKits.RvIndependent;
|
||
using Sai.RvKits.RvMEP;
|
||
using Sai.RvKits.RvView;
|
||
|
||
namespace Sai.RvKits.UIRibbon;
|
||
|
||
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))
|
||
#else
|
||
if (!doc.IsBackgroundCalculationInProgress() && doc.IsModified && !string.IsNullOrEmpty(doc.PathName))
|
||
#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);
|
||
CreateIndependentTools(Application);
|
||
_ = new TabManagerApp(Application);
|
||
_ = new FamilyApp(Application, UiApplication);
|
||
|
||
if (Properties.Settings.Default.IsActiveAutoSave)
|
||
{
|
||
var interval = Properties.Settings.Default.AutoSaveIntervalTime * 60_000;
|
||
saveTimer.Interval = interval;
|
||
saveTimer.Elapsed -= OnTimedEvent;
|
||
saveTimer.Elapsed += OnTimedEvent;
|
||
saveTimer.Start();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
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>(
|
||
"墙饰面",
|
||
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);
|
||
}
|
||
|
||
private static void CreateIndependentTools(UIControlledApplication application)
|
||
{
|
||
var ribbonPanel = application.CreateRibbonPanel(TabName, "独立工具");
|
||
var networkCreator = UIAssist.NewPushButtonData<NetworkCreatorCmd>(
|
||
"物探管网",
|
||
Resources.pipe_net_32px,
|
||
Resources.pipe_net_16px
|
||
);
|
||
var metroGauges = UIAssist.NewPushButtonData<MetroGaugesCmd>(
|
||
"限界轮廓",
|
||
Resources.gauges_32px,
|
||
Resources.gauges_16px,
|
||
"创建限界轮廓"
|
||
);
|
||
var metroTunnel = UIAssist.NewPushButtonData<MetroTunnelCmd>(
|
||
"盾构隧道",
|
||
Resources.gauges_32px,
|
||
Resources.gauges_16px,
|
||
"创建盾构隧道"
|
||
);
|
||
ribbonPanel.AddSplitButton("独立工具", networkCreator, metroTunnel, metroGauges);
|
||
//ribbonPanel.AddAwItem(networkCreator);
|
||
//ribbonPanel.AddAwItem(metroGauges);
|
||
//ribbonPanel.AddAwItem(metroTunnel);
|
||
//ribbonPanel.AddSplitButton("独立工具", networkCreator, metroGauges, metroTunnel);
|
||
}
|
||
}
|