找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1137|回复: 1

[每日一码] 从3d Solid 创建 PolyfaceMesh

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-8-27 10:34:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. using Autodesk.AutoCAD.BoundaryRepresentation;

  2. [CommandMethod("SOL2POLYFACEMESH")]
  3. static public void PolyfaceMeshFromSolid()
  4. {
  5.     Document doc =
  6.     Application.DocumentManager.MdiActiveDocument;
  7.     Database db = doc.Database;
  8.     Editor ed = doc.Editor;

  9.     PromptEntityOptions peo =
  10.     new PromptEntityOptions("Select a 3D solid");
  11.     peo.SetRejectMessage("\nA 3D solid must be selected.");
  12.     peo.AddAllowedClass(typeof(Solid3d), true);
  13.     PromptEntityResult per = ed.GetEntity(peo);

  14.     if (per.Status != PromptStatus.OK)
  15.         return;

  16.     Transaction tr = db.TransactionManager.StartTransaction();
  17.     using (tr)
  18.     {
  19.         BlockTable bt = (BlockTable)tr.GetObject
  20.             (
  21.                 db.BlockTableId,
  22.                 OpenMode.ForRead,
  23.                 false
  24.             );

  25.         BlockTableRecord btr = (BlockTableRecord)
  26.                 tr.GetObject(
  27.                                 bt[BlockTableRecord.ModelSpace],
  28.                                 OpenMode.ForWrite, false
  29.                             );

  30.         Solid3d sol = tr.GetObject(
  31.                                     per.ObjectId,
  32.                                     OpenMode.ForRead
  33.                                   ) as Solid3d;

  34.         // Calculate the approximate size of our solid
  35.         double length = sol.GeometricExtents.MinPoint.GetVectorTo
  36.                         (sol.GeometricExtents.MaxPoint).Length;

  37.         using (Brep brp = new Brep(sol))
  38.         {
  39.             // Create and set our mesh control object

  40.             using (Mesh2dControl mc = new Mesh2dControl())
  41.             {
  42.                 // These settings seem extreme, but only result
  43.                 // in ~500 faces for a sphere (during my testing,
  44.                 // anyway). Other control settings are available

  45.                 mc.MaxNodeSpacing = length / 10000;
  46.                 mc.MaxSubdivisions = 100000000;

  47.                 // Create a mesh filter object

  48.                 using (Mesh2dFilter mf = new Mesh2dFilter())
  49.                 {
  50.                     // Use it to map our control settings
  51.                     // to the Brep

  52.                     mf.Insert(brp, mc);

  53.                     // Generate a mesh using the filter

  54.                     PolyFaceMesh pfm = new PolyFaceMesh();
  55.                     pfm.SetDatabaseDefaults();
  56.                     pfm.ColorIndex = 2;
  57.                     btr.AppendEntity(pfm);

  58.                     short v0 = 0;
  59.                     short v1 = 0;
  60.                     short v2 = 0;
  61.                     short v3 = 0;
  62.                     short v = 0;

  63.                     Dictionary<Point3d, short> vertexLookup
  64.                             = new Dictionary<Point3d, short>();

  65.                     using (Mesh2d m = new Mesh2d(mf))
  66.                     {
  67.                         // Extract individual faces
  68.                         // from the mesh data

  69.                         foreach (Element2d e in m.Element2ds)
  70.                         {
  71.                             foreach (Node n in e.Nodes)
  72.                             {
  73.                                 if (! vertexLookup.ContainsKey(n.Point))
  74.                                 {
  75.                                     PolyFaceMeshVertex pfmVertex
  76.                                         = new PolyFaceMeshVertex(n.Point);

  77.                                     pfm.AppendVertex(pfmVertex);
  78.                                     vertexLookup.Add(n.Point, ++v);

  79.                                     tr.AddNewlyCreatedDBObject
  80.                                             (pfmVertex, true);
  81.                                 }

  82.                                 n.Dispose();
  83.                             }
  84.                         }

  85.                         foreach (Element2d e in m.Element2ds)
  86.                         {
  87.                             Point3dCollection pts
  88.                                     = new Point3dCollection();
  89.                             foreach (Node n in e.Nodes)
  90.                             {
  91.                                 pts.Add(n.Point);

  92.                                 n.Dispose();
  93.                             }

  94.                             e.Dispose();

  95.                             v0 = 0;
  96.                             if (vertexLookup.ContainsKey(pts[0]))
  97.                                 v0 = vertexLookup[pts[0]];

  98.                             v1 = 0;
  99.                             if (vertexLookup.ContainsKey(pts[1]))
  100.                                 v1 = vertexLookup[pts[1]];

  101.                             v2 = 0;
  102.                             if (vertexLookup.ContainsKey(pts[2]))
  103.                                 v2 = vertexLookup[pts[2]];

  104.                             v3 = 0;
  105.                             if (pts.Count == 4)
  106.                             {
  107.                                 if (vertexLookup.ContainsKey(pts[3]))
  108.                                     v3 = vertexLookup[pts[3]];
  109.                             }

  110.                             FaceRecord fr
  111.                                = new FaceRecord(v0, v1, v2, v3);
  112.                             pfm.AppendFaceRecord(fr);
  113.                             tr.AddNewlyCreatedDBObject(fr, true);
  114.                         }
  115.                     }

  116.                     tr.AddNewlyCreatedDBObject(pfm, true);

  117.                     vertexLookup.Clear();
  118.                 }
  119.             }
  120.         }
  121.         tr.Commit();
  122.     }
  123. }


下面是程序执行后生成的截图。

0.jpg


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2016-12-10 23:25:36 | 显示全部楼层
反过来能行吗?由PolyfaceMesh 创建实体
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 21:40 , Processed in 0.363839 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表