mdbdesign 发表于 2022-7-6 08:41:33

新圆弧尺寸程序

找到了两个执行圆弧标注的例程:
首先-需要选择圆弧,
第二,需要弧、圆上的两点。
可以将两者结合起来:选择弧或选择弧上的两个点,并根据“dimarc.lsp”获得弧尺寸
 
第一个例程:
;DIMMARC.LSP - Dimension an arc with length, rather than angle
;(c) 1998 Tee Square Graphics

(defun C:DIMARC (/ arc ent obj l)
(setq cmd (getvar "cmdecho")
       arc (entsel "\nPick ARC to dimension: ")
       ent (entget (car arc))
       obj (cdr (assoc 0 ent)))
(if (= obj "ARC")
   (progn
   (setvar "cmdecho" 1)
   (setq l (* (cdr (assoc 40 ent))
                (if (minusp (setq l (- (cdr (assoc 51 ent))
                                       (cdr (assoc 50 ent)))))
                  (+ pi pi l) l)))
   (command "_.dimangular" arc "_t" (rtos l))
   (while (= (logand (getvar "cmdactive") 1) 1)
       (command pause))
   (setvar "cmdecho" cmd))
   (alert "Object selected is not an ARC."))
(princ)
)和秒:
谢谢你。

Lee Mac 发表于 2022-7-6 08:49:35

既然您使用的是ACAD2010,为什么不使用DIMARC命令呢?

mdbdesign 发表于 2022-7-6 08:53:55

Arcdist例程允许选择圆弧或圆上的两点,dimarc没有此选项。现在我们有了将一切结合起来的趋势。。。
为什么不扩展它,使其更有用(IMO)。

Lee Mac 发表于 2022-7-6 08:56:42

 
我只是不明白为什么要创建角度标注来显示弧长。

mdbdesign 发表于 2022-7-6 08:59:50

我认为,因为角度尺寸的形状在视觉上是正确的,可以描述被测物体(圆弧),而不是度打印长度。给我讲道理。

alanjt 发表于 2022-7-6 09:06:27

为了好玩。。。
 
