计算圆弧的凸出度。
我使用了一个具有多段线命令调用的程序来制作弯头。我将其更改为一个entmake程序,该程序从一条连续多段线生成相同类型的弯头。
下面是从该肘部返回的列表示例。
在下表中,DXF代码42表示圆弧的凸起。
(-1 . <Entity name: 7ef6fe40>)
(0 . "LWPOLYLINE")
(330 . <Entity name: 7ef6dcf8>)
(5 . "A30")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "M-HVAC-SUPP")
(100 . "AcDbPolyline")
(90 . 4)
(70 . 1)
(43 . 0.0)
(38 . 0.0)
(39 . 0.0)
(10 -730.727 -201.462)
(40 . 0.0)
(41 . 0.0)
(42 . 0.414214)
(10 -724.727 -195.462)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(10 -676.727 -195.462)
(40 . 0.0)
(41 . 0.0)
(42 . -0.414214)
(10 -730.727 -249.462)
(40 . 0.0)
(41 . 0.0)
(42 . 0.0)
(210 0.0 0.0 1.0)
我试图弄清楚如何写一个计算,并将其值放入一个变量中,用于此。我假设这是一个三角学问题,对此几乎没有经验。
有谁能帮我弄清楚这件事吗?
提前感谢,
秃鹰
凸出是夹角的1/4的切线。正值在方向上为逆时针方向:
凸度=tan(ang/4)
谢谢wizman!
我要试一试。
秃鹰 这是Duff Kirkland的一些旧东西
; AutoLISP function to convert from Polyline "Bulge" representation
; of an arc to AutoCAD's normal "center, radius, start/end angles"
; form of arc.This function applies the bulge between two adjacent
; vertices.It assumes that global symbols "sp", "ep", and "bulge"
; contain the current vertex (start point), next vertex (end point),
; and bulge, respectively.It sets the appropriate values in global
; symbols "cen", "rad", "sa", and "ea".
; by Duff Kurland - Autodesk, Inc.
; July 7, 1986
(defun cvtbulge (/ cotbce x1 x2 y1 y2 temp)
(setq x1 (carsp) x2 (carep))
(setq y1 (cadr sp) y2 (cadr ep))
(setq cotbce (/ (- (/ 1.0 bulge) bulge) 2.0))
; Compute center point and radius
(setq cen (list (/ (+ x1 x2 (- (* (- y2 y1) cotbce))) 2.0)
(/ (+ y1 y2 (* (- x2 x1) cotbce) ) 2.0))
)
(setq rad (distance cen sp))
; Compute start and end angles
(setq sa(atan (- y1 (cadr cen)) (- x1 (car cen))))
(setq ea(atan (- y2 (cadr cen)) (- x2 (car cen))))
(if (< sa 0.0) ; Eliminate negative angles
(setq sa (+ sa (* 2.0 pi)))
)
(if (< ea 0.0)
(setq ea (+ ea (* 2.0 pi)))
)
(if (< bulge 0.0) ; Swap angles if clockwise
(progn
(setq temp sa)
(setq sa ea)
(setq ea temp)
)
)
)
-大卫
我也感谢你,大卫。
里面有很多好东西。 从图中可以看出,两者具有相同的凸出值,以计算:
切线(90/4)=0.4142(+/-)
这是真的wizman,但一个应该是积极的,另一个应该是消极的。
对不起,我在你编辑之前回复了。 没关系Buzz,
(defun Tan(X)
(if(zerop(cos X))
(提示“切线错误”)
(/(sin X)(cos X)))
(tan(/(/pi 2)4))
=> 0.4142 Bulge带来更多乐趣:
(defun c:bulge (/ *error* ENT GR INDEX OBJ P1 P2 TAN UFLAG )
;; Modification of code by ElpanovEvgeniy, by Lee Mac
(vl-load-com)
(setq *doc* (cond (*doc*) ((vla-get-ActiveDocument (vlax-get-acad-object)))))
(defun *error* (msg)
(and uFlag (vla-EndUndoMark *doc*))
(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
(princ (strcat "\n** Error: " msg " **")))
(princ))
(setq tan '((a) (/ (sin a) (cos a))))
(while
(progn
(setq ent (entsel "\nSelect LWPolyline: "))
(cond ((vl-consp ent)
(if (eq "LWPOLYLINE" (cdr (assoc 0 (entget (car ent)))))
(progn
(setq uFlag (not (vla-StartUndoMark *doc*)))
(setq index (fix (vlax-curve-getParamatPoint (car ent)
(vlax-curve-getClosestPointto (car ent) (cadr ent)))))
(mapcar (function set) '(p1 p2)
(mapcar (function vlax-curve-getPointatParam) (list (car ent) (car ent))
(list index (1+ index))))
(setq obj (vlax-ename->vla-object (car ent)))
(while (= 5 (car (setq gr (grread 't 4 0))))
(vla-SetBulge obj index (tan (/ (- (angle (cadr gr) p2) (angle p1 (cadr gr))) 2.))))
(setq uFlag (vla-EndUndomark *doc*)))
(princ "\n** Object Must be an LWPolyline **"))))))
(princ))
(defun c:cam3 (/ ANG BLG C1 CEN CEN2 CODE DATA DELTA DIS
EN GR IANG LEN LST POLY RAD RAD1 RAD2 TAN)
;; by Lee McDonnell (Lee Mac)~19.12.2009
(vl-load-com)
(if (setq cen (getpoint "\nPick Center of First Radius: "))
(progn
(setq poly (entmakex
(list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 100 "AcDbPolyline")
(cons 90 2)
(cons 70 1)
(cons 10 cen)
(cons 10 (polar cen 0 1.))))
en (reverse
(vl-member-if
(function
(lambda (x)
(= 39 (car x))))
(reverse (entget poly)))))
(princ "\nPick First Radius: ")
(while
(progn
(setq gr (grread 't 15 0) code (car gr) data (cadr gr))
(cond ((and (= 5 code) (listp data))
(setq ang (angle cen data)
dis (distance cen data))
(entmod
(append en
(setq lst
(list
(cons 10 data)
(cons 42 1.)
(cons 10 (polar data (+ ang pi) (* 2. dis)))
(cons 42 1.))))))
((and (= 3 code) (listp data))
(setq en
(append en
(setq lst
(list
(cons 10 data)
(cons 42 1.)
(cons 10 (polar data (+ ang pi) (* 2. dis)))
(cons 42 1.)
(cons 10 data))))
en (reverse
(vl-member-if
(function
(lambda (x)
(= 39 (car x))))
(reverse
(entmod
(subst (cons 90 3) (assoc 90 en) en)))))
rad (distance cen data))
(princ "\nPick Center of Second Radius: ")
(while
(progn
(setq gr (grread 't 15 0) code (car gr) data (cadr gr))
(cond ((and (= 5 code) (listp data))
(setq dis (distance cen data) ang (angle cen data))
(if (< rad dis)
(progn
(setq tan(sqrt (- (* dis dis) (* rad rad)))
iAng (atan tan rad)
blg(/ (sin (* 0.5 (- pi iAng)))
(cos (* 0.5 (- pi iAng)))))
(entmod
(append en
(setq lst
(list
(cons 10 data)
(cons 10 (polar cen (+ ang iAng) rad))
(cons 42 blg)
(cons 10 (polar cen (- ang iAng) rad))))))) t))
((and (= 3 code) (listp data))
(setq dis (distance cen data) ang (angle cen data))
(if (< rad dis)
(progn
(setq tan(sqrt (- (* dis dis) (* rad rad)))
iAng (atan tan rad)
blg(/ (sin (* 0.5 (- pi iAng)))
(cos (* 0.5 (- pi iAng)))))
(setq en
(append en
(list
(cons 10 data)
(cons 10 data)
(cons 10 (polar cen (+ ang iAng) rad))
(cons 42 blg)
(cons 10 (polar cen (- ang iAng) rad)))))
(setq en (reverse
(vl-member-if
(function
(lambda (x)
(= 39 (car x))))
(reverse
(entmod
(subst (cons 90 4) (assoc 90 en) en)))))
cen2 data len (distance cen cen2) ang (angle cen cen2))
(princ "\nPick Second Radius: ")
(while
(progn
(setq gr (grread 't 15 0) code (car gr) data (cadr gr))
(cond ((and (= 5 code) (listp data))
(setq rad2 (distance cen2 data) delta (- rad rad2))
(if (< (abs delta) len)
(progn
(setq tan(sqrt (- (* len len) (* delta delta))) iAng (atan tan delta)
blg1 (/ (sin (* 0.5 (- pi iAng))) (cos (* 0.5 (- pi iAng))))
blg2 (/ (sin (* 0.5 iAng)) (cos (* 0.5 iAng))))
(entmod
(append en
(list
(cons 10 (polar cen(+ ang iAng) rad))
(cons 42 blg1)
(cons 10 (polar cen(- ang iAng) rad))
(cons 10 (polar cen2 (- ang iAng) rad2))
(cons 42 blg2)
(cons 10 (polar cen2 (+ ang iAng) rad2)))))) t))
((and (= 3 code) (listp data)) nil)
(t )))))))
(t )))))
(t ))))))
(princ))
威兹曼,
在lisp中进行计算时,角度或ang是否需要用弧度表示?
页:
[1]
2