论文部分内容阅读
摘要:该文讨论了在AutoCAD中表面粗糙度符号标注工具的改进方法,在直线、圆对象基础上增加了正多边形、多段线、尺寸标注的尺寸界线对象标注表面粗糙度符号,完善了该工具的功能,提高了机械制图的绘图效率,具有较好的实际使用价值和推广意义。
关键词:表面粗糙度符号;AutoCAD;机械制图
中图分类号:TP391.72;TH122文献标识码:A文章编号:1009-3044(2009)36-10551-03
An Improvement on Surface Roughness Symbol Marking By Redevelopment of Auto CAD
FU Chun-hua, LIU Gao-jun, HUANG Mao-fei
(Sichuan University of Science & Engineering, Zigong 643000, China)
Abstract: The improvement of Surface Roughness Symbol Marking in AutoCAD is discussed in the paper. On the bases of line and circle objects, the surface roughness symbol marking of the polygon, polyline and extension line of dimension objects are added. This research extended the function of AutoCAD, enhanced mechanical drawings effectively, and embodies practical value and popularizing significance.
Key words: surface roughness symbol marking; AutoCAD; mechanical design
AutoCAD是一种功能十分强大通用图形处理软,在机械行业中使用越来越来普遍。绘制一张复杂的零件图可能要标注好十几次粗糙度符号。由于在AutoCAD中没有现成的粗糙度符号标注工具,因而直接标注符合国标的零件表面粗糙度是一项十分繁琐的工作,而且绘图效率极低。因此为提高绘图效率,扩充AutoCAD的功能,对表面粗糙度符号标注进行AutoCAD二次开发是十分必要的。李建明发表于《东北师大学报自然科学版》第36卷2004年5月《表面粗糙度符号标注的AutoCAD二次开发》一文,使用方便,界面友好,美中不足的是不能在对多段线、矩形、多边形与尺寸标注对象直接标注表面粗糙度符号,本文对此进行改进。
1 原文主要内容
1.1 表面粗糙度符号标注设计思想
开发过程采用参数化绘图的基本设计思想,通过输入标注粗糙度的数值、符号、位置、文字高度等参数,然后点取标注位置,就能标注出符合国家标准是GB/T 131-1993的表面粗糙度符号,并根据大量参考图册的粗糙度标注与笔者的工程制图经验,对该国家标准进行必要的简化,以简化程序开发工作并使开发的标注实用程序更接近实际使用情况。其设计思想流程如图1所示。
1.2 标注方位的判断与实现
1.2.1 直线对象的角度求解
由于Auto lisp函数无直接得到直线对象角度的函数,因而只有通过(angle pt1 pt2)函数来求解,所以必须先求解直线的两个端点坐标。该函数返回的是由起点指向终点方向与X轴的夹角。
求直线角度的程序如下:
(defun jd ( )
(command "osnap" "nea");;;设置“最近点”捕捉方式
(setq pt (getpoint)aa (ssget pt) ;;;以“点选”方式选择直线
stm_data (entget (ssname aa 0)));;;获得直线对象的定义数据关联表
(setqa_1(assoc 10stm_data) ;;;从关联表中取出指定的DXF组码,
a_2(assoc 11 stm_data);;;10为起点,11为终点
a_1(cdr a_1) a_2(cdr a_2)) ;;;从DXF组码中取出起点与终点坐标
(setq ang (angle a_1 a_2)) ;;;求直线12与X轴的夹角
);defun
1.2.2 标注粗糙度符号时α角度求解
以标注如图2所示的粗糙度符号为例,就要知道图中的α角度,然后将粗糙度符号转过一个α角度即可。由于直线的起点与终点不一样,求得的角度也不一样,对图2来讲,要求α角度,就需要由求得的直线角度ang进行转化,求α角度的程序段如下:
(if (and (> ang (/ pi 2)) (<= ang (* 1.5 pi)))
(setq ang (- ang pi))
);if
(if (and (> ang (* 1.5 pi)) (< ang (* 2 pi)))
(setq ang (- ang (* 2 pi)))
);if
2 改进方法的实施
2.1 原文主要缺陷及原因
原文开发的工具对直线、圆、圆弧对象的标注如图3所示,符合GB要求。对尺寸标注实体对象的粗糙度符号标注如图4所示;对多段线、正多边的粗糙度符号标注则提示“错误: 参数类型错误: 二维/三维点: nil”,不进行标注,如图5所示。主要原因是不能识别这些对象,标注不正确或不标注的原因是没有对这些实体进行处理,不能正确求解粗糙度符号标注角度。
要正确标注只有将上述对象分解为简单实体。但分解后会出现许多新的问题,一般不采用这种方法。
2.2 改进方法
开发设计思想与原文一致,主要针对原文缺陷的原因,解决的关键问题就是要能取出需要的端点。通过对多段线、矩形、尺寸标注对象的图形数据的分析知道,需要利用DXF组代码取出相应的端点,然后利用原文的求解角度方法,就能得到正确的标注。
具体过程是利用entget函数取得对象的图形数据,用assoc函数利用DXF组代码从图形数据中取出含有需要端点的数据表,如(10 330.491 75.0874 0.0),然后利用cdr函数去掉DXF组代码10后得到端点坐标(330.491 75.0874 0.0)。
2.2.1 标注尺寸界线的角度求解
AutoCAD的尺寸标注对象是一个整体。其图形数据为:
((-1 . <图元名: 7ef50d68>) (0 . "DIMENSION") (330 . <图元名: 7ef50d08>) (5 . "2D")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbDimension")(2 . "*D1") (10 330.491 75.0874 0.0) (11 328.616 121.982 0.0) (12 0.0 0.0 0.0) (70 . 32) (1 . "") (71 . 5) (72 . 1) (41 . 1.0)(42 . 93.7895) (52 . 0.0) (53 . 0.0) (54 . 0.0) (51 . 0.0)(210 0.0 0.0 1.0) (3 . "ISO-25") (100 . "AcDbAlignedDimension") (13 194.16 168.877 0.0) (14 194.16 75.0874 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 0.0) (40 . 0.0) (50 . 1.5708) (100 . "AcDbRotatedDimension")
如图6所示,对应组码表其中取出来的点为P1、P2、P3、P4四个点,分别为组码表中10、11、13、14所对应的值。10、14分别为图5所示的P1、P4点对应的组代码,其取点的程序为:
(setq a_1(cdr(assoc 10 stm_data))
a_2(cdr(assoc 14 stm_data)))
得到点后求解角度与直线的方法一样。
2.2.2 多段线、矩形框及多边形的角度求解
由于多段线、矩形及多边形对象利用组码取得的值为图形的各个顶点坐标值。如图7所示。
因此在求解多段线、矩形及多边形的角度时必需通过循环取得。循环取出相邻两点的坐标值,求出这两点所在的直线的斜率。再取这两点的第一点与用户选取的点来计算这两点的斜率,如果分别计算的两个斜率相同,那么退出循环。即可取出当前取得的两点的坐标值来求解角度。如果取到后一点,则再取出最后一点与图形的第一点进行计算。
如图7所示,分别计算P1与P2、P2与P3……等的斜率值,假设用户输入的点为Pt,当P1与P2的斜率等于P1与Pt的斜率,则取出当前两个点。计算及取点的程序如下:
(if (= bzys "LWPOLYLINE");;;判断所选择的对象是否为多义线、矩形框及多边形
(progn
(setq do_do 2 i 14)
(while (> do_do 1)
(setq xxxx 0 yyyy 0)
(setq zzzz (nth i stm_data))
(setq i (+ i 4))
(setq wwww (nth i stm_data))
(if (= rrrr 210)
(setq zzzz (nth (- i 8) stm_data)
wwww (nth 14 stm_data))) ;;;判断是否取到最后一点
(setq a_1 (cdr zzzz))
(setq a_2 (cdr wwww))
(setq rrrr (nth 0 wwww))
(setq b_1 (angle a_1 pt)
b_2 (angle a_1 a_2))
(if (= (rtos b_1) (rtos b_2))
(setq do_do 1));;;;if斜率相同则退出循环
);;;while
);;;progn
);;;if
在(if (= (rtos b_1) (rtos b_2)) (setq do_do 1));这个语句中用到了rtos将实型数转换成字符串再来进行比较。由于在计算两点的斜率时,有时候两点的斜率值非常小,为避免造成死循环,将其转换成字符串来进行比较更容易实现比较的目的。
2.2 运行与标注实例
运行界面如图8所示,标注实例如图9所示。
3 结论
本程序在AutoCAD2008中调试通过,改进后的表面粗糙度符号标注工具,增加了对多义线、矩形、及在尺寸标注对象的尺寸界限线上标注表面粗糙度符号,功能进一部完善,使用更加方便,扩充AutoCAD功能,提高了机械制图效率。本工具可作为单独的实用工具使用,也可作为机械制图适用工具的一个模块使用,具有较好的实际使用价值和推广意义。
参考文献:
[1] 符纯华.计算机辅助设计[M].成都:西南交通大学出版社,2006.
[2] 李建明.表面粗糙度符号标注的AutoCAD二次开发[J].东北师大学报自然科学版,2004(5):73-76.
[3] 汪恺.技术制图国家标准宣贯教材[M].北京:中国计量出版社,1997.
[4] 俞汉清.表面粗糙度标准及应用[M].北京:中国计量出版社,1997.
[5] 易春峰,张锡滨.Auto CAD中表面粗糙度标注工具的二次开发[J].企业技术开发,2001(5):4-5.
关键词:表面粗糙度符号;AutoCAD;机械制图
中图分类号:TP391.72;TH122文献标识码:A文章编号:1009-3044(2009)36-10551-03
An Improvement on Surface Roughness Symbol Marking By Redevelopment of Auto CAD
FU Chun-hua, LIU Gao-jun, HUANG Mao-fei
(Sichuan University of Science & Engineering, Zigong 643000, China)
Abstract: The improvement of Surface Roughness Symbol Marking in AutoCAD is discussed in the paper. On the bases of line and circle objects, the surface roughness symbol marking of the polygon, polyline and extension line of dimension objects are added. This research extended the function of AutoCAD, enhanced mechanical drawings effectively, and embodies practical value and popularizing significance.
Key words: surface roughness symbol marking; AutoCAD; mechanical design
AutoCAD是一种功能十分强大通用图形处理软,在机械行业中使用越来越来普遍。绘制一张复杂的零件图可能要标注好十几次粗糙度符号。由于在AutoCAD中没有现成的粗糙度符号标注工具,因而直接标注符合国标的零件表面粗糙度是一项十分繁琐的工作,而且绘图效率极低。因此为提高绘图效率,扩充AutoCAD的功能,对表面粗糙度符号标注进行AutoCAD二次开发是十分必要的。李建明发表于《东北师大学报自然科学版》第36卷2004年5月《表面粗糙度符号标注的AutoCAD二次开发》一文,使用方便,界面友好,美中不足的是不能在对多段线、矩形、多边形与尺寸标注对象直接标注表面粗糙度符号,本文对此进行改进。
1 原文主要内容
1.1 表面粗糙度符号标注设计思想
开发过程采用参数化绘图的基本设计思想,通过输入标注粗糙度的数值、符号、位置、文字高度等参数,然后点取标注位置,就能标注出符合国家标准是GB/T 131-1993的表面粗糙度符号,并根据大量参考图册的粗糙度标注与笔者的工程制图经验,对该国家标准进行必要的简化,以简化程序开发工作并使开发的标注实用程序更接近实际使用情况。其设计思想流程如图1所示。
1.2 标注方位的判断与实现
1.2.1 直线对象的角度求解
由于Auto lisp函数无直接得到直线对象角度的函数,因而只有通过(angle pt1 pt2)函数来求解,所以必须先求解直线的两个端点坐标。该函数返回的是由起点指向终点方向与X轴的夹角。
求直线角度的程序如下:
(defun jd ( )
(command "osnap" "nea");;;设置“最近点”捕捉方式
(setq pt (getpoint)aa (ssget pt) ;;;以“点选”方式选择直线
stm_data (entget (ssname aa 0)));;;获得直线对象的定义数据关联表
(setqa_1(assoc 10stm_data) ;;;从关联表中取出指定的DXF组码,
a_2(assoc 11 stm_data);;;10为起点,11为终点
a_1(cdr a_1) a_2(cdr a_2)) ;;;从DXF组码中取出起点与终点坐标
(setq ang (angle a_1 a_2)) ;;;求直线12与X轴的夹角
);defun
1.2.2 标注粗糙度符号时α角度求解
以标注如图2所示的粗糙度符号为例,就要知道图中的α角度,然后将粗糙度符号转过一个α角度即可。由于直线的起点与终点不一样,求得的角度也不一样,对图2来讲,要求α角度,就需要由求得的直线角度ang进行转化,求α角度的程序段如下:
(if (and (> ang (/ pi 2)) (<= ang (* 1.5 pi)))
(setq ang (- ang pi))
);if
(if (and (> ang (* 1.5 pi)) (< ang (* 2 pi)))
(setq ang (- ang (* 2 pi)))
);if
2 改进方法的实施
2.1 原文主要缺陷及原因
原文开发的工具对直线、圆、圆弧对象的标注如图3所示,符合GB要求。对尺寸标注实体对象的粗糙度符号标注如图4所示;对多段线、正多边的粗糙度符号标注则提示“错误: 参数类型错误: 二维/三维点: nil”,不进行标注,如图5所示。主要原因是不能识别这些对象,标注不正确或不标注的原因是没有对这些实体进行处理,不能正确求解粗糙度符号标注角度。
要正确标注只有将上述对象分解为简单实体。但分解后会出现许多新的问题,一般不采用这种方法。
2.2 改进方法
开发设计思想与原文一致,主要针对原文缺陷的原因,解决的关键问题就是要能取出需要的端点。通过对多段线、矩形、尺寸标注对象的图形数据的分析知道,需要利用DXF组代码取出相应的端点,然后利用原文的求解角度方法,就能得到正确的标注。
具体过程是利用entget函数取得对象的图形数据,用assoc函数利用DXF组代码从图形数据中取出含有需要端点的数据表,如(10 330.491 75.0874 0.0),然后利用cdr函数去掉DXF组代码10后得到端点坐标(330.491 75.0874 0.0)。
2.2.1 标注尺寸界线的角度求解
AutoCAD的尺寸标注对象是一个整体。其图形数据为:
((-1 . <图元名: 7ef50d68>) (0 . "DIMENSION") (330 . <图元名: 7ef50d08>) (5 . "2D")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbDimension")(2 . "*D1") (10 330.491 75.0874 0.0) (11 328.616 121.982 0.0) (12 0.0 0.0 0.0) (70 . 32) (1 . "") (71 . 5) (72 . 1) (41 . 1.0)(42 . 93.7895) (52 . 0.0) (53 . 0.0) (54 . 0.0) (51 . 0.0)(210 0.0 0.0 1.0) (3 . "ISO-25") (100 . "AcDbAlignedDimension") (13 194.16 168.877 0.0) (14 194.16 75.0874 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 0.0) (40 . 0.0) (50 . 1.5708) (100 . "AcDbRotatedDimension")
如图6所示,对应组码表其中取出来的点为P1、P2、P3、P4四个点,分别为组码表中10、11、13、14所对应的值。10、14分别为图5所示的P1、P4点对应的组代码,其取点的程序为:
(setq a_1(cdr(assoc 10 stm_data))
a_2(cdr(assoc 14 stm_data)))
得到点后求解角度与直线的方法一样。
2.2.2 多段线、矩形框及多边形的角度求解
由于多段线、矩形及多边形对象利用组码取得的值为图形的各个顶点坐标值。如图7所示。
因此在求解多段线、矩形及多边形的角度时必需通过循环取得。循环取出相邻两点的坐标值,求出这两点所在的直线的斜率。再取这两点的第一点与用户选取的点来计算这两点的斜率,如果分别计算的两个斜率相同,那么退出循环。即可取出当前取得的两点的坐标值来求解角度。如果取到后一点,则再取出最后一点与图形的第一点进行计算。
如图7所示,分别计算P1与P2、P2与P3……等的斜率值,假设用户输入的点为Pt,当P1与P2的斜率等于P1与Pt的斜率,则取出当前两个点。计算及取点的程序如下:
(if (= bzys "LWPOLYLINE");;;判断所选择的对象是否为多义线、矩形框及多边形
(progn
(setq do_do 2 i 14)
(while (> do_do 1)
(setq xxxx 0 yyyy 0)
(setq zzzz (nth i stm_data))
(setq i (+ i 4))
(setq wwww (nth i stm_data))
(if (= rrrr 210)
(setq zzzz (nth (- i 8) stm_data)
wwww (nth 14 stm_data))) ;;;判断是否取到最后一点
(setq a_1 (cdr zzzz))
(setq a_2 (cdr wwww))
(setq rrrr (nth 0 wwww))
(setq b_1 (angle a_1 pt)
b_2 (angle a_1 a_2))
(if (= (rtos b_1) (rtos b_2))
(setq do_do 1));;;;if斜率相同则退出循环
);;;while
);;;progn
);;;if
在(if (= (rtos b_1) (rtos b_2)) (setq do_do 1));这个语句中用到了rtos将实型数转换成字符串再来进行比较。由于在计算两点的斜率时,有时候两点的斜率值非常小,为避免造成死循环,将其转换成字符串来进行比较更容易实现比较的目的。
2.2 运行与标注实例
运行界面如图8所示,标注实例如图9所示。
3 结论
本程序在AutoCAD2008中调试通过,改进后的表面粗糙度符号标注工具,增加了对多义线、矩形、及在尺寸标注对象的尺寸界限线上标注表面粗糙度符号,功能进一部完善,使用更加方便,扩充AutoCAD功能,提高了机械制图效率。本工具可作为单独的实用工具使用,也可作为机械制图适用工具的一个模块使用,具有较好的实际使用价值和推广意义。
参考文献:
[1] 符纯华.计算机辅助设计[M].成都:西南交通大学出版社,2006.
[2] 李建明.表面粗糙度符号标注的AutoCAD二次开发[J].东北师大学报自然科学版,2004(5):73-76.
[3] 汪恺.技术制图国家标准宣贯教材[M].北京:中国计量出版社,1997.
[4] 俞汉清.表面粗糙度标准及应用[M].北京:中国计量出版社,1997.
[5] 易春峰,张锡滨.Auto CAD中表面粗糙度标注工具的二次开发[J].企业技术开发,2001(5):4-5.