abraxus 发表于 2022-7-6 21:42:20

选择集的边界框

在VBA中获取选择集边界框的最佳方法是什么?
 
谷歌发现了一个LISP例程可以做到这一点,但我已经多年没有使用LISP了
 
我在想,这里的某个人可能可以轻松地将这个小LISP例程转换为VBA
 
(defun LM:SSBoundingBox ( ss / i l1 l2 ll ur )
(repeat (setq i (sslength ss))
   (vla-getboundingbox (vlax-ename->vla-object (ssname ss (setq i (1- i)))) 'll 'ur)
   (setq
   l1 (cons (vlax-safearray->list ll) l1)
   l2 (cons (vlax-safearray->list ur) l2)
   )
)
(mapcar '(lambda ( a b ) (apply 'mapcar (cons a b))) '(min max) (list l1 l2))
)

abraxus 发表于 2022-7-6 21:53:01

我想现在我想起来了——迭代选择集中的每个项目并跟踪最小和最大x坐标和y坐标可能并不那么难。。。我想我只是在想autocad会内置这个。。。我猜不是

abraxus 发表于 2022-7-6 21:55:07

好吧,是的,我觉得自己现在连问这个问题都像个白痴
 
对于那些想知道
 
Public Sub GetSSBoundingBox(ss As AcadSelectionSet, ptMin As Variant, ptMax As Variant)
Dim entItem As AcadEntity
Dim ptImin As Variant
Dim ptImax As Variant
Const X = 0
Const Y = 1

ss(0).GetBoundingBox ptMin, ptMax
For Each entItem In ss
   entItem.GetBoundingBox ptImin, ptImax
   If ptImin(X) < ptMin(X) Then ptMin(X) = ptImin(X)
   If ptImin(Y) < ptMin(Y) Then ptMin(Y) = ptImin(Y)
   If ptImax(X) > ptMax(X) Then ptMax(X) = ptImax(X)
   If ptImax(Y) > ptMax(Y) Then ptMax(Y) = ptImax(Y)
Next

End Sub
 
下面是如何调用函数
 
Public Sub FlipTest()
Dim ssFlip As AcadSelectionSet
Dim pt1 As Variant
Dim pt2 As Variant

' get selection set from user
Set ssFlip = ThisDrawing.SelectionSets.Add("flip")
ssFlip.SelectOnScreen

' get bounding box of selection set
GetSSBoundingBox ssFlip, pt1, pt2

' draw a line from point to point
ThisDrawing.ModelSpace.AddLine pt1, pt2

ssFlip.Delete

End Sub

selvamani 发表于 2022-7-6 22:05:32

你的代码太棒了
有没有办法将此pt1和pt2传递到绘图(窗口)进行打印

BIGAL 发表于 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检查你在哪个空间可能是个好主意。在布局中进行测试,并在模型空间中绘制一条线。虽然很好的代码可以看到很多用途,比如绘图。

selvamani 发表于 2022-7-6 22:14:22

谢谢BIGAL
 
我需要找到在cad中多次使用的特定块,并通过vba逐个更改其属性值
 
有什么帮助吗

BIGAL 发表于 2022-7-6 22:19:27

selvamani在这里搜索attribute&vba许多发布的示例。

selvamani 发表于 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
末端接头

cad&cnc 发表于 2022-7-6 22:34:06

如何获得边界框的尺寸、长度和宽度。此外,如果形状是旋转的,我怎么能使它像LM:minboundingbox那样工作呢。
我正在研究一个宏,以获取要导出到exel文件的形状最大和最小尺寸。认为vba比Lisp更容易

abraxus 发表于 2022-7-6 22:38:33

长度和宽度可以通过从最大X/Y值中减去最小X/Y值来计算。如果旋转,则需要在获取边界框之前将对象旋转回0旋转。您可以对创建的临时对象执行此操作,方法是先制作临时对象的副本,然后在计算完成后将其删除。边界框的工作方式是,它必须基于WCS的90度值。
页: [1] 2
查看完整版本: 选择集的边界框