明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5110|回复: 9

根据一点获其所在取闭合区域面积

[复制链接]
发表于 2012-7-20 16:03:47 | 显示全部楼层 |阅读模式
前期在研究CAD的时候,想弄一个点击一个闭合区域内一点就获取这个区域的方法,后来尝试了使用boundary命令,可以实现。
现在把C#代码贴上来,希望对大家有用。
其中一个重要的环节就是调用CAD命令,这个借用了论坛里面一个高手的代码,不好意思忘了高手名字了。反正能够跳过boundary的回车控制。
代码如下:
  1. [CommandMethod("boundaryCAD")]
  2.         public void BoundaryCAD()
  3.         {
  4.             PromptPointOptions pPointOptions = new PromptPointOptions("\n 选择一个点");
  5.             PromptPointResult pPointResult = pDocument.Editor.GetPoint(pPointOptions);
  6.             if (pPointResult.Status == PromptStatus.OK)
  7.             {
  8.                 Point3d point3d = pPointResult.Value;

  9.                 InvokeArx.Command(true, "_Boundary", point3d, "\0");

  10.                 PromptSelectionResult pResult=  pDocument.Editor.SelectLast();
  11.                 SelectionSet pSelectionSet = pResult.Value;
  12.                 using (Transaction tran = pDatabase.TransactionManager.StartTransaction())
  13.                 {
  14.                     foreach (ObjectId pObjectId in pSelectionSet.GetObjectIds())
  15.                     {
  16.                         Entity pEntity = tran.GetObject(pObjectId,OpenMode.ForWrite) as Entity;
  17.                         if ((pEntity as Polyline) != null)
  18.                         {
  19.                             Polyline pPolyline = pEntity as Polyline;
  20.                             pDocument.Editor.WriteMessage("\n当前区域面积是:" + pPolyline.Area.ToString());
  21.                         }
  22.                       pEntity.Erase(true);
  23.                     }
  24.                     tran.Commit();
  25.                 }
  26.             }
  27.         }
效果图如下:

那个高手的类我放在附件里,


本帖子中包含更多资源

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

x
发表于 2012-7-20 17:07:38 | 显示全部楼层
Cad2011版本 这个问题可以直接代码解决 桌子提供了一个新函数解决这个问题 名字我忘了。。。
不过这个函数有点鸡肋 必须范围可见
 楼主| 发表于 2012-7-20 17:11:33 | 显示全部楼层
雪山飞狐_lzh 发表于 2012-7-20 17:07
Cad2011版本 这个问题可以直接代码解决 桌子提供了一个新函数解决这个问题 名字我忘了。。。
不过这个函数 ...

是哈 2011是提供了那个函数的 不过以前版本没有...现在做的是2007的开发
发表于 2012-7-21 13:02:45 | 显示全部楼层
boundary的内部实现就是用xray旋转扫略实现范围的选择
发表于 2012-7-30 14:45:43 | 显示全部楼层
楼主,你好,计算这个图中的面积试一试,还要手动输入Yes/No,而且不能算出面积,是怎么回事啊

本帖子中包含更多资源

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

x
发表于 2012-7-30 14:48:37 | 显示全部楼层
本帖最后由 bingfengxuanlan 于 2012-7-30 16:32 编辑
雪山飞狐_lzh 发表于 2012-7-20 17:07
Cad2011版本 这个问题可以直接代码解决 桌子提供了一个新函数解决这个问题 名字我忘了。。。
不过这个函数 ...


飞狐,你好,如果用楼主所给的代码,会出现(指定内部点或 [高级选项(A)]: 无法导出多段线边界。是否创建面域?? <Y>),而且得不到面域的面积,如果想不用输入Y,直接计算面积的话,请问这个如何解决呢,图上传到附件中了,谢谢

本帖子中包含更多资源

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

x
发表于 2012-7-31 08:43:25 | 显示全部楼层
确保你的区域是闭合的
发表于 2012-7-31 08:45:08 | 显示全部楼层
bingfengxuanlan 发表于 2012-7-30 14:45
楼主,你好,计算这个图中的面积试一试,还要手动输入Yes/No,而且不能算出面积,是怎么回事啊

这个已经解决啦,修改下代码就行了
[CommandMethod("boundaryCAD")]
        public void BoundaryCAD()
        {
            PromptPointOptions pPointOptions = new PromptPointOptions("\n 选择一个点");
            PromptPointResult pPointResult = pDocument.Editor.GetPoint(pPointOptions);
            if (pPointResult.Status == PromptStatus.OK)
            {
                Point3d point3d = pPointResult.Value;
                InvokeArx.Command(true, "-Boundary", point3d, "","","\0");
                PromptSelectionResult pResult=  pDocument.Editor.SelectLast();
                SelectionSet pSelectionSet = pResult.Value;
                using (Transaction tran = pDatabase.TransactionManager.StartTransaction())
                {
                    foreach (ObjectId pObjectId in pSelectionSet.GetObjectIds())
                    {
                        Entity pEntity = tran.GetObject(pObjectId,OpenMode.ForWrite) as Entity;
                        if ((pEntity as Polyline) != null)
                        {
                            Polyline pPolyline = pEntity as Polyline;
                            pDocument.Editor.WriteMessage("\n当前区域面积是:" + pPolyline.Area.ToString());
                        }
                       else if((pEntity as Region)!=null)
                        {
                            Region pRegion=pEntity as Region;
                             pDocument.Editor.WriteMessage("\n当前区域面积是:" + pRegion.Area.ToString());
                         }
                      pEntity.Erase(true);
                    }
                    tran.Commit();
                }
            }
        }
 楼主| 发表于 2012-7-31 14:44:56 | 显示全部楼层
bingfengxuanlan 发表于 2012-7-30 14:45
楼主,你好,计算这个图中的面积试一试,还要手动输入Yes/No,而且不能算出面积,是怎么回事啊

不好意思哈 你的图比我电脑CAD版本高 我猜要不是你区域没有闭合 要么你的区域是面状的 8L的帖子应该可以解决吧
发表于 2014-3-23 16:28:19 | 显示全部楼层
应该加入判断图形不封闭的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 15:48 , Processed in 0.582984 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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