明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2216|回复: 9

[提问] 如何动态显示多段线长度

[复制链接]
发表于 2020-1-4 13:54:47 | 显示全部楼层 |阅读模式
以下为动态显示直线长度的代码,如何改成多段线也能显示动态长度呢?因为有2个组码10,想来想去不知道怎么修改,特求助各位大神。
  1. (defun c:hddx( / cood d1 d2 data1 data3 data4 en1 en3 en4 gr loop pt1 ptb)
  2.   ;动态显示线段的总长度。 by fl202   2018.1.31
  3.   (setvar "cmdecho" 0)  
  4.   (setq d1 0 pt1 (getpoint "\n 动态显示线段的总长度,请确定起点:"))
  5.   (entmake (list '(0 . "line")  (cons 62 2)  (cons 10 pt1) (cons 11 (polar pt1 0 100) ) ) )
  6.   (setq en1 (entlast)   data1 (entget en1)  )  
  7.   (entmake (list '(0 . "TEXT") (cons 1 (strcat "总长度=" (rtos d1 2 3))) (cons 10 (polar pt1 (* pi 0.5) 10) ) (cons 40 4 )(cons 41 0.75 ) (cons 62 3)))
  8.   (setq en3 (entlast)   data3 (entget en3)  )
  9.   (entmake (list '(0 . "TEXT") (cons 1 (strcat "d1=" (rtos d1 2 3))) (cons 10 pt1) (cons 11 pt1) (cons 40 4 ) (cons 41 0.75 )(cons 62 3) (cons 71 0) (cons 72 1) (cons 73 2)))
  10.   (setq en4 (entlast)   data4 (entget en4)  )
  11.   (setq  loop T)
  12.   (while loop
  13.     (setq gr (grread T 8))
  14.     (setq cood (car gr)  ptb (cadr gr))
  15.     (cond
  16.       ((= cood 3) ;;; 鼠标左键
  17.         (progn
  18.           ;(entmake (list '(0 . "TEXT") (cons 1 ftxt1) (cons 10 ptb) (cons 40 h) (cons 62 211) (cons 7 "info")   ))         
  19.           (setq pt1 ptb)
  20.           (entmake (list '(0 . "line")  (cons 62 2)  (cons 10 pt1) (cons 11 (polar pt1 0 100) ) ) )
  21.           (setq en1 (entlast)   data1 (entget en1)  d1 (+ d1 d2) )
  22.           (setq data3 (subst (cons 1  (strcat "总长度=" (rtos d1 2 3))  ) (assoc 1 data3) data3))
  23.           (entmod data3)
  24.           (entmake (list '(0 . "TEXT") (cons 1 (strcat "d1=" (rtos d1 2 3))) (cons 10 pt1) (cons 11 pt1) (cons 40 4 )(cons 41 0.75 ) (cons 62 3) (cons 71 0) (cons 72 1) (cons 73 2)  ))
  25.           (setq en4 (entlast)   data4 (entget en4)  )
  26.           ;(setq loop nil)
  27.         ));;; 鼠标左键
  28.       ((= cood 11) (setq loop nil)(entdel en1)(entdel en4)  );;; 鼠标右键,右键设置为回车时
  29.       ((= cood 25) (setq loop nil)(entdel en1)(entdel en4)  );;; 鼠标右键,右键设置为屏幕菜单时
  30.       ((equal gr '(2 32)) (setq loop nil)(entdel en1)(entdel en4))               ;;; 空格键
  31.       
  32.       ( (= cood 5)  ;;; 鼠标移动
  33.         (progn              
  34.           ;(setq data1 (subst (cons 10 pt1) (assoc 10 data1) data1))
  35.           (setq pt2 (cdr (assoc 10 data1))  data1 (subst (cons 11 ptb) (assoc 11 data1) data1))           
  36.           (entmod data1)   
  37.           ;(setq d2 (distance pt1 ptb)  midp (list (/ (+ (car pt2) (car ptb) )  2.0)  (/ (+ (cadr pt2) (cadr ptb) )  2.0)   )  ag1 (+ (angle pt2 ptb) (* pi 0.5))  )
  38.           (setq d2 (distance pt1 ptb)  ag1 (+ (angle pt2 ptb) 0)  )
  39.           (cond
  40.             ((< (* pi 0.5) (angle pt2 ptb) pi)(setq ag2 (+ (angle pt2 ptb) pi))  )
  41.             ((< (* pi 1) (angle pt2 ptb) (* pi 1.5))(setq ag2 (- (angle pt2 ptb) pi))  )
  42.             (t (setq ag2 (angle pt2 ptb) )  )      
  43.           )
  44.           (setq pt3 (polar pt2 ag1 (/ d2 2.0))  pt3 (polar pt3 (+ ag2 (* pi 0.5)) 4)      )
  45.           (setq data4 (subst (cons 10  pt3 ) (assoc 10 data4) data4) )
  46.           (setq data4 (subst (cons 11  pt3 ) (assoc 11 data4) data4) )
  47.           (setq data4 (subst (cons 50  ag2 ) (assoc 50 data4) data4) )           
  48.           (setq data4 (subst (cons 1  (strcat "d1=" (rtos d2 2 3))  ) (assoc 1 data4) data4))
  49.           (entmod data4)  ;当前段长度         
  50.          
  51.         ))
  52.     );cond   
  53.    
  54.   );while
  55.   (princ "\n绘制结束。")
  56.   (princ)
  57. )


本帖子中包含更多资源

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

x
"觉得好,就打赏"
    共1人打赏
 楼主| 发表于 2020-1-5 10:15:48 | 显示全部楼层
想到了用reverse倒置获取图元的第二个组码10,接下来该怎么弄呢。

点评

多线段的点做成表,生成、、、动态时删除原线段  发表于 2020-1-5 10:31
发表于 2020-1-5 10:27:57 | 显示全部楼层
本帖最后由 sharetow 于 2020-1-5 11:00 编辑

文字方向按你自己的要求再调整一下

本帖子中包含更多资源

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

x
 楼主| 发表于 2020-1-5 12:35:26 | 显示全部楼层
sharetow 发表于 2020-1-5 10:27
文字方向按你自己的要求再调整一下

谢谢,我已经想通写得出来了!
 楼主| 发表于 2020-1-5 12:38:15 | 显示全部楼层
本帖最后由 烟盒迷唇 于 2020-1-14 17:30 编辑

经过一上午的思考,终于搞定了,也谢谢SHARETOW,虽然还没有看他的代码。
  1. ;动态显示线段的总长度。 by fl202   2018.1.31
  2. ;烟盒迷唇优化,支持多段线绘制 2020年1月5日
  3. (defun c:hddx( / cood d1 d2 data1 data3 data4 en1 en3 en4 gr loop pt1 ptb)
  4.   (setvar "cmdecho" 0)  
  5.   (setq d1 0 pt1 (getpoint "\n 动态显示线段的总长度,只支持多段线,请确定起点:"))
  6.   (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 62 2) (cons 90 2) (cons 10 pt1) (cons 10 (polar pt1 0 100) ) ) )
  7.   (setq en1 (entlast)   data1 (entget en1)  )  
  8.   (entmake (list '(0 . "TEXT") (cons 1 (strcat "总长度=" (rtos d1 2 3))) (cons 10 (polar pt1 (* pi 0.5) 10) ) (cons 40 4 )(cons 41 0.75 ) (cons 62 3)))
  9.   (setq en3 (entlast)   data3 (entget en3)  )
  10.   (entmake (list '(0 . "TEXT") (cons 1 (strcat "d1=" (rtos d1 2 3))) (cons 10 pt1) (cons 11 pt1) (cons 40 4 ) (cons 41 0.75 )(cons 62 3) (cons 71 0) (cons 72 1) (cons 73 2)))
  11.   (setq en4 (entlast)   data4 (entget en4)  )
  12.   (setq  loop T)
  13.         (while loop
  14.     (setq gr (grread T 8))
  15.     (setq cood (car gr)  ptb (cadr gr))
  16.     (cond
  17.                         ((= cood 3) ;;; 鼠标左键
  18.                                 (progn         
  19.                                         (setq pt1 ptb)
  20.                                         (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 62 2) (cons 90 2) (cons 10 pt1) (cons 10 (polar pt1 0 100) ) ) )
  21.                                         (setq en1 (entlast)   data1 (entget en1)  d1 (+ d1 d2) )
  22.                                         (setq data3 (subst (cons 1  (strcat "总长度=" (rtos d1 2 3))  ) (assoc 1 data3) data3))
  23.                                         (entmod data3)
  24.                                         (entmake (list '(0 . "TEXT") (cons 1 (strcat "d1=" (rtos d1 2 3))) (cons 10 pt1) (cons 11 pt1) (cons 40 4 )(cons 41 0.75 ) (cons 62 3) (cons 71 0) (cons 72 1) (cons 73 2)  ))
  25.                                         (setq en4 (entlast)   data4 (entget en4)  )
  26.                                         ;(setq loop nil)
  27.                                 ));;; 鼠标左键
  28.                         ((= cood 11) (setq loop nil)(entdel en1)(entdel en4)  );;; 鼠标右键,右键设置为回车时
  29.                         ((= cood 25) (setq loop nil)(entdel en1)(entdel en4)  );;; 鼠标右键,右键设置为屏幕菜单时
  30.                         ((equal gr '(2 32)) (setq loop nil)(entdel en1)(entdel en4))               ;;; 空格键
  31.                         
  32.                         ( (= cood 5)  ;;; 鼠标移动
  33.                                 (progn              
  34.                                         (setq pt2 (cdr (assoc 10 data1))  data1 (subst (cons 10 ptb) (assoc 10 (reverse data1)) data1))                 
  35.                                         (entmod data1)         
  36.                                         (setq d2 (distance pt1 ptb)  ag1 (+ (angle pt2 ptb) 0)  )
  37.                                         (cond
  38.                                                 ((< (* pi 0.5) (angle pt2 ptb) pi)(setq ag2 (+ (angle pt2 ptb) pi))  )
  39.                                                 ((< (* pi 1) (angle pt2 ptb) (* pi 1.5))(setq ag2 (- (angle pt2 ptb) pi))  )
  40.                                                 (t (setq ag2 (angle pt2 ptb) )  )      
  41.                                         )
  42.                                         (setq pt3 (polar pt2 ag1 (/ d2 2.0))  pt3 (polar pt3 (+ ag2 (* pi 0.5)) 4)      )
  43.                                         (setq data4 (subst (cons 10  pt3 ) (assoc 10 data4) data4) )
  44.                                         (setq data4 (subst (cons 11  pt3 ) (assoc 11 data4) data4) )
  45.                                         (setq data4 (subst (cons 50  ag2 ) (assoc 50 data4) data4) )                 
  46.                                         (setq data4 (subst (cons 1  (strcat "d1=" (rtos d2 2 3))  ) (assoc 1 data4) data4))
  47.                                         (entmod data4)                 
  48.                                        
  49.                                 ))
  50.     );cond   
  51.    
  52.         );while
  53.   (princ "\n绘制结束。")
  54.   (princ)
  55. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2020-1-5 14:19:09 | 显示全部楼层
用了GRREAD怎么才能使正交模式也有效呢?
发表于 2020-9-24 17:53:54 | 显示全部楼层
老大字体大不如何调呢
发表于 2022-9-27 11:20:51 | 显示全部楼层
烟盒迷唇 发表于 2020-1-5 12:38
经过一上午的思考,终于搞定了,也谢谢SHARETOW,虽然还没有看他的代码。

你好,请问一下
用这个插件,在动态显示线长的时候,有办法要点下一点时可以“锁点”吗?
感觉好象没办法锁点追踪似的
这样子比较没办法很精确的对准下一点
 楼主| 发表于 2022-9-27 11:51:45 | 显示全部楼层
p-3-ianlcc 发表于 2022-9-27 11:20
你好,请问一下
用这个插件,在动态显示线长的时候,有办法要点下一点时可以“锁点”吗?
感觉好象没办 ...

没办法捕捉的,需要自己研究GRREAD,添加捕捉功能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-23 02:59 , Processed in 0.168895 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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