zoukankan      html  css  js  c++  java
  • Revit二次开发十一 族

       在Revit中,提供了一个供用户自定义的元素"族",在Revit所有的操作都围绕族这个元素进行。

    1. 族的分类

      Revit将族分为系统族、内建族、标准构件族。

      1. 系统族:系统族是在 Autodesk Revit 中预定义的族,包含基本建筑构件,例如墙、窗和门。例如:基本墙系统族包含定义内墙、外墙、基础墙、常规墙和隔断墙样式的墙类型;可以复制和修改现有系统族,但不能创建新系统族;可以通过指定新参数定义新的族类型。
      2. 标准构件族:在默认情况下,在项目样板中载入标准构件族,但更多标准构件族存储在构件库中。使用族编辑器创建和修改构件。可以复制和修改现有构件族, 也可以根据各种族样板创建新的构件族。族样板可以是基于主体的样板, 也可以是独立的样板。基于主体的族包括需要主体的构件。例如:以墙族为主体的门族,独立族包括柱、树和家具;族样板有助于创建和操作构件族。标准构件族可以位于项目环境外,且具有 .rfa 扩展名,可以将它们载入项目,从一个项目传递到另一个项目,而且如果需要还可以从项目文件保存到您的库中。
      3. 内建族:内建族可以是特定项目中的模型构件,也可以是注释构件。只能在当前项目中创建内建族,因此它们仅可用于该项目特定的对象,例如:自定义墙的处理。创建内建族时,可以选择类别,且您使用的类别将决定构件在项目中的外观和显示控制。

      而我们在Revit二次开发中,与Family相关的主要是标准构建族和内建族,系统族虽然也被统称为族,并没有Family的相关属性和特性。本章主要讲解Family的相关关系。如图1-1所示:

      一个族(Famliy)在Revit系统中,是不允许独立存在,必须附属在一个族类别之上,族类别比族更加具体,族就像一个抽象类、族类型就是一个类,而族实例是一个实例化的对象元素。

    2. 族的访问

      从族实例获取族类型FamilySymbol:

    3. FamilySymbol symbol = familylnstance. Symbol  
      FamilySymbol symbol = RevitDoc. GetElement(familyInstance.GetTypeId()) as FamilySymbol 
    4. 从族类型获取族:

      Family family = symbol. Family;

      从族获取族类型:

      FamilySymbolSet setOfSymbols = family. Symbols;

      从族类型获取族实例

      FamilylnstanceFilter familylnstanceFilter = new FamilyInstanceFilter(RevitDoc,symbol, Id); 
      FilteredElementCollector filteredElements = new FilteredElementCollector(RevitDoc); 
      filteredElements = filteredElements. WherePasses(familylnstanceFilter); 
      foreach (Familylnstance element in filteredElements) 
      { 
      //各族实例 
      } 

      族实例的构建

    5. 分别通过doc.LoadFamily(file, out family);加载族,通过doc.Create.NewFamilyInstance创建一个族实例。

      /// <summary>
      /// 创建一个门族的案例
      /// </summary>
      /// <param name="RevitDoc"></param>
      /// <param name="doorTypeName"></param>
      public void CreatDoorInstance(Document doc, string doorTypeName = "0762 x 2032 mm") 
      { 
      FamilySymbol doorType = null; 
       
      string file = @"C:ProgramDataAutodeskRVT 2017LibrariesChinese_INTL门M_单-嵌板.rfa"; 
      //获取族
      Family family = null; 
      //加载指定的族
      bool loadSuccess = doc.LoadFamily(file, out family); 
      if (loadSuccess) 
      { 
      //获取当前族所有的验证类型
      foreach (ElementId doorTypeId in family.GetValidTypes()) 
      { 
      //获取当前的族类型
      doorType = doc.GetElement(doorTypeId) as FamilySymbol; 
      //指定当前的族类型
      if (doorType != null) 
      { 
      if (doorType.Name == doorTypeName) 
      { 
      break; 
      } 
      } 
      } 
      } 
      else
      { 
      Autodesk.Revit.UI.TaskDialog.Show("失败", "加载族失败"); 
      } 
      // 使用族类型创建门 
      if (doorType != null) 
      { 
      // 首先找到线形的墙 
      ElementFilter wallFilter = new ElementClassFilter(typeof(Wall)); 
      FilteredElementCollector filteredElements = new FilteredElementCollector(doc); 
      filteredElements = filteredElements.WherePasses(wallFilter); 
      Wall wall = null; 
      Line line = null; 
      foreach (Wall element in filteredElements) 
      { 
      LocationCurve locationCurve = element.Location as LocationCurve; 
      if (locationCurve != null) 
      { 
      line = locationCurve.Curve as Line; 
      if (line != null) 
      { 
      wall = element; 
      break; 
      } 
      } 
      } 
      // 在墙的中心位置创建一个门 
      if (wall != null) 
      { 
      XYZ midPoint = (line.GetEndPoint(0) + line.GetEndPoint(1)) / 2; 
      Level wallLevel = doc.GetElement(wall.LevelId) as Level; 
      //创建一个族实例 
      FamilyInstance door = doc.Create.NewFamilyInstance(midPoint, doorType, wall, wallLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); 
      Autodesk.Revit.UI.TaskDialog.Show("成功", door.Id.ToString()); 
      System.Diagnostics.Trace.WriteLine("门创建完成: " + door.Id.ToString()); 
      } 
      else
      { 
      Autodesk.Revit.UI.TaskDialog.Show("元素不存在", "没有找到符合条件的墙"); 
      } 
      } 
      else
      { 
      Autodesk.Revit.UI.TaskDialog.Show("族类型不存在", "没有找到族类型'" + doorTypeName + "'"); 
      } 
      }
      

       

    6. 元素的编辑

      元素的移动、旋转和镜像,当前对对象进行操作时需要注意以下几点,不管是移动和旋转镜像,需要当前族具有此类特性,如一些族限制了标高,则Z方向不管赋值是否,都无法产生移动,其代码如下:

      public void ElementUtil(Document doc, FamilyInstance familyInstance) { 
       
      //元素的移动
      ElementTransformUtils.MoveElement(doc, familyInstance.Id, new XYZ(0, 0, 0)); 
      ElementTransformUtils.RotateElement(doc, familyInstance.Id, Line.CreateBound(new XYZ(0, 0, 0), new XYZ(1, 1, 1)), 30); 
      Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisX, XYZ.Zero); 
      ElementTransformUtils.MirrorElement(doc, familyInstance.Id, plane); 
      }
  • 相关阅读:
    脏数据或者场景考虑不全面引发的生产问题
    框架那些事
    RMI远程方法调用和rpc远程过程调用
    如何提高开发效率
    什么是RPC
    TCP/IP协议和HTTP协议
    apache常见错误:VC运行库(找不到 VCRUNTIME140.dll)
    Apache报错:无法使用可靠的服务器域名
    Apache2.4 下载和安装
    Navicat Premium 15.0.17 破解激活(DFoX 注册机)
  • 原文地址:https://www.cnblogs.com/minhost/p/11586392.html
Copyright © 2011-2022 走看看