生成公切线的源码,如何完善?
现有生成任意圆弧公切线的源码,不完美之处在于1,生成的圆弧 其端点连接于圆弧切点上===》需要达到,离切点有一定距离的效果。
2.生成的公切线位于当前图层=====》无论当前在哪个图层,生成公切线后自动转入 MARK图层
如何改?源码如下:
(defun c:nr (/ last_obj last_se obj obj_data obj_data_list obj_i obj_name n plst ss var1 var2 )
(princ "\n<----圆弧切线---->")
(princ "\n请选择圆弧,多段线/<退出>...")
(setq var1 (getvar "cmdecho"))
(setq var2 (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq n 0)
(setq obj (ssget '((0 . "*POLYLINE,ARC"))))
(if obj
(repeat (sslength obj)
(setq ent (entget (ssname obj n)))
(if (= (cdr (assoc 0 ent)) "ARC")
(progn
(setq plst (sys_get_pt_arc_tan ent))
(command "_.line" (car plst)(caddr plst) "")
(command "_.line" (cadr plst) (caddr plst) "")
)
)
(if (= (cdr (assoc 0 ent)) "LWPOLYLINE")
(progn
(setq last_obj (ssget "p"))
(setq obj_data_list '())
(setq ss (ssadd (ssname obj n)))
(command "_undo" "mark")
(command "_explode" ss)
(setq last_se (ssget "p"))
(if (not (eq last_se last_obj))
(progn
(setq obj_i -1)
(repeat (sslength last_se)
(setq obj_name (ssname last_se (setq obj_i (1+ obj_i))))
(setq obj_data (entget obj_name))
(if (= (cdr (assoc 0 obj_data)) "ARC")
(setq obj_data_list (append (list obj_data) obj_data_list))
)
)
)
)
(command "_undo" "back")
(if obj_data_list
(foreach i obj_data_list
(setq plst (sys_get_pt_arc_tan i))
(command "_.line" (car plst)(caddr plst) "")
(command "_.line" (cadr plst) (caddr plst) "")
)
)
)
)
(setq n (+ n 1))
)
)
(setvar "cmdecho" var1)
(setvar "osmode" var2)
(princ)
)
(defun sys_get_pt_arc_tan (ent / cen jdq jdz p1 p2 p3 p4 p5 rad)
(setq cen (cdr (assoc 10 ent)));获取圆弧圆心
(setq rad (cdr (assoc 40 ent)));获取圆弧半径
(setq jdq (cdr (assoc 50 ent)));获取起始角度
(setq jdz (cdr (assoc 51 ent)));获取终止角度
(setq p1 (polar cen jdq rad);获取圆弧起始点
p2 (polar cen jdz rad);获取圆弧终止点
p3 (polar p1 (+ (/ pi 2) jdq) rad);获取起始点切线方向的半径点
p4 (polar p2 (+ (/ pi 2) jdz) rad);获取终止点切线方向的半径点
p5 (inters p1 p3 p2 p4 nil);切线交点
)
(if (not p5)
(princ "\n切线无交点...")
(list p1 p2 p5)
)
) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq la (getvar"clayer"))
(if (not (tblsearch "layer" "MARK"))
(command "layer" "m" "MARK" "" "" "clayer" la))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(command "_.line" (car plst)(caddr plst) "")
(command "chprop" (entlast) "" "p" "la" "MARK" "")
(command "_.line" (cadr plst) (caddr plst) "")
(command "chprop" (entlast) "" "p" "la" "MARK" "")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
谢谢分享,上面的可以改图层,其它不懂 换图层暂且搁置
对于生成的公切线有一定距离的目的,我的想法是,如果设置生成公切线后,以公切线的交点为基点,自动缩小公切线的比例0.5,这样,距离就出来了。
程序里面该如何修改?http://a3.qpic.cn/psb?/V121sF4C0xE1F5/oSo6w7259MmgdjCHHrcHbwp446KBl4v9b1U5AIkQDrI!/b/dPGcHebeMAAA&bo=4gJ5AQAAAAAFB7w!&rf=viewer_4 http://v1.freep.cn/110_3tb_141111211735nppn512293.jpg
页:
[1]