乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 311|回复: 14

Sset的绝对中心

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-7-6 16:19:09 | 显示全部楼层 |阅读模式
无论选择集中有多少个实体,都有可能获得选择集的绝对中点吗
谢谢你
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-6 16:46:53 | 显示全部楼层
希望这会让你开始
  1. Option Explicit
  2. Sub GetSelectionCenter()
  3.      Dim oSset As AcadSelectionSet
  4.      Dim oEnt As AcadEntity
  5.      Dim xmin As Double, xmax As Double
  6.      Dim ymin As Double, ymax As Double
  7.      Dim i As Integer
  8.      Dim lp(0 To 2) As Double
  9.      Dim up(0 To 2) As Double
  10.      
  11.           With ThisDrawing.SelectionSets
  12.                While .Count > 0
  13.                     .Item(0).Delete
  14.                Wend
  15.           Set oSset = .Add("TestSet")
  16.           End With
  17.      oSset.SelectOnScreen
  18.      ReDim xcoords(0 To (oSset.Count - 1) * 2) As Double
  19.      ReDim ycoords(0 To (oSset.Count - 1) * 2) As Double
  20. For Each oEnt In oSset
  21.     Dim minExt As Variant
  22.     Dim maxExt As Variant
  23.     oEnt.GetBoundingBox minExt, maxExt
  24.     xcoords(i) = minExt(0): xcoords(i + 1) = maxExt(0)
  25.     ycoords(i) = minExt(1): ycoords(i + 1) = maxExt(1)
  26.     i = i + 1
  27. Next
  28. xmin = SortDesc(xcoords)(0): ymin = SortDesc(ycoords)(0)
  29. xmax = SortAsc(xcoords)(0): ymax = SortAsc(ycoords)(0)
  30. lp(0) = xmin: lp(1) = ymin: lp(2) = 0#
  31. up(0) = xmax: up(1) = ymax: up(2) = 0#
  32. Dim minPt As Variant
  33. Dim maxPt As Variant
  34. Dim cpt As Variant
  35. Dim centPt(2) As Double
  36. With ThisDrawing.Utility
  37. minPt = .TranslateCoordinates(lp, acUCS, acWorld, False)
  38. maxPt = .TranslateCoordinates(up, acUCS, acWorld, False)
  39. centPt(0) = (minPt(0) + maxPt(0)) / 2: centPt(1) = (minPt(1) + maxPt(1)) / 2: centPt(2) = 0#
  40. cpt = .TranslateCoordinates(centPt, acUCS, acWorld, False)
  41. End With
  42. 'for visualization only:
  43. Dim oCirc As AcadCircle
  44. Set oCirc = ThisDrawing.ModelSpace.AddCircle(cpt, 10)
  45. oCirc.color = acRed
  46. ZoomWindow minPt, maxPt
  47. End Sub
  48. Public Function SortAsc(SourceArr As Variant) As Variant
  49.         Dim Check As Boolean
  50.         Dim Elem As Double
  51.         Dim iCount As Integer
  52.         Check = False
  53.         Do Until Check
  54.         Check = True
  55.         For iCount = LBound(SourceArr) To UBound(SourceArr) - 1
  56.         If SourceArr(iCount)  SourceArr(iCount + 1) Then
  57.         Elem = SourceArr(iCount)
  58.         SourceArr(iCount) = SourceArr(iCount + 1)
  59.         SourceArr(iCount + 1) = Elem
  60.         Check = False
  61.         End If
  62.         Next
  63.         Loop
  64.         
  65. SortDesc = SourceArr
  66. End Function

~&039;J#039~
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 02:18:04 | 显示全部楼层

