找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1850|回复: 1

[原创] 练习 相交的Region执行Union

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-7-26 18:40:32 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 csharp 于 2014-7-26 18:43 编辑

  1.         [CommandMethod("GetUnionRegs")]
  2.         public static void GetCurveUnionRegions()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;

  7.             TypedValue[] val = new TypedValue[1]
  8.             {
  9.                 new TypedValue(0, "REGION")
  10.             };
  11.             PromptSelectionOptions pso = new PromptSelectionOptions();
  12.             pso.MessageForAdding = "\nSelect Regions";

  13.             PromptSelectionResult psr = ed.GetSelection(pso, new SelectionFilter(val));

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

  15.             using (Transaction tr = db.TransactionManager.StartTransaction())
  16.             {
  17.                 SelectionSet ss = (SelectionSet)psr.Value;
  18.                 ObjectId[] ids = ss.GetObjectIds();
  19.                 try
  20.                 {
  21.                     RegionsUnion(ids);
  22.                 }
  23.                 catch (Exception)
  24.                 {
  25.                     throw;
  26.                 }
  27.                 tr.Commit();
  28.             }
  29.         }
  30.         private static bool RectIntersects(Extents3d first, Extents3d second)
  31.         {
  32.             bool one = second.MinPoint.X < first.MaxPoint.X &&
  33.                 first.MinPoint.X < second.MaxPoint.X &&
  34.                 second.MinPoint.Y < first.MaxPoint.Y &&
  35.                 first.MinPoint.Y < second.MaxPoint.Y;
  36.             bool two = first.MinPoint.X < second.MaxPoint.X &&
  37.               second.MinPoint.X < first.MaxPoint.X &&
  38.               first.MinPoint.Y < second.MaxPoint.Y &&
  39.               second.MinPoint.Y < first.MaxPoint.Y;
  40.             return one | two;
  41.         }


  42.         private static void RegionsUnion(ObjectId[] ids)
  43.         {
  44.             Matrix3d mat = Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
  45.             for (int i = 0; i < ids.Length; i++)
  46.             {
  47.                 if (!ids[i].IsNull)
  48.                 {
  49.                     Region fRegion = (Region)ids[i].GetObject(OpenMode.ForRead);

  50.                     using (fRegion)
  51.                     {
  52.                         for (int j = i + 1; j < ids.Length; j++)
  53.                         {
  54.                             Extents3d ext1 = fRegion.GeometricExtents;
  55.                             Region sRegion = (Region)ids[j].GetObject(OpenMode.ForRead);
  56.                             if (!sRegion.IsNull)
  57.                             {
  58.                                 Extents3d ext2 = sRegion.GeometricExtents;

  59.                                 Region tmpfRegion = (Entity) fRegion.Clone() as Region;
  60.                                 Region tmpsRegion = (Entity) sRegion.Clone() as Region;

  61.                                 if (RectIntersects(ext1, ext2))
  62.                                 {
  63.                                     tmpfRegion.BooleanOperation(BooleanOperationType.BoolIntersect, tmpsRegion);
  64.                                     if (!tmpfRegion.IsNull)
  65.                                     {
  66.                                         fRegion.UpgradeOpen();
  67.                                         sRegion.UpgradeOpen();
  68.                                         fRegion.BooleanOperation(BooleanOperationType.BoolUnite, sRegion);
  69.                                     }
  70.                                 }
  71.                             }
  72.                         }
  73.                     }
  74.                 }
  75.             }
  76.         }
regionunion.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-7-28 07:34:05 来自手机 | 显示全部楼层
问题
1 可能漏掉只有一个公共边的两个形
2 这种循环可能把后面的一个较大形状并到前面从而漏掉一些需合并的,解决办法应该是先按面积排序,以保障较大的形在前
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-19 02:00 , Processed in 0.387983 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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