明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1237|回复: 13

[源码] X、Y坐标值交换小程序

[复制链接]
发表于 2025-3-1 17:50:39 | 显示全部楼层 |阅读模式
电缆线路设计时需要标名桩号,浩辰CAD2019标注坐标点非常方便。但有个问题,X、Y坐标的值在城建坐标系统中与CAD中是颠倒的:


CAD坐标与图纸坐标XY反着的原因是建筑坐标系和CAD坐标轴是相反的。
在数学中,平面直角坐标系以纵轴为y轴,自原点向上为正,向下为负;以横轴为x轴,自原点向右为正,向左为负;象限按逆时针方向编号。
而在测量上,平面直角坐标系以南北方向的纵轴为x轴,自原点向北为正,向南为负;以东西方向的横轴为y轴,自原点向东为正,向西为负;象限按顺时针方向编号。这种差异导致了在CAD中,如果使用的是测量坐标系,输入坐标时需要将原本的X和Y坐标值交换使用,即将数学坐标系中的X坐标作为建筑坐标系中的Y坐标,将数学坐标系中的Y坐标作为建筑坐标系中的X坐标。


我需手动调整一个个坐标值,以前也确实这么做的,现在终于可用刚学会一点的lisp知识解决这个问题了。请允许我得瑟1秒钟
  1. ;浩辰CAD中标注坐标不需解散组也可用该功能框选交换X、Y坐标值
  2. (princ "X、Y坐标值交换程序加载成功,请输入yt_swap执行该命令...")
  3. (defun c:yt_swap(/ text1 text2 str1 obj obj1 obj2 ss n i)
  4.   (prompt "请注意:每次只能框选一对坐标!")
  5.   (setq ss (ssget '((0 . "TEXT"))))
  6.   (setq n (sslength ss))
  7.   (setq i 0)
  8.   (while (< i n)
  9.     (setq obj (ssname ss i))
  10.     (cond ((= (substr (cdr (assoc 1 (entget obj))) 1 2) "X=")
  11.       (setq obj1 obj))
  12.     ((= (substr (cdr (assoc 1 (entget obj))) 1 2) "Y=")
  13.       (setq obj2 obj)))
  14.     (setq i (1+ i))
  15.   )
  16.   (setq text1 (cdr (assoc 1 (entget obj1))))
  17.   (setq text1 (strcat "Y" (substr text1 2)))
  18.   (setq text2 (cdr (assoc 1 (entget obj2))))
  19.   (setq text2 (strcat "X" (substr text2 2)))
  20.   (setq str1 text1)
  21.   (entmod (subst (cons 1 Text2) (assoc 1 (entget obj1)) (entget obj1)))
  22.   (entmod (subst (cons 1 str1) (assoc 1 (entget obj2)) (entget obj2)))
  23.   (princ "\nX、Y坐标值交换成功!")
  24.   (princ)
  25. )

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2025-3-1 21:22:04 | 显示全部楼层
(defun c:tt (/ ss n i obj text x-list y-list x-value y-value x-obj y-obj x-pair y-pair)
  (prompt "\n请框选所有需要交换X、Y坐标值的标注点:")
  (setq ss (ssget '((0 . "TEXT"))))
  (if ss
    (progn
      (setq n (sslength ss))
      (setq i 0)
      (setq x-list nil)
      (setq y-list nil)
      (while (< i n)
        (setq obj (ssname ss i))
        (setq text (cdr (assoc 1 (entget obj))))
        (if (and (>= (strlen text) 2)
                                                        (or (= (substr text 1 2) "X=") (= (substr text 1 2) "Y=")))
                                        (progn
                                                (if (= (substr text 1 1) "X")
                                                        (setq x-list (cons (list obj text) x-list))
                                                        (if (= (substr text 1 1) "Y")
                                                                (setq y-list (cons (list obj text) y-list))
                                                        )
                                                )
                                        )
        )
        (setq i (1+ i))
      )
      (if (and x-list y-list)
                                (progn
                                        (while (and x-list y-list)
                                                (setq x-pair (car x-list))
                                                (setq y-pair (car y-list))
                                                (setq x-obj (car x-pair))
                                                (setq x-value (substr (cadr x-pair) 3))
                                                (setq y-obj (car y-pair))
                                                (setq y-value (substr (cadr y-pair) 3))
                                                (entmod (subst (cons 1 (strcat "X=" y-value)) (assoc 1 (entget x-obj)) (entget x-obj)))
                                                (entmod (subst (cons 1 (strcat "Y=" x-value)) (assoc 1 (entget y-obj)) (entget y-obj)))
                                                (entupd x-obj)
                                                (entupd y-obj)
                                                (setq x-list (cdr x-list))
                                                (setq y-list (cdr y-list))
                                        )
                                        (prompt "\n所有坐标点的X、Y坐标值已成功交换!")
                                )
                                (prompt "\n未找到匹配的X和Y坐标对!")
      )
    )
    (prompt "\n未选择任何对象!")
  )
  (princ)
)
回复 支持 反对

使用道具 举报

发表于 2025-3-1 22:45:25 | 显示全部楼层
xiao1984 发表于 2025-3-1 21:22
(defun c:tt (/ ss n i obj text x-list y-list x-value y-value x-obj y-obj x-pair y-pair)
  (prompt " ...

(defun c:hhzb (/ ss n i obj text x-list y-list x-value y-value x-obj y-obj x-pair y-pair)
  (prompt "\n请框选所有需要交换X、Y坐标值的标注点:")
  (setq ss (ssget '((0 . "TEXT"))))
  (if ss
    (progn
      (setq n (sslength ss))
      (setq i 0)
      (setq x-list nil)
      (setq y-list nil)
      (while (< i n)
        (setq obj (ssname ss i))
        (setq text (cdr (assoc 1 (entget obj))))
        (if (and (>= (strlen text) 2)
                 (or (= (substr text 1 2) "X=") (= (substr text 1 2) "Y=")))
          (progn
            (if (= (substr text 1 2) "X=")
              (setq x-list (cons (list obj text) x-list))
              (if (= (substr text 1 2) "Y=")
                (setq y-list (cons (list obj text) y-list))
              )
            )
          )
        )
        (setq i (1+ i))
      )
      (if (and x-list y-list)
        (progn
          (while (and x-list y-list)
            (setq x-pair (car x-list))
            (setq y-pair (car y-list))
            (setq x-obj (car x-pair))
            (setq x-value (substr (cadr x-pair) 3))
            (setq y-obj (car y-pair))
            (setq y-value (substr (cadr y-pair) 3))

            (setq x-ent (entget x-obj))
            (setq x-ent (subst (cons 1 (strcat "X=" y-value)) (assoc 1 x-ent) x-ent))
            (if (assoc 62 x-ent)
              (setq x-ent (subst (cons 62 1) (assoc 62 x-ent) x-ent))
              (setq x-ent (append x-ent (list (cons 62 1))))
            )
            (entmod x-ent)

            (setq y-ent (entget y-obj))
            (setq y-ent (subst (cons 1 (strcat "Y=" x-value)) (assoc 1 y-ent) y-ent))
            (if (assoc 62 y-ent)
              (setq y-ent (subst (cons 62 1) (assoc 62 y-ent) y-ent))
              (setq y-ent (append y-ent (list (cons 62 1))))
            )
            (entmod y-ent)

            (entupd x-obj)
            (entupd y-obj)
            (setq x-list (cdr x-list))
            (setq y-list (cdr y-list))
          )
          (prompt "\n所有坐标点的X、Y坐标值已成功交换并设置为红色!")
        )
        (prompt "\n未找到匹配的X和Y坐标对!")
      )
    )
    (prompt "\n未选择任何对象!")
  )
  (princ)
)
回复 支持 反对

使用道具 举报

发表于 2025-3-1 20:55:05 | 显示全部楼层
  1. (defun c:tt ()
  2.   (defun dxf (code e) (cdr (assoc code (entget e))))
  3.   (defun SubUpd(e c v)(entmod(subst(cons c v)(assoc c(entget e))(entget e)))(entupd e))
  4.   (while (and (setq ss (ssget '((0 . "TEXT") (1 . "X=*,Y=*"))))
  5.               (= (sslength ss) 2)
  6.          )
  7.     (setq s1  (ssname ss 0)
  8.           s2  (ssname ss 1)
  9.           t1  (DXF 1 s1)
  10.           t1a (substr t1 1 2)
  11.           t1b (substr t1 3)
  12.           t2  (DXF 1 s2)
  13.           t2a (substr t2 1 2)
  14.           t2b (substr t2 3)
  15.           t1  (strcat t1a t2b)
  16.           t2  (strcat t2a t1b)
  17.           s1  (SubUpd s1 1 t1)
  18.           s2  (SubUpd s2 1 t2)
  19.     )
  20.     (command"chprop" ss """c" 1 "")
  21.   )
  22.   (princ)
  23. )
回复 支持 反对

使用道具 举报

发表于 2025-3-1 18:04:20 | 显示全部楼层
好麻烦,标注时候就xy反过来,标注好有这种太麻烦
回复 支持 反对

使用道具 举报

发表于 2025-3-1 18:22:45 | 显示全部楼层
如果图纸画得比较好,文字不重叠,
那么按照text的包围盒扩容一个距离,选取两个单行文字,
就可以批量交换了.
原本半小时的任务变成两秒钟...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-1 19:53:49 | 显示全部楼层
cjf160204 发表于 2025-3-1 18:04
好麻烦,标注时候就xy反过来,标注好有这种太麻烦

浩辰CAD标注的,它本身不会过来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-1 20:19:03 | 显示全部楼层
你有种再说一遍 发表于 2025-3-1 18:22
如果图纸画得比较好,文字不重叠,
那么按照text的包围盒扩容一个距离,选取两个单行文字,
就可以批量交换了 ...

一个电缆路径不到5km,需要标注的点30~50个,逐个修改工作量也不大。并且文字距离太近,还有其它内容的干扰,容易出错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-2 08:02:32 | 显示全部楼层

看懂了,内部定义dxf、SubUpd两个函数,使得主程序变得很简洁。一次还是选中一对坐标进行交换。多谢指导
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-1 09:51 , Processed in 0.180446 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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