- 积分
- 540
- 明经币
- 个
- 注册时间
- 2025-6-25
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
;; ===============================================================
;; 功能:引出点坐标(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)
)
|
|