乐筑天下

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

塞特的绝对中心

[复制链接]

2

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
25
发表于 2008-7-6 16:19:09 | 显示全部楼层 |阅读模式
不管选择集中有多少个实体,是否有可能获得选择集的绝对中点?谢谢CAD

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 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

~'J'~
回复

使用道具 举报

2

主题

17

帖子

1

银币

初来乍到

Rank: 1

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

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

使用道具 举报

7

主题

42

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 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>将其作为变量返回
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-7-8 10:46:18 | 显示全部楼层
这两种方法都不起作用。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 10:59:28 | 显示全部楼层
这有助于完成手头的任务!
是“中心”的定义有问题,还是代码无法运行?
回复

使用道具 举报

2

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
25
发表于 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
回复

使用道具 举报

2

主题

17

帖子

1

银币

初来乍到

Rank: 1

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

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

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2008-7-8 17:56:24 | 显示全部楼层
我获取这些值的快速而肮脏的方式看起来像..
[code]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)
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2008-7-8 23:07:58 | 显示全部楼层

是的,Fixo,
我也试过你的,发现它不起作用
CADR
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-4 08:47 , Processed in 1.441437 second(s), 83 queries .

© 2020-2025 乐筑天下

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