(defun c:ArcDim (/ *error* AT:CycleThroughSS p1 ent p2 ss d1 d2)
;; label Arc with Dimension between two picked points
;; Alan J. Thompson, 11.14.11

(vl-load-com)

(defun *error* (msg)
   (and ent (redraw ent 4))
   (and *AcadDoc* (vla-endundomark *AcadDoc*))
   (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
   (princ (strcat "\nError: " msg))
   )
)

(defun AT:CycleThroughSS (ss / l i e)
   ;; Cycle through a selection set to choose one
   ;; ss - selection set
   ;; Alan J. Thompson, 03.30.11
   (if (eq (type ss) 'PICKSET)
   (if (eq (setq l (sslength ss)) 1)
       (ssname ss 0)
       (progn (princ "\n<Tab> to cycle through entities: ")
            (redraw (setq e (ssname ss (setq i 0))) 3)
            (while (eq (cadr (grread nil 10)) 9)
                (mapcar 'redraw (list e (setq e (ssname ss (setq i (rem (1+ i) l))))) '(4 3))
            )
            (redraw e 4)
            e
       )
   )
   )
)


(vla-startundomark
   (cond (*AcadDoc*)
         ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
   )
)

(cond ((not vla-addDimArc) (alert "AutoCAD version not supported!"))
       ((not (setq p1 (getpoint "\nSpecify fist point on arc: "))))
       ((not (setq ent (AT:CycleThroughSS (ssget "_C" p1 p1 '((0 . "ARC"))))))
      (alert "Point must be on arc!")
       )
       ((redraw ent 3))
       ((not (setq p2 (getpoint p1 "\nSpecify other point on arc: "))))
       ((not (and (setq ss (ssget "_C" p2 p2 '((0 . "ARC"))))
                  (vl-some '(lambda (e) (equal ent (cadr e))) (ssnamex ss))
             )
      )
      (alert "Point must be on arc!")
       )
       ((vlax-invoke
          (vlax-get *AcadDoc*
                  (if (eq (getvar 'CVPORT) 1)
                      'Paperspace
                      'Modelspace
                  )
          )
          'addDimArc
          (cdr (assoc 10 (entget ent)))
          (trans p1 1 0)
          (trans p2 1 0)
          (vlax-curve-getPointAtDist
            ent
            (+ (min (setq d1 (vlax-curve-getDistAtPoint ent (trans p1 1 ent)))
                  (setq d2 (vlax-curve-getDistAtPoint ent (trans p2 1 ent)))
               )
               (/ (abs (- d1 d2)) 2.)
            )
          )
      )
       )
)

(*error* nil)
(princ)
)
 
我知道李会因为我用vlax曲线*函数来找到中点而大惊小怪,但我记不起数学,而且我有懒惰的习惯。

Lee Mac 发表于 2022-7-6 09:11:24

 
你可以随心所欲,我不会对任何人大惊小怪的

alanjt 发表于 2022-7-6 09:12:17

好吧,好吧,我就问你。你如何从数学上找到它?

Lee Mac 发表于 2022-7-6 09:16:19

 
但如果修改弧,则会失去关联性,因为文本是覆盖。。。
 
仅供参考,您可以使用DIMARC命令选择两个点:
 
Command: _dimarc
Select arc or polyline arc segment:
Specify arc length dimension location, or Partial]:

alanjt 发表于 2022-7-6 09:24:27

好吧,我会被诅咒的。忘记我的代码。
仔细想想,这个功能是有意义的,因为它不同于其他Dim*命令。
 
我认为我仍然更喜欢以下功能,但这不是宏的真正原因。。。再一次,我有一个在端点/端点/半径处绘制圆弧的工具,我每天都会使用它。
 
(defun c:ArcDim (/ *error* AT:CycleThroughSS cmd p1 ent p2 ss d1 d2)
;; label Arc with Dimension between two picked points
;; Alan J. Thompson, 11.14.11

(vl-load-com)

(defun *error* (msg)
   (and ent (redraw ent 4))
   (and cmd (setvar 'CMDECHO cmd))
   (and *AcadDoc* (vla-endundomark *AcadDoc*))
   (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
   (princ (strcat "\nError: " msg))
   )
)

(defun AT:CycleThroughSS (ss / l i e)
   ;; Cycle through a selection set to choose one
   ;; ss - selection set
   ;; Alan J. Thompson, 03.30.11
   (if (eq (type ss) 'PICKSET)
   (if (eq (setq l (sslength ss)) 1)
       (ssname ss 0)
       (progn (princ "\n<Tab> to cycle through entities: ")
            (redraw (setq e (ssname ss (setq i 0))) 3)
            (while (eq (cadr (grread nil 10)) 9)
                (mapcar 'redraw (list e (setq e (ssname ss (setq i (rem (1+ i) l))))) '(4 3))
            )
            (redraw e 4)
            e
       )
   )
   )
)


(vla-startundomark
   (cond (*AcadDoc*)
         ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
   )
)

(setq cmd (getvar 'CMDECHO))
(setvar 'CMDECHO 0)

(cond ((not vla-addDimArc) (alert "AutoCAD version not supported!"))
       ((not (setq p1 (getpoint "\nSpecify fist point on arc: "))))
       ((not (setq ent (AT:CycleThroughSS (ssget "_C" p1 p1 '((0 . "ARC"))))))
      (alert "Point must be on arc!")
       )
       ((redraw ent 3))
       ((not (setq p2 (getpoint p1 "\nSpecify other point on arc: "))))
       ((not (and (setq ss (ssget "_C" p2 p2 '((0 . "ARC"))))
                  (vl-some '(lambda (e) (equal ent (cadr e))) (ssnamex ss))
             )
      )
      (alert "Point must be on arc!")
       )
       ((vl-cmdf "_.dimarc" (list ent p1) "_partial" "_non" p1 "_non" p2 PAUSE))
;;;      ((vlax-invoke
;;;         (vlax-get *AcadDoc*
;;;                     (if (eq (getvar 'CVPORT) 1)
;;;                     'Paperspace
;;;                     'Modelspace
;;;                     )
;;;         )
;;;         'addDimArc
;;;         (cdr (assoc 10 (entget ent)))
;;;         (trans p1 1 0)
;;;         (trans p2 1 0)
;;;         (vlax-curve-getPointAtDist
;;;             ent
;;;             (+ (min (setq d1 (vlax-curve-getDistAtPoint ent (trans p1 1 ent)))
;;;                     (setq d2 (vlax-curve-getDistAtPoint ent (trans p2 1 ent)))
;;;                )
;;;                (/ (abs (- d1 d2)) 2.)
;;;             )
;;;         )
;;;         )
;;;      )
)

(*error* nil)
(princ)
)

 
圆弧和圆(无命令)。。。
 
(defun c:ArcDim (/ *error* AT:CycleThroughSS cmd p1 ent p2 ss d1 d2)
;; label Arc with Dimension between two picked points
;; Alan J. Thompson, 11.14.11

(vl-load-com)

(defun *error* (msg)
   (and ent (redraw ent 4))
;;;    (and cmd (setvar 'CMDECHO cmd))
   (and *AcadDoc* (vla-endundomark *AcadDoc*))
   (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
   (princ (strcat "\nError: " msg))
   )
)

(defun AT:CycleThroughSS (ss / l i e)
   ;; Cycle through a selection set to choose one
   ;; ss - selection set
   ;; Alan J. Thompson, 03.30.11
   (if (eq (type ss) 'PICKSET)
   (if (eq (setq l (sslength ss)) 1)
       (ssname ss 0)
       (progn (princ "\n<Tab> to cycle through entities: ")
            (redraw (setq e (ssname ss (setq i 0))) 3)
            (while (eq (cadr (grread nil 10)) 9)
                (mapcar 'redraw (list e (setq e (ssname ss (setq i (rem (1+ i) l))))) '(4 3))
            )
            (redraw e 4)
            e
       )
   )
   )
)


(vla-startundomark
   (cond (*AcadDoc*)
         ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
   )
)

;;;(setq cmd (getvar 'CMDECHO))
;;;(setvar 'CMDECHO 0)

(cond ((not vla-addDimArc) (alert "AutoCAD version not supported!"))
       ((not (setq p1 (getpoint "\nSpecify fist point on arc: "))))
       ((not (setq ent (AT:CycleThroughSS (ssget "_C" p1 p1 '((0 . "ARC,CIRCLE"))))))
      (alert "Point must be on arc!")
       )
       ((redraw ent 3))
       ((not (setq p2 (getpoint p1 "\nSpecify other point on arc: "))))
       ((not (and (setq ss (ssget "_C" p2 p2 '((0 . "ARC,CIRCLE"))))
                  (vl-some '(lambda (e) (equal ent (cadr e))) (ssnamex ss))
             )
      )
      (alert "Point must be on arc!")
       )
;;;      ((vl-cmdf "_.dimarc" (list ent p1) "_partial" "_non" p1 "_non" p2 PAUSE))
       ((vlax-invoke
          (vlax-get *AcadDoc*
                  (if (eq (getvar 'CVPORT) 1)
                      'Paperspace
                      'Modelspace
                  )
          )
          'addDimArc
          (cdr (assoc 10 (entget ent)))
          (trans p1 1 0)
          (trans p2 1 0)
          (vlax-curve-getClosestPointTo
            ent
            (mapcar '(lambda (a b) (/ (+ a b) 2.)) (trans p1 1 ent) (trans p2 1 ent))
          )
;;;         (vlax-curve-getPointAtDist
;;;             ent
;;;             (+ (min (setq d1 (vlax-curve-getDistAtPoint ent (trans p1 1 ent)))
;;;                     (setq d2 (vlax-curve-getDistAtPoint ent (trans p2 1 ent)))
;;;                )
;;;                (/ (abs (- d1 d2)) 2.)
;;;             )
;;;         )
      )
       )
)

(*error* nil)
(princ)
)

页: [1] 2
查看完整版本: 新圆弧尺寸程序