找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 620|回复: 11

[转贴]:利用VBA开发AutoCAD

[复制链接]
发表于 2005-3-28 15:07:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在绘制工程图形以及开发新产品、绘制零件图形时,为了区别零件的不同部位,经常用不同线型、不同宽度的线来表示,在某些场合中,零件的轮廓线经常要用粗实线来表示。一些工程技术人员为节省作图时间,经常将轮廓线先作成细实线,待确定无误之后,再将细实线加粗成粗实线。在计算机上进行修改时,可以用多义线命令Polyline直接画出不同宽度的直线、圆弧,但画圆环命令Donut在绘制不同宽度的圆轮廓线时,需要经常改变所绘制形体的宽度且进行多次重复计算。当需要改变零件图中某些形体的线条宽度时,由于多义线编辑命令Pedit每次只能改变一条线的宽度,所以修改的过程十分繁琐,而且有些形体是无法用多义线编辑命令Pedit来修改宽度的,如圆、椭圆及椭圆弧等。对圆的修改可以使用圆环命令Donut重新绘制;而对于椭圆及椭圆弧,则无相应编辑命令。所有这些,都给作图带来诸多不便,基于此,笔者利用VBA技术,结合自己对AutoCAD的应用体会,编写了能一次修改多个实体宽度的应用程序,大大方便了工程图形的绘制。仿照此法还可以对Pedit的其他命令选项进行扩展和集成。

一、选择集的建立及管理

    为实现一次选择便可修改多个实体宽度的功能,采用VBA语句操作选择过程较为简单且容易理解。VBA中选择集的建立可以采用下述方法:
Dim Selset as AcadSelectionSet '定义一个选择集"Selset"
If Not IsNull(ThisDrawing.SelectionSets.Item("sset")) Then
Set Selset = ThisDrawing.SelectionSets.Item("sset")
Selset.Delete '如果选择集已存在,则删除
End If
Set Selset = ThisDrawing.SelectionSets.Add("sset") '添加选择集Selset
ThisDrawing是一个代表当前图形文件的程序术语,对独立的工程来说,ThisDrawing通常是指AutoCAD中的活动文档;而对内嵌的工程来说,ThisDrawing通常是指包含此工程的图形文档。
选择集数据的建立模式通常有以下几种方法:
1.Selset.Select Mode[, Point1][, Point2][, FilterType][, FilterData] '根据不同的Mode值来选择
2.Selset.SelectAtPoint Point, FilterType, FilterData '选择通过给定点的对象
3. Selset.SelectByPolygon Mode, PointsList, FilterType, FilterData '选择在给定网格内的对象
4.Selset.SelectOnScreen '直接在屏幕上选择
对于不同的图形来说,需要修改的实体不确定,故笔者采用的是最后一种方法,该方法可提供最大限度的灵活性。

二、对直线宽度的修改

由于多义线编辑命令Pedit提供了对直线宽度的编辑选项,因此对直线宽度的修改完全可以通过编程调用Pedit命令来实现,但由于本实例要实现预览、取消编辑的功能,笔者采用了在直线的位置上添加多义线并将该直线隐藏的方法,具体实现如下:
Dim polyObj as AcadPolyline
Set polyObj = ThisDrawing.ModelSpace.AddPolyline(pt) '生成多义线
polyObj.SetWidth 0, ComBox.Text, ComBox.Text '改变起点、终点的宽度
drawSet.Select acSelectionSetLast '将多义线添加到选择集"drawSet"
polyObj.Layer = layerStr '使多义线与直线处于同一层,layerStr为直线所 在图层名称
entObj.Visible = False '隐藏原直线

三、对圆宽度的修改

对于圆的修改,一种方式是用一条具有若干顶点的封闭多义线来近似模拟,绘制出的多义线失去了圆的基本特征,如圆心、半径等属性,一旦使用Explode命令,该多义线将被分解成若干条细实线;另一种方式是利用CAD内部的Donut命令,通过向AutoCAD的命令行发送Donut命令及其所需的内外直径的数值,修改后的圆环变为多义线,使用Explode命令时,该多义线将被分解成两个半圆弧,圆心、半径等属性不变。对比分析,我们使用了后一种方式,代码如下:
If ent.ObjectName="AcDbCircle" then
ThisDrawing.SendCommand Chr(27) & "_donut" & vbCr & (2 * R -
Val(ComBox.Text)) & vbCr & (2 * R + Val(ComBox.Text)) & vbCr
& (center(0) & "," & center(1)) & NL '发送画圆环命令
Ent.Delete
End if
程序运行时遇到圆实体时,依次向AutoCAD的命令行输入区发送“DONUT”命令以及作圆环所需的内径、外径、圆心坐标等参数,结果是圆被取消,取而代之的是宽度为Val(ComBox.text)的圆环。

四、对圆弧的修改

对圆弧的修改,可以利用“三”中的后一种方式,只不过将“Donut”改为“Pline”,选择“Arc”模式。而对椭圆宽度的改变,则采用“三”中的前一种方式,即
Dim plineObj as AcadPolyline
Set plineObj=ThisDrawing.ModelSpace.AddPolyline(points)
其中,Points为存放顶点坐标的一维数组,大小为顶点数的3倍。

五、VBA应用程序扩展命令的载入

若要使VBA应用程序只在一个图形文件中使用,可以将该程序内嵌到图形文件中,只要一打开这一图形文件,应用程序就会被自动装载。由于面向行业开发的应用程序一般都是通用的,若每次使用时都先进行加载,则比较麻烦,因此为了使开发的应用程序在创建新图形文件或启动AutoCAD时都可以使用,可以用Load Applications命令的Startup Suite选项,利用Add...按钮将该程序(后缀为.dvb的工程文件)加载进来。也可以用AutoLisp语言自定义函数S::STARTUP,使其包含在acad.lsp或.mnl文件中,以后在启动AutoCAD或建立新文件时,应用程序将自动加载进来。以下是自定义的加载、运行、卸载函数并与定制的菜单项结合起来。
(defun S::STARTUP()
(defun C:LOADPEDIT()
(command "_vbaload" "c:\\polyline\\pline.dvb") )
(defun C:RUNPEDIT()
(command "_vbarun" "c:\\polyline\\pline.dvb!Module1.pline") )
(defun C:UNLOADPEDIT()
(command "_vbaunload" "c:\\polyline\\pline.dvb") ) )
Module1.pline为pline.dvb工程对应的宏
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-3-29 20:00:07 | 显示全部楼层
hao
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-4 12:15:02 | 显示全部楼层
谢谢楼主
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-11 10:43:17 | 显示全部楼层
不错,VBa功能是强大啊,就是编码麻烦
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-13 19:49:21 | 显示全部楼层
VBA真的好用吗,难不难,我有点想学,不过没有学习资料,谁能推荐两个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-15 14:39:06 | 显示全部楼层
帮助文件里很详细,不过都是e文,如果cad比较熟悉的话,看起来应该不吃力.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-16 19:12:34 | 显示全部楼层
楼主好呀!
小弟我很受益哦
^_^
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-17 11:33:59 | 显示全部楼层
谢谢楼主
初学VBA还请多多指教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-18 14:59:03 | 显示全部楼层
好文章
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-18 15:21:20 | 显示全部楼层
楼主好厉害 又长了不少见识
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-18 17:47:56 | 显示全部楼层
1111111111
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-18 18:14:41 | 显示全部楼层
请问楼主:样条曲线可不可以修改宽度?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-9 12:22 , Processed in 0.200192 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表