明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10551|回复: 24

[原创]LISP的[复制标高后同时改变标高数字]程序,开源

  [复制链接]
发表于 2009-5-26 21:02:00 | 显示全部楼层 |阅读模式
看了subtlation的贴子有这么多人在问源码,今天就发一个,这只是一个最基本的,有很大的扩充空间。希望对大家有用。
  1. (defun c:cbg()
  2.   (setq bg (ssget));取得标高标注的对象(本程序中标高标注的字串必须为文字,不能为属性,而且也不能是块内的文字)
  3.   (setq i (sslength bg)
  4.           j 0)
  5.   ;--------------------------------------
  6.   (while (< j i);遍历选择集对象
  7.     (setq obj (ssname bg j))
  8.     (setq obj (entget obj))
  9.     (setq tmp (cdr (assoc 0 obj)))
  10.     (if (or (= tmp "TEXT") (= tmp "MTEXT") );(= tmp "INSERT"));如果选择集中有对象是文字则
  11.       (progn
  12.         (setq j i);准备退出循环
  13.         (setq is_OK t);设置标识
  14.         (setq ist_pt (cdr (assoc 10 obj)));并取得当前文字对象的坐标用于在复制后选取文字对象
  15.        )
  16.       )
  17.     (setq j (1+ j))
  18.     )
  19.   ;------------------------------------
  20.   (if (not is_OK);如果标识为假则退出程序
  21.     (progn
  22.       (alert "没有文字性标记")
  23.       (exit)
  24.       )
  25.     )
  26.   ;-----------开始复制-------------
  27.   (setq pt1 (getpoint "选择基点:"))
  28.   (command "copy" bg "" pt1)
  29.   (setq pt2 (getpoint pt1))
  30.   (command pt2)
  31.   ;----------开始修改复制后标高的文字标注-----------
  32.   (setq dlt_y (- (cadr pt2) (cadr pt1)));先计算Y的增量
  33.   (setq ist_pt (subst (+ (cadr ist_pt) dlt_y) (cadr ist_pt) ist_pt));按Y增量计算复制的新对象的坐标
  34.   (setq new_tag (ssget "x" (list (cons 10 ist_pt))));按这个新坐标来选取对象
  35.   ;注意,这种选取只能对垂直方向复制有效,如果X坐标发生改变,则这个选取方法也要调整X坐标
  36.   ;为了简单,本程序没有处理X坐标
  37.   
  38.   (setq obj (ssname new_tag 0))
  39.   (setq obj (entget obj));提取选择集中的文字对象
  40.   (setq tag_val (cdr (assoc 1 obj)));取文字对象的值
  41.   (setq tag_val (atof (substr tag_val 2)));去掉前面的符号,并转换成数字(这里没有考滤负号的情况)
  42.   (setq tag_val (+ tag_val (/ dlt_y 1000)));将标高值加上一个Y增量
  43.   (setq tag_val (rtos tag_val));并转换为文本格式
  44.   ;判断在标高前加什么符号
  45.   (if (> (atof tag_val) 0)
  46.     (setq tag_val (strcat "+" tag_val)))
  47.   (if (= (atof tag_val) 0)
  48.     (setq tag_val (strcat "%%P" tag_val)))
  49.   ;将标高转换为点对,用于SUBST函数替换原来的标高字符
  50.   (setq tag_val (cons 1 tag_val))
  51.   (setq obj (subst tag_val (assoc 1 obj) obj));替换
  52.   (entmod obj);修改数据
  53.   (entupd (ssname new_tag 0));更新数据
  54. )
发表于 2012-4-25 21:00:13 | 显示全部楼层
userzhl 发表于 2009-5-27 14:54
只支持“TEXT"MTEXT"意义不大,若能支持属性块的话就好了。

支持属性块的标高
http://bbs.mjtd.com/thread-91303-1-1.html
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-26 19:27:08 | 显示全部楼层
本帖最后由 alexmai 于 2017-10-26 19:50 编辑
pxt2001 发表于 2012-7-15 10:49
;;复制标高,标高数字自动修改
(defun c:t ()
  ;(PXT_ER)

这个标高程序很好用,但想调整功能:

计算后的标高结果,若为正数,想在数字前加上"+"
        即  3.000     (显示为→)   +3.000
             0.015     (显示为→)   +0.015

--------------------------------
我也知道是改这里,但苦于没找到加前序的函数 “+”  

如果能指点一下就更好,谢谢!
             ;; 替换属性文字
             (setq da (entget (entnext en)))
             (setq da (subst (cons 1 txt-n) (assoc 1 da) da))
             (entmod da)
             (entupd en)
             (entupd (entnext en))
发表于 2009-5-27 14:54:00 | 显示全部楼层

只支持“TEXT"MTEXT"意义不大,若能支持属性块的话就好了。

发表于 2011-2-25 10:40:22 | 显示全部楼层
多谢分享,继续学习。
发表于 2011-5-31 12:44:21 | 显示全部楼层
多谢分享
发表于 2011-11-8 17:24:50 | 显示全部楼层
多谢分享,用了下,估计还要根据自己习惯修理修理
发表于 2011-11-16 18:56:54 | 显示全部楼层
还真得修理修理
发表于 2011-11-17 07:51:55 | 显示全部楼层
谢谢楼主的分享
收藏了,学习学习
发表于 2011-11-17 08:32:14 | 显示全部楼层
程序不错,如果能保留小数点后面的零就更好了
发表于 2011-11-21 13:42:53 | 显示全部楼层
程序不错,但是不支持块 现在天正弄出来的标高 都是块,
发表于 2011-11-21 14:24:26 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-21 03:14 , Processed in 0.163033 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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