抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

01.介绍

环境:

  • 软件:Revit 2018
  • 框架:.Net Framework 4.7.2
  • 系统:Windows 11
  • 开发软件: Visual Studio 2022

02.添加插件

找到C:\ProgramData\Autodesk\Revit\Addins\2018文件夹,将需要的插件放置进来。

  • AddInManager.dll

  • RevitLookup.dll

03.新建项目

  • 打开VS,文件 → 新建 → 项目,或者快捷键 Ctrl + Shift + N
    选择类库(.NET Framework)

  • 配置启动程序

  • 加载Revit API

04.外部命令

脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace demo
{
[Transaction(TransactionMode.Manual)]
public class Class1 : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
TaskDialog.Show("标题", "第一个Revit脚本");
return Result.Succeeded;
}
}
}

生成脚本

运行脚本

05.外部插件

添加App.cs文件

插件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace demo
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class App : IExternalApplication
{
static AddInId appId = new AddInId(
new Guid("356CDA5A-E6C5-4c2f-A9EF-B5222116B8D8"));

static string ExecutingAssemblyPath = System.Reflection.Assembly.GetExecutingAssembly().Location;

public Result OnStartup(UIControlledApplication application)
{
RibbonPanel ribbonPanel = application.CreateRibbonPanel("我的工具");
PulldownButtonData data = new PulldownButtonData("Options", "工具");


RibbonItem item = ribbonPanel.AddItem(data);
PulldownButton optionsBtn = item as PulldownButton;

optionsBtn.AddPushButton(
new PushButtonData("展示", "展示...", ExecutingAssemblyPath, "demo.Class1"));

return Result.Succeeded;
}

public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
}
}

通过04.外部命令:生成脚本方式,重新生成dll文件。

添加Addin文件

02.添加插件的文件夹位置,创建新的ADDIN文件,例如 demo.addin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Application">
<!-- Assembly: 换成自己生成的demo.dll文件地址 -->
<Assembly>D:\self\A\demo\demo\bin\Debug\demo.dll</Assembly>
<!-- ClientId: 要求与其他插件不一致,需要唯一 -->
<ClientId>356CDA5A-E6C5-4c2f-A9EF-B5222116B8D8</ClientId>
<!-- FullClassName: 实现IExternalApplication的类名称 -->
<FullClassName>demo.App</FullClassName>
<Name>我的工具</Name>
<VendorId>ADSK</VendorId>
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
</AddIn>
</RevitAddIns>

使用插件

  1. 运行Revit:

  1. 新建项目

  2. 使用

设置图标

添加静态资源文件:

配置资源文件属性:将生成操作修改为嵌入的资源

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System.Windows.Media.Imaging;

public Result OnStartup(UIControlledApplication application)
{
RibbonPanel ribbonPanel = application.CreateRibbonPanel("我的工具");
PulldownButtonData data = new PulldownButtonData("Options", "工具");


RibbonItem item = ribbonPanel.AddItem(data);
PulldownButton optionsBtn = item as PulldownButton;

optionsBtn.Image = GetEmbeddedImage("demo.Resources.demo-16.png");
optionsBtn.LargeImage = GetEmbeddedImage("demo.Resources.demo-32.png");

optionsBtn.AddPushButton(
new PushButtonData("展示", "展示...", ExecutingAssemblyPath, "demo.Class1"));

return Result.Succeeded;
}

static BitmapSource GetEmbeddedImage(string name)
{
try
{
Assembly a = Assembly.GetExecutingAssembly();
Stream s = a.GetManifestResourceStream(name);
return BitmapFrame.Create(s);
}
catch
{
return null;
}
}

效果:

06.创建管道

基础管道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void CreatePipingLine(ExternalCommandData commandData, Level level)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;

using (Transaction transaction = new Transaction(doc))
{
transaction.Start("开始绘图");
// 获取管道系统
FilteredElementCollector pipSytem = new FilteredElementCollector(doc);
pipSytem.OfClass(typeof(PipingSystemType));
PipingSystemType pipingSystemType = pipSytem.ToList().First() as PipingSystemType;

// 获取管道类型
FilteredElementCollector pipetye = new FilteredElementCollector(doc);
pipetye.OfClass(typeof(PipeType));
PipeType type = pipetye.ToList().First() as PipeType;

XYZ start = new XYZ(0,0,0);
XYZ end = new XYZ(1,0,0);

Pipe pipe = Pipe.Create(doc,pipingSystemType.Id,type.Id,level.Id, start, end);
// flag...

TaskDialog.Show("success:", "创建结束");
transaction.Commit();
}
}

新管道系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void CreateNewPipingLine(ExternalCommandData commandData, Level level)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;

using (Transaction transaction = new Transaction(doc))
{
transaction.Start("开始绘图");

PipingSystemType pipingSystemType = PipingSystemType.Create(doc, MEPSystemClassification.SupplyHydronic, "testSystemType");
Color pipingSystemColor = new Color(255, 128, 255);
pipingSystemType.FillColor = pipingSystemColor;
pipingSystemType.LineColor = pipingSystemColor;

ElementId materialId = Material.Create(doc, "testMaterial");
Material material = doc.GetElement(materialId) as Material;
material.Color = pipingSystemColor;
material.CutPatternColor = pipingSystemColor;
material.SurfacePatternColor = pipingSystemColor;

pipingSystemType.MaterialId = materialId;

FilteredElementCollector pipetye = new FilteredElementCollector(doc);
pipetye.OfClass(typeof(PipeType));
PipeType type = pipetye.ToList().First() as PipeType;

Pipe pipe = Pipe.Create(doc,
pipingSystemType.Id,
type.Id,
Level.Id,
new XYZ(0,0,0),
new XYZ(1,0,0)
);

TaskDialog.Show("success:", "创建结束");
transaction.Commit();
}
}

