Lee Mac 发表于 2022-7-6 12:00:12

与两个圆相切的直线

我需要画一条与两个圆相切的线,这些快照让我很难过,但在这里搜索了一下后,我发现了这个Lisp程序的地方。
 
我发现它非常有用,我重写了它,尽管我会为你们发布它
 

(defun c:cam (/ *error* A A1 C1 C2 D L OV P P1 P2 P3 P4 R1 R2 VL)

(defun *error* (msg)
   (and ov (mapcar 'setvar vl ov))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ))

(setq vl '("CMDECHO" "OSMODE") ov (mapcar 'getvar vl))

(if (and (setq c1 (getpoint    "\nPick Center of First Radius: "))
          (setq r1 (getdistc1 "\nEnter First Radius: "))
          (setq c2 (getpoint c1 "\nPick Center of Second Radius: "))
          (setq r2 (getdistc2 "\nEnter Second Radius: ")))
   (progn
   (setq a(angle c1 c2)
         d(distance c1 c2) p (- r1 r2)
         l(sqrt (- (* d d) (* p p))) a1 (atan l p)

         p1 (polar c1 (- a a1) r1)
         p2 (polar p1 (+ (- a a1) (/ pi 2.)) l)
         p3 (polar c1 (+ a a1) r1)
         p4 (polar p3 (- (+ a a1) (/ pi 2.)) l))

   (mapcar 'setvar vl '(0 0))
   (command "_.arc" "_C" c1 p3 p1 "_.arc" "_C" c2 p2 p4)
   (command "_.line" p1 p2 "" "_.line" p3 p4 "")))

(mapcar 'setvar vl ov)
(princ))

   



mdbdesign 发表于 2022-7-6 12:06:11

凉的(这次对话框毫无疑问)-关于交叉线呢?像这样0X0

Diedesigner 发表于 2022-7-6 12:09:24

此工具栏按钮宏工作:^C^C_line tan;\谭;\;

Lee Mac 发表于 2022-7-6 12:11:50

 
没错,我知道有一种快速的方法可以做到这一点,但是,我发现这个特殊的LISP很有用
 
轻微改善?
 

(defun c:cam (/ *error* A A1 C1 C2 D E1 E2 L OV P P1 P2 P3 P4 R1 R2 VL)

(defun *error* (msg)
   (and ov (mapcar 'setvar vl ov))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ))

(setq vl '("CMDECHO" "OSMODE") ov (mapcar 'getvar vl))
(setvar "CMDECHO" 0)

(if (setq c1 (getpoint    "\nPick Center of First Radius: "))
   (progn
   (princ "\nEnter First Radius: ")
   (command "_.circle" "_non" c1 pause)
   (setq r1 (cdr (assoc 40 (entget (setq e1 (entlast))))))
   
   (if (setq c2 (getpoint c1 "\nPick Center of Second Radius: "))
       (progn
         (princ "\nEnter Second Radius: ")
         (command "_.circle" "_non" c2 pause)
         (setq r2 (cdr (assoc 40 (entget (setq e2 (entlast))))))

         (mapcar 'entdel (list e1 e2))
         
         (setq a(angle c1 c2)
               d(distance c1 c2) p (- r1 r2)
               l(sqrt (- (* d d) (* p p))) a1 (atan l p)
               
               p1 (polar c1 (- a a1) r1)
               p2 (polar p1 (+ (- a a1) (/ pi 2.)) l)
               p3 (polar c1 (+ a a1) r1)
               p4 (polar p3 (- (+ a a1) (/ pi 2.)) l))
         
         (mapcar 'setvar vl '(0 0))
         (command "_.arc" "_C" c1 p3 p1 "_.arc" "_C" c2 p2 p4)
         (command "_.line" p1 p2 "" "_.line" p3 p4 "")))))

(mapcar 'setvar vl ov)
(princ))

mdbdesign 发表于 2022-7-6 12:13:28

是的,但我想从李在Lisp程序的选项:P。
用于使用名为CirTools的程序,并最终在2002年版本。它非常方便,希望有一天李能将其用于更高版本:)

Glen Smith 发表于 2022-7-6 12:18:54

当我上课的时候,我需要用(我现在不记得是哪个)棕褐色半径或3点画一个圆。在几次错误的尝试之后,我问我的导师,为什么AuotCAD会如此聪明和逆反,以至于它知道我想要的多个可能的圆中的哪一个,但拒绝绘制它。
 
他的眼睛亮了起来,他说:“让我给你看些东西。”。他提出了一幅题为“阿波罗的问题”的画。当他复习时,我认为用LISP编写代码是一个完美的问题,它涵盖了一些相当复杂的数学和(我假设)相当复杂的编码。也许能够选择你想要相切的对象,然后切换可能的解决方案,直到你得到你想要的。
 
然后我就忘了——直到你发了这个。
 
格伦

David Bethel 发表于 2022-7-6 12:21:55

想到了另一种方法。我只是不知道如何得到正确的膨胀系数-大卫

(initget 7)
(setq r1 (getdist "\nRadius 1:   "))

(initget 7)
(setq r2 (getdist "\nRadius 2:   "))

(initget 7)
(setq d (getdist "\nCL->CL Distance:   "))

(setq delta (- r1 r2)
      h (sqrt (+ (* d d) (* delta delta)))
   a1 (angle '(0 0) (list d (abs delta)))
    ar1 (- pi a1 a1) ; ARC 1 Included Angle
    ar2 (+ pi a1 a1) ; or (- (* pi 2) a1 a1)
    bf1 (* 4 (atan ar1))
    bf2 (* 4 (atan ar2)))

(setq p1 (polar (list 0 0 0) (+ (* pi 0.5) a1) r1)
   p2 (polar (list 0 0 0) (- (* pi 1.5) a1) r1)
   p3 (polar (list d 0 0) (- (* pi 1.5) a1) r2)
   p4 (polar (list d 0 0) (+ (* pi 0.5) a1) r2))

(entmake (list (cons 0 "POLYLINE")(cons 66 1)(cons 10 (list 0 0 0))(cons 70 1)))
(entmake (list (cons 0 "VERTEX")(cons 10 p1)(cons 42 bf1)))
(entmake (list (cons 0 "VERTEX")(cons 10 p2)))
(entmake (list (cons 0 "VERTEX")(cons 10 p3)(cons 42 bf2)))
(entmake (list (cons 0 "VERTEX")(cons 10 p4)))
(entmake (list (cons 0 "SEQEND")))

Lee Mac 发表于 2022-7-6 12:22:45

带凸起:
 
当前仅在零旋转时。

Lee Mac 发表于 2022-7-6 12:27:00

带角度:
 

(defun c:cam2 (/ ANG B1 B2 C1 C2 D DELTA H IANG R1 R2)

(if (setq c1 (getpoint "\nPick Center of First Radius: "))
   (progn
   (initget 7) (setq r1 (getdist c1 "\nRadius 1:   "))

   (if (setq c2 (getpoint c1 "\nPick Center of Second Radius: "))
       (progn
         (initget 7) (setq r2 (getdist c2 "\nRadius 2:   "))

         (setq d (distance c1 c2) delta (- r1 r2)
               h (sqrt (- (* d d) (* delta delta)))

               iang (atan h delta) ang (angle c1 c2)

               b1 (/ (sin (* 0.5 (- pi iang))) (float (cos (* 0.5 (- pi iang)))))
               b2 (/ (sin (* 0.5 iang))      (float (cos (* 0.5 iang)))))

         (entmake (list (cons 0 "POLYLINE") (cons 66 1) (cons 10 (list 0 0 0)) (cons 70 1)))
         
         (entmake (list (cons 0 "VERTEX") (cons 10 (polar c1 (+ ang iang) r1)) (cons 42 b1)))
         (entmake (list (cons 0 "VERTEX") (cons 10 (polar c1 (- ang iang) r1))))
         
         (entmake (list (cons 0 "VERTEX") (cons 10 (polar c2 (- ang iang) r2)) (cons 42 b2)))
         (entmake (list (cons 0 "VERTEX") (cons 10 (polar c2 (+ ang iang) r2))))
         
         (entmake (list (cons 0 "SEQEND")))))))

(princ))

Lee Mac 发表于 2022-7-6 12:29:47

好吧,所以我有点忘乎所以了
 
 
5
页: [1] 2
查看完整版本: 与两个圆相切的直线