乐筑天下

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

[编程交流] VBA和视口

[复制链接]

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 17:10:32 | 显示全部楼层 |阅读模式
你好
 
因此,我一直在尝试编写一个程序,进入布局,选择视口,然后编辑视口的各种属性。
 
我曾尝试在论坛搜索中搜索视口、vba、属性、编辑和编辑的各种组合,但没有找到相关的线程。
 
我最大的困难是访问视口本身。我似乎无法正确地获得sytax。。。
 
本质上,我想要的东西看起来像:
  1. Dim lyt As Object 'layout
  2. Dim vp As Object 'viewport
  3. For Each lyt In acaddoc.Layouts
  4.    If lyt.Name <> "Model" Then
  5.        'grab the layout as "vp", I tried something like: lyt.Viewport
  6.        'vp.SomeProperty = WhatIWant
  7.        'insert some other stuff
  8.    End If
  9. Next lyt

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

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 17:17:06 | 显示全部楼层
您似乎是从外部访问Autocad。如果是这样,您可能必须修改“Thisdrawing”名称。
 
  1. Sub PVPortManipulation()
  2. 'Iterate through the viewports of every paperspace Layout.
  3. 'Change the pviewports height to 6
  4. 'Change it to SE Iso view
  5. 'Move each paperspace vport 2 units to the right.
  6. 'Set vport scale
  7. 'Modify target
  8. Dim Entity As AcadEntity
  9. Dim VPcenter As Variant
  10. Dim PVport As AcadPViewport
  11. Dim objLayout As AcadLayout
  12. Dim dblDir(0 To 2) As Double
  13. Dim i As Integer
  14.   For Each objLayout In ThisDrawing.Layouts
  15.      If objLayout.Name <> "Model" Then
  16.         ThisDrawing.ActiveLayout = objLayout
  17.         ThisDrawing.MSpace = False
  18.         For i = 1 To objLayout.Block.Count - 1 'avoid primary Paperspace PViewport
  19.            Set Entity = objLayout.Block.Item(i)
  20.            If TypeOf Entity Is AcadPViewport Then
  21.               Set PVport = Entity
  22.               PVport.Display True
  23.               PVport.Height = 6
  24.               dblDir(0) = -1#: dblDir(1) = -1#: dblDir(2) = 1#:
  25.               PVport.Direction = dblDir
  26.               VPcenter = PVport.Center
  27.               VPcenter(0) = VPcenter(0) + 2#
  28.               PVport.Center = VPcenter
  29.               PVport.StandardScale = acVp1_10
  30.               dblDir(0) = -6
  31.               PVport.Target = dblDir
  32.               PVport.Update
  33.            End If
  34.         Next
  35.         ThisDrawing.Regen acAllViewports
  36.      End If
  37.   Next
  38. End Sub
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

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

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

0

主题

252

帖子

290

银币

限制会员

铜币
-8
发表于 2022-7-6 17:36:07 | 显示全部楼层
我的第一个问题是,您是在Autocad内部还是外部尝试这样做?
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 17:42:48 | 显示全部楼层
这也是我想知道的第一件事。听起来Riddlez对这两种方式都有把握。
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

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

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 17:52:49 | 显示全部楼层
我找到了另一个带有我所说的“实用程序”的线程。
http://www.cadtutor.net/forum/showthread.php?t=18955
 
我有一种预感,左下角和右上角的位置是LL和UR。
 
然而,我不知道它是否只是高度和宽度的替代品。
 
我也不知道该实用程序在这两行中做了什么。我将对它进行一些处理,看看帮助文件中说了些什么。
 
Riddlez。
回复

使用道具 举报

3

主题

14

帖子

11

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 17:58:11 | 显示全部楼层
你好!!
 
我的导师有时间帮我找到了一些可以帮你选择目标的方法:
 
基本上,您可以获取视口,激活模型空间,然后使用ZoomWindow命令选择“目标”(要使ZoomWindow工作,您需要看到空间的左下角和右上角。)
 
代码方面:
 
  1. Sub IncompleteCode ()
  2. Dim LLCZ (0 to 2) As Double
  3. Dim UPCZ (0 to 2) As Double
  4. Dim acaddoc As Object
  5. Dim acadapp As Object
  6. Set acadapp = CreateObject("AutoCADLT.Application") 'only use if not open
  7. Set acadapp = GetObject(, "AutoCADLT.Application")
  8. Set acaddoc = acadapp.ActiveDocument
  9. 'retrieve your viewport some how
  10. acaddoc.mspace = True
  11. LLCZ(0) = 130.9999: LLCZ(1) = 2.25: LLCZ(2) = 0:
  12. UPCZ(0) = 130.9999 + 32.5: UPCZ(1) = 2.25 + 19.25: UPCZ(2) = 0:
  13. acadapp.ZoomWindow LLCZ, UPCZ
  14. acaddoc.mspace = False
  15. End Sub

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

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 18:03:40 | 显示全部楼层
这似乎是一个足够明智的解决方案。如果视口需要特定比例,则可能会出现问题。如果ZoomWindow的范围已知,则必须调整视口的大小以允许适当的比例。一旦实现了这一点,谨慎的做法是通过PVport显式设置视口比例。StandardScale或PVport。自定义比例。
 
我应该指出,你提供的链接很好地展示了我在之前的帖子中提到的“奥术”。事实上,AutoCAD VBA编程的许多非直观方面都涉及TranslateCoordinates调用。
 
以下是使用标准WCS平面图居中视口的示例:
 
  1. Sub NewPVP()
  2. Dim varTarg As Variant
  3. Dim PVport As IAcadPViewport2
  4. Dim objLayout As AcadLayout
  5. Dim dblWTarg(0 To 2) As Double
  6. Dim objView As AcadView
  7. Dim varViewCtr As Variant
  8. Dim dblCen(0 To 2) As Double
  9. Dim dblTarg(0 To 2) As Double
  10.   With ThisDrawing
  11.      For Each objLayout In .Layouts
  12.         If objLayout.Name = "Layout1" Then
  13.            .ActiveLayout = objLayout
  14.            varViewCtr = .GetVariable("VIEWCTR")
  15.            Set PVport = .PaperSpace.AddPViewport(dblCen, 30, 20) 'Using a ARCH E sheet
  16.            PVport.StandardScale = 4
  17.            dblCen(0) = 24#
  18.            dblCen(1) = 18#
  19.            dblWTarg(0) = 60#: dblWTarg(1) = 30#: dblWTarg(2) = 0#: 'Modelspace center (WCS)
  20.            PVport.Update
  21.            PVport.Display True
  22.            .MSpace = True
  23.            PVport.Target = dblWTarg
  24.            varTarg = .Utility.TranslateCoordinates(dblWTarg, acWorld, acDisplayDCS, 0)
  25.            varTarg(0) = varTarg(0) - varViewCtr(0)
  26.            varTarg(1) = varTarg(1) - varViewCtr(1)
  27.            varTarg(2) = varTarg(2) - varViewCtr(2)
  28.            varTarg = .Utility.TranslateCoordinates(varTarg, acDisplayDCS, acPaperSpace, 0)
  29.            .MSpace = False
  30.            PVport.Target = varTarg
  31.            PVport.Center = dblCen
  32.            PVport.Update
  33.         End If
  34.      Next
  35.   End With
  36. End Sub
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

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

© 2020-2025 乐筑天下

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