明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: ljpnb

[求助]这个LISP程序如何编写?

  [复制链接]
发表于 2003-10-16 11:08:00 | 显示全部楼层
再写了一下,有两个则画两个,如果切点在延长线上,则不画

  1. (defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
  2.   (setq ax_ent_1 (vlax-ename->vla-object ent1)
  3.         ax_ent_2 (vlax-ename->vla-object ent2)
  4.   )
  5.   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  6.   (setq intpoints (vlax-variant-value intpoints))
  7.   (setq i 0)
  8.   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  9.     (repeat (/ (+ 1
  10.               (- (vlax-safearray-get-u-bound intpoints 1)
  11.                  (vlax-safearray-get-l-bound intpoints 1)
  12.               )
  13.            )
  14.            3
  15.         )
  16.       (setq points (append points (list (list
  17.                       (vlax-safearray-get-element intpoints i)
  18.                       (vlax-safearray-get-element intpoints (+ i 1))
  19.                       (vlax-safearray-get-element intpoints (+ i 2))
  20.                     )))
  21.       )
  22.       (setq i (+ 3 i))
  23.     )
  24.   )
  25.   points
  26. )

  27. (defun c:DrawCircle( / ent pt r entc entl pts i)
  28.   (setq ent (car (entsel "\n选择直线或圆弧...")))
  29.   (setq pt (getpoint "\n输入通过点:"))
  30.   (setq r (getreal "\n输入半径:"))
  31.   (setvar "cmdecho" 0)
  32.   (command "_.circle" pt r)
  33.   (setq entc (entlast))
  34.   (command "_.offset" r ent pt "")
  35.   (setq entl (entlast))
  36.   (setq pts (GetInterpoint entc entl))
  37.   (entdel entc)
  38.   (entdel entl)
  39.   (setq i 0)
  40.   (repeat (length pts)
  41.     (setq pt (nth i pts))
  42.     (command "_.circle" pt r)
  43.     (setq entc (entlast))
  44.     (if (= (length (GetInterpoint entc ent)) 0) (entdel entc))
  45.     (setq i (1+ i))
  46.   )
  47.   (princ)
  48. )
发表于 2003-10-16 11:22:00 | 显示全部楼层
里面的输入为什么要有半径,我操作的时候不行,麻烦大哥再看一下。
  我认为是不能输入半径的,因为目前只知道点和直线或者圆弧的参数。而且要画的圆只有两种情况,而且两种情况的半径应该是相同的,不知道你是否认为还有其他情况。
发表于 2003-10-16 11:30:00 | 显示全部楼层
看看楼主的条件,圆的半径为已知,既然已知就必须提供,所以这里要输入半径。

操作过程为:
选择要与之相切的圆弧或直线,输入需要通过的点,然后输入圆的半径。
如果这个半径小于点到直线或圆弧的距离,则不存在这样的圆。

