使用平台是CAD2006

背景:这次要做的东西,名字有点绕,需求来源是这样的。如果有一批CAD图件,这里以一批1:500地形图为例,由于分幅面积小,所以总数量比较大,通常好几百甚至上千幅。当数据基本编辑完成,最后检查的时候,发现位于图件内的比例尺图示有误,需要更正。这里就隐含了一些条件了,比如各个图件内,图形的展布范围基本是一致的,而比例尺在各自图幅内的相对位置也是接近统一的。这时的需求就是批量替换比例尺,当然一种常用的处理办法是这样的:因为比例尺都放在TK图层,该层内其他内容通常也是批量生成的,那么直接全部TK层内容删除后重做,当然可以解决问题。

不过这一次,准备换一个思路,那就是用一个指定的东西,替换每个图幅内相对百分比位置的东西,是不是也可以解决问题呢?实话实说,这次尝试实现了最初的想法,但这个工具的适用范围着实不高,不过整个过程还是操练了好几种VBA

For AutoCAD的好几方面的东西:

A.

VBA制作AutoCAD的菜单并加载

B.

窗体设计以及通过菜单唤出窗体并输入参数

C.

图元分布范围的计算

D.

不同DWG文件间的图元内容复制,并移动到目标位置

首先,这次尝试做一下AutoCAD的菜单,通过菜单唤出窗体。

自定义菜单

第一个待解决的问题,如何自动加载菜单。搜索了一下,发现纯VBA环境貌似是无法实现自动加载的,所以想到了用“事件”的方式,即是说用DVB作为代码的载体,在启动CAD后手动加载DVB,这时DVB中和菜单建立相关的代码作为APP级别的事件,这里我选择了AcadDocument_Activate事件,即图形文件窗口激活这个条件。

VB Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

PrivateSubAcadDocument_activate()'菜单对象的层级关系:MenuGroups下通常有四个菜单组,第一组为默认ACAD,'第二组CUSTOM,第三组 MODELDOC,第四组CONTENTEXPLORER'一般新增的放在默认组,所以是,索引号为0 Item(0)'其下是PopupMenu对象,再下是PopupMenu的itemOnErrorResumeNext'该事件会被多次激活,所以会抛出错误DimcurrMenuGroupAsAcadMenuGroupSetcurrMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)' set currMenuGroup为默认菜单对象DimBrildo_MenuAsAcadPopupMenu'声明一个popupmenu对象SetBrildo_Menu = currMenuGroup.Menus.Add("Brildo_ToolBox")Dim替换指定范围, 分隔符AsAcadPopupMenuItemDimopenMacroAsString' 指定按钮对应宏的sub名字 格式固定 注意该sub 必须为publicopenMacro = Chr(3) & Chr(3) & Chr(95) &"-VBARUN form"& Chr(32)Set替换指定范围 = Brildo_Menu.AddMenuItem(Brildo_Menu.Count1, _"替换指定范围", openMacro)Set分隔符 = Brildo_Menu.AddSeparator("")' 在菜单栏上显示菜单Brildo_Menu.InsertInMenuBar (ThisDrawing.Application.MenuBar.Count1)EndSub

接下来是窗体的设计,无非是一些拖拽组合。最终效果如下:

窗体展示

我们希望实现的效果是通过点击菜单来唤出窗体,但是点击菜单本身只能对应运行一个Public

Sub,所以需要单独建立一个简单的公开过程,在其中唤出窗体:

VB Code

1

2

3

PublicSubform()

输入信息.ShowEndSub

每个按钮所涉及代码:

VB Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

PrivateSubCommanon1_Click()

