cass下的lisp编程技术和应用:(交流贴)
本帖最后由 mandala 于 2013-11-19 15:27 编辑开个贴,大家交流下cass9.1下的编程和应用心得。其实对lisp编程来说,cass9.1还是cass7.0几乎没有什么差别。
我先来问两个问题:
1、为什么cass9.1下,按键盘的“5”(无论大键盘还是小键盘)都会重复上一条cass命令?如果打开cass直接按“5”,那么进入的是"DD"这个程序,如果用工具画了个符号(如路灯)后,那么按“5”就重复画路灯的命令。但是cad内部命令如“pl”等不会重复。我单位所有cass都出现这个情况。
2、cass右侧菜单里“常用文字”一栏里边的文字(如“水泥”,“混”,“塘”等),默认宽高比是0.8,如何更改使它们的宽高比永远为1?
抛砖引玉,贴一个框选dwg中的线,将其变全部为cass下带编码的线型的lisp,可以将LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC,circle,统一变成LWPOLYLINE :
注意:1、该lisp需要cad下的express工具集支持,如没安装express无法工作;
2、该命令只列出了变更陡坎的命令。如果大家觉得有用,可以参照(c:dk)里的方式自行添加变更其它线型的命令。
(defun c:dk ()
(setvar "CMDECHO" 0)
(ltlx "10421" "dmtz" "204201" "0")
) ;_ 结束defun
;给选择集中的多义线加层、线型、编码、宽度
(defun ltlx ( lt1 ly1 bm1 wide / ss ent num ss1)
(if (cadr (ssgetfirst))
(setq ss (ssget))
(setq
ss (ssget'((0 . "LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC,CIRCLE"))
) ;_ 结束ssget
) ;_ 结束setq
) ;_ 结束if
(setq ss (connectbypline ss))
(if (null(tblsearch "ltype" lt1))(command ".linetype" "l" lt1 "acadiso.lin" "" ))
(command "change" ss "" "p" "lt" lt1 "")
(command "change" ss "" "p" "la" ly1 "")
(command "._pedit" "m" ss "" "w" wide "")
(setq num 0 )
(repeat (sslength ss)
(setq ent (ssnamess num))
(entmod (append (entget ent) (list (append (list -3) (list (append '("south") (list(cons 1000 bm1))))))))
(setq num (1+ num))
)
(princ)
) ;_ 结束defun
;;子程序,将输入选择集ssp中的LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC,circle,统一变成LWPOLYLINE,
;;如果其中有首尾相连的线,则连接成一条LWPOLYLINE,
;;最后返回一个名为xss的选择集。
(defun connectbypline (ssp / a xss xn ent)
(acet-autoload2 '("FLATTENSUP.LSP" (acet-flatn ss hide)))
;;加载flatten函数
(setqa 0
xss (ssadd)
) ;_ 结束setq
(if
(and (= (sslength ssp) 1)
(or (= (cdr (assoc 0 (entget (ssname ssp 0)))) "LWPOLYLINE")
(= (cdr (assoc 0 (entget (ssname ssp 0)))) "POLYLINE")
) ;_ 结束or
) ;_ 结束and
(ssadd (ssname ssp 0) xss)
;;当选中的仅有一条pline的时候另作处理。
(progn
;;如果有很多图元的话,全部变成pline并加入选择集xss:
(repeat (sslength ssp)
(setq xn (ssname ssp a))
(setq ent (entget xn))
(cond
((= (cdr (assoc 0 ent)) "LWPOLYLINE")
(ssadd xn xss)
)
((= (cdr (assoc 0 ent)) "POLYLINE")
(ssadd xn xss)
)
((= (cdr (assoc 0 ent)) "LINE")
(command "pedit" xn "y" "")
(setq xn (entlast))
(ssadd xn xss)
)
((= (cdr (assoc 0 ent)) "SPLINE")
(setq ss (ssadd))
(ssadd xn ss)
(acet-flatn ss nil)
(setq xn (entlast))
(ssadd xn xss)
)
((= (cdr (assoc 0 ent)) "ARC")
(command "pedit" xn "y" "")
(setq xn (entlast))
(ssadd xn xss)
)
((= (cdr (assoc 0 ENT)) "CIRCLE")
;;圆的处理比较复杂
(setq cp (cdr (assoc 10 ent))
r(cdr (assoc 40 ent))
) ;_ 结束setq
(entmake
(setq lst(list
'(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(67 . 0)
'(410 . "Model")
'(100 . "AcDbPolyline")
'(90 . 2)
'(70 . 129)
(cons 10 (polar cp 0 r))
'(40 . 0)
'(41 . 0)
'(42 . -1)
(cons 10 (polar cp pi r))
'(40 . 0)
'(41 . 0)
'(42 . -1)
) ;list
) ;setq
) ;entmake
(command "_matchprop" xn (entlast) "")
(entdel xn)
(setq xn (entlast))
(ssadd xn xss)
)
) ;cond
(setq a (+ a 1))
) ;repeat,以上将每个图元都变成pline并加入了选择集。
(command "pedit" "m" xss "" "j" 0.1 "") ;;把能连的连上。
(command "._pedit" "m" xss "" "l" "on" "");;重新生成多义线,使得线型连贯。
(setq xss xss)
) ;progn
) ;if
) ;_ 结束defun 楼主,有没有cass里提取横断面的程序 没有。我主要搞地籍测绘,不用横断面。 谢谢楼主的分享与交流 宽高比的修改:将cass图打开--->文件--->cass参数配置中修改 交流下cass9.1下的编程和应用心得
楼主是不是先放出吸引人的好贴或好代码?
本帖最后由 mandala 于 2013-11-19 15:28 编辑
461045462 发表于 2013-11-18 16:43 static/image/common/back.gif
宽高比的修改:将cass图打开--->文件--->cass参数配置中修改
嗯知道了,谢谢。
对于第一个问题我的表述不够清楚,是这样的:
为什么cass9.1下,按键盘的“5”(无论大键盘还是小键盘)都会重复上一条cass命令?如果打开cass直接按“5”,那么进入的是"DD"这个程序,如果用工具画了个符号(如路灯)后,那么按“5”就重复画路灯的命令。但是cad内部命令如“pl”等不会重复。我单位所有cass都出现这个情况。 非常感谢了。很详细啊! 楼主,是不是关于cass9.0中一些新的功能利用lisp来实现,这样就可以替代cass9.0的功能了, 没看明白要表达啥,cass中命令S好像就能解决
页:
[1]