using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI;
namespace Ribbon { public classClass1 : IExternalApplication { public Result OnShutdown(UIControlledApplication application) { return Result.Succeeded; }
public Result OnStartup(UIControlledApplication application) { //新建一个选项卡,并在该选项卡总新建一个命令栏(命令栏可以放多个命令按钮) application.CreateRibbonTab("NewTab"); RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewTab","TabBar");
//1、建立一个可下拉的命令栏 //1.1、新建一个可下拉按钮 SplitButtonData sbd1 = new SplitButtonData("Name", "Text"); SplitButton sb1 = ribbonPanel.AddItem(sbd1) as SplitButton; //1.2、在该按钮是添加两个命令按钮(软件中按钮的名称由命令名称文本定义) PushButtonData p1 = new PushButtonData("命令名称1", "Text1", @"C:\Users\Jhon\Desktop\StudyRevit\HelloRevit\HelloRevit\bin\Debug\HelloRevit.dll", "HelloRevit.Class1"); PushButton pushButton1= sb1.AddPushButton(p1); PushButtonData p2 = new PushButtonData("命令名称2", "Text2", @"C:\Users\Jhon\Desktop\StudyRevit\HelloRevit\HelloRevit\bin\Debug\HelloRevit.dll", "HelloRevit.Class1"); PushButton pushButton2 = sb1.AddPushButton(p2); //2、在选项卡栏添加一个普通按钮 PushButtonData p3 = new PushButtonData("命令名称3", "Text3", @"C:\Users\Jhon\Desktop\StudyRevit\HelloRevit\HelloRevit\bin\Debug\HelloRevit.dll", "HelloRevit.Class1"); PushButton pushButton3= ribbonPanel.AddItem(p3) as PushButton; //3、先准备一张图片,后面给按钮加图片。(这里要引用PresentationCore程序集,再引用system.windows.media.imaging) Uri uriImage = new Uri(@"C:\Users\Jhon\Desktop\StudyRevit\Ribbon\timg.jpg"); BitmapImage largeImage = new BitmapImage(uriImage); //3.1、将图片赋值给按钮。PushButton有两个属性,当按钮是堆叠时,显示的是Image;当按钮是下拉或单个的时候显示的是LargeImage。 pushButton1.LargeImage = largeImage; pushButton2.LargeImage = largeImage; pushButton3.LargeImage = largeImage;
using Autodesk.Revit.UI; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging;
namespace UIRibbon { classUIRibbon : IExternalApplication { public Result OnShutdown(UIControlledApplication application) { return Result.Succeeded; }
public Result OnStartup(UIControlledApplication application) { application.CreateRibbonTab("NewTab");//创建选项卡 RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewTab", "NewPanel");//创建面板 string assemblyPash = Assembly.GetExecutingAssembly().Location;//获取程序集的相对地址 string className = "UIRibbon.HelloRevit";//外部命令的FullName PushButtonData pushButtonData = new PushButtonData("ButtonName", "CommandName", assemblyPash, className); Stream sm = Assembly.GetExecutingAssembly().GetManifestResourceStream("UIRibbon.Image.图标.png");//获取嵌入的图片 pushButtonData.LargeImage = BitmapFrame.Create(sm);//创建图片并赋值给LargeImage ribbonPanel.AddItem(pushButtonData); return Result.Succeeded; } } }
三、dll文件和addin文件的使用
1、打开Revit,点击附加模块的外部工具,选择右侧的LoadedApplications,选择下面的Load加载我们刚编译好的UIRibbon.dll点右下角的save,选择第二个(Save chacked items to local .addin file),Save前记得把Loaded Commads里面的勾全部去掉。在载入文件夹生成一个addin文件。这样在我们编译的文件夹就会生成一个我们需要的addin文件,不用去自己编写addin文件。 2、如果前面忘记把勾去掉,addin文件就是生成我们不需要加载的东西。记事本打开addin文件,将我们不需要加载的HelloRevit删掉,我们只需要加载UIRibbon这个类就行。HelloRevit在按钮中调用即可。 3、将dll和addin文件复制,粘贴到C:\ProgramData\Autodesk\Revit\Addins\2018文件夹下,打开Revit后就能正常使用。(2018是我安装的Revit版本,故放在此文件夹下)
[CommandMethod("test")] public voidTestCommand() { //在此输入业务逻辑代码 }
以下示例业务代码为创建一条线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//在此输入业务逻辑代码 //创建两条线 Line line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); Line line2 = new Line(new Point3d(0, 0, 0), new Point3d(-1, 1, 0)); //打开CAD块表记录 using (IDisposable db = HostApplicationServices.WorkingDatabase, trans = (db as Database).TransactionManager.StartTransaction(), blockTable = (trans as Transaction).GetObject((db as Database).BlockTableId, OpenMode.ForRead), blockTableRecord = (trans as Transaction).GetObject((blockTable as BlockTable)[BlockTableRecord.ModelSpace], OpenMode.ForWrite)) { //添加实体 (blockTableRecord as BlockTableRecord).AppendEntity(line); (blockTableRecord as BlockTableRecord).AppendEntity(line2); (trans as Transaction).AddNewlyCreatedDBObject(line, true); (trans as Transaction).AddNewlyCreatedDBObject(line2, true); //提交实体 (trans as Transaction).Commit(); }
using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System;
namespace CADDEMO { public classClass1 { [CommandMethod("test")] public voidTestCommand() { //在此输入业务逻辑代码 //创建两条线 Line line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); Line line2 = new Line(new Point3d(0, 0, 0), new Point3d(-1, 1, 0)); //打开CAD块表记录 using (IDisposable db = HostApplicationServices.WorkingDatabase, trans = (db as Database).TransactionManager.StartTransaction(), blockTable = (trans as Transaction).GetObject((db as Database).BlockTableId, OpenMode.ForRead), blockTableRecord = (trans as Transaction).GetObject((blockTable as BlockTable)[BlockTableRecord.ModelSpace], OpenMode.ForWrite)) { //添加实体 (blockTableRecord as BlockTableRecord).AppendEntity(line); (blockTableRecord as BlockTableRecord).AppendEntity(line2); (trans as Transaction).AddNewlyCreatedDBObject(line, true); (trans as Transaction).AddNewlyCreatedDBObject(line2, true); //提交实体 (trans as Transaction).Commit(); } } } }
```c [CommandMethod("test")] public void TestCommand() { //在此输入业务逻辑代码 //创建两条线 Line line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); Line line2 = new Line(new Point3d(0, 0, 0), new Point3d(-1, 1, 0)); //打开CAD块表记录 using (IDisposable db = HostApplicationServices.WorkingDatabase, trans = (db as Database).TransactionManager.StartTransaction() blockTable = (trans as Transaction).GetObject((db as Database).BlockTableId, OpenMode.ForRead), blockTableRecord = (trans as Transaction).GetObject((blockTable as BlockTable)[BlockTableRecord.ModelSpace], OpenMode.ForWrite)) { //添加实体 (blockTableRecord as BlockTableRecord).AppendEntity(line); (blockTableRecord as BlockTableRecord).AppendEntity(line2); (trans as Transaction).AddNewlyCreatedDBObject(line, true); (trans as Transaction).AddNewlyCreatedDBObject(line2, true); //提交实体 (trans as Transaction).Commit(); } }
using Autodesk.AutoCAD.Runtime; using System; using System.Linq; using Autodesk.Windows; using System.Windows.Media.Imaging; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using System.Windows.Input;
namespace CADButtonDemo { public classClass1 { //创建按钮命令,在控制台输入InitMyRibbon,可生成选项卡、面板和按钮 [CommandMethod("InitMyRibbon")] public voidInit() { //设置名称参数 string ribbonTabTitle = "DSS-定制插件"; string ribbonPanleTitle = "自定义面板"; string ribbonButtonTitle = "自定义按钮"; //创建选项卡 RibbonControl ribbonControl = ComponentManager.Ribbon; RibbonTab ribbonTab = ribbonControl.FindTab(ribbonTabTitle); //如果没有该选项卡则创建新选项卡 if (ribbonTab == null) { ribbonTab = new RibbonTab { Title = ribbonTabTitle, Id = ribbonTabTitle }; ribbonControl.Tabs.Add(ribbonTab); } //创建面板 RibbonPanel ribbonPanel; //如果选项卡中没有我们的面板,则新建面板 if (ribbonTab.Panels == null || ribbonTab.Panels.Where(x => x.Source.Title == ribbonPanleTitle).Count() == 0) { RibbonPanelSource ribbonPanelSource = new RibbonPanelSource { Title = ribbonPanleTitle }; ribbonPanel = new RibbonPanel { Source = ribbonPanelSource }; ribbonTab.Panels.Add(ribbonPanel); } else { ribbonPanel = ribbonTab.Panels.First(x => x.Source.Title == ribbonPanleTitle); } //创建按钮 //如果面板中没有我们的按钮,则创建新按钮 if (ribbonPanel.Source == null || ribbonPanel.Source.Items == null || ribbonPanel.Source.Items.Where(x => x.Name == ribbonButtonTitle).Count()== 0) { RibbonButton ribbonButton = new RibbonButton { Orientation = System.Windows.Controls.Orientation.Vertical, AllowInStatusBar = true, Size = RibbonItemSize.Large, Name = ribbonButtonTitle, ShowText = true, Text = ribbonButtonTitle, Description = ribbonButtonTitle, LargeImage = new BitmapImage(new Uri("pack://application:,,,/CADButtonDemo;component/image/按钮图标.png", UriKind.Absolute)), //绑定命令 CommandHandler = new ButtonCommandHandler(), CommandParameter ="test\n" }; ribbonPanel.Source.Items.Add(ribbonButton); } } [CommandMethod("test")] public voidTestCommand() { //在此输入业务逻辑代码 //创建两条线 Line line = new Line(new Point3d(0, 0, 0), new Point3d(1, 1, 0)); Line line2 = new Line(new Point3d(0, 0, 0), new Point3d(-1, 1, 0)); //打开CAD块表记录 using (IDisposable db = HostApplicationServices.WorkingDatabase, trans = (db as Database).TransactionManager.StartTransaction(), blockTable = (trans as Transaction).GetObject((db as Database).BlockTableId, OpenMode.ForRead), blockTableRecord = (trans as Transaction).GetObject((blockTable as BlockTable)[BlockTableRecord.ModelSpace], OpenMode.ForWrite)) { //添加实体 (blockTableRecord as BlockTableRecord).AppendEntity(line); (blockTableRecord as BlockTableRecord).AppendEntity(line2); (trans as Transaction).AddNewlyCreatedDBObject(line, true); (trans as Transaction).AddNewlyCreatedDBObject(line2, true); //提交实体 (trans as Transaction).Commit(); } } }
public classButtonCommandHandler : ICommand { public boolCanExecute(object parameter) { returntrue; }
public event EventHandler CanExecuteChanged;
public voidExecute(object parameter) { //is from Ribbon Button RibbonButton ribBtn = parameter as RibbonButton; if (ribBtn != null) { //execute the command Autodesk.AutoCAD.ApplicationServices.Application .DocumentManager.MdiActiveDocument .SendStringToExecute( (string)ribBtn.CommandParameter, true, false, true); } } } }
//打包Debug目录下的所有文件 var project = new ManagedProject("软件名称",new Dir($@"%ProgramFiles%\制造商名称\软件名称",new Files(@"..\WpfApp1\bin\Debug\*.*")));
打包多个文件,由File变为Files,字符串格式以”*.*“结尾,意为匹配所有文件。
1.3、创建桌面图标
1 2
//打包多个文件并创建桌面快捷方式 var project = new ManagedProject("软件名称", new Dir($@"%ProgramFiles%\制造商名称\软件名称", new Files(@"..\WpfApp1\bin\Debug\*.*", f => !f.EndsWith("WpfApp1.exe")), new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe", new FileShortcut("软件名称", @"%Desktop%"))));
//依据功能选项安装不同文件 //创建不同功能选项 var revit2018 = new Feature("Revit2018", "Revit2018的功能描述") { IsEnabled = false }; var revit2019 = new Feature("Revit2019", "Revit2019的功能描述") { IsEnabled = false }; var revit2020 = new Feature("Revit2020", "Revit2020的功能描述") { IsEnabled = false }; //安装路径及文件配置 var project = new ManagedProject("软件名称", new WixEntity[] { new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2018", new WixEntity[] { new Files(revit2018, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2018, @"..\WpfApp1\Ribbon2018.addin") }), new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2019", new WixEntity[] { new Files(revit2019, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2019, @"..\WpfApp1\Ribbon2019.addin") }), new Dir(@"C:\Users\Administrator\Desktop\新建文件夹", new WixEntity[] { new Files(revit2020, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2020, @"..\WpfApp1\Ribbon2020.addin") }) }); //设置默认功能 project.DefaultFeature = revit2018;
using System; using System.Windows.Forms; using WixSharp; using WixSharp.Forms;
namespace WixSharp_Setup1 { internal classProgram { staticvoidMain() { //打包单个EXE文件 //var project = new ManagedProject("软件名称", // new Dir($@"%ProgramFiles%\制造商名称\软件名称", // new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe")));
//打包Debug目录下的所有文件 //var project = new ManagedProject("软件名称", // new Dir($@"%ProgramFiles%\制造商名称\软件名称", // new Files(@"..\WpfApp1\bin\Debug\*.*")));
//打包多个文件并创建桌面快捷方式 //var project = new ManagedProject("软件名称", // new Dir($@"%ProgramFiles%\制造商名称\软件名称", // new Files(@"..\WpfApp1\bin\Debug\*.*", f => !f.EndsWith("WpfApp1.exe")), // new File(@"..\WpfApp1\bin\Debug\WpfApp1.exe", new FileShortcut("软件名称", @"%Desktop%"))));
////依据功能选项安装不同文件 ////创建不同功能选项 //var revit2018 = new Feature("Revit2018", "Revit2018的功能描述") { IsEnabled = false }; //var revit2019 = new Feature("Revit2019", "Revit2019的功能描述") { IsEnabled = false }; //var revit2020 = new Feature("Revit2020", "Revit2020的功能描述") { IsEnabled = false }; ////安装路径及文件配置 //var project = new ManagedProject("软件名称", // new Dir(@"C:\ProgramData\Autodesk\Revit\Addins", // new Dir("2018", new WixEntity[] { new Files(revit2018, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2018, @"..\WpfApp1\Ribbon2018.addin") }), // new Dir("2019", new WixEntity[] { new Files(revit2019, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2019, @"..\WpfApp1\Ribbon2019.addin") }), // new Dir("2020", new WixEntity[] { new Files(revit2020, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2020, @"..\WpfApp1\Ribbon2020.addin") }))); ////设置默认功能 //project.DefaultFeature = revit2018;
//依据功能选项安装不同文件 //创建不同功能选项 var revit2018 = new Feature("Revit2018", "Revit2018的功能描述") { IsEnabled = false }; var revit2019 = new Feature("Revit2019", "Revit2019的功能描述") { IsEnabled = false }; var revit2020 = new Feature("Revit2020", "Revit2020的功能描述") { IsEnabled = false }; //安装路径及文件配置 var project = new ManagedProject("软件名称", new WixEntity[] { new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2018", new WixEntity[] { new Files(revit2018, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2018, @"..\WpfApp1\Ribbon2018.addin") }), new Dir(@"C:\ProgramData\Autodesk\Revit\Addins\2019", new WixEntity[] { new Files(revit2019, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2019, @"..\WpfApp1\Ribbon2019.addin") }), new Dir(@"C:\Users\Administrator\Desktop\新建文件夹", new WixEntity[] { new Files(revit2020, @"..\WpfApp1\bin\Debug\*.*"), new File(revit2020, @"..\WpfApp1\Ribbon2020.addin") }) }); //设置默认功能 project.DefaultFeature = revit2018;
using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.ExtensibleStorage; using Autodesk.Revit.UI; using System; using System.Collections.Generic; using System.Linq;
namespacedataStorage { [Transaction(TransactionMode.Manual)] publicclassClass1 : IExternalCommand { public Result Execute(ExternalCommandData commandData, refstring message, ElementSet elements) { Document doc = commandData.Application.ActiveUIDocument.Document; Transaction transaction = new Transaction(doc); //创建文档数据库(可替换成构件) List<Element> eles = new FilteredElementCollector(doc).OfClass(typeof(DataStorage)).Where(x => x.Name == "文档数据库").ToList(); Element dataStorage; if (eles.Count != 0) { dataStorage = eles.First(); } else { transaction.Start("创建文档数据库"); dataStorage = DataStorage.Create(doc); dataStorage.Name = "文档数据库"; transaction.Commit(); }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.Attributes;
namespace HelloWord { [Transaction(TransactionMode.Manual)] public classClass1 : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { TaskDialog.Show("Revit","Hello World"); return Result.Succeeded; } } }
提示:(1)Visual Studio 智能感知功能可帮助创建实现接口的方法。在上例中Class1之后,添加“IExternalCommand”,使用**“alt”+“回车”**快捷键,呼出智能选项。再回车选择“实现接口”。
事务是个类似上下文的对象,它封装了Revit模型中的任何更改。对文件的任何更改只能在该文件的活动事务打开之际进行。试图在事务之外更改文件将引发异常。所作更改不会成为模型的一部分,直到活动事务提交完成。因此,在事务中所作的所有更改都可(通过析构函数)显式或隐式回滚。在任何时候,每个文件只能打开一个事务。一个事务可以包括多个操作。Revit API 中与事务相关的主类有三个: