与两个圆相切的直线
我需要画一条与两个圆相切的线,这些快照让我很难过,但在这里搜索了一下后,我发现了这个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))
李 凉的(这次对话框毫无疑问)-关于交叉线呢?像这样0X0 此工具栏按钮宏工作:^C^C_line tan;\谭;\;
没错,我知道有一种快速的方法可以做到这一点,但是,我发现这个特殊的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))
是的,但我想从李在Lisp程序的选项:P。
用于使用名为CirTools的程序,并最终在2002年版本。它非常方便,希望有一天李能将其用于更高版本:) 当我上课的时候,我需要用(我现在不记得是哪个)棕褐色半径或3点画一个圆。在几次错误的尝试之后,我问我的导师,为什么AuotCAD会如此聪明和逆反,以至于它知道我想要的多个可能的圆中的哪一个,但拒绝绘制它。
他的眼睛亮了起来,他说:“让我给你看些东西。”。他提出了一幅题为“阿波罗的问题”的画。当他复习时,我认为用LISP编写代码是一个完美的问题,它涵盖了一些相当复杂的数学和(我假设)相当复杂的编码。也许能够选择你想要相切的对象,然后切换可能的解决方案,直到你得到你想要的。
然后我就忘了——直到你发了这个。
格伦 想到了另一种方法。我只是不知道如何得到正确的膨胀系数-大卫
(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")))
带凸起:
当前仅在零旋转时。 带角度:
(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))
好吧,所以我有点忘乎所以了
5
页:
[1]
2