07.导入和放置族

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void ImportAndCreateRFA(Document doc)
{
FamilySymbol symbol;
Family family;
string familyPath = new FileUtils().LoadFiles();

if (doc.LoadFamily(familyPath, out family))
{
TaskDialog.Show("success", "自己的族导入进来了");
ISet<ElementId> familySymbolIds = family.GetFamilySymbolIds();
foreach (ElementId id in familySymbolIds)
{
FamilySymbol familySymbol = family.Document.GetElement(id) as FamilySymbol;
if (familySymbol.Name == "检查井1400")
{
symbol = familySymbol;
symbol.Activate();
TaskDialog.Show("success", "找到这个族了");
doc.Create.NewFamilyInstance(new XYZ(0, 0, 0), symbol, Level.Create(doc, 1), StructuralType.NonStructural);
}
}
}
}

08.读取MDB文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public OleDbDataReader ReadMdb()
{
string dbPath = "";
OpenFileDialog dialog = new OpenFileDialog();
dialog.Multiselect = true;//该值确定是否可以选择多个文件
dialog.Title = "请选择文件夹";
dialog.Filter = "所有文件(*.*)|*.*";
if (dialog.ShowDialog() == DialogResult.OK)
{
dbPath = dialog.FileName;
}
string connString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dbPath}";

using (conn = new OleDbConnection(connString))
{
conn.Open();

using (OleDbCommand command = new OleDbCommand(sql, conn))
{
using (OleDbDataReader reader = command.ExecuteReader())
{
//构建结果字符串
string result = "";
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
result += $"{reader.GetName(i)}: {reader[i]}\t";
//TaskDialog.Show("data", reader.GetName(i)+reader[i]+"");
}
result += "\n";
}
return reader;
}
}
}
}

⚠️注意:在读取MDB数据库的时候,可能会在try-catch语句中出现未经处理的异常错误,即catch无法捕获的异常。这是因为没用安装AccessDatabaseEngine2010程序这时导致的,只要安装对应版本的AccessDatabaseEngine2010程序即可。可以通过 bool test = Environment.Is64BitProcess;来判断当前环境是否是64位处理器。

09.读取共享参数

在此之前,我们创建一个共享参数文件,如下图表示:

在API实现之前,通过界面操作,熟悉一下项目参数从共享参数中读取的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public void LoadingSharingParameters(ExternalCommandData commandData)
{
Autodesk.Revit.ApplicationServices.Application RevitApp = commandData.Application.Application;
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;

string filePath = @"D:\test\b.txt";

RevitApp.SharedParametersFilename = filePath;
DefinitionFile definitionFile = RevitApp.OpenSharedParameterFile();
foreach (DefinitionGroup group in definitionFile.Groups)
{
////往参数组中添加参数
//ExternalDefinitionCreationOptions option = new ExternalDefinitionCreationOptions("testInsert", ParameterType.Text);
//option.UserModifiable = true;
//Definition definition = group.Definitions.Create(option);

foreach (Definition item in group.Definitions)
{
CategorySet categories = new CategorySet();
// 管件
categories.Insert(doc.Settings.Categories.get_Item(BuiltInCategory.OST_PipeFitting));
// 管道
categories.Insert(doc.Settings.Categories.get_Item(BuiltInCategory.OST_PipeCurves));
// 管道附件
categories.Insert(doc.Settings.Categories.get_Item(BuiltInCategory.OST_PipeAccessory));
// 将参数添加到相关的的类别中,对应上图中的第三步操作。
Binding binding = new InstanceBinding(categories);
// BuiltInParameterGroup.PG_TEXT 指上图中的参数分组方式。
doc.ParameterBindings.Insert(item, binding, BuiltInParameterGroup.PG_TEXT);
}

}
}

10.设置参数值

创建一个操作类 Tools,复用该方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Tools
{
public void SetParameterValue(ParameterSet parameters, string parameterName, string parameterValue)
{
foreach (Parameter p in parameters)
{
if (p.Definition.Name.Equals(parameterName))
{
if (p.IsReadOnly)
{
break;
}
if (!p.SetValueString(parameterValue))
p.Set(parameterValue);
}
}
}
}

使用:以【06.创建管道.基础管道】为例,只需在 // flag...位置,添加下述代码:

1
2
3
4
new Tools().SetParameterValue(pipe.Parameters, "长度", "123");
// 或者在
Tools tool = new Tools();
tool.SetParameterValue(pipe.Parameters, "长度", "123");

考虑到Tools类会在项目中频繁创建,对此进行一些优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Tools
{
private static Tools instance;
private Tools(){}
public static Tools getInstance()
{
if(instance == null){
instance = new Tools();
}
return instance;
}

public void SetParameterValue(){...}
public ...
}

如此,后续只用:

1
2
3
4
Tools.getInstance().SetParameterValue(pipe.Parameters, "长度", "123");
// 或者在
Tools tool = Tools.getInsatnce();
tool.SetParameterValue(pipe.Parameters, "长度", "123");

评论