file1 = CreateObject("WScript.Shell").Exec("mshta vbscript:"").StdOut.ReadAll

TextBox1 = file1EndSubPrivateSubCommanon2_Click()

file2 = CreateObject("WScript.Shell").Exec("mshta vbscript:"").StdOut.ReadAll

TextBox5 = file2EndSubPrivateSubCommanon3_Click()Setwshshell = CreateObject("Shell.Application")

dirpath = wshshell.BrowseForFolder(0,"请选择待处理文件目录",0,"").self.PathSetwshshell =NothingTextBox4 = dirpathEndSubPrivateSubLabel4_Click()

MsgBox"【说明】"& vbNewLine &"通过指定替换后的新内容,即替换文件"& vbNewLine &"以及替换内容位于示例文件中的位置"& vbNewLine &"完成目标文件夹下的批量替换"EndSubPrivateSubLabel5_Click()Me.hideCallReplace_Specific_Region(TextBox1, TextBox5, TextBox4, TextBox3, ComboBox1)EndSubPrivateSubSpinButton1_Change()

TextBox3 = Format((0CDbl(SpinButton1.Value /10)),"0.0") &"%"EndSubPrivateSubUserForm_Initialize()Me.ComboBox1.List = Array("左对齐","居中对齐","右对齐")

TextBox3 ="0%"last_value =0EndSub

前三个条形框分别展示“示例文件”、“替换文件”和“目标文件夹”的信息,通过点击左侧按钮弹出Windows的默认对话框作为交互方式。如何正确的弹出这个对话框,需要考虑到系统32位/64位的兼容性问题,以及最好是系统自带的实现方式,不需要对用户追加新的软件运行环境要求。最后采用的方法为:

CreateObject("WScript.Shell").Exec("mshta

vbscript:""

该方法选择文件,返回文件路径

CreateObject("Shell.Application").BrowseForFolder(0,

"请选择待处理文件目录",

0, "").self.Path

该方法选择文件夹,返回文件夹路径

这两种方法都具有很好的适用性,应该是VBA辉煌年代的遗产……

对齐方式预设了三种,左对齐、右对齐、居中对齐。表示新内容放入待替换的区域后的对齐方式;

最后是所谓【容差】,最初的考虑是这样的:从示例文件中得到的百分比范围在其他待处理的文件中定位不一定达到最好效果,因为待处理文件中希望被替换部分真实百分比可能有出入,所以用所谓容差来控制,在待处理文件中稍微扩大范围选取一部分空间,删除其中的现有内容,再将新内容放进去。【实际效果一般,我测试了前述大比例尺图件,由于不同图幅的整饰内容相差较大,所以必须要设定相当的容差才能将旧内容删除干净。但是引出了可以进一步优化的地方,比如计算范围时使用图号,就能准确抓取百分比,当然这并不适用于非标准分幅的图件,另一个思路是,扩大范围后所选取的内容做精细处理等】。

程序启动是用图片形式插入的。

cad vba 打开文件对话框_基于VBA的AutoCAD二次开发之批量替换DWG文件的指定范围(上)...相关推荐

  1. lisp二次开发 微盘_基于AutoLISP的AutoCAD二次开发研究_郭秀娟.pdf

    2008 年 12 月 Journal of Jilin Architectural and Civil Engineering Institute Dec.2008 基于 AutoLISP 的 Au ...

  2. CAD自控lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    基于 AutoLisp 的 AutoCAD 二次开发自动生成系统图 [摘 要]本文主要阐述了应用 autolisp 语言二次开发 autocad 自动生成系统图的实现方案. [关键词] autocad ...

  3. 基于C#进行AutoCAD二次开发初探(二)——C#编写代码直接打开AutoCAD并显示图形

    AutoCAD 2006 Type Library   //我用的是CAD2006版 AutoCAD/ObiectDBX Common 16.0 Type Library 把这两个引用的命名空间引进来 ...

  4. 基于C#的AutoCAD二次开发之获取用户输入信息、选择集、访问CAD内部命令

    基于C#的AutoCAD二次开发之获取用户输入信息.选择集.访问CAD内部命令 在CAD创建图形对象时,经常需要和用户进行交互,例如:直线创建时需要用户输入起点和终点(或长度)信息,复制对象时需要指定 ...

  5. 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    龙源期刊网 http://www.qikan.com.cn 基于 AutoLisp 的 AutoCAD 二次开发自动 生成系统图 作者:郎建山 金江 来源:<科技视界> 2013 年第 2 ...

  6. 基于C#进行AutoCAD二次开发初探(一)——调用dll库

    自己是测绘行业,不可避免要跟CAD打交道.因为之前用C#写了一个小软件,希望能够自动调用CAD画等高线,所以想基于C#进行Autocad的二次开发.但自己在此方面真的是零基础菜鸟一只.搜了大量的资料, ...

  7. 基于C#的AutoCAD二次开发之块操作

    基于C#的AutoCAD二次开发之块操作 什么是块? 块由多个在逻辑上相关的图形对象所定义的整体. 块的优点有哪些 统一作业标准.提高作业效率 压缩图形文件 便于修改和维护 块的分类 块的分类 简单块 ...

  8. python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解

    第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...

  9. 基于python的abaqus二次开发_基于PYTHON的ABAQUS二次开发实例讲解

    第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...

  10. python在材料模拟中的应用_基于Python的ABAQUS二次开发及在板料快速冲压成形模拟中的应用...

    2009 doi :10 1 3969/ j 1 issn 1 1007 2 2012 1 2009 1 04 1 013 基于 Python 的 ABAQUS 二次开发及在板料快速 冲压成形模拟中的 ...

最新文章

  1. pcf8574c语言测试程序,PCF8563驱动程序(C语言版)
  2. Java实现的简单神经网络(基于Sigmoid激活函数)
  3. java 使用gdal_java-gdal实现shp转geojson
  4. Spring Security OAuth 个性化token
  5. SAP Fiori element框架template的框架加载逻辑
  6. P3846-[TJOI2007]可爱的质数【BSGS,数论】
  7. 为什么我突然不能启动tomcat_为什么我的Tomcat启动加载不了配置文件?
  8. docx文档怎么排列图片_格式转换太麻烦?仅需一行命令,搞定图片、音频、视频、文本批量转换!...
  9. MYSQL基础之centos 6下二进制安装mariadb
  10. android编辑框显示,android – 如何在屏幕上显示文本编辑框?
  11. Fedora 9 vmware 上网问题
  12. 求长方形和正方形的周长
  13. 计算机类绘图的文献,基于计算机CAD绘图探讨论文
  14. python常用快捷键mac_Mac PHPStorm 常用快捷键,常用设置
  15. 专门打游戏的手机精选:rog3散热好 续航好 玩游戏更好!
  16. 自写:斤与公斤的转化
  17. 【兴趣书签】为什么观测之后量子态会坍塌
  18. 数学建模----拟合的实现
  19. 组合导航(二):导航参考坐标系
  20. 使用HTML 5/CSS3五步快速制作便签贴特效

热门文章

  1. CMFCMenuBar 的另类动态修改
  2. 9款常用的数据可视化工具推荐
  3. linux中原子量的学习和理解
  4. 基于java可视化的会议室管理系统
  5. 【多任务学习】多任务学习中的任务选择机制(Task Selection Policies for Multitask Learning)
  6. 2021金三银四,你准备好挑战这份最新腾讯、字节跳动、阿里巴巴Android面试题集了吗?
  7. gradle教程java_Gradle教程系列 ——Gradle基本语法
  8. Gradle教程--基础篇
  9. ecshop模板构建说明
  10. html转PDF并添加水印