乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 93|回复: 14

[编程交流] 新圆弧尺寸程序

[复制链接]

22

主题

272

帖子

254

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2022-7-6 08:41:33 | 显示全部楼层 |阅读模式
找到了两个执行圆弧标注的例程:
首先-需要选择圆弧,
第二,需要弧、圆上的两点。
可以将两者结合起来:选择弧或选择弧上的两个点,并根据“dimarc.lsp”获得弧尺寸
 
第一个例程:
  1. ;DIMMARC.LSP - Dimension an arc with length, rather than angle
  2. ;(c) 1998 Tee Square Graphics
  3. (defun C:DIMARC (/ arc ent obj l)
  4. (setq cmd (getvar "cmdecho")
  5.        arc (entsel "\nPick ARC to dimension: ")
  6.        ent (entget (car arc))
  7.        obj (cdr (assoc 0 ent)))
  8. (if (= obj "ARC")
  9.    (progn
  10.      (setvar "cmdecho" 1)
  11.      (setq l (* (cdr (assoc 40 ent))
  12.                 (if (minusp (setq l (- (cdr (assoc 51 ent))
  13.                                        (cdr (assoc 50 ent)))))
  14.                   (+ pi pi l) l)))
  15.      (command "_.dimangular" arc "_t" (rtos l))
  16.      (while (= (logand (getvar "cmdactive") 1) 1)
  17.        (command pause))
  18.      (setvar "cmdecho" cmd))
  19.    (alert "Object selected is not an ARC."))
  20. (princ)
  21. )
和秒:
谢谢你。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:49:35 | 显示全部楼层
既然您使用的是ACAD2010,为什么不使用DIMARC命令呢?
回复

使用道具 举报

22

主题

272

帖子

254

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2022-7-6 08:53:55 | 显示全部楼层
Arcdist例程允许选择圆弧或圆上的两点,dimarc没有此选项。现在我们有了将一切结合起来的趋势。。。
为什么不扩展它,使其更有用(IMO)。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:56:42 | 显示全部楼层
 
我只是不明白为什么要创建角度标注来显示弧长。
回复

使用道具 举报

22

主题

272

帖子

