乐筑天下

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

[编程交流] 圆角替换所有半径

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 16:43:19 | 显示全部楼层 |阅读模式
我现在正在做一个例程,用另一个半径替换某个图层上每个多段线的半径。例如,假设由于某种原因,项目上的所有2个“半径现在需要变成3”(这发生在停车场项目上)。我最关心的是,如何使函数迭代一条多段线的所有线段,看看它是否有一个特定的半径,然后用另一个半径交换该半径,同时确保绘制的新半径与相邻的两个线段相切。如果不能画出与相邻的两个相切的圆,那么只需要在那里出现一个圆,这样用户就可以去检查他或她想要做什么。到目前为止,我得到的是
  1. (defun c:filletreplace (/ *error* ent ent8)
  2. (defun *error* (msg)
  3.    (if (not
  4.          (member msg '("Function cancelled" "quit / exit abort"))
  5.        )
  6.      (princ (strcat "\nError: " msg))
  7.    )
  8.    (princ)
  9. )
  10. (setq prd (lambda (x) (eq "LWPOLYLINE" (cdr (assoc 0 (entget (car x)))))))
  11. (if (and
  12.        (setq ent
  13.               (car (LM:SelectIf "\nSelect polyline on layer you want to replace radii: " prd entsel nil)
  14.               )
  15.        )
  16.        (filletreplace:settings)
  17.      )
  18.    (progn
  19.      (setq ent8 (cdr (assoc 8 (entget ent)))
  20.            cnt  0
  21.      )
  22.      (setq ss (ssget "_A"
  23.                      (list '(0 . "LWPOLYLINE")
  24.                            (cons 8 ent8)
  25.                      )
  26.               )
  27.      )
  28.      (repeat (sslength ss)
  29. ;;;I am getting stuck here on iterating over the polyline and checking the radius
  30.          (setq cnt (+ cnt 1))
  31.        )
  32.      )
  33.    )
  34. )
  35. (princ)
  36. )
  37. ;;;
  38. (defun filletreplace:settings ()
  39. (setq *filletorigans*
  40.         (cond
  41.           (
  42.            (getreal
  43.              (strcat "\nOriginal radii <"
  44.                      (rtos *filletorigans* 2 2)
  45.                      ">: "
  46.              )
  47.            )
  48.           )
  49.           (*filletorigans*)
  50.         )
  51. )
  52. (setq *filletreplans*
  53.         (cond
  54.           (
  55.            (getreal
  56.              (strcat "\nReplacement radii <"
  57.                      (rtos *filletreplans* 2 2)
  58.                      ">: "
  59.              )
  60.            )
  61.           )
  62.           (*filletreplans*)
  63.         )
  64. )
  65. )
  66. ;;;
  67. ;;---------------------=={ Select if }==----------------------;;
  68. ;;                                                            ;;
  69. ;;  Provides continuous selection prompts until either a      ;;
  70. ;;  predicate function is validated or a keyword is supplied. ;;
  71. ;;------------------------------------------------------------;;
  72. ;;  Author: Lee Mac, Copyright © 2011 - [url="http://www.lee-mac.com"]www.lee-mac.com[/url]       ;;
  73. ;;------------------------------------------------------------;;
  74. ;;  Arguments:                                                ;;
  75. ;;  msg  - prompt string                                      ;;
  76. ;;  pred - optional predicate function [selection list arg]   ;;
  77. ;;  func - selection function to invoke                       ;;
  78. ;;  keyw - optional initget argument list                     ;;
  79. ;;------------------------------------------------------------;;
  80. ;;  Returns:  Entity selection list, keyword, or nil          ;;
  81. ;;------------------------------------------------------------;;
  82. (defun LM:SelectIf (msg pred func keyw / sel)
  83. (setq pred (eval pred))
  84. (while
  85.    (progn (setvar 'ERRNO 0)
  86.           (if keyw
  87.             (apply 'initget keyw)
  88.           )
  89.           (setq sel (func msg))
  90.           (cond
  91.             ((= 7 (getvar 'ERRNO))
  92.              (princ "\nMissed, Try again.")
  93.             )
  94.             ((eq 'STR (type sel))
  95.              nil
  96.             )
  97.             ((vl-consp sel)
  98.              (if (and pred (not (pred sel)))
  99.                (princ "\nInvalid Object Selected.")
  100.              )
  101.             )
  102.           )
  103.    )
  104. )
  105. sel
  106. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:09:07 | 显示全部楼层
这是Alan JT很久以前做的,非常接近您想要的,它通过拖动实时工作,但您应该能够硬编码半径。此外,在pline中,弧被称为凸出。请看lee mac pline info lisp。
 
  1. (defun c:DyF (/ *error* _pnt AT:GetSel vl ov ent plst elst gr sp)
  2. ;; Dynamic Fillet
  3. ;; Alan J. Thompson, 03.07.11 / 03.09.11
  4. (vl-load-com)
  5. (defun *error* (msg)
  6.    (redraw)
  7.    (and vl (mapcar (function setvar) vl ov))
  8.    (and elst (mapcar (function redraw) elst '(4 4)))
  9.    (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,")))
  10.      (princ (strcat "\nError: " msg))
  11.    )
  12. )
  13. (defun _pnt (p) (trans (list (car p) (cadr p)) 0 1))
  14. (defun AT:GetSel (meth msg fnc / ent)
  15.    ;; meth - selection method (entsel, nentsel, nentselp)
  16.    ;; msg - message to display (nil for default)
  17.    ;; fnc - optional function to apply to selected object
  18.    ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
  19.    ;; Alan J. Thompson, 05.25.10
  20.    (setvar 'ERRNO 0)
  21.    (while
  22.      (progn (setq ent (meth (cond (msg)
  23.                                   ("\nSelect object: ")
  24.                             )
  25.                       )
  26.             )
  27.             (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
  28.                   ((eq (type (car ent)) 'ENAME)
  29.                    (if (and fnc (not (fnc ent)))
  30.                      (princ "\nInvalid object!")
  31.                    )
  32.                   )
  33.             )
  34.      )
  35.    )
  36.    ent
  37. )
  38. (if (setq ent
  39.             (car
  40.               (AT:GetSel
  41.                 entsel
  42.                 "\nSelect arc: "
  43.                 (lambda (x)
  44.                   (if (eq "ARC" (cdr (assoc 0 (entget (car x)))))
  45.                     (vl-every (function (lambda (p / ss)
  46.                                           (if (setq ss (ssget "_C" p p '((0 . "LINE"))))
  47.                                             (setq elst (cons (ssname ss 0) elst))
  48.                                           )
  49.                                         )
  50.                               )
  51.                               (setq plst (list (_pnt (vlax-curve-getStartPoint (car x)))
  52.                                                (_pnt (vlax-curve-getEndPoint (car x)))
  53.                                          )
  54.                               )
  55.                     )
  56.                   )
  57.                 )
  58.               )
  59.             )
  60.      )
  61.    (progn
  62.      (setq ov (mapcar (function getvar) (setq vl '("CMDECHO" "FILLETRAD"))))
  63.      (while
  64.        (progn
  65.          (setq gr (grread T 15 0))
  66.          (cond
  67.            ((eq 5 (car gr))
  68.             (redraw)
  69.             (grdraw (setq sp (trans (vlax-curve-getStartPoint ent) 0 1)) (cadr gr) 1 -1)
  70.             (princ
  71.               (strcat "\rFillet radius: "
  72.                       (rtos (setvar 'FILLETRAD (distance sp (cadr gr))))
  73.                       "      "
  74.               )
  75.             )
  76.             (if (vl-cmdf "_.fillet" (list (car elst) (car plst)) (list (cadr elst) (cadr plst)))
  77.               (progn (entdel ent) (setq ent (entlast)))
  78.               T
  79.             )
  80.            )
  81.          )
  82.        )
  83.      )
  84.    )
  85. )
  86. (*error* nil)
  87. (princ)
  88. )
回复

举报

95

主题

477

帖子

383

银币

后起之秀

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

铜币
475
发表于 2022-7-5 17:25:23 | 显示全部楼层
谢谢比格尔的帮助!这看起来是一个很好的起点,所以我将开始处理它。
回复

举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:43:01 | 显示全部楼层
不,谢谢艾伦·J·T。
回复

举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 17:49:16 | 显示全部楼层
事实上,你们都在帮助这里的人方面发挥了作用。
回复

举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 14:26 , Processed in 0.382144 second(s), 63 queries .

© 2020-2025 乐筑天下

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