WPF窗口与revit数据交互
代码如下:
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreatePipe
{
[TransactionAttribute(TransactionMode.Manual)]
class CreateDuct : IExternalCommand
{
UIDocument uIDocument = null;
Document document = null;
//得到主窗类
MainWindow mainWindow = new MainWindow();
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Application application = uiApp.Application;
uIDocument = uiApp.ActiveUIDocument;
document = uIDocument.Document;
//显示窗体
mainWindow.ShowDialog();
using (Transaction transaction = new Transaction(document, "创建管"))
{
transaction.Start();
//按x关闭窗口
if (!mainWindow.ClickClosed)
{
return Result.Cancelled;
}
string selection = mainWindow.text.Text;
double wD = Convert.ToDouble(mainWindow.text2.Text);
double h = Convert.ToDouble(mainWindow.text3.Text);
switch (selection)
{
case "圆形":
CreateDuct1(DuctShape.Round, wD, h);
break;
case "矩形":
CreateDuct1(DuctShape.Rectangle, wD, h);
break;
case "椭圆":
CreateDuct1(DuctShape.Oval, wD, h);
break;
default:
TaskDialog.Show("提示", $"没有找到{selection}管");
break;
}
transaction.Commit();
TransactionStatus status = transaction.GetStatus();
if (status.Equals(TransactionStatus.Committed))
{
TaskDialog.Show("提示", "创建成功!");
}
}
return Result.Succeeded;
}
/// <summary>
/// 创建风管
/// </summary>
/// <param name="Shape">形状</param>
/// <returns>风管</returns>
public Duct CreateDuct1(DuctShape shape, double wD, double h)
{
//过滤风管系统类型
FilteredElementCollector collector1 = new FilteredElementCollector(document);
List<MechanicalSystemType> mechanicalSystemTypes = collector1.OfClass(typeof(MechanicalSystemType)).Cast<MechanicalSystemType>().ToList();
MechanicalSystemType mechanicalSystemType = null;
foreach (MechanicalSystemType item in mechanicalSystemTypes)
{
//if (mechanicalSystemType.SystemClassification == MEPSystemClassification.SupplyAir)
//{
// mechanicalSystemType = item;
// break;
//}
if (item.Name.Contains("送风"))
{
mechanicalSystemType = item;
break;
}
}
//过滤风管类型
FilteredElementCollector collector2 = new FilteredElementCollector(document);
List<DuctType> ductTypes = collector2.OfClass(typeof(DuctType)).Cast<DuctType>().ToList();
DuctType ductType = null;
foreach (DuctType item in ductTypes)
{
switch (shape)
{
case DuctShape.Round:
if (item.FamilyName.Contains("圆形"))
{
ductType = item;
}
break;
case DuctShape.Rectangle:
if (item.FamilyName.Contains("矩形"))
{
ductType = item;
}
break;
case DuctShape.Oval:
if (item.FamilyName.Contains("椭圆"))
{
ductType = item;
}
break;
default:
break;
}
if (ductType != null)
{
break;
}
}
View view = document.ActiveView;
Level level = view.GenLevel;
XYZ stratPoint = uIDocument.Selection.PickPoint();
XYZ endPoint = uIDocument.Selection.PickPoint();
Duct duct = Duct.Create(document, mechanicalSystemType.Id, ductType.Id, level.Id, stratPoint, endPoint);
switch (shape)
{
case DuctShape.Round:
duct.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM).Set(ToFoot(wD));//直径
break;
case DuctShape.Rectangle:
case DuctShape.Oval:
duct.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM).Set(ToFoot(wD));//宽度
duct.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM).Set(ToFoot(h));//高度
break;
default:
break;
}
return duct;
}
public enum DuctShape
{
/// <summary>
/// 圆形
/// </summary>
Round,
/// <summary>
/// 矩形
/// </summary>
Rectangle,
/// <summary>
/// 椭圆
/// </summary>
Oval
}
/// <summary>
/// 毫米转英尺
/// </summary>
/// <param name="var">毫米</param>
/// <returns>英尺</returns>
public double ToFoot(double var)
{
double foot = UnitUtils.ConvertToInternalUnits(var, DisplayUnitType.DUT_MILLIMETERS);
return foot;
}
}
}
点击右上角x的时候关闭窗口
public bool ClickClosed{ get; set; } = false;
if (!mainWindow.ClickClosed)
{
return Result.Cancelled;
}