Riddlez 发表于 2022-7-6 17:10:32

VBA和视口

你好
 
因此,我一直在尝试编写一个程序,进入布局,选择视口,然后编辑视口的各种属性。
 
我曾尝试在论坛搜索中搜索视口、vba、属性、编辑和编辑的各种组合,但没有找到相关的线程。
 
我最大的困难是访问视口本身。我似乎无法正确地获得sytax。。。
 
本质上,我想要的东西看起来像:

Dim lyt As Object 'layout
Dim vp As Object 'viewport
For Each lyt In acaddoc.Layouts
   If lyt.Name <> "Model" Then
       'grab the layout as "vp", I tried something like: lyt.Viewport
       'vp.SomeProperty = WhatIWant
       'insert some other stuff
   End If
Next lyt

 
此外,我在破译所有视口属性时遇到了困难,我需要这些属性才能:
-更改视口在当前布局中的大小和位置
-更改视口“查看”模型空间的位置
 
我希望很快能收到别人的来信!
 
提前谢谢。
Riddlez。

SEANT 发表于 2022-7-6 17:17:06

您似乎是从外部访问Autocad。如果是这样,您可能必须修改“Thisdrawing”名称。
 
Sub PVPortManipulation()

'Iterate through the viewports of every paperspace Layout.
'Change the pviewports height to 6
'Change it to SE Iso view
'Move each paperspace vport 2 units to the right.
'Set vport scale
'Modify target


Dim Entity As AcadEntity
Dim VPcenter As Variant
Dim PVport As AcadPViewport
Dim objLayout As AcadLayout
Dim dblDir(0 To 2) As Double
Dim i As Integer
For Each objLayout In ThisDrawing.Layouts
   If objLayout.Name <> "Model" Then
      ThisDrawing.ActiveLayout = objLayout
      ThisDrawing.MSpace = False
      For i = 1 To objLayout.Block.Count - 1 'avoid primary Paperspace PViewport
         Set Entity = objLayout.Block.Item(i)
         If TypeOf Entity Is AcadPViewport Then
            Set PVport = Entity
            PVport.Display True
            PVport.Height = 6
            dblDir(0) = -1#: dblDir(1) = -1#: dblDir(2) = 1#:
            PVport.Direction = dblDir
            VPcenter = PVport.Center
            VPcenter(0) = VPcenter(0) + 2#
            PVport.Center = VPcenter
            PVport.StandardScale = acVp1_10
            dblDir(0) = -6
            PVport.Target = dblDir
            PVport.Update
         End If
      Next
      ThisDrawing.Regen acAllViewports
   End If
Next
End Sub

Riddlez 发表于 2022-7-6 17:26:28

谢谢您的快速回复!
 
1.a)代码看起来很有用。但是,如果我创建一个新布局,它将只有主布局,没有其他布局,对吗?因此,如果我要使用主视口进行修改,我会删除用于排除它的“for循环”吗?
 
b) 即使是这样,我是否应该对不“玩”主视口有任何保留?一般来说,我对VBA和AutoCAD的编码相当陌生,不知道在paperspace中有多个视口是好事还是坏事。
 
2.此外,关于“视口正在看什么”,我可以看到您正在放置一个单位向量来告诉视口“看”的方向然而,要澄清的是,VPcenter是否要移动查看端口的纸张空间中心?
 
如果是这样,那么我将如何调整视口的模型空间中心?
 
再次提前感谢!
Riddlez。

SEANT 发表于 2022-7-6 17:29:37

 
我所说的主视口是指与布局视图相关联的视口。换句话说,即使布局中没有绘制pviewport,代码中也会显示一个(布局视图)。幸运的是,它始终是布局块中的第一项,因此可以通过简单地从布局块的第二项开始(即,对于i=1….)来排除
 
 
我们通过玩耍学到了很多新东西。
 
 
 
对的
 
 
模型空间中的视图中心由调整。目标属性。然而,老实说,我不容易决定如何可以预见地控制它。这是一门我们都喜欢的AutoCAD VBA编程的神秘艺术。

CmdrDuh 发表于 2022-7-6 17:36:07

我的第一个问题是,您是在Autocad内部还是外部尝试这样做?

SEANT 发表于 2022-7-6 17:42:48

这也是我想知道的第一件事。听起来Riddlez对这两种方式都有把握。

Riddlez 发表于 2022-7-6 17:48:30

我想澄清一下:
 
我正在从excel VBA访问它。我有一个处理sytax进入绘图和什么不。
 
原因是我使用电子表格作为用户输入的基础。
 
