bsirhell 发表于 2006-7-11 21:05:00

选择集的怪问题

<P>欲将选择集中的同心圆半径小的那个去掉,结果却将所有的小圆都去掉了,图形中只剩下半径最大的圆了,以下是源程序,还请高手指教!</P>
<P>&nbsp;For Each element In SSet<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim i As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim j As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim obj1 As AcadCircle<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim obj2 As AcadCircle<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; For i = 0 To SSet.Count - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j = 0 To SSet.Count - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set obj1 = SSet.Item(i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set obj2 = SSet.Item(j)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If obj1.Center = obj2.Center Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If obj1.Radius &gt; obj2.Radius Then<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSet.Item(j).Delete<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Update<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next j<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next i</P>
<P>本意是在选择集中删除,用ERASE方法也没用,</P>

wangiron 发表于 2006-7-11 22:59:00

<P>Set obj1 = SSet.Item(i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set obj2 = SSet.Item(j)</P>
<P>&nbsp;有问题</P>

mccad 发表于 2006-7-12 07:07:00

圆心的位置不是这样比较的吧。三个坐标都需要比较。

雪山飞狐_lzh 发表于 2006-7-12 10:24:00

<P>For循环也错了,应该这样</P>
<P>For i = SSet.Count - 1 To&nbsp;0 setp -1</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j = SSet.Count - 1 To 0 setp -1</P>

霹雳啪啦啦 发表于 2006-7-12 12:26:00

<P>关键是循环的问题。当外层的i循环第一次循环时,j变量就从选择集第一个找起,比较半径,所有半径比item(i)的圆小的同心圆就全删光了。如果第一次外层循环的i变量对应的圆就使半径最大的,只要外层的第一次循环就只剩下半径最大的圆了。</P>
<P>如果你只要删除所有同心圆中半径最小的,那么就是在一个序列中查找最小值的问题,应该首先进行比较,找到最小的后,退出所有循环才能删除。而不是一边比较一边删除,那这个序列就给你破坏了。</P>

bsirhell 发表于 2006-7-13 12:20:00

<P>先谢谢!</P>
<P>能否给出解决问题的代码!</P>

bsirhell 发表于 2006-7-17 20:18:00

For Each element In SSet<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim i As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim j As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim obj1 As AcadCircle<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim obj2 As AcadCircle<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>
<P>For i = SSet.Count - 1 To&nbsp;0 setp -1</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j = SSet.Count - 1 To 0 setp -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P>
<P>&nbsp; Set obj1 = SSet.Item(i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set obj2 = SSet.Item(j)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dim pt1(0 to 2)&nbsp;as&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dim pt2(0 to 2)&nbsp;as&nbsp;&nbsp;double&nbsp;&nbsp;</P>
<P>pt1=obj1.center</P>
<P>pt2=obj2.center</P>
<P>if pt1(0)=pt2(0):pt1(1)=pt(2)1:pt1(2)=pt2(2) then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSet.Item(j).Delete<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Update<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next j<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next i</P>
<P>问题依旧!</P>
<P>能否再将解答详细点!谢谢!</P>

霹雳啪啦啦 发表于 2006-7-19 13:37:00

<P>'在下列程序前,首先生成只包括圆的sset选择集</P>
<P>Dim delArray(0) As AcadCircle<BR>Dim delSet As AcadSelectionSet<BR><BR>Set delSet = ThisDrawing.SelectionSets.Add("delset1")<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim i As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim j As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim obj1 As AcadCircle<BR>&nbsp;&nbsp;&nbsp;&nbsp; Dim obj2 As AcadCircle</P>
<P>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; For i = 0 To sset.Count - 1</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set delArray(0) = sset.Item(i)</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For j = 0 To sset.Count - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set obj2 = sset.Item(j)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If delArray(0).Center(0) = obj2.Center(0) And delArray(0).Center(1) = obj2.Center(1) Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If delArray(0).Radius &gt; obj2.Radius Then</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set delArray(0) = obj2</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; Next j</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delSet.AddItems delArray<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next i</P>
<P><BR>delSet.Erase<BR></P>
<P>使用上述程序,不知达到你的要求吗?</P>

bsirhell 发表于 2006-7-21 21:48:00

非常感谢!
页: [1]
查看完整版本: 选择集的怪问题