The Buzzard 发表于 2022-7-6 11:14:04

计算圆弧的凸出度。

我使用了一个具有多段线命令调用的程序来制作弯头。
我将其更改为一个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)
 
我试图弄清楚如何写一个计算,并将其值放入一个变量中,用于此。我假设这是一个三角学问题,对此几乎没有经验。
 
有谁能帮我弄清楚这件事吗?
提前感谢,
秃鹰

wizman 发表于 2022-7-6 11:18:08

凸出是夹角的1/4的切线。正值在方向上为逆时针方向:
 
凸度=tan(ang/4)

The Buzzard 发表于 2022-7-6 11:22:53

 
谢谢wizman!
 
我要试一试。
 
秃鹰

David Bethel 发表于 2022-7-6 11:26:05

这是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)
    )
)
)


 
-大卫

The Buzzard 发表于 2022-7-6 11:29:32

 
 
我也感谢你,大卫。
里面有很多好东西。

wizman 发表于 2022-7-6 11:30:13

从图中可以看出,两者具有相同的凸出值,以计算:
 
切线(90/4)=0.4142(+/-)

The Buzzard 发表于 2022-7-6 11:35:52

 
这是真的wizman,但一个应该是积极的,另一个应该是消极的。
 
 
 
对不起,我在你编辑之前回复了。

wizman 发表于 2022-7-6 11:38:50

没关系Buzz,
 
(defun Tan(X)
(if(zerop(cos X))
(提示“切线错误”)
(/(sin X)(cos X)))
 
(tan(/(/pi 2)4))
=> 0.4142

Lee Mac 发表于 2022-7-6 11:41:31

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))

The Buzzard 发表于 2022-7-6 11:42:42

 
威兹曼,
 
在lisp中进行计算时,角度或ang是否需要用弧度表示?
页: [1] 2
查看完整版本: 计算圆弧的凸出度。