254

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2022-7-6 08:59:50 | 显示全部楼层
我认为,因为角度尺寸的形状在视觉上是正确的,可以描述被测物体(圆弧),而不是度打印长度。给我讲道理。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:06:27 | 显示全部楼层
为了好玩。。。
 
  1. (defun c:ArcDim (/ *error* AT:CycleThroughSS p1 ent p2 ss d1 d2)
  2. ;; label Arc with Dimension between two picked points
  3. ;; Alan J. Thompson, 11.14.11
  4. (vl-load-com)
  5. (defun *error* (msg)
  6.    (and ent (redraw ent 4))
  7.    (and *AcadDoc* (vla-endundomark *AcadDoc*))
  8.    (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
  9.      (princ (strcat "\nError: " msg))
  10.    )
  11. )
  12. (defun AT:CycleThroughSS (ss / l i e)
  13.    ;; Cycle through a selection set to choose one
  14.    ;; ss - selection set
  15.    ;; Alan J. Thompson, 03.30.11
  16.    (if (eq (type ss) 'PICKSET)
  17.      (if (eq (setq l (sslength ss)) 1)
  18.        (ssname ss 0)
  19.        (progn (princ "\n<Tab> to cycle through entities: ")
  20.               (redraw (setq e (ssname ss (setq i 0))) 3)
  21.               (while (eq (cadr (grread nil 10)) 9)
  22.                 (mapcar 'redraw (list e (setq e (ssname ss (setq i (rem (1+ i) l))))) '(4 3))
  23.               )
  24.               (redraw e 4)
  25.               e
  26.        )
  27.      )
  28.    )
  29. )
  30. (vla-startundomark
  31.    (cond (*AcadDoc*)
  32.          ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
  33.    )
  34. )
  35. (cond ((not vla-addDimArc) (alert "AutoCAD version not supported!"))
  36.        ((not (setq p1 (getpoint "\nSpecify fist point on arc: "))))
  37.        ((not (setq ent (AT:CycleThroughSS (ssget "_C" p1 p1 '((0 . "ARC"))))))
  38.         (alert "Point must be on arc!")
  39.        )
  40.        ((redraw ent 3))
  41.        ((not (setq p2 (getpoint p1 "\nSpecify other point on arc: "))))
  42.        ((not (and (setq ss (ssget "_C" p2 p2 '((0 . "ARC"))))
  43.                   (vl-some '(lambda (e) (equal ent (cadr e))) (ssnamex ss))
  44.              )
  45.         )
  46.         (alert "Point must be on arc!")
  47.        )
  48.        ((vlax-invoke
  49.           (vlax-get *AcadDoc*
  50.                     (if (eq (getvar 'CVPORT) 1)
  51.                       'Paperspace
  52.                       'Modelspace
  53.                     )
  54.           )
  55.           'addDimArc
  56.           (cdr (assoc 10 (entget ent)))
  57.           (trans p1 1 0)
  58.           (trans p2 1 0)
  59.           (vlax-curve-getPointAtDist
  60.             ent
  61.             (+ (min (setq d1 (vlax-curve-getDistAtPoint ent (trans p1 1 ent)))
  62.                     (setq d2 (vlax-curve-getDistAtPoint ent (trans p2 1 ent)))
  63.                )
  64.                (/ (abs (- d1 d2)) 2.)
  65.             )
  66.           )
  67.         )
  68.        )
  69. )
  70. (*error* nil)
  71. (princ)
  72. )

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:11:24 | 显示全部楼层
 
你可以随心所欲,我不会对任何人大惊小怪的
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:12:17 | 显示全部楼层
好吧,好吧,我就问你。你如何从数学上找到它?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:16:19 | 显示全部楼层
 
但如果修改弧,则会失去关联性,因为文本是覆盖。。。
 
仅供参考,您可以使用DIMARC命令选择两个点:
 
  1. Command: _dimarc
  2. Select arc or polyline arc segment:
  3. Specify arc length dimension location, or [Mtext/Text/Angle/[color=red]Partial[/color]]:
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:24:27 | 显示全部楼层
好吧,我会被诅咒的。忘记我的代码。
仔细想想,这个功能是有意义的,因为它不同于其他Dim*命令。
 
我认为我仍然更喜欢以下功能,但这不是宏的真正原因。。。再一次,我有一个在端点/端点/半径处绘制圆弧的工具,我每天都会使用它。
 
  1. (defun c:ArcDim (/ *error* AT:CycleThroughSS cmd p1 ent p2 ss d1 d2)
  2. ;; label Arc with Dimension between two picked points
  3. ;; Alan J. Thompson, 11.14.11
  4. (vl-load-com)
  5. (defun *error* (msg)
  6.    (and ent (redraw ent 4))
  7.    (and cmd (setvar 'CMDECHO cmd))
  8.    (and *AcadDoc* (vla-endundomark *AcadDoc*))
  9.    (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
  10.      (princ (strcat "\nError: " msg))
  11.    )
  12. )
  13. (defun AT:CycleThroughSS (ss / l i e)
  14.    ;; Cycle through a selection set to choose one
  15.    ;; ss - selection set
  16.    ;; Alan J. Thompson, 03.30.11
  17.    (if (eq (type ss) 'PICKSET)
  18.      (if (eq (setq l (sslength ss)) 1)
  19.        (ssname ss 0)
  20.        (progn (princ "\n<Tab> to cycle through entities: ")
  21.               (redraw (setq e (ssname ss (setq i 0))) 3)
  22.               (while (eq (cadr (grread nil 10)) 9)
  23.                 (mapcar 'redraw (list e (setq e (ssname ss (setq i (rem (1+ i) l))))) '(4 3))
  24.               )
  25.               (redraw e 4)
  26.               e
  27.        )
  28.      )
  29.    )
  30. )
  31. (vla-startundomark
  32.    (cond (*AcadDoc*)
  33.          ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
  34.    )
  35. )
  36. (setq cmd (getvar 'CMDECHO))
  37. (setvar 'CMDECHO 0)
  38. (cond ((not vla-addDimArc) (alert "AutoCAD version not supported!"))
  39.        ((not (setq p1 (getpoint "\nSpecify fist point on arc: "))))
  40.        ((not (setq ent (AT:CycleThroughSS (ssget "_C" p1 p1 '((0 . "ARC"))))))
  41.         (alert "Point must be on arc!")
  42.        )
  43.        ((redraw ent 3))
  44.        ((not (setq p2 (getpoint p1 "\nSpecify other point on arc: "))))
  45.        ((not (and (setq ss (ssget "_C" p2 p2 '((0 . "ARC"))))
  46.                   (vl-some '(lambda (e) (equal ent (cadr e))) (ssnamex ss))
  47.              )
  48.         )
  49.         (alert "Point must be on arc!")
  50.        )
  51.        ((vl-cmdf "_.dimarc" (list ent p1) "_partial" "_non" p1 "_non" p2 PAUSE))
  52. ;;;        ((vlax-invoke
  53. ;;;           (vlax-get *AcadDoc*
  54. ;;;                     (if (eq (getvar 'CVPORT) 1)
  55. ;;;                       'Paperspace
  56. ;;;                       'Modelspace
  57. ;;;                     )
  58. ;;;           )
  59. ;;;           'addDimArc
  60. ;;;           (cdr (assoc 10 (entget ent)))
  61. ;;;           (trans p1 1 0)
  62. ;;;           (trans p2 1 0)
  63. ;;;           (vlax-curve-getPointAtDist
  64. ;;;             ent
  65. ;;;             (+ (min (setq d1 (vlax-curve-getDistAtPoint ent (trans p1 1 ent)))
  66. ;;;                     (setq d2 (vlax-curve-getDistAtPoint ent (trans p2 1 ent)))
  67. ;;;                )
  68. ;;;                (/ (abs (- d1 d2)) 2.)
  69. ;;;             )
  70. ;;;           )
  71. ;;;         )
  72. ;;;        )
  73. )
  74. (*error* nil)
  75. (princ)
  76. )

 
圆弧和圆(无命令)。。。
 
  1. (defun c:ArcDim (/ *error* AT:CycleThroughSS cmd p1 ent p2 ss d1 d2)
  2. ;; label Arc with Dimension between two picked points
  3. ;; Alan J. Thompson, 11.14.11
  4. (vl-load-com)
  5. (defun *error* (msg)
  6.    (and ent (redraw ent 4))
  7. ;;;    (and cmd (setvar 'CMDECHO cmd))
  8.    (and *AcadDoc* (vla-endundomark *AcadDoc*))
  9.    (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
  10.      (princ (strcat "\nError: " msg))
  11.    )
  12. )
  13. (defun AT:CycleThroughSS (ss / l i e)
  14.    ;; Cycle through a selection set to choose one
  15.    ;; ss - selection set
  16.    ;; Alan J. Thompson, 03.30.11
  17.    (if (eq (type ss) 'PICKSET)
  18.      (if (eq (setq l (sslength ss)) 1)
  19.        (ssname ss 0)
  20.        (progn (princ "\n<Tab> to cycle through entities: ")
  21.               (redraw (setq e (ssname ss (setq i 0))) 3)
  22.               (while (eq (cadr (grread nil 10)) 9)
  23.                 (mapcar 'redraw (list e (setq e (ssname ss (setq i (rem (1+ i) l))))) '(4 3))
  24.               )
  25.               (redraw e 4)
  26.               e
  27.        )
  28.      )
  29.    )
  30. )
  31. (vla-startundomark
  32.    (cond (*AcadDoc*)
  33.          ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
  34.    )
  35. )
  36. ;;;  (setq cmd (getvar 'CMDECHO))
  37. ;;;  (setvar 'CMDECHO 0)
  38. (cond ((not vla-addDimArc) (alert "AutoCAD version not supported!"))
  39.        ((not (setq p1 (getpoint "\nSpecify fist point on arc: "))))
  40.        ((not (setq ent (AT:CycleThroughSS (ssget "_C" p1 p1 '((0 . "ARC,CIRCLE"))))))
  41.         (alert "Point must be on arc!")
  42.        )
  43.        ((redraw ent 3))
  44.        ((not (setq p2 (getpoint p1 "\nSpecify other point on arc: "))))
  45.        ((not (and (setq ss (ssget "_C" p2 p2 '((0 . "ARC,CIRCLE"))))
  46.                   (vl-some '(lambda (e) (equal ent (cadr e))) (ssnamex ss))
  47.              )
  48.         )
  49.         (alert "Point must be on arc!")
  50.        )
  51. ;;;        ((vl-cmdf "_.dimarc" (list ent p1) "_partial" "_non" p1 "_non" p2 PAUSE))
  52.        ((vlax-invoke
  53.           (vlax-get *AcadDoc*
  54.                     (if (eq (getvar 'CVPORT) 1)
  55.                       'Paperspace
  56.                       'Modelspace
  57.                     )
  58.           )
  59.           'addDimArc
  60.           (cdr (assoc 10 (entget ent)))
  61.           (trans p1 1 0)
  62.           (trans p2 1 0)
  63.           (vlax-curve-getClosestPointTo
  64.             ent
  65.             (mapcar '(lambda (a b) (/ (+ a b) 2.)) (trans p1 1 ent) (trans p2 1 ent))
  66.           )
  67. ;;;           (vlax-curve-getPointAtDist
  68. ;;;             ent
  69. ;;;             (+ (min (setq d1 (vlax-curve-getDistAtPoint ent (trans p1 1 ent)))
  70. ;;;                     (setq d2 (vlax-curve-getDistAtPoint ent (trans p2 1 ent)))
  71. ;;;                )
  72. ;;;                (/ (abs (- d1 d2)) 2.)
  73. ;;;             )
  74. ;;;           )
  75.         )
  76.        )
  77. )
  78. (*error* nil)
  79. (princ)
  80. )
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 08:53 , Processed in 0.477139 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表