明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1097|回复: 12

【求救】多边形选择集遇到的奇怪问题

[复制链接]
发表于 2019-4-30 13:01 | 显示全部楼层 |阅读模式
本帖最后由 giswater 于 2019-4-30 14:51 编辑

利用多边形选择集选择位于多边形和穿过多边形的对象,结果发现总有几根数据,无论怎么样都选择不了。这几根数据特点:①位于多边形内,且一个点在多边形上;②竖直90度。 但是同样特点的数据,有的又可以被选中。选不中的数据见附件图形中的白色线。运行环境:VBA+AutoCAD2008.麻烦各位大神分析一下原因和解决方法。图形数据见附件CAD文件。
代码如下:
  1. Sub SelPl()
  2.       ' On Error Resume Next
  3.      Dim objSelect As AcadEntity
  4.     Dim basePnt As Variant
  5.     Dim objAdd As AcadEntity
  6.     Dim lw As AcadLWPolyline
  7.     Dim sss As AcadSelectionSet
  8.     Set sss = CreateSelectionSet("zz")


  9.     ThisDrawing.Utility.GetEntity objSelect, basePnt, vbCrLf & "请选择多边形:"
  10.    
  11.      
  12.     Dim k1 As Integer
  13.     Dim k As Integer
  14.     Dim pointarrays() As Double
  15.     Dim i As Integer
  16.    
  17.    
  18.     Set lw = objSelect
  19.      k = UBound(lw.Coordinates)
  20.     k1 = (k + 1) * 1.5
  21.    
  22.    
  23.         ReDim pointarrays(0 To k1 - 1)
  24.     For i = 0 To k1 / 3 - 1 Step 1                  '把坐标赋值给数组
  25.          pointarrays(i * 3) = lw.Coordinates(i * 2)
  26.          pointarrays(i * 3 + 1) = lw.Coordinates(i * 2 + 1)
  27.          pointarrays(i * 3 + 2) = 0
  28.     Next
  29.    
  30.    
  31.     ThisDrawing.Application.ZoomExtents
  32.     sss.Clear
  33.     sss.SelectByPolygon acSelectionSetCrossingPolygon, pointarrays
  34.    
  35.     For Each objAdd In sss
  36.    
  37.        objAdd.color = 30
  38.     Next
  39. End Sub

  40. Private Function CreateSelectionSet(Optional SSetName As String) As AcadSelectionSet
  41.     On Error Resume Next
  42.     ThisDrawing.SelectionSets(SSetName).Delete
  43.     Set CreateSelectionSet = ThisDrawing.SelectionSets.Add(SSetName)
  44. End Function


本帖子中包含更多资源

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

x
发表于 2019-5-2 21:46 | 显示全部楼层
  1.     Dim i As Integer, j As Integer
  2.    
  3.    
  4.     Set lw = objSelect
  5.     k = UBound(lw.Coordinates)
  6.     k1 = (k + 1) * 3 \ 2
  7.    
  8.    
  9.     ReDim pointarrays(0 To k1 - 1)
  10.     For i = 0 To k1 - 1 Step 3                   '把坐标赋值给数组
  11.         pointarrays(i) = lw.Coordinates(j)
  12.         pointarrays(i + 1) = lw.Coordinates(j + 1)
  13.         pointarrays(i + 2) = 0
  14.         j = j + 2
  15.     Next
  16.    
  17.    

稍改改
 楼主| 发表于 2019-5-5 11:26 | 显示全部楼层
mikewolf2k 发表于 2019-5-5 10:57
先试试看,感觉有时候这个crossing不大准,保险起见,两个方向各来一次。

试过了,多边形顺时针与逆时针选择对象效果一样,因此执行两次还是存在漏选情况,邪门了!!cad2008下vba与C#选择效果一样,换CAD2010一样存在漏选,但是居然漏选的对象不一样,奇葩CAD!!!
 楼主| 发表于 2019-5-6 12:54 | 显示全部楼层

您可以用您的多边形点表与我的方法点表做比较,一模一样哦(本身算法就是一样,无非您多个变量而已,您可以仔细读读代码)。为了确定,我同样用您的方式,做过测试,实现效果也是一模一样。mikewolf2k 应该也试过,不然不会找其他问题了
 楼主| 发表于 2019-5-3 17:46 | 显示全部楼层
你的这个没有必要修改啊,与我的效果一模一样,二维坐标转三维坐标。所以用你的替换,实现效果肯定与我的一模一样,也是部分线怎么都选不中,而且我用C#,实现效果一样;怀疑是CAD选择集本身的BUG。再求高手现身指导,谢谢!

点评

我用你的图,亲测有效!  发表于 2019-5-6 12:09
发表于 2019-5-4 06:10 | 显示全部楼层
把多边形顶点顺序改为逆时针试试
 楼主| 发表于 2019-5-5 08:29 | 显示全部楼层
woaishuijia 发表于 2019-5-4 06:10
把多边形顶点顺序改为逆时针试试

一样无效。确实成了无解了,怎么@原来的几个版主啊?
发表于 2019-5-5 10:35 | 显示全部楼层
giswater 发表于 2019-5-5 08:29
一样无效。确实成了无解了,怎么@原来的几个版主啊?

先顺时针选一次,再逆时针选一次。(其实本质上需要的是逆时针的那次,但不知道多边形的的绘图顺序是顺时针还是逆时针,所以两种顺序都选一次,肯定又一次是真正的逆时针。)
 楼主| 发表于 2019-5-5 10:48 | 显示全部楼层
mikewolf2k 发表于 2019-5-5 10:35
先顺时针选一次,再逆时针选一次。(其实本质上需要的是逆时针的那次,但不知道多边形的的绘图顺序是顺时 ...

这个什么原因或原理呢,如果这样可以解决,是不是以后所有的多边形选择都需要这样操作?十分感谢,我马上试试看可以不?
发表于 2019-5-5 10:57 | 显示全部楼层
giswater 发表于 2019-5-5 10:48
这个什么原因或原理呢,如果这样可以解决,是不是以后所有的多边形选择都需要这样操作?十分感谢,我马上 ...

先试试看,感觉有时候这个crossing不大准,保险起见,两个方向各来一次。
发表于 2019-5-5 13:41 | 显示全部楼层
好像的确是有bug,有时候能全选中,跟做不做zoomextents有时候也有关系。
试试用两点连线选择,不要用多边形选。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 22:07 , Processed in 0.392321 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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