Revit中的参数
族中参数
- 族参数——不能出现在明细表
- 实例参数
- 类型参数
- 共享参数——可以出现在明细表
项目的参数
- 项目参数——可以同时添加到项目多类别图元中
- 共享参数——和前面族中的共享参数是一样的
- 全局参数——控制项目中图元的参数
族中创建实例参数
private void FamDocCreateInstancePrameter(Document famDoc) {
var manager = famDoc.FamilyManager;
var instanceParametere1 = default(FamilyParameter);
using (var trans = new Transaction(famDoc, "创建参数")) {
trans.Start();
instanceParametere1 = manager.AddParameter("实例参数1", BuiltInParameterGroup.PG_LENGTH, ParameterType.Length, true);
trans.Commit();
}
//假设这里创建了一个尺寸标注
var dimension1 = default(Autodesk.Revit.DB.Dimension);
//尺寸标注和参数做关联,这样等族载入带项目中以后,可以通过参数来驱动尺寸标注,从而实现参数化控制的效果
dimension1.FamilyLabel = instanceParametere1;
}
族中创建类型参数
因为一个族文档中可能存在多个族类型,在族文档中创建类型参数时需要明确到底给那个类型添加参数,主要步骤是这样:
- 找到需要添加参数的类型
- 设置需要添加参数类型为当前类型
- 添加参数
下面demo会给族文档中名称带有"AA"字段的类型添加一个类型参数
private void FamDocCreateSymbolParameter(Document famDoc) {
var keyWord = "AA";
var manager = famDoc.FamilyManager;
var types = manager.Types;
foreach (var type in types) {
if (type is FamilyType famType && famType.Name.Contains(keyWord)) {
var trans = new Transaction(famDoc, "创建类型参数");
trans.Start();
//设置当前的族类型
manager.CurrentType = famType;
//创建参数,最后一个布尔值来确定是类型参数还是实例参数
var symbolParameter = manager.AddParameter("类型参数1", BuiltInParameterGroup.PG_LENGTH, ParameterType.Length, false);
trans.Commit();
trans.Dispose();
}
}
}
创建共享参数
族中使用共享参数
项目中使用共享参数
创建并使用项目参数
创建并使用全局参数
全局参数说白了也是一个参数,可以类比到族参数。族文档中创建了一扇门,宽度做了标注,然后创建了相应的参数以后,我们把族载入到项目中,就可以通过这个参数来控制门的宽度。全局参数其实就是控制项目文档中图元的参数。比如下面的demo实现了用户选择两堵平行墙,然后标注两者之间的距离,然后创建一个全局参数和标注做关联,后期就可以通过这个全局参数来控制这个这两堵墙的宽度了
private void DocCreateGloablParameter() {
var ref1 = _uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "select wall1");
var ref2 = _uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "select wall2");
var wall1 = _uidoc.Document.GetElement(ref1) as Wall;
var wall2 = _uidoc.Document.GetElement(ref2) as Wall;
var line1 = (wall1.Location as LocationCurve).Curve;
var line2 = (wall2.Location as LocationCurve).Curve;
var face1 = wall1.GetTargetFace(wall1.Orientation);
var face2 = wall2.GetTargetFace(wall2.Orientation);
var array = new ReferenceArray();
array.Append(face1.Reference);
array.Append(face2.Reference);
var parameter = default(GlobalParameter);
using (var trans = new Transaction(_doc, "创建参数")) {
trans.Start();
parameter = GlobalParameter.Create(_doc, "间距", ParameterType.Length);
trans.Commit();
}
var line = Line.CreateBound(line1.GetEndPoint(0), line2.GetEndPoint(0));
using (var trans = new Transaction(_doc, "创建标注")) {
trans.Start();
var dimension = _doc.Create.NewDimension(_uidoc.ActiveGraphicalView, line, array);
parameter.LabelDimension(dimension.Id);
trans.Commit();
}
}
public static PlanarFace GetTargetFace(this Element elem, XYZ normal) {
var opt = new Options() {
ComputeReferences = true,
DetailLevel = ViewDetailLevel.Fine,
IncludeNonVisibleObjects = true,
};
var geometry = elem.get_Geometry(opt);
foreach (var geoObje in geometry) {
if (geoObje is Solid solid && solid.Faces.Size > 0) {
foreach (var face in solid.Faces) {
if (face is PlanarFace pf && pf.FaceNormal.IsAlmostEqualTo(normal)) {
return pf;
}
}
}
}
return default(PlanarFace);
}
待更新