找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 748|回复: 3

[LISP程序]:推荐一个好的坐标标注程序,不过有些地方需要

[复制链接]
发表于 2003-10-3 09:48:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
由 aqaz 于 2003年05月13日 17:23 最后编辑
原创]:我自己写的坐标标注.   
code:
;;;zbbz

;;; 标注时是按当前的UCS的,但是数值还是 WCS 的,

;;; 不用转换到 WCS。


;============================== 开始 ==============================

(defun c:zbbz ()

;============================== 设置 ==============================

  (prompt "\n输入字高:<") (princ (getvar "textsize")) (princ ">")
  (setq 输入字高 (getreal))
  (if (not 输入字高)
      (setq 字高 (getvar "textsize"))
      (setq 字高 输入字高)
  )
  (setq old_dimzin (getvar "dimzin"))
  (setvar "dimzin" 1)
  (setq 精度 3)                     
  (setvar "cmdecho" 0)
  (标注)
)


;====================== 取起点的位置及数值 ======================

  (defun 标注()
    (setq 标注点 (getpoint "\n点取标注点:"))
    (if 标注点 (继续) (退出))
  )

  (defun 继续()
    (setq 绝对标注点 (trans 标注点 1 0))
    (setq x_坐标值 (rtos (car   绝对标注点) 2 精度))
    (setq y_坐标值 (rtos (nth 1 绝对标注点) 2 精度))


;=================== 取标注引线位置及长度和角度 ===================

    (setq 临时起点 (getpoint 标注点 "\n点取标注位置:"))
    (setq 引线长度 (distance 标注点 临时起点))
    (setq 临时角度 (atof (angtos (angle 标注点 临时起点 ) 0 3)))
  

;================= 检查标注引线的角度并设为标准值 =================

    (setq 标准角度 (cond ((<= 临时角度    15)   0)
                         ((<= 临时角度  37.5)  30)
                         ((<= 临时角度  52.5)  45)
                         ((<= 临时角度  67.5)  60)
                         ((<= 临时角度   105)  90)
                         ((<= 临时角度 127.5) 120)
                         ((<= 临时角度   141) 135)
                         ((<= 临时角度   165) 150)
                         ((<= 临时角度   195) 180)
                         ((<= 临时角度 217.5) 210)
                         ((<= 临时角度 232.5) 225)
                         ((<= 临时角度   255) 240)
                         ((<= 临时角度   285) 270)
                         ((<= 临时角度 307.5) 300)
                         ((<= 临时角度 322.5) 315)
                         ((<= 临时角度   345) 330)
                         (0)
                   )
    )





;======================= 设标注引线终点的位置 =======================

    (setq 起点 (polar 标注点 (angtof (itoa 标准角度) 0) 引线长度))
  

;===================== 设标注线终点的位置及方向 ===================

    (setq x_字符数 (strlen  x_坐标值))
    (setq y_字符数 (strlen  y_坐标值))
    (if (> x_字符数 y_字符数)
        (setq 坐标字符数 x_字符数)
        (setq 坐标字符数 y_字符数)
    )
  
    (setq 坐标字符长 (* 坐标字符数 字高))  
    (if (and (< 标准角度 270) (> 标准角度 90))
        (setq 标注方向 180)
        (setq 标注方向 0)
    )
  
    (if (= 标注方向 180)
        (setq 终点 (list (- (car 起点) 坐标字符长)  (nth 1 起点)))
        (setq 终点 (list (+ (car 起点) 坐标字符长)  (nth 1 起点)))
    )


;======================== 设标注数字的起点 ========================

    (if (= 标注方向 0) (setq 文字开始点 起点) (setq 文字开始点 终点))  
    (setq 起点_x (list (car 文字开始点)
                       (+ (nth 1 文字开始点) (/ 字高 3.5))))
    (setq 起点_y (list (car 文字开始点)
                       (- (nth 1 文字开始点) 字高 (/ 字高 3.5))))
  

;======================= 使两个坐标字符等长 =======================

    (setq 相差字符数 (abs(- x_字符数 y_字符数)))
    (setq 补充空格数 "")
    (repeat 相差字符数 (setq 补充空格数 (strcat 补充空格数 " ")))
    (if (= 相差字符数 0)
        (setq x_c (strcat "Y=" x_坐标值) y_c (strcat "X=" y_坐标值)))
  
    (if (and (/= l 0) (> x_字符数 y_字符数))  
        (setq x_c (strcat "Y=" x_坐标值)
              y_c (strcat "X="  补充空格数 y_坐标值)))
  
    (if (and (/= l 0) (< x_字符数 y_字符数))  
        (setq x_c (strcat "Y="  补充空格数 x_坐标值)
              y_c (strcat "X=" y_坐标值)))

  
;============================= 标注 ===============================

    (setq old_osmode (getvar "osmode"))
    (setvar "osmode" 0)
    (command "line" 标注点 起点 终点)
    (command "")
    (command "text" 起点_x 字高 "0" y_c)
    (command "text" 起点_y 字高 "0" x_c)
    (setvar "osmode" old_osmode)
    (标注)
  )

;============================== 还原 ==============================

  (defun 退出()
    (setvar "dimzin" old_dimzin)
    (setvar "cmdecho" 1)
    (princ)
  )


;============================== 结束 ==============================


经使用,感觉这个程序写的非常简洁,而且好用!唯一美中不足的就是标注完后X,Y中间的标注线太长,如果可以让标注线根据 X,Y的文字长度适当缩短就更好!请各位高手改进!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-10-6 09:07:26 | 显示全部楼层
;;修改标注部份
;;============================= 标注 ===============================

  (setq OLD_OSMODE (getvar "osmode"))
  (setvar "osmode" 0)
  (command "_.text" 起点_X 字高 "0" Y_C)
  (setq T1 (entlast))
  (setq LEN (textbox (list (assoc 1 (entget (entlast))))))
  (setq LEN (- (car (nth 1 LEN)) (car (nth 0 LEN))))
  (command "_.text" 起点_Y 字高 "0" X_C)
  (setq T2 (entlast))
  (setq LEN1 (textbox (list (assoc 1 (entget (entlast))))))
  (setq LEN1 (- (car (nth 1 LEN1)) (car (nth 0 LEN1))))
  (if (> LEN1 LEN)
    (setq LEN LEN1)
  )
  (command "_.line"
           标注点
           起点
           (setq PT (polar 起点 (angle 起点 终点) LEN))
           ""
  )
  (if (= 标注方向 180)
    (command "_.move"
             T1
             T2
             ""
             起点_X
             (polar 起点_X PI (- (car 起点_X) (car PT)))
    )
  )
  (setvar "osmode" OLD_OSMODE)
  (标注)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-10-9 09:57:27 | 显示全部楼层
实在是太感谢了!经过改进后,这个标注程序显的非常好!谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-10-13 13:56:36 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 20:45 , Processed in 0.354894 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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