lengxiaxi 发表于 2014-11-27 22:36:02

【有源码】 完善自动公切线 再发帖 带动画

源码来自明经,非原创,旨在分享。

目前的功能:批量为任意弧长的圆弧添加公切线,用于钣金行业标注折弯内尺寸或外尺寸。

需改善的功能:1.生成公切线后,需实现以相交点为基点,缩小0.5倍。
                        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)
   )
)

http://v2.freep.cn/3tb_141127223306oud1512293.gif

lengxiaxi 发表于 2014-11-27 22:39:13

http://v2.freep.cn/3tb_141127223306oud1512293.gif

lengxiaxi 发表于 2014-12-1 21:00:36

enn09 发表于 2014-12-2 09:23:09

不错不错,感谢分享~~~~~~~~~

lengxiaxi 发表于 2014-12-3 10:48:30

有高手完善吗?生成公切线后,再以切线交点为基点缩小0.5倍

caogis 发表于 2015-9-1 07:16:33

机械制图的好程序
页: [1]
查看完整版本: 【有源码】 完善自动公切线 再发帖 带动画