乐筑天下

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

[编程交流] 选择集的边界框

[复制链接]

13

主题

70

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 21:42:20 | 显示全部楼层 |阅读模式
在VBA中获取选择集边界框的最佳方法是什么?
 
谷歌发现了一个LISP例程可以做到这一点,但我已经多年没有使用LISP了
 
我在想,这里的某个人可能可以轻松地将这个小LISP例程转换为VBA
 
  1. (defun LM:SSBoundingBox ( ss / i l1 l2 ll ur )
  2. (repeat (setq i (sslength ss))
  3.    (vla-getboundingbox (vlax-ename->vla-object (ssname ss (setq i (1- i)))) 'll 'ur)
  4.    (setq
  5.      l1 (cons (vlax-safearray->list ll) l1)
  6.      l2 (cons (vlax-safearray->list ur) l2)
  7.    )
  8.   )
  9.   (mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list l1 l2))
  10. )
回复

使用道具 举报

13

主题

70

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 21:53:01 | 显示全部楼层
我想现在我想起来了——迭代选择集中的每个项目并跟踪最小和最大x坐标和y坐标可能并不那么难。。。我想我只是在想autocad会内置这个。。。我猜不是
回复

使用道具 举报

13

主题

70

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 21:55:07 | 显示全部楼层
好吧,是的,我觉得自己现在连问这个问题都像个白痴
 
对于那些想知道
 
  1. Public Sub GetSSBoundingBox(ss As AcadSelectionSet, ptMin As Variant, ptMax As Variant)
  2. Dim entItem As AcadEntity
  3. Dim ptImin As Variant
  4. Dim ptImax As Variant
  5. Const X = 0
  6. Const Y = 1
  7. ss(0).GetBoundingBox ptMin, ptMax
  8. For Each entItem In ss
  9.    entItem.GetBoundingBox ptImin, ptImax
  10.    If ptImin(X) < ptMin(X) Then ptMin(X) = ptImin(X)
  11.    If ptImin(Y) < ptMin(Y) Then ptMin(Y) = ptImin(Y)
  12.    If ptImax(X) > ptMax(X) Then ptMax(X) = ptImax(X)
  13.    If ptImax(Y) > ptMax(Y) Then ptMax(Y) = ptImax(Y)
  14. Next
  15. End Sub

 
下面是如何调用函数
 
  1. Public Sub FlipTest()
  2. Dim ssFlip As AcadSelectionSet
  3. Dim pt1 As Variant
  4. Dim pt2 As Variant
  5. ' get selection set from user
  6. Set ssFlip = ThisDrawing.SelectionSets.Add("flip")
  7. ssFlip.SelectOnScreen
  8. ' get bounding box of selection set
  9. GetSSBoundingBox ssFlip, pt1, pt2
  10. ' draw a line from point to point
  11. ThisDrawing.ModelSpace.AddLine pt1, pt2
  12. ssFlip.Delete
  13. End Sub
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:05:32 | 显示全部楼层
你的代码太棒了
有没有办法将此pt1和pt2传递到绘图(窗口)进行打印
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 22:12:21 | 显示全部楼层
selvamani代码在ptimin ptimax中执行此操作。您可以将其传递到绘图窗口子窗口,并说使用拟合。这里有很多绘图代码,主要是lisp,但我相信你可以找到VBA版本,如果你想要的话。https://forums.autodesk.com/t5/autocad-forum/plotting-in-a-vba-script/td-p/3249378
 
abraxus检查你在哪个空间可能是个好主意。在布局中进行测试,并在模型空间中绘制一条线。虽然很好的代码可以看到很多用途,比如绘图。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:14:22 | 显示全部楼层
谢谢BIGAL
 
我需要找到在cad中多次使用的特定块,并通过vba逐个更改其属性值
 
有什么帮助吗
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 22:19:27 | 显示全部楼层
selvamani在这里搜索attribute&vba许多发布的示例。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:27:55 | 显示全部楼层
这是我从主子节点的边界框中得到的点
我不知道发生了什么,我只得到了一个空窗口作为布局,但实际上给setplotwindow的点并不是空的,请在此代码上提供帮助以供参考
 
 
 
子示例_SetWindowToPlot(点1为变量,点2为变量)
'此示例允许用户在当前布局中定义区域
'并显示定义区域的打印预览。
'
“*注意:您必须退出
'在VBA示例停止并返回控件之前进行打印预览
 
激活此绘图。应用说明文字
 
'将点1作为变量,将点2作为变量
 
'获取窗口中的第一个点
'点1=此绘图。公用事业GetPoint(,“单击窗口左下角进行绘图。”)
ReDim Preserve point1(0到1)'通过删除Z位置将其更改为2D数组
 
'获取窗口中的第二个点
'点2=ThisDrawing。公用事业GetPoint(,“单击窗口右上角进行绘图。”)
ReDim Preserve point2(0到1)'通过删除Z位置将其更改为2D数组
 
'将有关窗口的信息发送到当前布局
此图纸。ActiveLayout。SetWindowToPlot点1,点2
此图纸。情节DisplayPlotPreview acFullPreview
 
'读回窗口信息
此图纸。ActiveLayout。GetWindowToPlot点1,点2
 
MsgBox“按任意键绘制以下窗口:”&vbCrLf&vbCrLf&_
“左下:”&点1(0)&“,”&点1(1)&vbCrLf&_
“右上:”&点2(0)&“,”&点2(1)
 
'确保打印视图,而不是其他打印样式
此图纸。ActiveLayout。PlotType=acWindow
 
'将绘图发送到窗口
此图纸。ActiveLayout。ConfigName=“DWG到PDF.pc3”
此图纸。情节DisplayPlotPreview acFullPreview
末端接头
回复

使用道具 举报

0

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 22:34:06 | 显示全部楼层
如何获得边界框的尺寸、长度和宽度。此外,如果形状是旋转的,我怎么能使它像LM:minboundingbox那样工作呢。
我正在研究一个宏,以获取要导出到exel文件的形状最大和最小尺寸。认为vba比Lisp更容易
回复

使用道具 举报

13

主题

70

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 22:38:33 | 显示全部楼层
长度和宽度可以通过从最大X/Y值中减去最小X/Y值来计算。如果旋转,则需要在获取边界框之前将对象旋转回0旋转。您可以对创建的临时对象执行此操作,方法是先制作临时对象的副本,然后在计算完成后将其删除。边界框的工作方式是,它必须基于WCS的90度值。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 16:19 , Processed in 0.538715 second(s), 72 queries .

© 2020-2025 乐筑天下

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