到目前为止,事情比我想象的要复杂得多。。。。原因是:
-一个示例视口表示,当我向其添加手表时,它是19“高35”宽,但当我创建新视口并输入这些尺寸时,它的大小似乎是我布局的两倍多
-对中心的影响类似
-我无法让目标“看”我想要的地方。
 
我要看看我前一段时间在另一个网站上找不到的东西,看看现在我能从肖特的帮助中找到更好的基础。它与“acad.thisdrawing.utilities”和一系列空间转换有关。
 
如果你知道我在说什么,一定要分享。
Riddlez。

Riddlez 发表于 2022-7-6 17:52:49

我找到了另一个带有我所说的“实用程序”的线程。
http://www.cadtutor.net/forum/showthread.php?t=18955
 
我有一种预感,左下角和右上角的位置是LL和UR。
 
然而,我不知道它是否只是高度和宽度的替代品。
 
我也不知道该实用程序在这两行中做了什么。我将对它进行一些处理,看看帮助文件中说了些什么。
 
Riddlez。

Riddlez 发表于 2022-7-6 17:58:11

你好!!
 
我的导师有时间帮我找到了一些可以帮你选择目标的方法:
 
基本上,您可以获取视口,激活模型空间,然后使用ZoomWindow命令选择“目标”(要使ZoomWindow工作,您需要看到空间的左下角和右上角。)
 
代码方面:
 

Sub IncompleteCode ()

Dim LLCZ (0 to 2) As Double
Dim UPCZ (0 to 2) As Double
Dim acaddoc As Object
Dim acadapp As Object

Set acadapp = CreateObject("AutoCADLT.Application") 'only use if not open
Set acadapp = GetObject(, "AutoCADLT.Application")
Set acaddoc = acadapp.ActiveDocument

'retrieve your viewport some how

acaddoc.mspace = True
LLCZ(0) = 130.9999: LLCZ(1) = 2.25: LLCZ(2) = 0:
UPCZ(0) = 130.9999 + 32.5: UPCZ(1) = 2.25 + 19.25: UPCZ(2) = 0:
acadapp.ZoomWindow LLCZ, UPCZ
acaddoc.mspace = False

End Sub

 
再次感谢肖特-没有你的帮助,我不可能走这么远。
 
我会不时回来查看,以了解有关我的解决方案的任何澄清。
Riddlez。

SEANT 发表于 2022-7-6 18:03:40

这似乎是一个足够明智的解决方案。如果视口需要特定比例,则可能会出现问题。如果ZoomWindow的范围已知,则必须调整视口的大小以允许适当的比例。一旦实现了这一点,谨慎的做法是通过PVport显式设置视口比例。StandardScale或PVport。自定义比例。
 
我应该指出,你提供的链接很好地展示了我在之前的帖子中提到的“奥术”。事实上,AutoCAD VBA编程的许多非直观方面都涉及TranslateCoordinates调用。
 
以下是使用标准WCS平面图居中视口的示例:
 
Sub NewPVP()
Dim varTarg As Variant
Dim PVport As IAcadPViewport2
Dim objLayout As AcadLayout
Dim dblWTarg(0 To 2) As Double
Dim objView As AcadView
Dim varViewCtr As Variant
Dim dblCen(0 To 2) As Double
Dim dblTarg(0 To 2) As Double
With ThisDrawing
   For Each objLayout In .Layouts
      If objLayout.Name = "Layout1" Then
         .ActiveLayout = objLayout
         varViewCtr = .GetVariable("VIEWCTR")
         Set PVport = .PaperSpace.AddPViewport(dblCen, 30, 20) 'Using a ARCH E sheet
         PVport.StandardScale = 4
         dblCen(0) = 24#
         dblCen(1) = 18#
         dblWTarg(0) = 60#: dblWTarg(1) = 30#: dblWTarg(2) = 0#: 'Modelspace center (WCS)
         PVport.Update
         PVport.Display True
         .MSpace = True
         PVport.Target = dblWTarg
         varTarg = .Utility.TranslateCoordinates(dblWTarg, acWorld, acDisplayDCS, 0)
         varTarg(0) = varTarg(0) - varViewCtr(0)
         varTarg(1) = varTarg(1) - varViewCtr(1)
         varTarg(2) = varTarg(2) - varViewCtr(2)
         varTarg = .Utility.TranslateCoordinates(varTarg, acDisplayDCS, acPaperSpace, 0)
         .MSpace = False
         PVport.Target = varTarg
         PVport.Center = dblCen
         PVport.Update
      End If
   Next
End With
End Sub
页: [1] 2
查看完整版本: VBA和视口