EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-9 12:59:08

Revit二次开发之“族”操作



风管 - 类别Category
圆形风管 - 族Family
T形三通 - 族型号FamilySymbol
画出来 - 族实例FamilyInstance
http://revit.5d6d.com
加载族


public class LoadFamily : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
    {
      Document doc = commandData.Application.ActiveUIDocument.Document;
      doc.LoadFamily(@"C:\Documents and Settings\All Users\Application Data\Autodesk\RME 2011\Metric Library\窗\M_带贴面窗.rfa");
      return Result.Succeeded;
    }
}

end   
   
   
    public class LoadFamily : IExternalCommand
    {
      public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
      {
            Document doc = commandData.Application.ActiveUIDocument.Document;
            //加载族
            //doc.LoadFamily(@"C:\Documents and Settings\All Users\Application Data\Autodesk\RME 2011\Metric Library\窗\M_带贴面窗.rfa");
            //加载族中的一个Symbol
            //doc.LoadFamilySymbol(@"C:\Documents and Settings\All Users\Application Data\Autodesk\RME 2011\Metric Library\窗\M_带贴面窗.rfa"
            //, "0406 x 0610 mm");
            //遍历族
            TraversqlFamily(doc);

            return Result.Succeeded;
      }
      public Result TraversqlFamily(Document doc)
      {
            Family family = null;
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            ICollection<Element> collection = collector.OfClass(typeof(Family)).ToElements();
            string sMsg = "Standard families already loaded in this model:";
            foreach (Element e in collection)
            {
                family = e as Family;
                if (null != family)
                {
                  /*
                  //获得族的类别名称
                  string famCatName = (null == family.FamilyCategory) ? "?" : family.FamilyCategory.Name;
                  sMsg += "\r\n Name=" + family.Name + ";Category=" + famCatName;

                  if (family.Name == "M_圆形四通")//M_风管尺寸标记//M_圆形软风管标记
                        MessageBox.Show(family.Name);
                  if (family.Name == "风管")
                        MessageBox.Show(family.Name);
                  if (family.Name == "圆形风管")
                        MessageBox.Show(family.Name);
                  if (family.Name == "接头")
                        MessageBox.Show(family.Name);

                  if (family.Name.Contains("风管"))
                        MessageBox.Show(family.Name);*/
                  if (family.FamilyCategory.Name == "圆形风管")
                  //if (family.FamilyCategory.Name == "风管")
                        sMsg += "\r\n Name=" + family.Name + ";Category=" + family.FamilyCategory.Name;
                }
            }
            MessageBox.Show(sMsg);

            return Result.Succeeded;
      }

end
创建族实例

public class CreateFamilyInstance : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
      UIApplication uiApp = commandData.Application;
      Document doc = uiApp.ActiveUIDocument.Document;
      Selection sel = uiApp.ActiveUIDocument.Selection;

      FamilySymbol familySymbol = null;
      FilteredElementCollector collector = new FilteredElementCollector(doc);//过滤元素
      ICollection<Element> collection = collector.OfClass(typeof(FamilySymbol)).ToElements();

      foreach (Element e in collection)
      {
            familySymbol = e as FamilySymbol;
            if (null != familySymbol.Category)
            {
                if ("风管管件" == familySymbol.Category.Name)//这里不知道怎样用内参BuiltInCategory.o
                {
                  if (familySymbol.Family.Name == "矩形弯头 - 法兰")
                  {
                        //遍历族符号的方法
                        FamilySymbolSetIterator symbolItor = familySymbol.Family.Symbols.ForwardIterator();
                        FamilySymbol fs = null;
                        while (symbolItor.MoveNext())
                        {
                            fs = symbolItor.Current as FamilySymbol;
                        }
                        break;
                  }
                }
            }
      }

      XYZ point = new XYZ(10, 10, 10);

      //创建族实例
      FamilyInstance fi = doc.Create.NewFamilyInstance(point, familySymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);

      //修改族实例
      FamilySymbol newFamilySymbol = null;
      foreach (Element e in collection)
      {
            newFamilySymbol = e as FamilySymbol;
            if (null != newFamilySymbol.Category)
            {
                if ("风管管件" == newFamilySymbol.Category.Name)
                {
                  if (newFamilySymbol.Family.Name == "矩形弯头 - 平滑半径 - 法兰")
                  {
                        FamilySymbolSetIterator symbolItor = newFamilySymbol.Family.Symbols.ForwardIterator();
                        FamilySymbol fs = null;
                        while (symbolItor.MoveNext())
                        {
                            fs = symbolItor.Current as FamilySymbol;
                            //MessageBox.Show(fs.Name);
                        }
                        break;
                  }
                }
            }
      }
      fi.Symbol = newFamilySymbol;

      return Result.Succeeded;
    }
}

妮可 发表于 2014-2-20 14:37:45

路过!!!
不发表意见……

简单_幸福 发表于 2014-11-20 09:45:18

路过!!!
不发表意见……
不懂

页: [1]
查看完整版本: Revit二次开发之“族”操作