Revit二次开发:对族实例、风管、管进行操作

(1) 风管 (管道)

a. 获取风管的各个连接器

b. 获取和修改风管的类型属性和实例属性

c.  根据一个风管的属性创建另一个风管

// a. 获取风管的各个连接器
 var ductConnector = duct.ConnectorManager.Connectors.Cast<Connector>().ToList();

// b. 修改风管的实例属性  (从一个风管的属性上获取需要的参数 添加到另一个风管上)
string height = duct1.LookupParameter("高度").AsValueString();
string width = duct1.LookupParameter("宽度").AsValueString();
string moveDistance = duct1.LookupParameter("偏移").AsValueString();

double diameter = nearPipe.LookupParameter("直径").AsDouble(); // 管道获取直径

foreach (Parameter parameter in newDuct.Parameters)
{
    if (parameter.Definition.Name.Equals("高度"))
    {
        parameter.Set(height); //如果不行尝试后边 parameter.Set(height.ToDouble().ToAPI());
    }
    else if (parameter.Definition.Name.Equals("宽度"))
    {
        parameter.Set(width); //如果不行尝试后边 parameter.Set(height.ToDouble().ToAPI());
    }
    else if (parameter.Definition.Name.Equals("偏移"))
    {
        parameter.Set(moveDistance);
    }
    else  if (parameter.Definition.Name.Equals("直径")) // 管道
    {
        parameter.Set(diameter);
    }
}

// c. 根据一个风管的属性创建另一个风管
Duct newDuct1 = Duct.Create(m_curDoc, duct1.MEPSystem.GetTypeId(), duct1.DuctType.Id, duct1.ReferenceLevel.Id, startPt.ToXYZ().ToAPI(), endPt.ToXYZ().ToAPI());
   

(2) 族实例

a. 获取族实例的各个连接器

b. 获取和修改族实例的类型属性和实例属性

c.  族实例FamilyInstance旋转

// a. 获取族实例的各个连接器
 var familyConnectors = familyInstance.MEPModel.ConnectorManager.Connectors.Cast<Connector>().ToList();

// b. 获取和修改族实例的类型属性和实例属性
// 备注 : 1. 不成功的尝试用Set(Length) / SetValueString  // 2. 数值不对需要转化一下ToAPI();
// 实例类型 参数修改
foreach (Parameter parameter in fInst.Parameters)
{
    if (parameter.Definition.Name.Contains("构件编号"))
    {
        parameter.Set(familyInstanceName);
    }
    else if (parameter.Definition.Name.Contains("底部标高"))
    {
        parameter.Set(level_1.Id); // 标高
    }
}

// 类型属性修改
foreach (Parameter parameter in fInst.Symbol.Parameters)
{
    if (parameter.Definition.Name.Equals("长度"))
    {
        parameter.SetValueString(Length);
    }
}

// c.族实例FamilyInstance旋转
public void RotateFamilyInstance(Document doc, FamilyInstance instance, double angle, XYZ familyInInsertPt)
{
    // 得到起点
    var targetXyz = familyInInsertPt.ToAPI();
    // 创建旋转基线
    Line line1 = Line.CreateBound(targetXyz, targetXyz + XYZ.BasisZ * 1);
    // 旋转
    instance.Location.Rotate(line1, angle);
    // 获取旋转后的插入点
    XYZ nowXyz = instance.GetTransform().Origin;
    //计算目标位置相对于当前物体位置的关系
    XYZ newXyz = new XYZ(targetXyz.X - nowXyz.X, targetXyz.Y - nowXyz.Y, targetXyz.Z - nowXyz.Z);
    // (以自身为坐标系  移动的距离  需要计算目标位置对于现在的相对距离)
    ElementTransformUtils.MoveElement(m_curDoc, instance.Id, newXyz);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤道士

您的认可是我最快乐的事情,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值