明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1123|回复: 3

[讨论] 生成公切线的源码,如何完善?

[复制链接]
发表于 2014-11-11 20:22 | 显示全部楼层 |阅读模式
现有生成任意圆弧公切线的源码,不完美之处在于

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)
   )
)
发表于 2014-11-11 20:48 | 显示全部楼层
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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" "")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


谢谢分享,上面的可以改图层,其它不懂
 楼主| 发表于 2014-11-11 21:16 | 显示全部楼层
换图层暂且搁置

对于生成的公切线有一定距离的目的,我的想法是,如果设置生成公切线后,以公切线的交点为基点,自动缩小公切线的比例0.5,这样,距离就出来了。

程序里面该如何修改?
 楼主| 发表于 2014-11-11 21:18 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 00:00 , Processed in 0.216448 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表