两种情况就是半径相同,且会交与通过的那点的两个圆。没有其它情况,这是几何知识,你画画就可以知道了
发表于 2003-10-16 11:46:00 | 显示全部楼层
哦,忘记看那个圆半径已知的条件了。呵呵!
发表于 2003-10-16 13:55:00 | 显示全部楼层
仔细看了看图,发现还有一种情况,就是当选择圆弧时,如果通过的在圆弧的外部,而且圆的半径大于圆弧的半径时,就有可能有另一种情况,就是圆包住圆弧也可能相切,且通过指定点。程序作了修正:
  1. (defun GetInterPoint (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
  2.   (setq ax_ent_1 (vlax-ename->vla-object ent1)
  3.         ax_ent_2 (vlax-ename->vla-object ent2)
  4.   )
  5.   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  6.   (setq intpoints (vlax-variant-value intpoints))
  7.   (setq i 0)
  8.   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  9.     (repeat (/ (+ 1
  10.               (- (vlax-safearray-get-u-bound intpoints 1)
  11.                  (vlax-safearray-get-l-bound intpoints 1)
  12.               )
  13.            )
  14.            3
  15.         )
  16.       (setq points (append points (list (list
  17.                       (vlax-safearray-get-element intpoints i)
  18.                       (vlax-safearray-get-element intpoints (+ i 1))
  19.                       (vlax-safearray-get-element intpoints (+ i 2))
  20.                     )))
  21.       )
  22.       (setq i (+ 3 i))
  23.     )
  24.   )
  25.   points
  26. )
  27. (defun Draw(pts r ent / pt entc i)
  28.   (setq i 0)
  29.   (repeat (length pts)
  30.     (setq pt (nth i pts))
  31.     (command "_.circle" pt r)
  32.     (setq entc (entlast))
  33.     (if (= (length (GetInterpoint entc ent)) 0) (entdel entc))
  34.     (setq i (1+ i))
  35.   )
  36. )

  37. (defun c:DrawCircle( / ent pt r entc entl pts rArc ptArc)
  38.   (setq ent (car (entsel "\n选择直线或圆弧...")))
  39.   (setq rArc (cdr (assoc 40 (entget ent))))
  40.   (setq ptArc (cdr (assoc 10 (entget ent))))
  41.   (setq pt (getpoint "\n输入通过点:"))
  42.   (setq r (getreal "\n输入半径:"))
  43.   (if (and (< (distance pt ptArc) rArc) (> r rArc)) (exit))
  44.   (setvar "cmdecho" 0)
  45.   (command "_.circle" pt r)
  46.   (setq entc (entlast))
  47.   (command "_.offset" r ent pt "")
  48.   (setq entl (entlast))
  49.   (if (not (equal entc entl))
  50.     (progn
  51.       (setq pts (GetInterpoint entc entl))
  52.       (entdel entl)
  53.       (Draw pts r ent)
  54.     )
  55.   )
  56.   (if (> r rArc)
  57.     (progn
  58.       (command "_.circle" ptArc (- r rArc))
  59.       (setq entl (entlast))
  60.       (setq pts (GetInterpoint entc entl))
  61.       (Draw pts r ent)
  62.       (entdel entl)
  63.     )
  64.   )
  65.   (entdel entc)
  66.   (princ)
  67. )
发表于 2003-10-16 14:06:00 | 显示全部楼层
我指的可能性就是這些啦.
发表于 2003-10-18 10:58:00 | 显示全部楼层
我是初学者,目前看不懂上面的程序但我觉得有如下几种情况
直线时
1.不交
2.一个切点
3.两个切点
圆弧时
因为可能交在延长线上,应先当作圆

点在圆外,半径增大依次有
1.不交
2.一个切点
3.两个切点
4.一个切点
5.两个切点
点在圆内,半径增大依次有
1.不交
2.一个切点
3.两个切点
4.一个切点
 楼主| 发表于 2003-10-18 22:25:00 | 显示全部楼层
谢谢以上各位的解答!我提得这个问题是实际中经常碰到的问题,解决的办法就是运用尺规作图法,所以我一直就想弄个程序偷懒一下!我对LISP研究不深,还需要各位高手相助!
发表于 2003-10-19 14:04:00 | 显示全部楼层
程序已经给你写出来了啊?不会看不到吧?
发表于 2003-10-21 12:22:00 | 显示全部楼层
;;通过任意一点,与一直线或是圆弧切
;;利用TTR原理只缯画唯一"圆"
;;BY 龙龙仔(LUCAS)
(defun C:T_PT_CIRCLE (/ HOLDOSMODE ENT ENT1 ENT2 ENT3 PTARC PT R SS N)
  (defun DO_IT (FLAG)
    (if        SS
      (progn
        (setq N 0)
        (repeat        (sslength SS)
          (vla-put-visible
            (vlax-ename->vla-object (ssname SS N))
            FLAG
          )
          (setq N (1+ N))
        )
      )
    )
  )
  (setq ENT (car (setq ENT1 (entsel "\n选择直线或圆弧..."))))
  (setq PTARC (cdr (assoc 10 (entget ENT))))
  (setq HOLDOSMODE (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq PT (getpoint "\n输入通过点: "))
  (setq R (getdist PT "\n输入半径: "))
  (setq SS (ssget "C" PT PT))
  (DO_IT :vlax-false)
  (command "_.CIRCLE" PT 1E-50)
  (setq ENT2 (entlast))
  (command "_.CIRCLE" "T" PT (cadr ENT1) R)
  (entdel ENT2)
  (DO_IT :vlax-true)
  (setvar "OSMODE" HOLDOSMODE)
  (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 05:35 , Processed in 0.165406 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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