revit二次开发——从族实例中取得几何信息

来源:互联网 发布:淘宝买家仅退款不退货 编辑:程序博客网 时间:2024/06/11 00:31
1、可以从族实例中获得面、获得边、获得线、获得点,方法如下

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingAutodesk.Revit.UI;
usingAutodesk.Revit.DB;
usingAutodesk.Revit.UI.Selection;
usingAutodesk.Revit.ApplicationServices;
namespace从族实例中获得几何信息
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
   publicclassClass1:IExternalCommand
    {
       publicResultExecute(ExternalCommandDatacommandData,refstringmessage,ElementSetelements)
        {
           DocumentrevitDoc=commandData.Application.ActiveUIDocument.Document//取得文档
           ApplicationrevitApp=commandData.Application.Application;            //取得应用程序
           UIDocumentuiDoc=commandData.Application.ActiveUIDocument;
           Selectionsel=uiDoc.Selection;
           Referenceref1=sel.PickObject(ObjectType.Element,"选择一个族实例");
           Elementelem=revitDoc.GetElement(ref1);
           FamilyInstancefamilyInstance=elemasFamilyInstance;
           Optionsopt=newOptions();
           opt.ComputeReferences=true;
           opt.DetailLevel=ViewDetailLevel.Fine;
           GeometryElemente=familyInstance.get_Geometry(opt);
           
           foreach(GeometryObjectobjine)
            {
                   GeometryInstancegeoInstance=objasGeometryInstance;
                   GeometryElementgeoElement=geoInstance.GetInstanceGeometry();
                   TransforminsTransform=geoInstance.Transform;
                   foreach(GeometryObjectobj2ingeoElement)
                    {
                          Solidsolid2=obj2asSolid;
                        if(solid2.Faces.Size> 0)
                         {
                       //FindBottomFace(solid2);
                       //FindEdge(solid2);
                       //FindLine(solid2);
                       //FindPoint(solid2);
                       transformPointAndUaPoint(solid2,insTransform);
                       TaskDialog.Show("呵呵","在这里");
                         }                      
                    }               
            }
           returnResult.Succeeded;
        }
       ///<summary>
       ///得到最底下的边的面积和原点坐标
       ///</summary>
       ///<param name="solid"></param>
       ///<returns></returns>
       FaceFindBottomFace(Solidsolid)
        {
           PlanarFacepf=null;
           foreach(Facefaceinsolid.Faces)
            {
               pf=faceasPlanarFace;
               if(null!=pf)
                {
                   if(Math.Abs(pf.FaceNormal.X) < 0.01 && Math.Abs(pf.FaceNormal.Y) < 0.01 && pf.FaceNormal.Z< 0)
                    {
                       TaskDialog.Show("Wall Bottom Face","Area is "+pf.Area.ToString() + "; Origin = (" + pf.Origin.X.ToString() + "  " + pf.Origin.Y.ToString() + "  " + pf.Origin.Z.ToString() + ")");
                       break;
                    }
                }
            }
           returnpf;
        }
       ///<summary>
       ///通过curve得到12个边的长度
       ///</summary>
       ///<param name="solid"></param>
       publicvoidFindEdge(Solidsolid)
        {
           stringstrParamInfo=null;
           foreach(Edgeeinsolid.Edges)
            {
               strParamInfo+=e.ApproximateLength+"\n";
            }
           TaskDialog.Show("REVIT",strParamInfo);
        }
       ///<summary>
       ///通过Line得到12个边的长度
       ///</summary>
       ///<param name="solid"></param>
       publicvoidFindLine(Solidsolid)
        {
           stringstrParamInfo=null;
           foreach(Edgeeinsolid.Edges)
            {
               Lineline=e.AsCurve()asLine;
               strParamInfo+=line.ApproximateLength+"\n";
            }
           TaskDialog.Show("REVIT",strParamInfo);
        }
       ///<summary>
       ///通过curve或者line找到点
       ///</summary>
       ///<param name="solid"></param>
       publicvoidFindPoint(Solidsolid)
        {
           stringstrParamInfo1=null;
           stringstrParamInfo2=null;
           //string strParamInfo3 = null;
           foreach(Edgeeinsolid.Edges)
            {
               foreach(XYZiiine.Tessellate())
                {
                   XYZpoint=ii;
                   strParamInfo1+=ii.X+","+ii.Y+","+ii.Z+"\n";
                   
                 }
               Lineline=e.AsCurve()asLine;
               foreach(XYZiiinline.Tessellate())
                {
                   XYZpoint=ii;
                   strParamInfo2+=ii.X+","+ii.Y+","+ii.Z+"\n";
                }
               
            }
           TaskDialog.Show("通过curve找到点的坐标",strParamInfo1);
           TaskDialog.Show("通过line找到点的坐标",strParamInfo2);
        }
       publicvoidtransformPointAndUaPoint(Solidsolid,TransforminsTransform)
        {
           stringstrParamInfo1=null;
           stringstrParamInfo2=null;
           //string strParamInfo3 = null;
           foreach(Edgeeinsolid.Edges)
            {
               foreach(XYZiiine.Tessellate())
                {
                   XYZpoint=ii;
                   strParamInfo1+=point.X+","+point.Y+","+point.Z+"\n";
                   XYZtransformPoint=insTransform.OfPoint(point);
                   strParamInfo2+=transformPoint.X+","+transformPoint.Y+","+transformPoint.Z+"\n";
                }             
            }
           TaskDialog.Show("未经transform过转换的坐标",strParamInfo1);
           TaskDialog.Show("经过transform转换的坐标系",strParamInfo2);
        }
    }
}
0 0