本帖最后由 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))        ;求弧的长度
)



网友答: 打印多段线长度可以这样  
(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 请选中多段线")
)   
)
  • 上一篇:图块用XC选取的范围图,炸开怎么只保留可见的区
  • 下一篇:没有了