设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2761|回复: 27

[每日一码] (C#)算HATCH的周长的代码

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2016-7-15 13:29:19 | 显示全部楼层 |阅读模式

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

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

x

游客,如果您要查看本帖隐藏内容请回复



  1. void HatchPerimeter(ObjectId entId)
  2. {
  3.     Document activeDoc = Application.DocumentManager.MdiActiveDocument;
  4.     Database db = activeDoc.Database;
  5.     Editor ed = activeDoc.Editor;

  6.     using (Transaction tr = db.TransactionManager.StartTransaction())
  7.     {
  8.         Hatch hatch = tr.GetObject(entId, OpenMode.ForRead) as Hatch;
  9.         int nLoops = hatch.NumberOfLoops;

  10.         double totalExternalPerimeter =0.0;
  11.         double totalInternalPerimeter =0.0;

  12.         for(int i=0; i < nLoops; i++)
  13.         {
  14.             double loopLength = 0.0;
  15.             HatchLoopTypes hlt = hatch.LoopTypeAt(i);
  16.             HatchLoop hatchLoop = hatch.GetLoopAt(i);

  17.             if ((hatch.LoopTypeAt(i) & HatchLoopTypes.Polyline)
  18.                                     == HatchLoopTypes.Polyline)
  19.             {
  20.                 BulgeVertexCollection bulges
  21.                                             = hatchLoop.Polyline;

  22.                 int nVertices = bulges.Count;
  23.                 Polyline testPoly = new Polyline(nVertices);

  24.                 for(int vx = 0; vx < bulges.Count; vx++)
  25.                 {
  26.                     BulgeVertex bv = bulges[vx];
  27.                     testPoly.AddVertexAt(
  28.                                             vx,
  29.                                             bv.Vertex,
  30.                                             bv.Bulge,
  31.                                             1.0,
  32.                                             1.0
  33.                                         );
  34.                 }

  35.                 LineSegment3d ls = new LineSegment3d();
  36.                 CircularArc3d cs = new CircularArc3d();
  37.                 double d = 0.0, p1 = 0.0, p2 = 1.0;

  38.                 for(int ver = 0; ver < nVertices-1; ver++)
  39.                 {
  40.                     d = testPoly.GetBulgeAt(ver);
  41.                     if( d <= 1e-5 )
  42.                     {
  43.                         ls = testPoly.GetLineSegmentAt(ver);
  44.                         loopLength += ls.Length;
  45.                     }
  46.                     else
  47.                     {
  48.                         Point2d v1
  49.                             = new Point2d(
  50.                                             bulges[ver].Vertex.X,
  51.                                             bulges[ver].Vertex.Y
  52.                                          );
  53.                         Point2d v2
  54.                             = new Point2d(
  55.                                             bulges[ver + 1].Vertex.X,
  56.                                             bulges[ver + 1].Vertex.Y
  57.                                          );
  58.                         if (v1.IsEqualTo(v2) == false)
  59.                         {
  60.                             cs = testPoly.GetArcSegmentAt(ver);
  61.                             p1 = cs.GetParameterOf(cs.StartPoint);
  62.                             p2 = cs.GetParameterOf(cs.EndPoint);

  63.                             loopLength +=
  64.                                 cs.GetLength
  65.                                 (
  66.                                     p1,
  67.                                     p2,
  68.                                     Tolerance.Global.EqualPoint
  69.                                 );
  70.                         }
  71.                     }
  72.                 }
  73.             }
  74.             else
  75.             {
  76.                 Curve2dCollection curves = hatchLoop.Curves;
  77.                 if (curves != null)
  78.                 {
  79.                     foreach (Curve2d curve in curves)
  80.                     {
  81.                         if (hatchLoop.LoopType
  82.                             == HatchLoopTypes.External)
  83.                         {
  84.                             totalExternalPerimeter +=
  85.                                     curve.GetLength(0.0, 1.0);
  86.                         }
  87.                         else
  88.                         {
  89.                             totalInternalPerimeter +=
  90.                                     curve.GetLength(0.0, 1.0);
  91.                         }
  92.                     }
  93.                 }
  94.             }

  95.             if (    nLoops > 1 &&
  96.                     ((hlt & HatchLoopTypes.External) != HatchLoopTypes.External))
  97.             {
  98.                 totalInternalPerimeter += loopLength;
  99.             }
  100.             else
  101.             {
  102.                 totalExternalPerimeter += loopLength;
  103.             }
  104.         }

  105.         ed.WriteMessage(
  106.                             string.Format
  107.                             (
  108.                                 "\nExternal Perimeter : {0}",
  109.                                 totalExternalPerimeter
  110.                             )
  111.                        );

  112.         ed.WriteMessage(
  113.                             string.Format
  114.                             (
  115.                                 "\nInternal Perimeter : {0}",
  116.                                 totalInternalPerimeter
  117.                             )
  118.                        );
  119.         tr.Commit();
  120.     }
  121. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6个

财富等级: 恭喜发财

 楼主| 发表于 2016-7-15 13:30:27 | 显示全部楼层
算HATCH周长的ARX代码

  1. // Perimeter calculation of a hatch using ObjectARX
  2. static void ADS_HatchTest(void)
  3. {
  4.     ads_name en;
  5.     ads_point pt;
  6.     if( acedEntSel(
  7.                     ACRX_T("\nSelect a hatch :"),
  8.                     en,
  9.                     pt
  10.                    ) != RTNORM )
  11.     {
  12.         return;
  13.     }

  14.     AcDbObjectId entId = AcDbObjectId::kNull;
  15.     Acad::ErrorStatus es;
  16.     es = acdbGetObjectId(entId, en);
  17.     if(es != Acad::eOk)
  18.           return;

  19.     HatchPerimeter(entId);
  20. }

  21. static void HatchPerimeter(AcDbObjectId entId)
  22. {
  23.     Acad::ErrorStatus es;
  24.     AcDbEntity *pEnt;
  25.     es = acdbOpenAcDbEntity(
  26.                             pEnt,
  27.                             entId,
  28.                             AcDb::kForRead
  29.                            );
  30.     if( es != Acad::eOk )
  31.         return;

  32.     if( pEnt->isA() != AcDbHatch::desc() )
  33.     {
  34.         acutPrintf(ACRX_T("\n Please select a hatch."));
  35.         pEnt->close();
  36.         return;
  37.     }

  38.     AcDbHatch* pHatch = AcDbHatch::cast(pEnt);

  39.     int nLoops = pHatch->numLoops();
  40.     double totalExternalPerimeter =0.0;
  41.     double totalInternalPerimeter =0.0;

  42.     for(int i=0; i < nLoops; i++)
  43.     {
  44.         double loopLength = 0.0;
  45.         long loopType;

  46.         if( pHatch->loopTypeAt( i )
  47.           & AcDbHatch::kPolyline )
  48.         {   
  49.             AcGePoint2dArray vertices;   
  50.             AcGeDoubleArray bulges;   
  51.             pHatch->getLoopAt(
  52.                                 i,
  53.                                 loopType,
  54.                                 vertices,
  55.                                 bulges
  56.                              );  
  57.             int nVertices = vertices.length();

  58.             AcDbPolyline testPoly(nVertices);

  59.             for( int vx=0; vx < nVertices; vx++)
  60.             {
  61.                 double bulge = 0.0;
  62.                 if(bulges.length() < nVertices)
  63.                   bulge = 0.0;
  64.                 else
  65.                   bulge = bulges[vx];
  66.                 testPoly.addVertexAt(
  67.                                         vx,
  68.                                         vertices[vx],
  69.                                         bulge
  70.                                     );
  71.             }

  72.             AcGeLineSeg3d ls;
  73.             AcGeCircArc3d as;
  74.             double d = 0.0, p1 = 0.0, p2 = 1.0;

  75.             for(int ver = 0; ver < nVertices; ver++)
  76.             {
  77.                 es = testPoly.getBulgeAt( i, d );
  78.                 if( es != Acad::eOk )
  79.                     break;

  80.                 if( d <= 1e-5 )
  81.                 {
  82.                     es = testPoly.getLineSegAt(ver, ls);
  83.                     if( es != Acad::eOk )
  84.                           break;
  85.                     loopLength += ls.length();
  86.                 }
  87.                 else
  88.                 {
  89.                     AcGePoint2d v1;
  90.                     AcGePoint2d v2;
  91.                     v1.set(
  92.                             vertices[ver].x,
  93.                             vertices[ver].y
  94.                           );

  95.                     if (ver == (nVertices - 1))
  96.                     {
  97.                         v2.set(
  98.                                 vertices[0].x,
  99.                                 vertices[0].y
  100.                               );
  101.                     }
  102.                     else
  103.                     {
  104.                         v2.set(
  105.                                  vertices[ver+1].x,
  106.                                  vertices[ver+1].y
  107.                               );
  108.                     }

  109.                     if (v1.isEqualTo(v2, AcGeContext::gTol)
  110.                                         == Adesk::kFalse)
  111.                     {
  112.                         es = testPoly.getArcSegAt( i, as );
  113.                         if( es != Acad::eOk )
  114.                             break;

  115.                         p1 = as.paramOf(as.startPoint());
  116.                         p2 = as.paramOf(as.endPoint());

  117.                         loopLength += as.length( p1, p2 );
  118.                     }
  119.                 }
  120.             }
  121.         }  
  122.         else
  123.         {   
  124.             AcGePoint2dArray vertices;   
  125.             AcGeDoubleArray bulges;
  126.             AcGeVoidPointerArray edgePtrs;
  127.             AcGeIntArray edgeTypes;

  128.             pHatch->getLoopAt(i, loopType,edgePtrs, edgeTypes );
  129.             AcGeCompositeCurve2d compCurve( edgePtrs );

  130.             AcGeInterval interval;  
  131.             compCurve.getInterval( interval );

  132.             loopLength
  133.                 = compCurve.length(
  134.                                     interval.lowerBound(),
  135.                                     interval.upperBound()
  136.                                   );
  137.         }

  138.         if( nLoops > 1 && !(loopType & AcDbHatch::kExternal ))   
  139.             totalInternalPerimeter += loopLength;
  140.         else
  141.             totalExternalPerimeter += loopLength;
  142.     }

  143.     acutPrintf(
  144.                 ACRX_T("\nExternal Perimeter : %lf"),
  145.                 totalExternalPerimeter
  146.               );

  147.     acutPrintf(
  148.                 ACRX_T("\nInternal Perimeter : %lf"),
  149.                 totalInternalPerimeter
  150.               );

  151.     pEnt->close();
  152. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2393个

财富等级: 金玉满堂

发表于 2016-7-20 09:19:11 | 显示全部楼层
学习!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3453个

财富等级: 富可敌国

发表于 2016-7-20 09:59:28 | 显示全部楼层
回复学习学习!

点评

大师也学C#呢?  详情 回复 发表于 2016-7-20 11:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

发表于 2016-7-20 11:00:15 | 显示全部楼层

大师也学C#呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2017-11-18 15:11:41 | 显示全部楼层
学习!!学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 34个

财富等级: 招财进宝

发表于 2018-1-8 17:58:46 | 显示全部楼层
学习!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2018-5-11 09:00:49 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2018-6-26 11:28:19 | 显示全部楼层
学习!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2018-7-4 08:32:49 | 显示全部楼层
现在都不更新了么
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2019-6-11 08:21:36 | 显示全部楼层
正在学习中,非常感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-6-11 08:25:32 | 显示全部楼层
非常感谢,正在学习中
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2963个

财富等级: 家财万贯

发表于 2019-6-11 14:29:03 | 显示全部楼层
回复学习,谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2021-10-25 00:38 , Processed in 1.427175 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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