| 
积分730明经币 个注册时间2025-6-25在线时间 小时威望 金钱 个贡献 激情  
 | 
 
 
 楼主|
发表于 2025-9-2 08:50:20
|
显示全部楼层 
| ;; =============================================================== ;;  功能:引出点坐标(XY可互换)
 ;;  命令:ZZ坐标标注
 ;;  格式:
 ;; ===============================================================
 (defun c:ZZ坐标标注 (/ *ZXC-TEXTHIGH* *ZXC-SWAPXY* LC:TEXTLENGTH TEXTSTYLE-BAK TEXTSIZE-BAK TEXTHIGH XSWS PT1 PT1_WCS PT2 STRLST TEXTLENGTH PT3 LST swapChoice gr)
 (vl-load-com)
 
 ;; 定义全局变量保存文字高度和坐标互换设置
 (if (not *ZXC-TEXTHIGH*)
 (setq *ZXC-TEXTHIGH* 30)
 )
 (if (not *ZXC-SWAPXY*)
 (setq *ZXC-SWAPXY* 2)  ; 1=不互换,2=互换
 )
 
 ;; 让用户选择是否互换坐标
 (setq swapChoice (getint (strcat "\n坐标(xy)是否互换 (1=否 2=是[建筑坐标])<" (itoa *ZXC-SWAPXY*) ">: ")))
 (if (and swapChoice (or (= swapChoice 1) (= swapChoice 2)))
 (setq *ZXC-SWAPXY* swapChoice)
 )
 
 (defun LC:TextLength (String / Tbox)
 (setq Tbox (textbox (list (cons 1 String))))
 (distance (car Tbox) (cadr Tbox))
 )
 
 (setq TEXTSTYLE-bak (getvar "TEXTSTYLE"))
 (setvar "TEXTSTYLE" "Standard")
 (setq textsize-bak (getvar "TEXTSIZE"))
 
 ;; 使用上一次的高度作为默认值
 (setq texthigh (getreal (strcat "\n请输入文字高度<" (rtos *ZXC-TEXTHIGH*) ">: ")))
 (if (null texthigh)
 (setq texthigh *ZXC-TEXTHIGH*)
 (setq *ZXC-TEXTHIGH* texthigh)
 )
 (setvar "TEXTSIZE" texthigh)
 
 ; 取消小数位数输入,直接设置为3
 (setq xsws 3)
 
 (defun DrawTempObjects (pt1 pt2 / strlst textlength pt3 text1-pos text2-pos)
 ;; 根据全局变量决定是否互换X和Y值
 (if (= *ZXC-SWAPXY* 2)
 (setq strlst (mapcar 'strcat '("X=" "Y=")
 (mapcar '(lambda (x) (rtos x 2 xsws)) (list (cadr pt1) (car pt1))))) ; 互换位置
 (setq strlst (mapcar 'strcat '("X=" "Y=")
 (mapcar '(lambda (x) (rtos x 2 xsws)) (list (car pt1) (cadr pt1))))) ; 正常位置
 )
 
 (setq textlength (apply 'MAX (mapcar '(lambda (x) (LC:TextLength x)) strlst)))
 (setq pt3 (if (> (car pt2) (car pt1))
 (polar pt2 0 (+ textlength 1))
 (polar pt2 pi (+ textlength 1))
 ))
 
 ;; 绘制临时引线 - 从实际选择点(pt1)引出,不转换为WCS坐标
 (grdraw pt1 pt2 3 1)  ; 从选择点到中间点
 (grdraw pt2 pt3 3 1)   ; 从中间点到文字位置
 
 ;; 计算文字位置
 (setq text1-pos (polar (polar (if (>= (car pt2) (car pt1)) pt2 pt3) 0 0.5) (* 0.5 pi) (* texthigh 0.2)))
 (setq text2-pos (polar (polar (if (>= (car pt2) (car pt1)) pt2 pt3) 0 0.5) (* 1.5 pi) (+ (* texthigh 0.2) texthigh)))
 
 ;; 绘制临时文字
 (DrawTextSimulation text1-pos (car strlst) texthigh)
 (DrawTextSimulation text2-pos (cadr strlst) texthigh)
 )
 
 (defun DrawTextSimulation (pt text height / bbox width)
 ;; 简单模拟文字显示
 (setq bbox (textbox (list (cons 1 text) (cons 40 height))))
 (setq width (distance (car bbox) (cadr bbox)))
 
 ;; 绘制文字边框以模拟文字 - 不转换为WCS坐标
 (grdraw (list (- (car pt) 0.5) (- (cadr pt) 0.5))
 (list (+ (car pt) width 0.5) (- (cadr pt) 0.5)) 7 1)
 (grdraw (list (+ (car pt) width 0.5) (- (cadr pt) 0.5))
 (list (+ (car pt) width 0.5) (+ (cadr pt) height 0.5)) 7 1)
 (grdraw (list (+ (car pt) width 0.5) (+ (cadr pt) height 0.5))
 (list (- (car pt) 0.5) (+ (cadr pt) height 0.5)) 7 1)
 (grdraw (list (- (car pt) 0.5) (+ (cadr pt) height 0.5))
 (list (- (car pt) 0.5) (- (cadr pt) 0.5)) 7 1)
 )
 
 ;; 取消"指定注记点"提示,直接获取点
 (while (setq pt1 (getpoint "\n选择注记点或按ESC退出: "))
 ;; 保存WCS坐标用于实体创建(仅实体创建时使用转换)
 (setq pt1_WCS (trans pt1 1 0))
 
 ;; 使用grread实现动态拖动
 (princ "\n拖动到注记位置,点击确认: ")
 (setq gr (grread t 15 0))
 (while (eq (car gr) 5)
 (redraw)
 (setq pt2 (cadr gr))
 (DrawTempObjects pt1 pt2)  ; 始终从选择点pt1开始绘制引线
 (setq gr (grread t 15 0))
 )
 
 ;; 如果是左键点击,则确认位置
 (if (eq (car gr) 3)
 (progn
 (setq pt2 (cadr gr))
 
 ;; 根据全局变量决定是否互换X和Y值
 (if (= *ZXC-SWAPXY* 2)
 (setq strlst (mapcar 'strcat '("X=" "Y=")
 (mapcar '(lambda (x) (rtos x 2 xsws)) (list (cadr pt1) (car pt1))))) ; 互换位置
 (setq strlst (mapcar 'strcat '("X=" "Y=")
 (mapcar '(lambda (x) (rtos x 2 xsws)) (list (car pt1) (cadr pt1))))) ; 正常位置
 )
 
 (setq textlength (apply 'MAX (mapcar '(lambda (x) (LC:TextLength x)) strlst)))
 (setq pt3 (if (> (car pt2) (car pt1))
 (polar pt2 0 (+ textlength 1))
 (polar pt2 pi (+ textlength 1))
 ))
 
 ; 转换所有点到WCS坐标用于实体创建(实体需要WCS坐标)
 (setq lst (list pt1_WCS (trans pt2 1 0) (trans pt3 1 0)))
 
 ; 白色文字(颜色代码7)
 (entmake (list '(0 . "TEXT") '(41 . 1.0) (cons 1 (car strlst))
 (cons 10 (trans (polar (polar (if (>= (car pt2) (car pt1)) pt2 pt3) 0 0.5) (* 0.5 pi) (* texthigh 0.2)) 1 0))
 (cons 40 texthigh) (cons 62 7)))
 
 (entmake (list '(0 . "TEXT") '(41 . 1.0) (cons 1 (cadr strlst))
 (cons 10 (trans (polar (polar (if (>= (car pt2) (car pt1)) pt2 pt3) 0 0.5) (* 1.5 pi) (+ (* texthigh 0.2) texthigh)) 1 0))
 (cons 40 texthigh) (cons 62 7)))
 
 ; 绿色引出线(颜色代码3)
 (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity")
 (cons 62 3)
 '(100 . "AcDbPolyline") (cons 90 (length lst)))
 (mapcar '(lambda (pt) (cons 10 pt)) lst)))
 )
 )
 (redraw) ; 清除临时图形
 )
 (setvar "TEXTSIZE" textsize-bak)
 (setvar "TEXTSTYLE" TEXTSTYLE-bak)
 (princ)
 )
 ;;; ================================================================
 ;;  功能:将CAD图中某点移到指定坐标
 ;;  命令:ZZ改指定坐标
 ;;  说明:整图移动,注意 X Y 轴  天正坐标XY是互换
 ;;; ================================================================
 (DEFUN C:ZZ改指定坐标 (/ oldPt newPt inputX inputY xOffset yOffset)
 ; 正常顺序输入,但内部对调使用
 (princ "\n请输入X(y)值<建筑坐标X>: ")
 (if (setq inputX (getreal))  ; 输入的X值,实际作为Y坐标
 (progn
 (princ "\n请输入Y(x)值<建筑坐标Y>: ")
 (if (setq inputY (getreal))  ; 输入的Y值,实际作为X坐标
 (progn
 ; 关键修改:输入X→Y坐标,输入Y→X坐标
 (setq newPt (list inputY inputX 0.0))  ; (实际X, 实际Y, 0)
 
 (princ "\n请选择需要修改坐标的原始点: ")
 (if (setq oldPt (getpoint))
 (progn
 ; 显示坐标映射关系,让用户清晰了解转换情况
 (princ (strcat "\n原始点坐标: X=" (rtos (car oldPt) 2 3)
 " Y=" (rtos (cadr oldPt) 2 3)))
 (princ (strcat "\n您输入的X值: " (rtos inputX 2 3) " (将作为Y坐标)"))
 (princ (strcat "\n您输入的Y值: " (rtos inputY 2 3) " (将作为X坐标)"))
 (princ (strcat "\n转换后的目标坐标: X=" (rtos inputY 2 3)
 " Y=" (rtos inputX 2 3)))
 
 ; 计算偏移量(基于转换后的坐标)
 (setq xOffset (- inputY (car oldPt)))  ; 输入Y作为X偏移
 (setq yOffset (- inputX (cadr oldPt)))  ; 输入X作为Y偏移
 
 ; 移动所有对象,完成坐标调整
 (command "_.SELECT" "ALL" "")
 (command "_.MOVE" "_P" "" (list 0 0 0) (list xOffset yOffset 0))
 
 (princ "\n坐标系统已调整,X值已作为Y坐标,Y值已作为X坐标使用!")
 )
 (princ "\n未选择原始点,操作取消。")
 )
 )
 (princ "\n未输入Y值,操作取消。")
 )
 )
 (princ "\n未输入X值,操作取消。")
 )
 (princ)
 )
 ;;; ================================================================
 ;;  功能: 改坐标原点【X=0.000  Y=0.000】
 ;;  命令:ZZ改坐标原点
 ;;  说明:影响整图坐标
 ;;; ================================================================
 (defun C:ZZ改坐标原点 (/ PT0 PT3 PTI)
 (setvar "OSMODE" 16383)
 (setq PT0 (getpoint "\n指定坐标系原点:"))
 (command "_.UCS" "_O" PT0)
 (initget "0,0")
 (if (setq PT3 (getpoint "\n输入参考点坐标<0,0>:"))
 (command "_.MOVE" "_ALL" "" PT3 "0,0")
 )
 ;; 坐标查询
 (while (setq PTI (getpoint "\n点击查询坐标<退出>:"))
 (princ (strcat "\rX=" (rtos (car PTI) 2 4) " Y=" (rtos (cadr PTI) 2 4)))
 )
 (command "_.UCS" "_W")  ; 恢复世界坐标系
 (princ)
 )
 
 | 
 |