明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 443|回复: 8

指定直线或多段线的长度

[复制链接]
发表于 2026-1-11 11:07:00 | 显示全部楼层 |阅读模式
本帖最后由 hubeiwdlue 于 2026-1-12 12:50 编辑

选择一条直线或多段线,输入长度,将修改直线或多段线端线段的长度为指定值。根据选择点到起点、终点距离判定修改的方向。


  1. (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)
  2.   ;3维坐标转2维,chaoyin提供
  3.   (defun wdl_3d->2d (L)
  4.     (mapcar '+ L '(0.0 0.0))
  5.   )
  6.   ; main
  7.   (setvar "cmdecho" 0)
  8.   (command "_.undo" "_begin");;定义撤销开始处
  9.   (if (and (setq en (entsel "\n选择一条直线或多段线: "))
  10.         (setq ent (car en)
  11.           pt (cadr en))
  12.       )
  13.     (progn
  14.       (setq dxf (entget ent))
  15.       (cond
  16.         ((eq (cdr (assoc 0 dxf)) "LINE")
  17.           (setq newLength (getreal "\n输入新的长度: "))
  18.           (setq pt1 (wdl_3d->2d(cdr (assoc 10 dxf))) pt2 (wdl_3d->2d(cdr (assoc 11 dxf))))
  19.           (if (> (distance pt1 pt) (distance pt2 pt))
  20.             (progn
  21.               (setq ang (angle pt1 pt2))
  22.               (setq newPoint (polar pt1 ang newLength))
  23.               (entmod (subst (cons 11 newPoint) (assoc 11 dxf) dxf))
  24.             )
  25.             (progn
  26.               (setq ang (angle pt2 pt1))
  27.               (setq newPoint (polar pt2 ang newLength))
  28.               (entmod (subst (cons 10 newPoint) (assoc 10 dxf) dxf))
  29.             )
  30.           )
  31.           (princ (strcat "\n长度已修改为 " (rtos newLength) "."))
  32.         )
  33.         ((eq (cdr (assoc 0 dxf)) "LWPOLYLINE")
  34.           (setq newLength (getreal "\n输入新的长度: "))
  35.           (setq obj (vlax-ename->vla-object ent))
  36.           (setq en-co (cdr (assoc 90 dxf)))
  37.           (setq en-qd (wdl_3d->2d(vlax-curve-getstartpoint ent)))
  38.           (setq en-zd (wdl_3d->2d(vlax-curve-getendpoint ent)))
  39.           ;确定需要修改的点
  40.           (if (> (distance en-qd pt) (distance en-zd pt))
  41.             (setq pt-xg en-zd)
  42.             (setq pt-xg en-qd)
  43.           )
  44.           (setq index1 (fix (+ (vlax-curve-getParamAtPoint obj pt-xg) 0.1)))
  45.           ;;获得相邻节点的编号和点坐标
  46.           (setq index2 (1+ index1))
  47.           (if (> index2 (1- en-co))
  48.             (setq index2 (1- index1))
  49.           )
  50.           (setq pt-nx (vla-get-Coordinate obj index2))
  51.           (setq pt-nx (vlax-safearray->list(vlax-variant-value pt-nx)))
  52.           (setq ang (angle pt-nx pt-xg))
  53.           (setq newPoint (polar pt-nx ang newLength))
  54.           (setq vb_new1(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble '(0 . 1)) newPoint))
  55.           (vla-put-Coordinate obj index1  vb_new1)
  56.           (princ (strcat "\n长度已修改为 " (rtos newLength) "."))
  57.         )
  58.       )
  59.     )
  60.     (princ "\n未选择图元。")
  61.   )
  62.   (command "_.undo" "_end");;定义撤销结束处
  63.   (setvar "cmdecho" 1)
  64.   (princ)
  65. )


回复

使用道具 举报

发表于 2026-1-11 15:52:30 | 显示全部楼层
试用了一下,还是好用,想用到平交口进出道渠化标线上,能否增加一下功能。
1、以固定长度打断点,线均留下。目前这个是其他线是删除,仅留固定长度的线。
2、可以一次选择多根线。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
(COMMAND "LENGTHEN" "T" (getdist "\n输入新的长度: "))
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
fangmin723 发表于 2026-1-12 07:46
(COMMAND "LENGTHEN" "T" (getdist "\n输入新的长度: "))

command这个命令没用过。
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 hubeiwdlue 于 2026-1-12 10:27 编辑
chdxllll 发表于 2026-1-11 15:52
试用了一下,还是好用,想用到平交口进出道渠化标线上,能否增加一下功能。
1、以固定长度打断点,线均留 ...

1.第一个问题应该比较简单,端点A的坐标修改为B点,A点B点的坐标我们是知道的,新生成一个多段线就可以了,生成前加一个判断语句就好。我不是路线专业的,具体功能你自己会清楚些。
2.一个直线或线段有两个端点,修改哪个点的坐标,这个代码很难判断,这个问题不解决,多选就会出错。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
chdxllll 发表于 2026-1-11 15:52
试用了一下,还是好用,想用到平交口进出道渠化标线上,能否增加一下功能。
1、以固定长度打断点,线均留 ...

是我这演示的效果吗

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
不用分这么多段,一般标线均分成2段,进道口靠近路口的留出固定长度的实线(例如留50米实线),路段上的正常的标线样式。
点选实线哪段就是留实线的一端。

参照下图就好理解点了。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
chdxllll 发表于 2026-1-12 12:25
不用分这么多段,一般标线均分成2段,进道口靠近路口的留出固定长度的实线(例如留50米实线),路段上的正 ...

是这个意思吗?

  1. (defun c:tt()
  2.         (setq en (entsel))
  3.         (setq ent (car en)
  4.                 pt (cadr en))
  5.         (setq dxf (entget ent))
  6.         (setq pt1 (cdr (assoc 10 dxf)) pt2 (cdr (assoc 11 dxf)))
  7.         (setq len (getreal))
  8.         (if (> (distance pt1 pt) (distance pt2 pt))
  9.                 (progn
  10.                         (setq ang (angle pt2 pt1))
  11.                         (setq newPoint (polar pt2 ang len))
  12.                         (entmod (subst (cons 11 newPoint) (assoc 11 dxf) dxf))
  13.                         (command "LINE" "non" pt2 "non" newPoint "")
  14.                 )
  15.                 (progn
  16.                         (setq ang (angle pt1 pt2))
  17.                         (setq newPoint (polar pt1 ang len))
  18.                         (entmod (subst (cons 10 newPoint) (assoc 10 dxf) dxf))
  19.                         (command "LINE" "non" pt1 "non" newPoint "")
  20.                 )
  21.         )
  22. )
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 17:07 , Processed in 1.525883 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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