修复,
我需要仔细看看这个
很可能与当地人一起运行它,看看到底发生了什么。我有一些类似的东西,但没有那么复杂。谢谢你,我会看一看
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-7-8 06:22:17 | 显示全部楼层
“嗯,”;中心“;通常是指圆-我假设你是指包含所有选定实体的多边形的中间…在这种情况下,你'd需要比已经发布的代码更多的代码和更复杂的代码
但是如果你想找一个又快又脏的函数,这里有一个小函数,它平均传递给它的选择集的边界框的x/y----------------------------------------------------
函数SsCenter(对象设置为AcadSelectionSet)作为变量 Dim MinPoint、MaxPoint作为变体&nbsp&nbsp&nbsp' 用于BBox回叫 Dim I As Long,objCount As Long&nbsp&nbsp&nbsp&nbsp' 各种计数器 Dim retPoint(1)为双精度&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp' 函数返回中心的XY Dim TotalX为双精度,TotalY为双精度' 即时统计平均值&nbsp
&nbsp' 确保将体面的东西作为参数传递 如果objSset为Nothing,则退出函数&nbsp' 确保我们有SelSet objCount=objSset。计数 如果objCount=0,则退出函数&nbsp&nbsp&nbsp&nbsp' 确保有#039;选择集中有一些东西&nbsp' 循环并获得每个实体的最小/最大值 对于I=0到objCount-1' 循环和抓取边界框&nbsp&nbsp 对象集。项目(I)。GetBoundingBox最小点、最大点&nbsp&nbsp TotalX=TotalX+MinPoint(0)+MaxPoint(零)&nbsp&nbsp TotalY=TotalY+MinPoint(1)+MaxPoint(一) 下一步&nbsp
&nbsp' 生成x/y平均值的2索引安全数组 retPoint(0)=TotalX/(objCount*2):retPoint(1)=Total/(objCount*2)&nbsp' 将其作为变体返回 SsCenter=retPoint结束函数
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 10:46:18 | 显示全部楼层
两种方法都不适用于't工作
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 10:59:28 | 显示全部楼层
这有助于完成手头的任务
这是#039的定义吗;中心#039;即#039;这是一个问题,或者说代码没有#039;t跑步
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 14:36:05 | 显示全部楼层

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

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-7-8 15:16:51 | 显示全部楼层

啊,最后一件事;我认为我的方法(口头)是有道理的,但有一个值得考虑;也就是说,如果一个边界框#039;s点为-(neg)0,0
我想,我们首先需要检查一个值是否为<然后取0,0,然后取负0,0方向上的最远点作为起点,仍然取从0,0开始的最远的点作为需要除以2的点。边界框LL+UR/2,如果有人有一种方法可以得到这4个点(x和y),我想我可以做其余的
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-7-8 17:56:24 | 显示全部楼层
又快又脏的方式我'd得到这些值,看起来像..
  1. Public Function ReturnMid(objSS As AcadSelectionSet) As Variant
  2.     Dim objEnt As AcadEntity
  3.     Dim varMinBound As Variant
  4.     Dim varMaxBound As Variant
  5.     Dim minX As Double
  6.     Dim minY As Double
  7.     Dim maxX As Double
  8.     Dim maxY As Double
  9.    
  10.     Set objEnt = objSS(0)
  11.     objEnt.GetBoundingBox varMinBound, varMaxBound
  12.     minX = varMinBound(0): minY = varMinBound(1)
  13.     maxX = varMaxBound(0): maxY = varMaxBound(1)
  14.     For Each objEnt In objSS
  15.         objEnt.GetBoundingBox varMinBound, varMaxBound
  16.         If varMinBound(0) < minX Then minX = varMinBound(0)
  17.         If varMinBound(1) < minY Then minY = varMinBound(1)
  18.         If varMaxBound(0) < maxX Then maxX = varMaxBound(0)
  19.         If varMaxBound(1) < maxY Then maxY = varMaxBound(1)
  20.     Next objEnt
  21.     'calculate midpt, have kettle call pot black, etc..
  22.     '???
  23.     'PROFIT!!
  24. End Function
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 23:07:58 | 显示全部楼层
是的,你&#039;你说得对,我的问题你能解决吗
~&#039;J#039~
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 09:50 , Processed in 0.691000 second(s), 83 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表