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

    xiaoxiao2021-03-26  53

    1、可以从族实例中获得面、获得边、获得线、获得点,方法如下 using System ; using System . Collections . Generic ; using System . Linq ; using System . Text ; using System . Threading . Tasks ; using Autodesk . Revit . UI ; using Autodesk . Revit . DB ; using Autodesk . Revit . UI . Selection ; using Autodesk . 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 )]     public class Class1 : IExternalCommand     {         public Result Execute ( ExternalCommandData commandData , ref string message , ElementSet elements )         {             Document revitDoc = commandData . Application . ActiveUIDocument . Document //取得文档             Application revitApp = commandData . Application . Application ;             //取得应用程序             UIDocument uiDoc = commandData . Application . ActiveUIDocument ;             Selection sel = uiDoc . Selection ;             Reference ref1 = sel . PickObject ( ObjectType . Element , "选择一个族实例" );             Element elem = revitDoc . GetElement ( ref1 );             FamilyInstance familyInstance = elem as FamilyInstance ;             Options opt = new Options ();             opt . ComputeReferences = true ;             opt . DetailLevel = ViewDetailLevel . Fine ;             GeometryElement e = familyInstance .get_Geometry( opt );                         foreach ( GeometryObject obj in e )             {                     GeometryInstance geoInstance = obj as GeometryInstance ;                     GeometryElement geoElement = geoInstance . GetInstanceGeometry ();                     Transform insTransform = geoInstance . Transform ;                     foreach ( GeometryObject obj2 in geoElement )                     {                            Solid solid2 = obj2 as Solid ;                          if ( solid2 . Faces . Size > 0)                          {                         //FindBottomFace(solid2);                         //FindEdge(solid2);                         //FindLine(solid2);                         //FindPoint(solid2);                         transformPointAndUaPoint ( solid2 , insTransform );                         TaskDialog . Show ( "呵呵" , "在这里" );                          }                                           }                            }             return Result . Succeeded ;         }         /// <summary>         /// 得到最底下的边的面积和原点坐标         /// </summary>         /// <param name=" solid "></param>         /// <returns></returns>         Face FindBottomFace ( Solid solid )         {             PlanarFace pf = null ;             foreach ( Face face in solid . Faces )             {                 pf = face as PlanarFace ;                 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 ;                     }                 }             }             return pf ;         }         /// <summary>         /// 通过curve得到12个边的长度         /// </summary>         /// <param name=" solid "></param>         public void FindEdge ( Solid solid )         {             string strParamInfo = null ;             foreach ( Edge e in solid . Edges )             {                 strParamInfo += e . ApproximateLength + "\n" ;             }             TaskDialog . Show ( "REVIT" , strParamInfo );         }         /// <summary>         /// 通过Line得到12个边的长度         /// </summary>         /// <param name=" solid "></param>         public void FindLine ( Solid solid )         {             string strParamInfo = null ;             foreach ( Edge e in solid . Edges )             {                 Line line = e . AsCurve () as Line ;                 strParamInfo += line . ApproximateLength + "\n" ;             }             TaskDialog . Show ( "REVIT" , strParamInfo );         }         /// <summary>         /// 通过curve或者line找到点         /// </summary>         /// <param name=" solid "></param>         public void FindPoint ( Solid solid )         {             string strParamInfo1 = null ;             string strParamInfo2 = null ;             //string strParamInfo3 = null;             foreach ( Edge e in solid . Edges )             {                 foreach ( XYZ ii in e . Tessellate ())                 {                     XYZ point = ii ;                     strParamInfo1 += ii . X + "," + ii . Y + "," + ii . Z + "\n" ;                                      }                 Line line = e . AsCurve () as Line ;                 foreach ( XYZ ii in line . Tessellate ())                 {                     XYZ point = ii ;                     strParamInfo2 += ii . X + "," + ii . Y + "," + ii . Z + "\n" ;                 }                             }             TaskDialog . Show ( "通过curve找到点的坐标" , strParamInfo1 );             TaskDialog . Show ( "通过line找到点的坐标" , strParamInfo2 );         }         public void transformPointAndUaPoint ( Solid solid , Transform insTransform )         {             string strParamInfo1 = null ;             string strParamInfo2 = null ;             //string strParamInfo3 = null;             foreach ( Edge e in solid . Edges )             {                 foreach ( XYZ ii in e . Tessellate ())                 {                     XYZ point = ii ;                     strParamInfo1 += point . X + "," + point . Y + "," + point . Z + "\n" ;                     XYZ transformPoint = insTransform . OfPoint ( point );                     strParamInfo2 += transformPoint . X + "," + transformPoint . Y + "," + transformPoint . Z + "\n" ;                 }                          }             TaskDialog . Show ( "未经transform过转换的坐标" , strParamInfo1 );             TaskDialog . Show ( "经过transform转换的坐标系" , strParamInfo2 );         }     } }
    转载请注明原文地址: https://ju.6miu.com/read-662077.html

    最新回复(0)