仿Presscad 多段线方向检查
[ 本帖最后由 易云网络 于 2015-5-17 10:49 编辑 ]\n\n[ 本帖最后由 易云网络 于 2015-5-17 10:42 编辑 ]\n\n在这里有几个月了,收集了些函数,拼凑了段效率只有Presscad40%左右的源码,现在发出来希望有朋友用得着,
顺便希望哪位大佬能提高一下效率,
(defun C:sed()
(defun sys_var ()
(setq e_lst (mapcar (function (lambda (n) (list 'setvar n (getvar n))))
'("cecolor" "clayer" "LUPrec" "autosnap" "osmode" "aperture" "hpspace" "hpassoc" "mirrtext" "auprec" "luprec" "dimzin" )))
(defun *error* (msg)(mapcar 'eval e_lst)))
(defun dxf (ent i)
(cond ((= (type ent) 'ename)
(cdr (assoc i (entget ent '("*"))))
)
((= (type ent) 'list)
(cdr (assoc i ent))
)
)
)
(defun ang2rad (ang)
(* pi (/ ang 180.))
)
;返回多义线的各顶点By ;By 无痕
(defun get-pl-pt (e / i v lst)
(setq i -1)
(while (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
(setq lst (cons v lst))
)
(reverse lst)
)
;;8 中点+总长度+角度画直线
(defun Plline (pt Long ang)
(setq pl1 (polar pt (ang2rad ang) (* 0.5 long) ))
(setq pl2 (polar pt (+ pi (ang2rad ang)) (* 0.5 long) ))
(entmake (list (cons 0 "LINE") (cons 10 pl1) (cons 11 pl2)))
)
(defun sed-error (msg) (mapcar 'eval e_lst)
(setq ssb (ssadd))
(while (entnext lastty)
(ssadd(entnext lastty) ssb)
(setq lastty (entnext lastty))
)
(command "erase" ssb "")
(princ)
)
(defun Ptline3j (p1 p2)
(setq ang (angle p2 p1))
;(entmake (list (cons 0 "LINE") (cons 10 p2) (cons 11 (polar p2 ang tt))))
(entmake (list (cons 0 "LINE") (cons 10 p2) (cons 11 (polar p2 (+ 0.5 ang) tt))))
(entmake (list (cons 0 "LINE") (cons 10 p2) (cons 11 (polar p2 (- ang 0.5 ) tt))))
)
(setvar "cmdecho" 0)
(command ".undo" "be")
(sys_var)
(vl-load-com)
(setq
*error* sed-error
ptctr (getvar "viewctr") ; 视口中心点
vph (getvar "viewsize") ; 视口高度(以画图单位计算)
vps (getvar "screensize") ; 视口宽度和高度(以像素为单位)
ratio (/ (car vps) (cadr vps))
vpw (* ratio vph)
ptlb(list (- (car ptctr) (/ vpw 2))(- (cadr ptctr) (/ vph 2)) ); 左下角点
ptrt(list (+ (car ptctr) (/ vpw 2))(+ (cadr ptctr) (/ vph 2)) ); 右上角点
tt (* 0.012 (distance ptlb ptrt))
)
(setq ss (ssget "x" '((0 . "LWPOLYLINE"))))
;(setq ss (ssget '((0 . "*POLYLINE"))))
(setq lastty (entlast));将最后一个图元记录在lastty中
(if (/= ss nil)
(progn
(setq n -1)
(repeat (sslength ss)
(setq ent (ssname ss (setq n (1+ n))))
(setq cx1 (get-pl-pt ent))
(setq p11 (car cx1))
(repeat(1- (dxfent 90))
(setq p1 (car cx1)
p2 (cadr cx1)
cx1 (cdr cx1)
)
(Ptline3j p1 p2)
)
(setq p1 (car cx1)
p2 (cadr cx1))
(if (=p2 nil)
(progn
(entmake (list '(0 . "CIRCLE") (cons 10 p11) (cons 40 tt)))
(Plline p11 (+ tt tt) 45)
(Plline p11 (+ tt tt) -45)
)
(Ptline3j p1 p2)))
(getpoint "\n---- 方向(断点)检查(ShowDir) 按按任意鼠标键:结束:")
;sa是COPY前的选择集,sb是COPY后新生成的选择集
(setq ssb (ssadd))
(while (entnext lastty)
(ssadd(entnext lastty) ssb)
(setq lastty (entnext lastty))
)
(command "erase" ssb "")
(princ)
))) 感谢 易云网络 分享程序!
页:
[1]