本帖最后由 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 请选中多段线")
)
)
明明自定义函数给定 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 请选中多段线")
)
)