本帖最后由 hubeiwdlue 于 2026-1-12 12:50 编辑
选择一条直线或多段线,输入长度,将修改直线或多段线端线段的长度为指定值。根据选择点到起点、终点距离判定修改的方向。
 - (defun c:tt (/ ang dxf en en-co en-qd ent en-zd index1 index2 newlength newpoint obj pt pt1 pt2 pt-nx pt-xg vb_new1 wdl_3d->2d)
- ;3维坐标转2维,chaoyin提供
- (defun wdl_3d->2d (L)
- (mapcar '+ L '(0.0 0.0))
- )
- ; main
- (setvar "cmdecho" 0)
- (command "_.undo" "_begin");;定义撤销开始处
- (if (and (setq en (entsel "\n选择一条直线或多段线: "))
- (setq ent (car en)
- pt (cadr en))
- )
- (progn
- (setq dxf (entget ent))
- (cond
- ((eq (cdr (assoc 0 dxf)) "LINE")
- (setq newLength (getreal "\n输入新的长度: "))
- (setq pt1 (wdl_3d->2d(cdr (assoc 10 dxf))) pt2 (wdl_3d->2d(cdr (assoc 11 dxf))))
- (if (> (distance pt1 pt) (distance pt2 pt))
- (progn
- (setq ang (angle pt1 pt2))
- (setq newPoint (polar pt1 ang newLength))
- (entmod (subst (cons 11 newPoint) (assoc 11 dxf) dxf))
- )
- (progn
- (setq ang (angle pt2 pt1))
- (setq newPoint (polar pt2 ang newLength))
- (entmod (subst (cons 10 newPoint) (assoc 10 dxf) dxf))
- )
- )
- (princ (strcat "\n长度已修改为 " (rtos newLength) "."))
- )
- ((eq (cdr (assoc 0 dxf)) "LWPOLYLINE")
- (setq newLength (getreal "\n输入新的长度: "))
- (setq obj (vlax-ename->vla-object ent))
- (setq en-co (cdr (assoc 90 dxf)))
- (setq en-qd (wdl_3d->2d(vlax-curve-getstartpoint ent)))
- (setq en-zd (wdl_3d->2d(vlax-curve-getendpoint ent)))
- ;确定需要修改的点
- (if (> (distance en-qd pt) (distance en-zd pt))
- (setq pt-xg en-zd)
- (setq pt-xg en-qd)
- )
- (setq index1 (fix (+ (vlax-curve-getParamAtPoint obj pt-xg) 0.1)))
- ;;获得相邻节点的编号和点坐标
- (setq index2 (1+ index1))
- (if (> index2 (1- en-co))
- (setq index2 (1- index1))
- )
- (setq pt-nx (vla-get-Coordinate obj index2))
- (setq pt-nx (vlax-safearray->list(vlax-variant-value pt-nx)))
- (setq ang (angle pt-nx pt-xg))
- (setq newPoint (polar pt-nx ang newLength))
- (setq vb_new1(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble '(0 . 1)) newPoint))
- (vla-put-Coordinate obj index1 vb_new1)
- (princ (strcat "\n长度已修改为 " (rtos newLength) "."))
- )
- )
- )
- (princ "\n未选择图元。")
- )
- (command "_.undo" "_end");;定义撤销结束处
- (setvar "cmdecho" 1)
- (princ)
- )
|