明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 323|回复: 2

[讨论] 求多段线弧线结果是错的,忘高人个指正(已解决)

[复制链接]
发表于 2025-11-1 00:11:29 | 显示全部楼层 |阅读模式
10明经币
本帖最后由 yanguangfei 于 2025-11-1 10:26 编辑

明明自定义函数给定 2个坐标和一个凹凸值返回结果是对的,但是程序运行起来就错了





(defun c:tt ( / )
    (setq entity (car(entsel"\n 点选范围线")))
  (setq coors  (MY_GET_VERTEXLIST entity)
               r 0)
  (repeat (length coors)
              (setq zb1 (nth r coors)
                    zb2 (if (nth (1+ r) coors)
                            (nth (1+ r) coors)
                            (car coors)))
    (if (= (caddr zb1) 0.0)
       (setq dist (rtos (distance (list (car zb1) (cadr zb1)) (list (car zb2) (cadr zb2))) 2 2))
       (setq dist (rtos (*q_arcleng zb1 zb2 (caddr zb1)) 2 2))
    )
    (print dist)
           (setq r (1+ r))
)
(princ "\n         --------------------   yse7--------------------")
(princ)
)


(defun MY_GET_VERTEXLIST (entity)
   (setq coords nil)
  (setq dxf (entget entity))
  (setq ii 0)
  (repeat (length dxf)
      (setq zdxf (nth ii dxf))
      (if (= (car zdxf) 10)
          (setq  coords (append coords (list (append (list (car(cdr zdxf)) (cadr(cdr zdxf)) (cdr (nth (+ ii 3) dxf)))))))
      )
   (setq ii (1+ ii))
  )
  coords
)
;;;(*q_arcleng (list 870.6235 1193.4455) (list 873.2281 1190.2837) -0.334331)
;;;弧长度
(defun *q_arcleng (hu-p1 hu-p2 hu-tud / )
  (setq *d1 (/ (distance hu-p1 hu-p2) 2.0))
  (setq *d2 (* *d1 hu-tud))                        ;求弧顶高度
  (setq *an1 (angle hu-p1 hu-p2))
  (setq *p3 (polar hu-p1 *an1 *d1))                ;求直线段p1、p2的中点坐标
  (setq *p4 (polar *p3 (- *an1 (* pi 0.5)) *d2))                ;求曲线段中点坐标
  (setq *an3 (* (atan hu-tud) 2.0))                ;求弧段切线的角度(也是弧段所对圆心角的一半)
  (setq r* (/ *d1 (sin *an3)))        ;求曲线弧对应的圆的半径
  (abs (* 2.0 r* *an3))        ;求弧的长度
)

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

使用道具 举报

发表于 2025-11-1 09:50:55 | 显示全部楼层
打印多段线长度可以这样  
(defun c:tt(/ B DX L PL)
(if (setq pl(car(entsel "\n 请选中多段线")))
(progn
  (vl-cmdf "undo" "be")
  (setq dx(vla-explode (vlax-ename->vla-object pl)))
  (foreach x
    (setq b (vlax-safearray->list (vlax-variant-value dx)))
    (setq l(cons
          (if  (=(vlax-get-property x 'ObjectName) "AcDbArc")
               (vla-get-arclength x)
               (vla-get-length x)
           )
         l)
    )
  )
  (vl-cmdf "undo" "e")
  (vl-cmdf "undo" "")
  (reverse l)
  )
   (princ "\n 请选中多段线")
)   
)

点评

多谢多谢  发表于 2025-11-1 10:22
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 11:39 , Processed in 0.192702 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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