选择集的边界框
在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))
) 我想现在我想起来了——迭代选择集中的每个项目并跟踪最小和最大x坐标和y坐标可能并不那么难。。。我想我只是在想autocad会内置这个。。。我猜不是 好吧,是的,我觉得自己现在连问这个问题都像个白痴
对于那些想知道
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 你的代码太棒了
有没有办法将此pt1和pt2传递到绘图(窗口)进行打印 selvamani代码在ptimin ptimax中执行此操作。您可以将其传递到绘图窗口子窗口,并说使用拟合。这里有很多绘图代码,主要是lisp,但我相信你可以找到VBA版本,如果你想要的话。https://forums.autodesk.com/t5/autocad-forum/plotting-in-a-vba-script/td-p/3249378
abraxus检查你在哪个空间可能是个好主意。在布局中进行测试,并在模型空间中绘制一条线。虽然很好的代码可以看到很多用途,比如绘图。 谢谢BIGAL
我需要找到在cad中多次使用的特定块,并通过vba逐个更改其属性值
有什么帮助吗 selvamani在这里搜索attribute&vba许多发布的示例。 这是我从主子节点的边界框中得到的点
我不知道发生了什么,我只得到了一个空窗口作为布局,但实际上给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
末端接头 如何获得边界框的尺寸、长度和宽度。此外,如果形状是旋转的,我怎么能使它像LM:minboundingbox那样工作呢。
我正在研究一个宏,以获取要导出到exel文件的形状最大和最小尺寸。认为vba比Lisp更容易 长度和宽度可以通过从最大X/Y值中减去最小X/Y值来计算。如果旋转,则需要在获取边界框之前将对象旋转回0旋转。您可以对创建的临时对象执行此操作,方法是先制作临时对象的副本,然后在计算完成后将其删除。边界框的工作方式是,它必须基于WCS的90度值。
页:
[1]
2