明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: linshiyin2

[基础] [求助]如何画出圆弧的两个切线

    [复制链接]
发表于 2010-6-1 10:21:00 | 显示全部楼层

修改了下6楼的程序,单只能选择圆弧,单常用的多段线,哪位大侠能把多段线里的圆弧也加进去呢?

 

 


(defun C:XNJD (/ p1 p2 p3 p4 p5)
  (setq p1 (entsel "\n选取一段圆弧: ")) ;获取图元名
  (if p1
    (progn
      (setq p0 (entget (car p1)))  ;获取图元表
      (setq p1 (cdr (assoc 0 p0)))        ;获取表的0位置元素即类型ARC
    )
  )
  (if (/= p1 "ARC")
    (prompt "\n选择的不是圆弧,请再试...")
  )
  (setq CEN (cdr (assoc 10 p0)))         ;获取圆弧圆心
  (setq RAD (cdr (assoc 40 p0)))         ;获取圆弧半径
  (setq JDQ (cdr (assoc 50 p0)))         ;获取起始角度
  (setq JDZ (cdr (assoc 51 p0)))         ;获取终止角度

  (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)
    (prompt "\n没有交点...")
   )
 (command "_.line" p1 p5 "")
 (command "_.line" p2 p5 "")

  (princ)
)

发表于 2010-6-1 11:54:00 | 显示全部楼层

你的图是比较理想的情况,实际上圆弧段的两个点不一定是切点。如果是求两个圆弧端点的切线的交点,那么只需要圆心和切点连接,然后转个90°可以求了。如果不是,那如何确定这个切点呢?

发表于 2010-6-1 14:47:00 | 显示全部楼层

一个用于修改特定块属性的程序

方法1:

根据凸度段参数求圆心,由圆心与凸段两个端点求切线交点

方法2:

求凸度段前后两段直段端点,4个端点求交点(可以用数学方法,也可以用 lisp函数 inters)

方法 3:

(vlax-curve-getFirstDeriv curve-obj param)

 

 楼主| 发表于 2010-6-1 14:58:00 | 显示全部楼层
duotu007已经解决了多余的切线部分,哪位大侠能修改成多段线的圆弧。
发表于 2010-6-1 15:52:00 | 显示全部楼层
  1. (defun c:test (/ LAST_OBJ LAST_SE OBJ OBJ_DATA OBJ_DATA_LIST OBJ_I OBJ_NAME)
  2.   (defun XNJD (p0 / CEN JDQ JDZ P1 P2 P3 P4 P5 RAD)
  3.     (setq CEN (cdr (assoc 10 p0))) ;获取圆弧圆心
  4.     (setq RAD (cdr (assoc 40 p0))) ;获取圆弧半径
  5.     (setq JDQ (cdr (assoc 50 p0))) ;获取起始角度
  6.     (setq JDZ (cdr (assoc 51 p0))) ;获取终止角度
  7.     (setq p1 (polar CEN JDQ RAD) ;获取圆弧起始点
  8.    p2 (polar CEN JDZ RAD) ;获取圆弧终止点
  9.    p3 (polar p1 (+ (/ pi 2) JDQ) RAD)
  10.      ;获取起始点切线方向的半径点
  11.    p4 (polar p2 (+ (/ pi 2) JDZ) RAD)
  12.      ;获取终止点切线方向的半径点
  13.    p5 (inters p1 p3 p2 p4 nil) ;切线交点
  14.     )
  15.     (if (not p5)
  16.       (prompt "\n没有交点...")
  17.     )
  18.     (command "_.line" p1 p5 "")
  19.     (command "_.line" p2 p5 "")
  20.   )
  21.   
  22.   (setq obj (ssget '((0 . "*POLYLINE"))))
  23.   (if obj
  24.     (progn
  25.       (setq last_obj (ssget "p"))
  26.       (setq obj_data_list '())
  27.       (command "_undo" "mark")
  28.       (command "_explode" obj)
  29.       (setq last_se (ssget "p"))
  30.       (if (not (eq last_se last_obj))
  31. (progn
  32.    (setq obj_i -1)
  33.    (repeat (sslength last_se)
  34.      (setq obj_name (ssname last_se (setq obj_i (1+ obj_i))))
  35.      (setq obj_data (entget obj_name))
  36.      (if (= (cdr (assoc 0 obj_data)) "ARC")
  37.        (progn
  38.   (setq obj_data_list
  39.          (append (list obj_data) obj_data_list)
  40.   )
  41.        )
  42.      )
  43.      )
  44.    )
  45. )
  46.       (command "_undo" "back")
  47.       (if obj_data_list
  48. (progn
  49.    (foreach i obj_data_list
  50.      (XNJD i)
  51.      )
  52.    )
  53. )
  54.       )
  55.     )
  56.   (princ)
  57.   )
 楼主| 发表于 2010-6-1 15:57:00 | 显示全部楼层
楼上的可用,我刚想把我的写出来呢,你比我快
发表于 2016-8-6 23:06:13 | 显示全部楼层
不错,炸开之后,获取圆弧的属性
发表于 2023-10-3 19:33:29 | 显示全部楼层
正是我想要的,赞一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 07:31 , Processed in 0.192090 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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