自动绘制图幅框及设置字体和标注样式
在AutuCAD上绘图主要有三种工作方式。
1、最古老的在模型空间创建单视图图形。不少人喜欢在一个dwg文件模型空间里画上好几幅,甚至一套图纸。
2、在图纸空间创建布局。
3、使用图纸集。
采用方式1的时候,如果A3、A4图幅框无法容纳按照1:1比例绘制的图形,就得或者放大图幅框,或者缩小图形。显然,放大图幅框是个较好选择。但这个时候需要根据放大比例去设置字体样式(高度)、标注样式(全局比例),以便标注、打印的时候可以得到正确的效果。
本程序试图将此过程自动化处理。显然,程序第一稿(能够运行的)写的不够精致干练,留待以后删改。根据经验,一件事最少重复做到第三次的时候才刚开始搞明白正确的做法。这世上或许有似韩寒长篇小说一次定稿的“天才”?我没见过。
程序需要CAD模板配合。预先画好A3、A4图幅框,分别放在CAD的搜索路径里。
程序里设置标注样式的地方写的比较罗嗦,没找到什么好办法。而且发现如果标注样式的全局比例如果为1,则在(entget dim-style)获得标注样式的群码表时,里面缺少(40 . dimscale)这一内容。为此不得不将模板中iso-25标注样式的全局比例改为1.001。
;;;;;;;;;;;;;;;;;;程序开始
(defun bottom-left (p1 p2 / p3 p4)
;;p1 p2是对角点
;;获得对角点所在矩形的左下角点
(setq p3 (list (car p1) (cadr p2))
p4 (list (car p2) (cadr p1))
)
(list (min (car p1)
(car p2)
(car p3)
(car p4)
)
(min (cadr p1)
(cadr p2)
(cadr p3)
(cadr p4)
)
)
)
(defun len (p1 p2)
;获得对角点水平长度(即矩形长)
(abs (- (car p1)
(car p2)
)
)
)
(defun wid (p1 p2)
;获得对角点垂直宽度(即矩形宽)
(abs (- (cadr p1)
(cadr p2)
)
)
)
(defun c:tufu (/ p1 p2 lenth width p0 l/w)
;;插入图幅框
(setvar "osmode" 0) ;取消捕获
(princ "给出图幅框的两个对角点:")
(setq p1 (getpoint "\n第一点:")
p2 (getcorner p1 "")
lenth (len p1 p2) ;图幅框水平距离
width (wid p1 p2) ;图幅框竖直距离
p0 (bottom-left p1 p2) ;获得左下角点
l/w (/ lenth width)
) ;长宽比
(cond ((<= l/w 1) (tufu-a4y p0 lenth width)) ;A4竖幅
((a4x?) (tufu-a4x p0 lenth width)) ;A4横幅
(t (tufu-a3x p0 lenth width)) ;A3横幅
)
(setvar "osmode" 1) ;打开捕获端点
)
(defun a4x? ()
;;用户选择以A3还是A4打印
(if
(/=
(getstring
"预计将来以A4纸(横幅)打印?(y/n,选否则以A3纸(横幅)打印。)"
)
"n"
)
t
nil
)
)
(defun fix-scal (n1 n2)
;;放大比例截取1位小数
(cond ((<= n1 n2) 1) ; 图幅框只放大或保持原尺寸,不缩小
(t
(/ (fix (* 10 (/ (float n1) n2)))
10.0
)
)
)
)
(defun tufu-a4y (p0 lenth width / scal text-style)
;;插入A4竖幅框
(setq scal (max (fix-scal lenth 180) ;在长和宽中选择以较大比例
(fix-scal width 287)
)
)
(command "insert" "a4y" p0 scal scal "") ;插入A4图幅框
(tufu-print
(polar p0 (* 1.05 pi) (* 25 scal))
"A4竖幅"
scal
) ;文字样式建立,并在图幅框原点附近写下放大即打印比例
(setq text-style
(tblobjname "style" (strcat "s-" (rtos scal 2 1)))
) ;获取文字样式的图元名
(tufu-dim scal text-style) ;根据打印比例和文字样式设置标注样式
)
(defun tufu-a4x (p0 lenth width / scal)
;;插入A4横幅框
(setq scal (max (fix-scal lenth 267)
(fix-scal width 200)
)
)
(command "insert" "a4x" p0 scal scal "")
(tufu-print
(polar p0 (* 1.05 pi) (* 25 scal))
"A4横幅"
scal
)
(setq text-style
(tblobjname "style" (strcat "s-" (rtos scal 2 1)))
)
(tufu-dim scal text-style)
)
(defun tufu-a3x (p0 lenth width / scal)
;;插入A3横幅框
(setq scal (max (fix-scal lenth 390)
(fix-scal width 287)
)
)
(command "insert" "a3x" p0 scal scal "")
(tufu-print
(polar p0 (* 1.05 pi) (* 25 scal))
"A3横幅"
scal
)
(setq text-style
(tblobjname "style" (strcat "s-" (rtos scal 2 1)))
)
(tufu-dim scal text-style)
)
(defun tufu-print (pp text scal)
;;文字样式建立,打印比例输出.
;;pp是起点 text 前缀内容 scal 比例
(command "style"
(strcat "s-" (rtos scal 2 1))
"gbcbig.shx"
(rtos (* 2.5 scal) 2 1) ;字体高度2.5
""
""
""
""
""
) ;建立文字样式
(command "text"
pp
""
(strcat text "打印比例 1:" (rtos scal 2 1))
)
)
(defun tufu-dim (scal text-style / dim dim-s)
;;设置标注样式
;;scal 打印比例 text-style 文字样式
;;dim 标注样式符号表的图元名 dim-s 标注样式符号表
(command "dimstyle" "r" "iso-25") ;先恢复iso-25标注样式
(command "dimstyle" "s" (strcat "s-" (rtos scal 2 1)))
;以iso-25样式为模板建立新标注样式
(setq dim (tblobjname "dimstyle" (strcat "s-" (rtos scal 2 1))))
(setq dim-s (subst (cons 340 text-style)
(assoc 340 (entget dim))
(entget dim)
)
)
(entmod dim-s)
(setq dim-s (subst (cons 40 scal) ; 如果iso-25标注样式的全局比例默认为1,则(assoc 40 (entget dim))求值为nil
(assoc 40 (entget dim))
(entget dim)
)
)
(entmod dim-s)
(command "dimstyle" "r" (strcat "s-" (rtos scal 2 1)))
;再次恢复更改后的标注样式,删掉替代样式
)
;;;;;;;;;;;;;;;;;;;;;结束
1、最古老的在模型空间创建单视图图形。不少人喜欢在一个dwg文件模型空间里画上好几幅,甚至一套图纸。
2、在图纸空间创建布局。
3、使用图纸集。
采用方式1的时候,如果A3、A4图幅框无法容纳按照1:1比例绘制的图形,就得或者放大图幅框,或者缩小图形。显然,放大图幅框是个较好选择。但这个时候需要根据放大比例去设置字体样式(高度)、标注样式(全局比例),以便标注、打印的时候可以得到正确的效果。
本程序试图将此过程自动化处理。显然,程序第一稿(能够运行的)写的不够精致干练,留待以后删改。根据经验,一件事最少重复做到第三次的时候才刚开始搞明白正确的做法。这世上或许有似韩寒长篇小说一次定稿的“天才”?我没见过。
程序需要CAD模板配合。预先画好A3、A4图幅框,分别放在CAD的搜索路径里。
程序里设置标注样式的地方写的比较罗嗦,没找到什么好办法。而且发现如果标注样式的全局比例如果为1,则在(entget dim-style)获得标注样式的群码表时,里面缺少(40 . dimscale)这一内容。为此不得不将模板中iso-25标注样式的全局比例改为1.001。
;;;;;;;;;;;;;;;;;;程序开始
(defun bottom-left (p1 p2 / p3 p4)
;;p1 p2是对角点
;;获得对角点所在矩形的左下角点
(setq p3 (list (car p1) (cadr p2))
p4 (list (car p2) (cadr p1))
)
(list (min (car p1)
(car p2)
(car p3)
(car p4)
)
(min (cadr p1)
(cadr p2)
(cadr p3)
(cadr p4)
)
)
)
(defun len (p1 p2)
;获得对角点水平长度(即矩形长)
(abs (- (car p1)
(car p2)
)
)
)
(defun wid (p1 p2)
;获得对角点垂直宽度(即矩形宽)
(abs (- (cadr p1)
(cadr p2)
)
)
)
(defun c:tufu (/ p1 p2 lenth width p0 l/w)
;;插入图幅框
(setvar "osmode" 0) ;取消捕获
(princ "给出图幅框的两个对角点:")
(setq p1 (getpoint "\n第一点:")
p2 (getcorner p1 "")
lenth (len p1 p2) ;图幅框水平距离
width (wid p1 p2) ;图幅框竖直距离
p0 (bottom-left p1 p2) ;获得左下角点
l/w (/ lenth width)
) ;长宽比
(cond ((<= l/w 1) (tufu-a4y p0 lenth width)) ;A4竖幅
((a4x?) (tufu-a4x p0 lenth width)) ;A4横幅
(t (tufu-a3x p0 lenth width)) ;A3横幅
)
(setvar "osmode" 1) ;打开捕获端点
)
(defun a4x? ()
;;用户选择以A3还是A4打印
(if
(/=
(getstring
"预计将来以A4纸(横幅)打印?(y/n,选否则以A3纸(横幅)打印。)"
)
"n"
)
t
nil
)
)
(defun fix-scal (n1 n2)
;;放大比例截取1位小数
(cond ((<= n1 n2) 1) ; 图幅框只放大或保持原尺寸,不缩小
(t
(/ (fix (* 10 (/ (float n1) n2)))
10.0
)
)
)
)
(defun tufu-a4y (p0 lenth width / scal text-style)
;;插入A4竖幅框
(setq scal (max (fix-scal lenth 180) ;在长和宽中选择以较大比例
(fix-scal width 287)
)
)
(command "insert" "a4y" p0 scal scal "") ;插入A4图幅框
(tufu-print
(polar p0 (* 1.05 pi) (* 25 scal))
"A4竖幅"
scal
) ;文字样式建立,并在图幅框原点附近写下放大即打印比例
(setq text-style
(tblobjname "style" (strcat "s-" (rtos scal 2 1)))
) ;获取文字样式的图元名
(tufu-dim scal text-style) ;根据打印比例和文字样式设置标注样式
)
(defun tufu-a4x (p0 lenth width / scal)
;;插入A4横幅框
(setq scal (max (fix-scal lenth 267)
(fix-scal width 200)
)
)
(command "insert" "a4x" p0 scal scal "")
(tufu-print
(polar p0 (* 1.05 pi) (* 25 scal))
"A4横幅"
scal
)
(setq text-style
(tblobjname "style" (strcat "s-" (rtos scal 2 1)))
)
(tufu-dim scal text-style)
)
(defun tufu-a3x (p0 lenth width / scal)
;;插入A3横幅框
(setq scal (max (fix-scal lenth 390)
(fix-scal width 287)
)
)
(command "insert" "a3x" p0 scal scal "")
(tufu-print
(polar p0 (* 1.05 pi) (* 25 scal))
"A3横幅"
scal
)
(setq text-style
(tblobjname "style" (strcat "s-" (rtos scal 2 1)))
)
(tufu-dim scal text-style)
)
(defun tufu-print (pp text scal)
;;文字样式建立,打印比例输出.
;;pp是起点 text 前缀内容 scal 比例
(command "style"
(strcat "s-" (rtos scal 2 1))
"gbcbig.shx"
(rtos (* 2.5 scal) 2 1) ;字体高度2.5
""
""
""
""
""
) ;建立文字样式
(command "text"
pp
""
(strcat text "打印比例 1:" (rtos scal 2 1))
)
)
(defun tufu-dim (scal text-style / dim dim-s)
;;设置标注样式
;;scal 打印比例 text-style 文字样式
;;dim 标注样式符号表的图元名 dim-s 标注样式符号表
(command "dimstyle" "r" "iso-25") ;先恢复iso-25标注样式
(command "dimstyle" "s" (strcat "s-" (rtos scal 2 1)))
;以iso-25样式为模板建立新标注样式
(setq dim (tblobjname "dimstyle" (strcat "s-" (rtos scal 2 1))))
(setq dim-s (subst (cons 340 text-style)
(assoc 340 (entget dim))
(entget dim)
)
)
(entmod dim-s)
(setq dim-s (subst (cons 40 scal) ; 如果iso-25标注样式的全局比例默认为1,则(assoc 40 (entget dim))求值为nil
(assoc 40 (entget dim))
(entget dim)
)
)
(entmod dim-s)
(command "dimstyle" "r" (strcat "s-" (rtos scal 2 1)))
;再次恢复更改后的标注样式,删掉替代样式
)
;;;;;;;;;;;;;;;;;;;;;结束
热门话题 · · · · · · ( 去话题广场 )
- 想做的事,别等“以后”1.0万+篇内容 · 475.0万次浏览
- 让人生变开阔的方法1.0万+篇内容 · 29.6万次浏览
- 重新养一遍自己,可真好啊1882篇内容 · 252.9万次浏览
- 你有哪些“终不似,少年游”的经历?3130篇内容 · 78.9万次浏览
- 我们需要什么样的金钱观教育8713篇内容 · 1.4万次浏览
- 假期必备书影音清单497篇内容 · 33.2万次浏览
- 我的旅行穿搭69篇内容 · 13.9万次浏览
- 我能把生活过得很好4916篇内容 · 966.0万次浏览
终于搞明白了-dimstyle的用法。 先设置各种系统变量,然后s保存。
(defun tufu-dim (scal) ;;设置标注样式 ;;scal 打印比例 (command "dimstyle" "r" "iso-25") ;先恢复iso-25标注样式 (setvar "dimtxt" (* scal 2.5)) (setvar "dimscale" scal) (command "dimstyle" "s" (strcat "s-" (rtos scal 2 1))) )
;;;在模型空间画出图幅框,并设置字体和标注样式 ;;;只需给出图幅框的两个对角点,自动求出比例因子 ;;;支持A4横幅、竖幅和A3横幅的图幅框,取消对图幅框模板的依赖 ;;;编写时间:2013-6-23 ;;;修改时间:2013-6-23 / V1
(defun c:tu-fu-kuang (/ p1 p2 lenth width p0 l/w osmode) (setq osmode (getvar "osmode")) ;保存捕获设置 (setvar "osmode" 0) ;取消捕获 (princ "给出图幅框的两个对角点:") (setq p1 (getpoint "\n第一点:") ;图幅框第一点 p2 (getcorner p1 "") ;第二点 lenth (len p1 p2) ;图幅框水平距离 width (wid p1 p2) ;图幅框竖直距离 p0 (bottom-left p1 p2) ;获得图幅框的左下角点 l/w (/ lenth width)) ;图幅框的长宽比 (command "style" ;设置字体,将来标注样式使用 "Annotative" "gbcbig.shx" 0 ;字体高度为0 "" "" "" "" "") (setvar "celweight" 25) ;设置线宽0.25mm (cond ((<= l/w 1) ;竖幅图纸 (a4y-kuang p0 (max (fix-scal lenth 180) ;在长和宽中选择以较大比例 (fix-scal width 287)))) ;A4竖幅 ((a4x?) ;判断是A4横幅还是A3横幅? (a4x-kuang p0 (max (fix-scal lenth 267) (fix-scal width 200)))) ;A4横幅 (t (a3x-kuang p0 (max (fix-scal lenth 390) (fix-scal width 287)))) ;A3横幅 ) (setvar "celweight" -1) ;设置线宽随层 (setvar "osmode" osmode) ;恢复捕获设置 )
;;;;;;;以下是子函数 (defun a4x? () ;;用户选择以A3还是A4打印 (if (/= (getstring "预计将来以A4纸(横幅)打印?(y/n,选否则以A3纸(横幅)打印。)") "n") t nil))
(defun fix-scal (n1 n2) ;;计算比例因子,只截取1位小数 (cond ((<= n1 n2) 1) ; 图幅框只放大或保持原尺寸,不缩小 (t (/ (fix (* 10 (/ (float n1) n2))) 10.0))))
(defun bottom-left (p1 p2 / p3 p4) ;;p1 p2是对角点 ;;获得p1 p2所在矩形左下角点 (setq p3 (list (car p1) (cadr p2)) p4 (list (car p2) (cadr p1))) (list (min (car p1) (car p2) (car p3) (car p4)) (min (cadr p1) (cadr p2) (cadr p3) (cadr p4))))
(defun len (p1 p2) ;获得对角点水平长度(矩形长) (abs (- (car p1) (car p2)))) (defun wid (p1 p2) ;获得对角点垂直高度(矩形宽) (abs (- (cadr p1) (cadr p2))))
(defun xy-m (xy x-move y-move scale) ;直角坐标系中二维点平移 ;xy是原始点坐标,x-move、y-move是坐标偏移量,scale是比例因子 (mapcar '+ xy (list (* scale x-move) (* scale y-move))))
(defun a4x-kuang (p0 scale / p0- osmode) ;给出左下角点和比例,画出A4横幅图幅框 ;(setq osmode (getvar "osmode")) ;(setvar "osmode" 0) ;设置对象捕获为0 (setq p0- (xy-m p0 -5 -5 scale)) ;p0-是图纸左下边源点 (command "rectang" p0 "d" (* 287 scale) (* 180 scale) (polar p0 (/ pi 4) 10)) (command "rectang" p0- "d" (* 297 scale) (* 210 scale) p0) (command "style" ;建立文字样式 (strcat "s-" (rtos scale 2 1)) "gbcbig.shx" (rtos (* 3 scale) 2 1) "" "" "" "" "") (biao-ti-lan (xy-m p0 287 0 scale) scale) (command "text" p0- "" (strcat "A4横幅 打印比例1:" (rtos scale 2 1))) (tufu-dim scale) ;设置标注样式 ;(setvar "osmode" osmode) ;恢复对象捕获 )
(defun a4y-kuang (p0 scale / p0- osmode) ;给出左下角点和比例,画出A4竖幅图幅框 ;(setq osmode (getvar "osmode")) ;(setvar "osmode" 0) ;设置对象捕获为0 (setq p0- (xy-m p0 -25 -5 scale)) (command "rectang" p0 "d" (* 180 scale) (* 287 scale) (polar p0 (/ pi 4) 10)) (command "rectang" p0- "d" (* 210 scale) (* 297 scale) p0) (command "style" ;建立文字样式 (strcat "s-" (rtos scale 2 1)) "gbcbig.shx" (rtos (* 3 scale) 2 1) "" "" "" "" "") (biao-ti-lan (xy-m p0 180 0 scale) scale) (command "text" p0- "" (strcat "A4竖幅 打印比例1:" (rtos scale 2 1))) (tufu-dim scale) ;设置标注样式 ;(setvar "osmode" osmode) ;恢复对象捕获 )
(defun a3x-kuang (p0 scale / p0- osmode) ;给出左下角点和比例,画出A3横幅图幅框 ;(setq osmode (getvar "osmode")) ; (setvar "osmode" 0) ;设置对象捕获为0 (setq p0- (xy-m p0 -25 -5 scale)) (command "rectang" p0 "d" (* 390 scale) (* 287 scale) (polar p0 (/ pi 4) 10)) (command "rectang" p0- "d" (* 420 scale) (* 297 scale) p0) (command "style" ;建立文字样式 (strcat "s-" (rtos scale 2 1)) "gbcbig.shx" (rtos (* 3 scale) 2 1) "" "" "" "" "") (biao-ti-lan (xy-m p0 390 0 scale) scale) (command "text" p0- "" (strcat "A3横幅 打印比例1:" (rtos scale 2 1))) (tufu-dim scale) ;设置标注样式 ;(setvar "osmode" osmode) ;恢复对象捕获 )
(defun tufu-dim (scale) ;;设置标注样式 ;;scale 打印比例 (command "dimstyle" "r" "iso-25") ;恢复iso-25标注样式,以此为基准 (setvar "dimtxt" 2.5) ;字体标准高度 (setvar "dimtxsty" "Annotative") ;字体名称 (setvar "dimscale" scale) ;全局比例因子 (command "dimstyle" "s" (strcat "s-" (rtos scale 2 1)))) ;保存设置
(defun biao-ti-lan (p1 scale / p2 p3) ;给出右下角点p1和比例scale,画出标题栏 (setq p2 (xy-m p1 -120 8 scale) p3 (xy-m p1 -60 24 scale)) (command "line" (xy-m p1 -120 0 scale) (xy-m p1 -120 32 scale) (xy-m p1 0 32 scale) "") (command "line" (xy-m p1 0 16 scale) (xy-m p1 -120 16 scale) "") (command "line" (xy-m p1 -60 0 scale) (xy-m p1 -60 32 scale) "") (command "line" (xy-m p1 -60 8 scale) p2 "") (command "line" p3 (xy-m p1 -20 24 scale) "") (command "line" (xy-m p1 -20 16 scale) (xy-m p1 -20 32 scale) "") (command "line" (xy-m p1 -45 16 scale) (xy-m p1 -45 32 scale) "") (command "line" (xy-m p1 -80 16 scale) (xy-m p1 -80 0 scale) "") (command "line" (xy-m p1 -105 0 scale) (xy-m p1 -105 16 scale) "") (setvar "celweight" 13) ;设置线宽为0.13mm (command "text" (xy-m p2 3.5 -5.5 scale) "" "审 核") (command "text" (xy-m p2 3.5 2.5 scale) "" "制 图") (command "text" (xy-m p3 3.5 -5.5 scale) "" "材 料") (command "text" (xy-m p3 3.5 2.5 scale) "" "数 量") (command "text" "j" "f" (xy-m p1 -55 6.5 scale) (xy-m p1 -5 6.5 scale) "***************公司"))