明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 598|回复: 8

[提问] 增加一个手动选择插入点

[复制链接]
发表于 2024-12-20 11:09:18 | 显示全部楼层 |阅读模式
本帖最后由 wyy81061 于 2024-12-20 11:10 编辑

各位大佬帮帮看看,现在的功能只能实现根据多段线颜色生成文字后对齐,但是这个文字的位置不是固定的,我想要增加一个功能,就是根据我鼠标点击的位置做为基准点生成文字
   

  1. (defun c:XX8 ()
  2.   (vl-load-com)
  3.   ;; 定义颜色与文字的映射表
  4.   (setq color-text-map '(
  5.     (1 . "48B1")   ;; 洋红
  6.     (2 . "96B1")   ;; 红色
  7.     (3 . "72B1")   ;; 绿色
  8.     (4 . "144B1")  ;; 青色
  9.     (5 . "36B1")   ;; 蓝色
  10.     (6 . "12B1")   ;; 黄色
  11.     (7 . "24B1")   ;; 白色
  12.   ))

  13.   ;; 获取用户选择的多段线
  14.   (setq selection (ssget '((0 . "LWPOLYLINE"))))
  15.   (if selection
  16.     (progn
  17.       (setq horizontal-lines '())
  18.       (setq vertical-lines '())

  19.       ;; 遍历多段线,分类为横向和竖向
  20.       (repeat (sslength selection)
  21.         (setq ent (ssname selection 0))
  22.         (setq obj (vlax-ename->vla-object ent))
  23.         ;; 获取顶点
  24.         (setq vertices (mapcar 'cdr (vl-remove-if-not
  25.                                      '(lambda (x) (= (car x) 10))
  26.                                      (entget ent))))
  27.         ;; 判断方向
  28.         (if (> (abs (- (car (car vertices)) (car (last vertices))))
  29.                (abs (- (cadr (car vertices)) (cadr (last vertices)))))
  30.           (setq horizontal-lines (cons ent horizontal-lines))
  31.           (setq vertical-lines (cons ent vertical-lines))
  32.         )
  33.         (ssdel ent selection)
  34.       )

  35.       ;; 处理横向多段线
  36.       (if horizontal-lines
  37.         (progn
  38.           ;; 以最左边的线为基准
  39.           (setq base-line (car (vl-sort horizontal-lines
  40.                                         '(lambda (a b)
  41.                                            (< (car (vlax-curve-getStartPoint a))
  42.                                               (car (vlax-curve-getStartPoint b)))))))
  43.           (setq base-center (vlax-curve-getPointAtParam base-line
  44.                                                         (vlax-curve-getParamAtDist base-line
  45.                                                                                    (/ (vlax-curve-getDistAtParam base-line
  46.                                                                                                                  (vlax-curve-getEndParam base-line)) 2))))
  47.           ;; 遍历横向多段线
  48.           (foreach ent horizontal-lines
  49.             (setq obj (vlax-ename->vla-object ent))
  50.             (setq color (vla-get-color obj))
  51.             (setq text (cdr (assoc color color-text-map)))
  52.             (if text
  53.               (progn
  54.                 (setq line-center (list (car base-center) (cadr (vlax-curve-getPointAtParam ent
  55.                                                                                            (vlax-curve-getParamAtDist ent
  56.                                                                                                                       (/ (vlax-curve-getDistAtParam ent
  57.                                                                                                                                                     (vlax-curve-getEndParam ent)) 2))))))
  58.                 (entmake (list
  59.                   (cons 0 "TEXT")
  60.                   (cons 10 line-center)
  61.                   (cons 40 2.5)
  62.                   (cons 41 0.7)
  63.                   (cons 7 "宋体")
  64.                   (cons 1 text)
  65.                   (cons 50 0)
  66.                   (cons 62 color)
  67.                   (cons 72 4)
  68.                   (cons 73 2)
  69.                   (cons 11 line-center)
  70.                 ))
  71.               )
  72.             )
  73.           )
  74.         )
  75.       )

  76.       ;; 处理竖向多段线
  77.       (if vertical-lines
  78.         (progn
  79.           ;; 以最上方的线为基准
  80.           (setq base-line (car (vl-sort vertical-lines
  81.                                         '(lambda (a b)
  82.                                            (> (cadr (vlax-curve-getStartPoint a))
  83.                                               (cadr (vlax-curve-getStartPoint b)))))))
  84.           (setq base-center (vlax-curve-getPointAtParam base-line
  85.                                                         (vlax-curve-getParamAtDist base-line
  86.                                                                                    (/ (vlax-curve-getDistAtParam base-line
  87.                                                                                                                  (vlax-curve-getEndParam base-line)) 2))))
  88.           ;; 遍历竖向多段线
  89.           (foreach ent vertical-lines
  90.             (setq obj (vlax-ename->vla-object ent))
  91.             (setq color (vla-get-color obj))
  92.             (setq text (cdr (assoc color color-text-map)))
  93.             (if text
  94.               (progn
  95.                 (setq line-center (list (car (vlax-curve-getPointAtParam ent
  96.                                                                          (vlax-curve-getParamAtDist ent
  97.                                                                                                     (/ (vlax-curve-getDistAtParam ent
  98.                                                                                                                                   (vlax-curve-getEndParam ent)) 2))))
  99.                                         (cadr base-center)))
  100.                 (entmake (list
  101.                   (cons 0 "TEXT")
  102.                   (cons 10 line-center)
  103.                   (cons 40 2.5)
  104.                   (cons 41 0.7)
  105.                   (cons 7 "宋体")
  106.                   (cons 1 text)
  107.                   (cons 50 (/ pi 2))
  108.                   (cons 62 color)
  109.                   (cons 72 4)
  110.                   (cons 73 2)
  111.                   (cons 11 line-center)
  112.                 ))
  113.               )
  114.             )
  115.           )
  116.         )
  117.       )
  118.     )
  119.     (princ "\n未选择任何多段线!")
  120.   )
  121.   (princ)
  122. )


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2024-12-21 01:10:26 | 显示全部楼层

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2024-12-20 11:35:57 | 显示全部楼层
有一个简单办法,生成后,用(command "_.move" ss ''" pt pause)
回复 支持 反对

使用道具 举报

发表于 2024-12-20 12:50:36 | 显示全部楼层
本帖最后由 llsheng_73 于 2024-12-20 12:58 编辑

(setq line-center(list(car base-center)
                      (cadr(vlax-curve-getPointAtParam ent(vlax-curve-getParamAtDist ent(/(vlax-curve-getDistAtParam ent(vlax-curve-getEndParam ent))2))))))

改成(setq line-center(getpoint"\n指定基准点"))

不过这程序需要优化的地方太多,比如纵线和横线分开后,处理时绝大部分代码重复。这就完全可以考虑根据直接线的起止点计算方向,50组就使用这个方向,这样代码不必重复,甚至不需要判断是纵线还是横线
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-20 14:14:19 | 显示全部楼层
llsheng_73 发表于 2024-12-20 12:50
(setq line-center(list(car base-center)
                      (cadr(vlax-curve-getPointAtParam ent( ...
  1. (defun c:XX7 ()
  2.   (vl-load-com)
  3.   ;; 定义颜色与文字的映射表
  4.   (setq color-text-map '(
  5.     (1 . "48B1")   ;; 洋红
  6.     (2 . "96B1")   ;; 红色
  7.     (3 . "72B1")   ;; 绿色
  8.     (4 . "144B1")  ;; 青色
  9.     (5 . "36B1")   ;; 蓝色
  10.     (6 . "12B1")   ;; 黄色
  11.     (7 . "24B1")   ;; 白色
  12.   ))

  13.   ;; 提示用户选择一条多段线
  14.   (setq selected-polyline (car (entsel "\n请选择一条多段线:")))
  15.   (if selected-polyline
  16.     (progn
  17.       (setq polyline-obj (vlax-ename->vla-object selected-polyline))
  18.       ;; 获取点击点
  19.       (setq clicked-point (getpoint "\n请选择插入文字的位置:"))
  20.       ;; 获取多段线的起点和终点
  21.       (setq start-point (vlax-curve-getStartPoint polyline-obj))
  22.       (setq end-point (vlax-curve-getEndPoint polyline-obj))
  23.       ;; 判断多段线方向
  24.       (if (> (abs (- (car start-point) (car end-point)))
  25.              (abs (- (cadr start-point) (cadr end-point))))
  26.         (setq orientation 'horizontal)
  27.         (setq orientation 'vertical)
  28.       )
  29.       ;; 获取多段线颜色并生成文字
  30.       (setq color (vla-get-color polyline-obj))
  31.       (setq text (cdr (assoc color color-text-map)))
  32.       (if text
  33.         (progn
  34.           ;; 根据方向调整文字插入点
  35.           (setq text-point
  36.                 (if (eq orientation 'horizontal)
  37.                   (list (car clicked-point)
  38.                         (cadr start-point))
  39.                   (list (car start-point)
  40.                         (cadr clicked-point))))
  41.           ;; 创建文字
  42.           (entmake (list
  43.             (cons 0 "TEXT")
  44.             (cons 10 text-point)
  45.             (cons 40 2.5)
  46.             (cons 41 0.7)
  47.             (cons 7 "宋体")
  48.             (cons 1 text)
  49.             (cons 50 (if (eq orientation 'horizontal) 0 (/ pi 2)))
  50.             (cons 62 color)
  51.             (cons 72 4)
  52.             (cons 73 2)
  53.             (cons 11 text-point)
  54.           ))
  55.           ;; 添加“管”字,判断是否需要
  56.           (if (or (eq orientation 'horizontal)
  57.                   (eq orientation 'vertical))
  58.             (progn
  59.               (setq pipe-point
  60.                     (if (eq orientation 'horizontal)
  61.                       (list (car clicked-point)
  62.                             (+ (cadr start-point) 4))
  63.                       (list (- (car start-point) 4)
  64.                             (cadr clicked-point))))
  65.               (entmake (list
  66.                 (cons 0 "TEXT")
  67.                 (cons 10 pipe-point)
  68.                 (cons 40 2.5)
  69.                 (cons 41 0.7)
  70.                 (cons 7 "宋体")
  71.                 (cons 1 "管")
  72.                 (cons 50 (if (eq orientation 'horizontal) 0 (/ pi 2)))
  73.                 (cons 62 color)
  74.                 (cons 72 4)
  75.                 (cons 73 2)
  76.                 (cons 11 pipe-point)
  77.               ))
  78.             )
  79.           )
  80.         )
  81.         (princ "\n未找到对应颜色的文字映射!")
  82.       )
  83.     )
  84.     (princ "\n未选择任何多段线!")
  85.   )
  86.   (princ)
  87. )


我原来写的就是对单个多段线的,后面想批量处理,刚开始弄,很多还不清楚,大佬能不能帮忙改进下

点评

不清楚到底要标成啥样  发表于 2024-12-20 17:26
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-20 19:23:40 | 显示全部楼层
wyy81061 发表于 2024-12-20 14:14
我原来写的就是对单个多段线的,后面想批量处理,刚开始弄,很多还不清楚,大佬能不能帮忙改进下

我上面那个CAD文件里有具体的效果
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-21 13:57:45 | 显示全部楼层

我原先的就是这种,主要是我那CAD里的有些多段线是L型,而且还是每一档都要插入文字,这种情况下想自动确定文字插入点也太难了,所以我才想手动选择插入点,虽然麻烦点,但是起码能够实现
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-22 21:02:15 | 显示全部楼层
自贡黄明儒 发表于 2024-12-20 11:35
有一个简单办法,生成后,用(command "_.move" ss ''" pt pause)

黄大师能不能帮忙提供个完整的?刚开始弄还不熟悉,折腾半天还是没弄好
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-22 21:42 , Processed in 0.163174 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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