CadRover 发表于 2008-7-6 16:19:09

塞特的绝对中心

不管选择集中有多少个实体,是否有可能获得选择集的绝对中点?谢谢CAD
**** Hidden Message *****

fixo 发表于 2008-7-6 16:46:53

希望这将使您开始
Option Explicit
Sub GetSelectionCenter()
   Dim oSset As AcadSelectionSet
   Dim oEnt As AcadEntity
   Dim xmin As Double, xmax As Double
   Dim ymin As Double, ymax As Double
   Dim i As Integer
   Dim lp(0 To 2) As Double
   Dim up(0 To 2) As Double
   
          With ThisDrawing.SelectionSets
               While .Count > 0
                  .Item(0).Delete
               Wend
          Set oSset = .Add("TestSet")
          End With
   oSset.SelectOnScreen
   ReDim xcoords(0 To (oSset.Count - 1) * 2) As Double
   ReDim ycoords(0 To (oSset.Count - 1) * 2) As Double
For Each oEnt In oSset
    Dim minExt As Variant
    Dim maxExt As Variant
    oEnt.GetBoundingBox minExt, maxExt
    xcoords(i) = minExt(0): xcoords(i + 1) = maxExt(0)
    ycoords(i) = minExt(1): ycoords(i + 1) = maxExt(1)
    i = i + 1
Next
xmin = SortDesc(xcoords)(0): ymin = SortDesc(ycoords)(0)
xmax = SortAsc(xcoords)(0): ymax = SortAsc(ycoords)(0)
lp(0) = xmin: lp(1) = ymin: lp(2) = 0#
up(0) = xmax: up(1) = ymax: up(2) = 0#
Dim minPt As Variant
Dim maxPt As Variant
Dim cpt As Variant
Dim centPt(2) As Double
With ThisDrawing.Utility
minPt = .TranslateCoordinates(lp, acUCS, acWorld, False)
maxPt = .TranslateCoordinates(up, acUCS, acWorld, False)
centPt(0) = (minPt(0) + maxPt(0)) / 2: centPt(1) = (minPt(1) + maxPt(1)) / 2: centPt(2) = 0#
cpt = .TranslateCoordinates(centPt, acUCS, acWorld, False)
End With
'for visualization only:
Dim oCirc As AcadCircle
Set oCirc = ThisDrawing.ModelSpace.AddCircle(cpt, 10)
oCirc.color = acRed
ZoomWindow minPt, maxPt
End Sub
Public Function SortAsc(SourceArr As Variant) As Variant
      Dim Check As Boolean
      Dim Elem As Double
      Dim iCount As Integer
      Check = False
      Do Until Check
      Check = True
      For iCount = LBound(SourceArr) To UBound(SourceArr) - 1
      If SourceArr(iCount)SourceArr(iCount + 1) Then
      Elem = SourceArr(iCount)
      SourceArr(iCount) = SourceArr(iCount + 1)
      SourceArr(iCount + 1) = Elem
      Check = False
      End If
      Next
      Loop
      
SortDesc = SourceArr
End Function
~'J'~

CadRover 发表于 2008-7-8 02:18:04


修复,
我需要仔细看看这个。
可能会与当地人一起运行它,以查看到底发生了什么。
我有一些类似的东西,但不太参与
谢谢
我会看看
CADR

Rogue 发表于 2008-7-8 06:22:17

“中心”通常意味着圆——我假设你是指包含所有选定实体的多边形的中间……在这种情况下,你需要比已经发布的代码更多的代码和更复杂的代码
但是,如果您正在寻找一个快速而肮脏的函数,这里有一个小函数,它将传递给它的选择集的边界框的x/y求平均值…
,------------------------------------------------
函数SsCenter(objSset作为AcadSelectionSet)作为变量
Dim MinPoint,MaxPoint作为变量,用于BBox返回调用
Dim I,只要,objCount As Long‘各种计数器<br>Dim retPoint(1)为双精度’函数将中心的XY<br>TIM TotalX返回为双精度,总计为双“动态计数平均值”
“确保将适当的数据作为参数传递…”
如果objSset为空,则退出函数“确保我们有SelSet
objCount=objSset”。如果objCount=0,则计数
然后退出函数“确保选择集
中有东西循环通过,并获得I=0到objCount-1的每个实体的最小/最大值,循环通过并抓取边界框
objSset.Item(I)。GetBoundingBox最小点,MaxPoint<br>TotalX=TotalX+MinPoint(0)+MaxPoint(1)<br>下一步,我<br>生成一个x/y平均值的双指数安全数组<br>retPoint(0)=TotalX/(objCount*2):retPoint=Total/(objCount*2)<br>将其作为变量返回

Bryco 发表于 2008-7-8 10:46:18

这两种方法都不起作用。

Atook 发表于 2008-7-8 10:59:28

这有助于完成手头的任务!
是“中心”的定义有问题,还是代码无法运行?

CadRover 发表于 2008-7-8 14:36:05


我正在寻找整个选择集的绝对中心。
例如,假设从左下角到右上角的所有实体(边界框)都是
0,0到50,50
然后我会寻找设置一个变量来选择点25,25
一旦我抓住了那个点,那么我就可以将整个sset定位到我需要它的位置。
所以,我希望它能工作,无论是一个实体还是15个;我试了又试,但仍然没有运气。
我认为获得左下角是有意义的(如果我知道一种方法)(x和y)最接近0,0的边界框,以及距离0,0最远的边界框(x和y)的最右上点,然后将这2点除以2,这应该会给出所需的答案。
问题是,我如何获得这些值?
谢谢
CADR

CadRover 发表于 2008-7-8 15:16:51


啊,最后一件事;我认为我的方法(口头上)是有意义的,但有一个需要考虑;也就是说,如果边界框的点是 - (负)0,0呢?
我想,那么,我们需要首先检查一个值是否
。Sset-Ent.bounding box LL + UR /2
再次,如果有人有一个可以得到这4个点(x和y)的方法,我想我可以做剩下的。

Atook 发表于 2008-7-8 17:56:24

我获取这些值的快速而肮脏的方式看起来像..
Public Function ReturnMid(objSS As AcadSelectionSet) As Variant
    Dim objEnt As AcadEntity
    Dim varMinBound As Variant
    Dim varMaxBound As Variant
    Dim minX As Double
    Dim minY As Double
    Dim maxX As Double
    Dim maxY As Double
   
    Set objEnt = objSS(0)
    objEnt.GetBoundingBox varMinBound, varMaxBound
    minX = varMinBound(0): minY = varMinBound(1)
    maxX = varMaxBound(0): maxY = varMaxBound(1)
    For Each objEnt In objSS
      objEnt.GetBoundingBox varMinBound, varMaxBound
      If varMinBound(0)

fixo 发表于 2008-7-8 23:07:58


是的,Fixo,
我也试过你的,发现它不起作用
CADR
页: [1] 2
查看完整版本: 塞特的绝对中心