描述:
项目中需要获取风管的数据,要按照类型来获取。用API把风管取出来,可是两种风管的DuctType.Name一样,无法判别一个风管类型是圆形还是方形,或椭圆。网上查了一些资料,现在做一个总结。
解决方案一:
可以使用Duct 类型的参数ALL_MODEL_FAMILY_NAME 来判断。
例如(C++版本):
Autodesk::Revit::DB::Mechanical::Duct^ pDuct=gcnew Autodesk::Revit::DB::Mechanical::Duct;
string namestr=pDuct->DuctType->Parameter[BuiltInParameter::ALL_MODEL_FAMILY_NAME]->AsString();//获取字符形式的风管类型
对于英文版:
圆型的风管类型的值是:Round Duct
方形的风管类型的值是:Rectangular Duct
椭圆的风管类型的值是:Oval Duct
对于中文版:
圆型的风管类型的值是:圆形风管
方形的风管类型的值是:矩形风管
椭圆的风管类型的值是:椭圆形风管
解决方案二:
考虑获取风管的截面形状来判断。
从风管类型获取与风管类型关联的弯头族类型,然后打开这个弯头族,在从打开的族文档中获取连接件DuctConnector的截面形状。
详细参见:http://cleanbugs.com/item/413412/how-to-use-api-to-get-the-cross-section-shape-of-duct-type-from-duct-type.html
例如(C#版本):
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Autodesk.Revit .DB;
using Autodesk.Revit.UI;
using Autodesk.Revit .ApplicationServices;
using Autodesk.Revit.Attributes ;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI.Selection;
[TransactionAttribute(TransactionMode.Manual)]
public class RevitCommand : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string messages,
ElementSet elements)
{
UIApplication app = commandData.Application;
Document doc = app.ActiveUIDocument.Document;
Selection sel = app.ActiveUIDocument.Selection;
Reference ref1 = sel.PickObject(
ObjectType.Element, "please pick a duct");
Duct duct = doc.GetElement(ref1) as Duct;
if(duct == null)
{
messages = "You didn't select a duct";
return Result.Failed;
}
DuctType ductType = duct.DuctType;
//Get the duct type's elbow parameter value.
Parameter param = ductType.get_Parameter(
BuiltInParameter.RBS_CURVETYPE_DEFAULT_ELBOW_PARAM);
FamilySymbol symbol =
doc.get_Element(param.AsElementId()) as FamilySymbol;
Family family = symbol.Family;
Document familyDoc = doc.EditFamily(family);
FilteredElementCollector collector =
new FilteredElementCollector(familyDoc);
collector.OfClass(typeof(ConnectorElement));
Element firstConnector = collector.FirstElement();
DuctConnector connector = firstConnector as DuctConnector;
TaskDialog.Show("Duct Section Shape", connector.Shape.ToString());
familyDoc.Close(false);
return Result.Succeeded ;
}
}
说明:只验证方案一,方案二未验证。