明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 942|回复: 13

[源码] 直线、多段线(不含圆弧段)长度增量工具

[复制链接]
发表于 2025-3-15 15:51:16 | 显示全部楼层 |阅读模式

效果如图所示:


系统自带的命令:

命令: LENGTHEN
选择对象或 [增量(DE)/百分数(P)/全部(T)/动态(DY)]: DE
输入长度增量或 [角度(A)] <0.00>:


  1. ;;说明:直线、多段线(不含圆弧段)长度增量工具
  2. (defun c:CDE(/ arcang arcinfo arclength bulge cenpt eang ent ept exang exdis getptlength isstoe istype lm:bulge->arc modpt nearpt obj oldlen param ptlen radius sang spt ss var)
  3.   (vl-load-com)
  4.   ;; Bulge to Arc  -  Lee Mac
  5.   ;; p1 - start vertex
  6.   ;; p2 - end vertex
  7.   ;; b  - bulge
  8.   ;; Returns: (<center> <start angle> <end angle> <radius>)
  9.   (defun LM:Bulge->Arc ( p1 p2 b / c r )
  10.     (setq r (/ (* (distance p1 p2) (1+ (* b b))) 4 b)
  11.       c (polar p1 (+ (angle p1 p2) (- (/ pi 2) (* 2 (atan b)))) r)
  12.     )
  13.     (if (minusp b)
  14.       (list c (angle c p2) (angle c p1) (abs r))
  15.       (list c (angle c p1) (angle c p2) (abs r))
  16.     )
  17.   )
  18.   (defun getptlength(lsobj lsparam / lsspt lsept)
  19.     (list
  20.       (setq lsspt (vlax-curve-getPointAtParam lsobj lsparam))
  21.       (setq lsept (vlax-curve-getPointAtParam lsobj (1+ lsparam)))
  22.       (distance lsspt lsept)
  23.     )
  24.   )
  25.   (while (and (setq exdis (getdist (strcat "\n输入增量:"))) (/= exdis 0))
  26.     (while
  27.       (setq ss
  28.         (ssget ":S"
  29.           '(
  30.              (-4 . "<or")
  31.              (0 . "LINE")
  32.              (-4 . "<and")
  33.              (0 . "LWPOLYLINE")
  34.              (-4 . "!=") (70 . 1)
  35.              (-4 . "and>")
  36.              (-4 . "or>")
  37.            )
  38.         )
  39.       )
  40.       (setq ent (ssnamex ss 0) istype (cdr (assoc 0 (entget (cadar ent)))))
  41.       (setq obj (vlax-ename->vla-object (cadar ent)))
  42.       (setq nearpt (vlax-curve-getClosestPointTo obj (cadr (last (car ent))) t))
  43.       (if (equal istype "LWPOLYLINE")
  44.         (progn
  45.           (setq param (fix (vlax-curve-getParamAtPoint obj nearpt)))
  46.           (setq ptlen (getptlength obj param) spt (car ptlen) ept (cadr ptlen) oldlen (caddr ptlen))
  47.           (setq bulge (vla-GetBulge obj param))
  48.           (if (= bulge 0)
  49.             (progn
  50.               (setq isstoe (> (distance spt nearpt) (distance ept nearpt)))
  51.               (setq modpt (polar (if isstoe ept spt) (if isstoe (angle spt ept) (angle ept spt)) exdis))
  52.               (setq var (vlax-make-safearray vlax-vbDouble '(0 . 1)))
  53.               (vlax-safearray-fill var (list (car modpt) (cadr modpt)))
  54.               (vla-put-Coordinate obj (if isstoe (+ 1 param) (+ 0 param)) var)
  55.               (vla-Update obj)
  56.               (princ (strcat "\n原始线段长【" (rtos oldlen) "】, 增量【" (rtos exdis) "】, 当前线段长【" (rtos (caddr (getptlength obj param))) "】"))
  57.             )
  58.             (progn
  59.             ;  (setq arcinfo (LM:Bulge->Arc spt ept bulge) cenpt (car arcinfo) sang (cadr arcinfo) eang (caddr arcinfo) radius (cadddr arcinfo))
  60.             ;  (setq arclength (- (vlax-curve-getDistAtParam obj (1+ param)) (vlax-curve-getDistAtParam obj param)))
  61.             ;  (setq arcang (/ arclength radius))
  62.             ;  (setq exang (/ exdis radius))
  63.             ;  (if (or (and (> exang 0) (< (+ exang arcang) (* pi 2))) (and (< exang 0) (< (abs exang) arcang)))
  64.             ;    (progn
  65.             ;      (setq isstoe (> (distance spt nearpt) (distance ept nearpt)))
  66.             ;      (setq modpt (polar cenpt (if isstoe (+ eang exang) (- sang exang)) radius))
  67.             ;      (setq var (vlax-make-safearray vlax-vbDouble '(0 . 1)))
  68.             ;      (vlax-safearray-fill var (list (car modpt) (cadr modpt)))
  69.             ;      (vla-put-Coordinate obj (if isstoe (+ 1 param) (+ 0 param)) var)
  70.             ;      (vla-Update obj)
  71.             ;    )
  72.             ;  )
  73.             )
  74.           )
  75.         )
  76.         (progn
  77.           (setq spt (vlax-curve-getStartPoint obj))
  78.           (setq ept (vlax-curve-getEndPoint obj))
  79.           (setq isstoe (> (distance spt nearpt) (distance ept nearpt)))
  80.           (setq modpt (polar (if isstoe ept spt) (if isstoe (angle spt ept) (angle ept spt)) exdis))
  81.           (if isstoe (vla-put-EndPoint obj (vlax-3D-point modpt)) (vla-put-StartPoint obj (vlax-3D-point modpt)))
  82.           (vla-Update obj)
  83.           (princ (strcat "\n原始线段长【" (rtos (distance spt ept)) "】, 增量【" (rtos exdis) "】, 当前线段长【" (rtos (distance (vlax-curve-getStartPoint obj) (vlax-curve-getEndPoint obj))) "】"))
  84.         )
  85.       )
  86.     )
  87.   )
  88.   (prin1)
  89. )



针对于圆弧段还有待完善,有兴趣的话,你们可以自己试着去完善!!!

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2025-3-16 11:06:29 | 显示全部楼层
与 LENGTHEN功能有啥区别?
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2025-3-17 07:54:09 | 显示全部楼层
本帖最后由 fangmin723 于 2025-3-17 08:00 编辑
yegucheng0129 发表于 2025-3-15 17:35
很实用的功能 ,感谢大佬分享,这个功能贱人工具箱里有,叫定距延长,另外你说的圆弧未完善,可以请教贱人大佬

我试了下贱人工具箱的定距延长,还是和我的预想有差别,我这个支持多段线子段定距延长,贱人工具箱中的延长只能延长多段线两端
回复 支持 反对

使用道具 举报

发表于 2025-3-17 09:01:09 | 显示全部楼层
fangmin723 发表于 2025-3-16 23:09
没有具体的区别,功能实现一样,比系统的简化了一步



line和arc可以直接用lengthen命令的De选项,lwpolyline可以单独处理

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-3-15 17:35:24 | 显示全部楼层
很实用的功能 ,感谢大佬分享,这个功能贱人工具箱里有,叫定距延长,另外你说的圆弧未完善,可以请教贱人大佬
回复 支持 反对

使用道具 举报

发表于 2025-3-15 19:08:20 | 显示全部楼层
很强大,我们一般就用系统自带的那个,好像只针对多段线。
回复 支持 反对

使用道具 举报

发表于 2025-3-16 00:22:31 | 显示全部楼层
很特别的工具,直接拿来量测和分等好用!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-16 23:09:31 | 显示全部楼层
xyp1964 发表于 2025-3-16 11:06
与 LENGTHEN功能有啥区别?

没有具体的区别,功能实现一样,比系统的简化了一步
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-17 11:03:58 | 显示全部楼层
xyp1964 发表于 2025-3-17 09:01
line和arc可以直接用lengthen命令的De选项,lwpolyline可以单独处理

嗯嗯,可以的,看个人需要了,想用哪种用哪种
回复 支持 反对

使用道具 举报

发表于 2025-3-17 13:47:12 | 显示全部楼层


多段线圆弧段的伸缩

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-1 09:30 , Processed in 0.257272 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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