明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: gao6690

[原创]圆弧转多段线

[复制链接]
发表于 2023-5-3 09:52:00 | 显示全部楼层
谁能改为框选
发表于 2023-6-1 12:43:11 | 显示全部楼层
yjtdkj 发表于 2021-6-25 10:36
去掉了command命令,重新写了一遍,速度快多了

有没有多段线转圆弧的插件呢
发表于 2024-9-6 14:28:20 | 显示全部楼层
谢谢楼主分享。
发表于 2024-10-12 22:05:47 | 显示全部楼层
感谢大佬分享
发表于 2025-3-9 12:09:12 | 显示全部楼层
可以试下这个程序,可以多选!
  1. ;;;-----------------------------------------------------
  2. ;;; 功能:批量将圆弧转换为多段线(支持逆向圆弧)
  3. ;;;-----------------------------------------------------

  4. (defun c:ARC2PL ( / *error* acadObj doc ss i ename oldVars h)
  5.   ;; 错误处理函数
  6.   (defun *error* (msg)
  7.     (if doc (vla-endundomark doc))
  8.     (if oldVars (mapcar 'setvar '("CMDECHO" "OSMODE") oldVars))
  9.     (princ (strcat "\n错误: " msg))
  10.   )
  11.   
  12.   (setq acadObj (vlax-get-acad-object)
  13.         doc (vla-get-activedocument acadObj)
  14.         oldVars (list (getvar "CMDECHO") (getvar "OSMODE"))) ; 修正变量存储方式
  15.   
  16.   (setvar "CMDECHO" 0)
  17.   (setvar "OSMODE" 0)
  18.   
  19.   ;; 用户输入弓高(默认0.005)
  20.   (initget 6)
  21.   (setq h (getreal "\n输入弓高精度<0.005>: "))
  22.   (if (not h) (setq h 0.005))
  23.   
  24.   (if (setq ss (ssget '((0 . "ARC"))))
  25.     (progn
  26.       (vla-startundomark doc)
  27.       (setq i 0)
  28.       (repeat (sslength ss)
  29.         (setq ename (ssname ss i))
  30.         (arc->polyline ename h)
  31.         (setq i (1+ i))
  32.       )
  33.       (vla-endundomark doc)
  34.       (princ (strcat "\n成功转换 " (itoa i) " 个圆弧"))
  35.     )
  36.     (princ "\n未选择任何圆弧")
  37.   )
  38.   (mapcar 'setvar '("CMDECHO" "OSMODE") oldVars)
  39.   (princ)
  40. )

  41. ;;;-----------------------------------------------------
  42. ;;; 核心转换函数
  43. ;;; 参数:ename - 圆弧图元名
  44. ;;;       h     - 最大允许弓高
  45. ;;;-----------------------------------------------------
  46. (defun arc->polyline (ename h / elst r pts)
  47.   ;; 获取圆弧关键参数
  48.   (setq elst (entget ename)
  49.         r (cdr (assoc 40 elst)))
  50.   
  51.   ;; 计算顶点列表
  52.   (setq pts (arc-divide ename h r)) ; 增加半径参数传递
  53.   
  54.   ;; 构建多段线数据
  55.   (entmakex
  56.     (append
  57.       (list
  58.         '(0 . "LWPOLYLINE")
  59.         '(100 . "AcDbEntity")
  60.         (assoc 8 elst)   ; 保留图层
  61.         (if (assoc 62 elst) (assoc 62 elst) '(62 . 256)) ; 处理未设置颜色
  62.         (if (assoc 6 elst) (assoc 6 elst) '(6 . "BYLAYER")) ; 处理未设置线型
  63.         '(100 . "AcDbPolyline")
  64.         (cons 90 (length pts))
  65.         '(70 . 0)
  66.         (if (assoc 38 elst) (assoc 38 elst) '(38 . 0.0)) ; 处理标高
  67.         (if (assoc 210 elst) (assoc 210 elst) '(210 (0.0 0.0 1.0))) ; 默认法向量
  68.       )
  69.       (mapcar '(lambda (p) (cons 10 p)) pts) ; 简化坐标处理
  70.     )
  71.   )
  72.   (entdel ename) ; 删除原始圆弧
  73.   (princ)
  74. )

  75. ;;;-----------------------------------------------------
  76. ;;; 圆弧分割算法(修正版)
  77. ;;; 返回顶点坐标列表(包含起点和终点)
  78. ;;;-----------------------------------------------------
  79. (defun arc-divide (ename h r / startParam endParam totalAngle segAngle n pts param)
  80.   (setq startParam (vlax-curve-getStartParam ename)
  81.         endParam (vlax-curve-getEndParam ename)
  82.         totalAngle (abs (- endParam startParam)))
  83.   
  84.   ;; 计算分段数(基于弓高公式)
  85.   (if (> r h)
  86.     (progn
  87.       (setq segAngle (* 2 (acos (/ (- r h) r)))
  88.       (setq n (max (fix (/ totalAngle segAngle)) 1))
  89.       (setq segAngle (/ totalAngle n))
  90.     )
  91.     (setq n 1) ; 处理半径过小的情况
  92.   )
  93.   
  94.   ;; 生成顶点参数表
  95.   (setq pts (list (vlax-curve-getStartPoint ename)))
  96.   (repeat (1- n)
  97.     (setq param (+ startParam (* segAngle (length pts))))
  98.     (setq pts (cons (vlax-curve-getPointAtParam ename param) pts))
  99.   )
  100.   (reverse (cons (vlax-curve-getEndPoint ename) pts))
  101. )

  102. ;;;-----------------------------------------------------
  103. ;;; 辅助函数:反余弦计算(修正括号匹配)
  104. ;;;-----------------------------------------------------
  105. (defun acos (x)
  106.   (cond
  107.     ((>= x 1.0) 0.0)
  108.     ((<= x -1.0) pi)
  109.     (t (atan (sqrt (- 1.0 (* x x))) x)
  110.   )
  111. )

  112. (princ "\n圆弧转多段线命令已加载,请输入 ARC2PL 执行")
  113. (princ)

点评

括号都不匹配  发表于 2025-3-9 12:19
回复 支持 反对

使用道具 举报

发表于 2025-3-9 12:25:16 | 显示全部楼层


  1. (defun c:tt ()
  2.   "圆弧转多段线"
  3.   (princ "\n选择圆弧实体<退出>: ")
  4.   (if (setq ss (ssget '((0 . "arc"))))
  5.     (progn
  6.       (setvar "PEDITACCEPT" 1)
  7.       (command "pedit" "m" ss "" "")
  8.     )
  9.   )
  10.   (princ)
  11. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-1 09:07 , Processed in 0.161533 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表