乐筑天下

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

[编程交流] VB使用la切换视口

[复制链接]

6

主题

33

帖子

27

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 22:18:56 | 显示全部楼层 |阅读模式
我没有在Autocad中使用VB的经验,但在其他基于word的应用程序中经常使用它,并且知道它的能力。我想知道它是否可以在Autocad中作为一个基于宏的函数应用于某些事物的MVIEW。
 
背景:视口1被指定给“Viewport 1”层(它的帧),我当前正在应用视口帧出现的层。对于该视口帧,I MVIEW=ON,视口显示。反之亦然。一般来说,在整个文件中都是类似的。我想知道的是,你是否可以使用一个宏,它的工作方式是“视口”层在指定给它的帧上打开。然后,通过打开层或通过出现帧,这可能会触发MVIEW=打开,并关闭层或帧消失MVIEW=关闭。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:24:45 | 显示全部楼层
一个简单的反应器(读取事件处理程序)可以做到这一点。。。我知道Visual LISP,还有。NET可以轻松做到这一点;不确定VBA。
 
您希望为图层对象钩住ObjectModified事件,并根据由此产生的状态变化,相应地修改视口。
回复

使用道具 举报

6

主题

33

帖子

27

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 22:27:47 | 显示全部楼层
Blackbox感谢您的快速响应。。。。。如上所述,我对Autocad的了解有限。你能让我更深入地了解一下如何实现这一点或了解你正在讨论的应用程序吗?你能为我指引方向吗?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:30:01 | 显示全部楼层
不过,我要补充一点,因为您对AutoCAD比较陌生,所以大多数人会发现,只需将视口的图层设置为“无打印”就可以一直打开,但仍然不能“打印”。
 
HTH公司
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:31:52 | 显示全部楼层
 
不客气。
 
AutoCAD支持少量开发人员API。。。为了更好地帮助你,也许你可以先给我提供更多的信息?
 
你提到擅长VB。。。是VBA(Visual Basic for Applications)还是VB。网络?
 
我个人学习了Visual LISP,它是AutoLISP的ActiveX COM扩展,后来我跳到了。NET(主要是C#)。。。我不想先问上述问题,从而进一步混淆。
回复

使用道具 举报

6

主题

33

帖子

27

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 22:36:13 | 显示全部楼层
Blackbox很抱歉昨天没有回复你。就VB的经验而言,它主要与为基于Microsoft的应用程序(excel、word等)开发宏有关。
 
附件是一个与我试图实现的目标类似的例子。如果你看有2个视口。每个视口帧被分配到一个单独的层(“视口1”和“视口2”)。在我的文件中,它们是相当多的视口,所有视口的帧都分配给不同的层。目前,我切换它们的方式是应用层>MVIEW>打开>选择视口帧>输入,这使视口可见,类似于关闭MVIEW>关闭>选择视口帧>输入>然后取消应用层。
 
我试图做到的是,当我应用层时,视口框架和其中的对象都会出现,但当我消失层时,它们会关闭。我开始思考并认为有可能使用VB来实现,当应用一个层时,所有视口帧都将显示与该层相关,如果您可以使用该层或出现的帧来触发MVIEW>打开和MVIEW>关闭功能,这将解决我的问题。但我愿意为这个可视化的LISP或VB提供任何建议。如果你不说话,也会这样做。谢谢你的帮助。
回复

使用道具 举报

6

主题

33

帖子

27

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 22:40:06 | 显示全部楼层
抱歉忘记附件
示例视口。图纸
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:44:01 | 显示全部楼层
我仍然不知道我是否理解你的目标,或者至少不知道为什么VBA是必要的(对不起)。
 
如果您希望能够切换ViewportOn属性,只需这样做,就不需要这个复杂的应用层,删除层补充,听起来它只是作为一种机制添加的,在不必要的时候做出反应(想想事件驱动的代码)。。。如果我错了,每个视口都需要单独的图层,请纠正我。
 
如果我是正确的,您只需要切换ViewportOn属性,而不需要调用MVIEW命令,指定开/关,然后考虑以下简单的LISP示例:
  1. (defun c:Test1 ()
  2. (command "._mview" "off")
  3. (princ)
  4. )
  5. (defun c:Test2 ()
  6. (command "._mview" "on")
  7. (princ)
  8. )
  9. (defun c:Test3 (/ *error* acDoc)
  10. (defun *error* (msg)
  11.    (if acDoc
  12.      (vla-endundomark acDoc)
  13.    )
  14.    (cond ((not msg))                                                   ; Normal exit
  15.          ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
  16.          ((princ msg))                                                 ; Fatal error, display it
  17.    )
  18.    (princ)
  19. )
  20. (if (= 0 (getvar 'tilemode))
  21.    (if (ssget "_:L" '((0 . "VIEWPORT")))
  22.      (progn
  23.        (vla-startundomark
  24.          (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
  25.        )
  26.        (vlax-for x (vla-get-activeselectionset acDoc)
  27.          (vla-put-viewporton x (~ (vlax-get x 'viewporton)))
  28.        )
  29.      )
  30.    )
  31.    (*error* "\n** Command not allowed in Model Tab **")
  32. )
  33. (*error* nil)
  34. )

 
Test1和Test2提示用户输入“开/关”规范,然后调用MVIEW命令,该命令允许用户选择布局中的任何视口。
 
Test3使用ActiveX而不是命令调用有效地执行与Test1相同的操作,并将测试2组合在一起(如果启用了ViewportOn,则禁用等等)。
 
HTH公司
回复

使用道具 举报

6

主题

33

帖子

27

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 22:46:22 | 显示全部楼层
我想我觉得这个应用程序需要解决的问题是,图形由许多外部参照图形组成,它们在某些视口的重要性之间存在很大差异。因此,我已将视口指定给与其在图形中的功能相关的图层。某些图层可能包含6个视口,而其他图层可能包含1个视口。如前所述,该文件的目的与能够打开和关闭视口密切相关。因此,在这一点上,假设我应用了一个带有5个视口的层。所有这些视口框架现在都“切换”了,我必须在每个单独的框架上单独MVIEW>。然后类似地,当我想要关闭该层以将另一层应用到该视口时,我必须MVIEW>关闭每个单独的层。
 
我知道这在某种意义上听起来太简单了,他们还有其他方法可以做到这一点,尤其是当我只处理几个视口时,但我更想寻找一些可以使我的绘图更容易导航的方法。如果你觉得这个函数太复杂了,我会更加阻碍你,因为我会听从你的建议,继续MVIEW过程。我只是觉得VB或这个VisualLISP可以用来控制层、视口和MVIEW的这个功能
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 22:47:47 | 显示全部楼层
有两件事有助于澄清。。。。
 
只能在一个层上应用(放置)视口。
 
当你说“假设我应用了一个有5个视口的图层”时,你的意思是修改了图层以解冻,还是打开(从冻结到关闭)?
 
我无法打开您的图纸,因为我目前没有2013年以上的图纸(仅在家中)。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 09:05 , Processed in 0.955948 second(s), 72 queries .

© 2020-2025 乐筑天下

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