本帖最后由 kuaigoumanzhu 于 2011-1-18 15:31 编辑

开始没一点思路,后来在论坛看了一天的帖子。现在是先拾取一个点坐标,然后找到所有封闭区域的顶点坐标然后再计算这个点是否在封闭区域内。
  1. BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  2.                 BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  3.                 Polyline p = new Polyline();
  4.                 Point3d a = new Point3d();
  5.                 PromptPointOptions opt = new PromptPointOptions("选择点");
  6. PromptPointResult rest = ed.GetPoint(opt);
  7. if (rest.Status == PromptStatus.OK)
  8.                 {
  9.                     a = rest.Value;
  10.                 }
  11. TypedValue[] pline ={ new TypedValue((int)DxfCode.Start, "LWPOLYLINE") };
  12.                 SelectionFilter sf = new SelectionFilter(pline);
  13.                 PromptSelectionResult res = ed.SelectAll(sf);
  14.                 SelectionSet st = res.Value;
  15.                 if (st != null)
  16.                 {
  17.                     ObjectId[] ids = st.GetObjectIds();
  18.                     Point3dCollection p3dc=new Point3dCollection();
  19.                     foreach (ObjectId id in ids)
  20.                     {
  21.                         p = trans.GetObject(id, OpenMode.ForRead) as Polyline;
  22.                         //Point3d c = new Point3d((p.c));
  23.                         int j=p.NumberOfVertices-1;
  24.                         bool result = false;
  25.                         for (int i = 0; i < p.NumberOfVertices; i++)
  26.                         {
  27.                             p3dc.Add(p.GetPoint3dAt(i));
  28.                             //nodes.Add(p.GetPoint3dAt(i));
  29.                             ed.WriteMessage(p.GetPoint3dAt(i).ToString());
  30.                            
  31.                             if (((p.GetPoint3dAt(i).Y)<=a.Y)&&(a.Y<p.GetPoint3dAt(j).Y)||((p.GetPoint3dAt(j).Y<a.Y))&&a.Y<(p.GetPoint3dAt(i).Y))
  32.                             {
  33.                                 if ((a.X - p.GetPoint3dAt(i).X) < (p.GetPoint3dAt(j).X - p.GetPoint3dAt(i).X) * (a.Y - p.GetPoint3dAt(i).Y) / (p.GetPoint3dAt(j).Y - p.GetPoint3dAt(i).Y))
  34.                                 {
  35.                                     result = !result;
  36.                                 }
  37.                             }
  38.                             j = i;
  39.                         }
  40.                         if (result)
  41.                         {
  42.                             MessageBox.Show("在封闭区域中");
  43.                         }
  44.                     }

这个是测试时候的代码。

网友答:
你有种再说一遍 发表于 2024-11-29 15:10
本来搞定这个算法就没有几个人,你用Lisp搞不定的,要学习到树和哈希网格之后再来,并且看懂扫描线算法

哦,看了一圈确实发现没人搞这个,昨天看了大佬的帖子已经隐隐觉得lisp搞不定了,所以先插个眼,没准以后就能参考上了,现在学得浅,以后慢慢来

网友答:
liuhe 发表于 2024-11-29 14:07
这是  c#   跟楼主的一样,lisp可以调用cad的命令  bo

刚刚试了下bo命令,可以用,但效果不是很好,速度太慢了而且有些需要忽略的因素没办法用这个消除,我得再研究研究,感谢大佬我以前居然不知道这个命令

网友答:
edrise 发表于 2024-11-29 14:29
刚刚试了下bo命令,可以用,但效果不是很好,速度太慢了而且有些需要忽略的因素没办法用这个消除,我 ...

本来搞定这个算法就没有几个人,你用Lisp搞不定的,要学习到树和哈希网格之后再来,并且看懂扫描线算法

网友答: 这种方法需要比较的太多,还有那个算点是否在封闭区域内的算法,也不明白。有什么更好的没有大家多多指点啊。

网友答: http://bbs.mjtd.com/thread-84681-1-1.html

网友答: 本帖最后由 dafeilang 于 2011-3-13 19:31 编辑

(bpoly (getpoint "ss"))  找输入点周围的封闭图形并创建多段线

然后可以求创建的面域的面积 (也是在网上学的,这个命令)

不好意思,搜求坐标点的方法的时候进错版了,我以为是Lisp版


网友答: 新手学习!

网友答: 这个目标正是我需要的,学习学习

网友答:
edrise 发表于 2024-11-28 12:26
这个目标正是我需要的,学习学习

这个最终的算法是扫描线算法
https://www.cnblogs.com/JJBox/p/12571436.html

网友答: Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
ed.TraceBoundary(........);

这个是求周围轮廓的api

网友答:
你有种再说一遍 发表于 2024-11-28 15:15
这个最终的算法是扫描线算法
https://www.cnblogs.com/JJBox/p/12571436.html

膜拜大佬,感谢大佬提供宝贵的学习资源!

网友答:
liuhe 发表于 2024-11-29 08:41
Editor ed = Acap.DocumentManager.MdiActiveDocument.Editor;
ed.TraceBoundary(........);

求教大佬,这个是那种语言呢?目前只初步学了lisp,还没涉猎其它语言
  • 上一篇:图元修改事件的封装-关联修改
  • 下一篇:没有了