找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 916|回复: 8

[LISP程序]:修改相切圆弧的程序------不妨一试

[复制链接]
发表于 2005-3-5 14:18:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本程序暂时只适于与直线相切的圆弧半径的修改

;|修改相切圆弧的程序----by ljpnb         
    本程序适用于CAD R2002以上,目前只适合于
    与直线相切的圆弧半径的修改            
                                          
命令: MRR                                 
选择一条圆弧:                             
选择一条直线:                             
输入一个基准点:                           
当前的圆弧半径 R=120,请输入一个新的半径值:
                                          
当继续修改前一次修改的圆弧,操作如下      
                                          
命令:MRR                                 
选择一条圆弧:  <直接回车>                 
当前的圆弧半径 R=60,请输入一个新的半径值:
|;

(defun c:mrr ()
  (vl-load-com)
  (if (= (setq ent1 (car (entsel "\n选择一条圆弧: "))) nil)
    (setq ent1 ent6
          P    T
    )
    (setq p nil)
  )
  (redraw ent1 3)
  (if (/= p T)
    (setq ent0 (car (entsel "\n选择一条直线: ")))
    (setq ent0 ent0)
  )
  (redraw ent0 3)
  (setq obj1 (vlax-ename->vla-object ent1))
  (setq r0 (rtos (vla-get-Radius obj1)))
  (setq obj0 (vlax-ename->vla-object ent0))
  (if (/= p T)
    (setq pt0 (getpoint "\n输入一个基准点: "))
    (setq pt0 pt0)
  )
  (setq dis (distance (vlax-curve-getClosestPointTo obj0 pt0 T) pt0))
  (setq
    r (getreal
        (strcat "\n当前的圆弧半径 R=" r0 ",请输入一个新的半径值: ")
      )
  )
  (redraw ent1 4)
  (redraw ent0 4)
  (if (> r dis)
    (progn
      (setq os(getvar "OSMODE"))
      (setvar "cmdecho" 0)
      (command "undo" "g")
      (command "offset" r ent0 pt0 "")
      (setq ent2 (entlast))


      (setq obj2 (vlax-ename->vla-object ent2))
      (setq a-sp (vlax-safearray->list
                   (vlax-variant-value (vla-get-startpoint obj1))
                 )
      )
      (setq a-ep (vlax-safearray->list
                   (vlax-variant-value (vla-get-Endpoint obj1))
                 )
      )
      (setq l-sp (vlax-curve-getStartPoint obj0))
      (setq l-ep (vlax-curve-getEndPoint obj0))
      (setq d1 (distance a-ep l-sp)
            d2 (distance a-ep l-ep)
            d3 (distance a-sp l-sp)
            d4 (distance a-sp l-ep)
      )
      (setvar "osmode" 0)
      (if (or (equal a-sp l-sp 0.001) (equal a-sp l-ep 0.001))
        (progn
          (setq p1 (vlax-curve-getClosestPointTo obj2 a-ep T))
          (setq L1 (distance p1 a-ep))
          (setq l2 (sqrt (- (* r r) (* l1 l1))))
          (if (< d1 d2)
            (setq p0 (polar p1 (angle l-sp l-ep) l2))
            (setq p0 (polar p1 (angle l-ep l-sp) l2))
          )
          (setq point (vlax-curve-getClosestPointTo obj0 p0 T))
          (command "arc" point "e" a-ep "r" r)
          (setq ent6 (entlast))
          (if (< d1 d2)
            (vla-put-startpoint obj0 (vlax-3d-point point))
            (vla-put-endpoint obj0 (vlax-3d-point point))
          )
        )
        (progn
          (setq p1 (vlax-curve-getClosestPointTo obj2 a-sp T))
          (setq L1 (distance p1 a-sp))
          (setq l2 (sqrt (- (* r r) (* l1 l1))))
          (if (< d3 d4)
            (setq p0 (polar p1 (angle l-sp l-ep) l2))
            (setq p0 (polar p1 (angle l-ep l-sp) l2))
          )
          (setq point (vlax-curve-getClosestPointTo obj0 p0 T))
          (command "arc" a-sp "e" point "r" r)
          (setq ent6 (entlast))
          (if (< d3 d4)
            (vla-put-startpoint obj0 (vlax-3d-point point))
            (vla-put-endpoint obj0 (vlax-3d-point point))
          )
        )
      )
      (vla-delete obj2)
      (vla-delete obj1)
      (command "undo" "e")
      (setvar "osmode" OS)
      (setvar "cmdecho" 1)
    )
    (progn
      (setq ent6 ent1)
      (prompt (strcat "\n输入的半径值小于最小半径" (rtos dis)))
    )
  )
  (princ)
)
;;;;程序结束
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-3-6 09:55:29 | 显示全部楼层
帶命令的輸入要5個步驟了. 用起來不是很方便, 你可以改進的, 呵呵

不過我覺的改兩條弧的難度比較的大
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-6 10:41:44 | 显示全部楼层
不知程序用在何处?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-6 11:53:10 | 显示全部楼层
回2楼的问题,当连续第二次修改该相切圆弧时,就不需要再选择圆弧和直线,直接回车就会直接跳到输入新半径值这一步,当然最好是只选择一条圆弧,再输入新半径值就行了,这是最简单的操作,这一点会继续修改程序的。
回3楼的问题,这个程序用在外形设计上,有时候这个相切圆弧的半径需要改大或改小,按正常操作至于超过7步操作,所以我就想弄个程序出来,稍微方便一点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-6 12:24:57 | 显示全部楼层
这个半径改来改去的不方便,能不能直接计算出最小值,给个参考值什么的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-6 12:49:09 | 显示全部楼层
应该就两步
1,选圆弧。2输入半径
搞定
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-6 18:06:12 | 显示全部楼层
最初由 whiteon 发布
[B]这个半径改来改去的不方便,能不能直接计算出最小值,给个参考值什么的? [/B]


这个最小值我不也有提示吗,当输入任一一个比较小的值,比如1,就会有提示出来。

另外狂刀提出的建议,我也早想过,只不过单选圆弧,获取一条要相切的直线有点麻烦,因为如果圆弧的两端都连着一条线,那怎么得到你真正想要的那条相切直线呢,所以最起码需要加一步操作。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-6 22:41:37 | 显示全部楼层
曲线端点的切线方向是可求的,如果这个方向和直线相等or差n×pi就相切
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-7 18:10:17 | 显示全部楼层
最初由 ljpnb 发布
[B]因为如果圆弧的两端都连着一条线,那怎么得到你真正想要的那条相切直线呢,所以最起码需要加一步操作。... [/B]


選靠近的位置
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 23:02 , Processed in 0.437635 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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