找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 773|回复: 7

[LISP程序]:详图比例设定、复原

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2002-9-3 23:29:46 | 显示全部楼层 |阅读模式

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

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

×
xt1命令,详图比例设定,根据比例自动放缩详图,按1:100出图比例布图。
xt2命令,详图比例复原,根据比例复原详图为1:1,方便修改。


  1. [FONT=courier new]
  2. ;;详图比例设定
  3. (defun c:xt1 (/ pt1 pt2 ss df q0 vh i lt e bl pt)
  4.   (if (and (setq pt1 (getpoint "\n窗口的第一点<退出>: "))
  5.            (setq pt2 (getcorner pt1 "\n窗口的第二点<退出>: "))
  6.            (setq ss (ssget "_w" pt1 pt2))
  7.       )
  8.     (progn
  9.       (xdrx_begin)
  10.       (if (setq vh (ssget "w" pt1 pt2 (list (cons 0 "DIMENSION"))))
  11.         (progn
  12.           (setq bl (substr (cdr (assoc 3 (entget (ssname vh 0)))) 5 3))
  13.           (setq df (getint (strcat "\n请输入详图比例 <1:" bl "> 1:")))
  14.           (if (null df)
  15.             (setq df (* 0.01 (atoi bl)))
  16.             (setq df (* 0.01 df))
  17.           )
  18.           (setq i 0)
  19.           (while (< i (sslength vh))
  20.             (setq lt (entget (ssname vh i)))
  21.             (setq e (cdr (assoc 3 lt)))
  22.             (command "dim1" "res" e)
  23.             (setvar "dimlfac" df)
  24.             (setvar "dimscale" 1)
  25.             (command "dim1" "update" (cdr (assoc -1 lt)) "")
  26.             (setq i (+ 1 i))
  27.           )
  28.         )
  29.         (setq df (* 0.01 (getint "\n请输入详图比例 <退出> 1: ")))
  30.       )
  31.       (setq q0 (xdrx_entity_box ss)
  32.             q0 (xdrx_midp (car q0) (cadr q0))
  33.       )
  34.       (command "scale" ss "" q0 (/ 1 df))
  35.       (if
  36.         (setq pt (xdrx_dragssmove "\n点取要移到的位置 <不移动>:" ss q0))
  37.          (command ".move" ss "" q0 pt)
  38.       )
  39.       (xdrx_end)
  40.     )
  41.   )
  42.   (princ)
  43. )
  44. ;;详图比例恢复
  45. (defun c:xt2 (/ pt1 pt2 ss df q0 vh i lt e bl pt)
  46.   (if (and (setq pt1 (getpoint "\n窗口的第一点<退出>: "))
  47.            (setq pt2 (getcorner pt1 "\n窗口的第二点<退出>: "))
  48.            (setq ss (ssget "_w" pt1 pt2))
  49.       )
  50.     (progn
  51.       (xdrx_begin)
  52.       (if (setq vh (ssget "w" pt1 pt2 (list (cons 0 "DIMENSION"))))
  53.         (progn
  54.           (setq bl (substr (cdr (assoc 3 (entget (ssname vh 0)))) 5 3))
  55.           (setq df (getint (strcat "\n请输入详图比例 <1:" bl ">  1:")))
  56.           (if (null df)
  57.             (setq df (* 0.01 (atoi bl)))
  58.             (setq df (* 0.01 df))
  59.           )
  60.           (setq i 0)
  61.           (while (< i (sslength vh))
  62.             (setq lt (entget (ssname vh i)))
  63.             (setq e (cdr (assoc 3 lt)))
  64.             (command "dim1" "res" e)
  65.             (setvar "dimlfac" 1)
  66.             (setvar "dimscale" df)
  67.             (command "dim1" "update" (cdr (assoc -1 lt)) "")
  68.             (setq i (+ 1 i))
  69.           )
  70.         )
  71.         (setq df (* 0.01 (getint "\n请输入详图比例 <退出> 1: ")))
  72.       )
  73.       (setq q0 (xdrx_entity_box ss)
  74.             q0 (xdrx_midp (car q0) (cadr q0))
  75.       )
  76.       (command "scale" ss "" q0 df)
  77.       (if
  78.         (setq pt (xdrx_dragssmove "\n点取要移到的位置 <不移动>:" ss q0))
  79.          (command ".move" ss "" q0 pt)
  80.       )
  81.       (xdrx_end)
  82.     )
  83.   )
  84.   (princ)
  85. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-3 23:44:30 | 显示全部楼层
从XDRX_API函数用法的角度,修改了程序,你看看,体会下API处理选择集的方便性,这个用法是很多程序用到的。


  1. [FONT=courier new]
  2. ;;详图比例设定
  3. (defun c:xt1 (/ pt1 pt2 ss df q0 vh i lt e bl pt)
  4.   (if (and (setq pt1 (getpoint "\n窗口的第一点<退出>: "))
  5.            (setq pt2 (getcorner pt1 "\n窗口的第二点<退出>: "))
  6.            (setq ss (ssget "_w" pt1 pt2))
  7.       )
  8.     (progn
  9.       (xdrx_begin)
  10.       (if (setq vh (ssget "w" pt1 pt2 (list (cons 0 "DIMENSION"))))
  11.         (progn
  12.           (xdrx_setenttodb (ssname vh 0))
  13.           (setq bl (substr (xdrx_getentdxf 3) 5 3))
  14.           (setq df (getint (strcat "\n请输入详图比例 <1:" bl "> 1:")))
  15.           (if (null df)
  16.             (setq df (* 0.01 (atoi bl)))
  17.             (setq df (* 0.01 df))
  18.           )
  19.           (xdrx_setsstodb vh 0) ;;选择集入库
  20.           (while (setq e (xdrx_getentdata 0))
  21.             (command "dim1" "res" (xdrx_getentdxf 3))
  22.             (setvar "dimlfac" df)
  23.             (setvar "dimscale" 1)
  24.             (command "dim1" "update" e "")
  25.           )
  26.         )
  27.         (setq df (* 0.01 (getint "\n请输入详图比例 <退出> 1: ")))
  28.       )
  29.       (setq q0 (xdrx_entity_box ss)
  30.             q0 (xdrx_midp (car q0) (cadr q0))
  31.       )
  32.       (command "scale" ss "" q0 (/ 1 df))
  33.       (if
  34.         (setq pt (xdrx_dragssmove "\n点取要移到的位置 <不移动>:" ss q0))
  35.          (command ".move" ss "" q0 pt)
  36.       )
  37.       (xdrx_end)
  38.     )
  39.   )
  40.   (princ)
  41. )
  42. ;;详图比例恢复
  43. (defun c:xt2 (/ pt1 pt2 ss df q0 vh i lt e bl pt)
  44.   (if (and (setq pt1 (getpoint "\n窗口的第一点<退出>: "))
  45.            (setq pt2 (getcorner pt1 "\n窗口的第二点<退出>: "))
  46.            (setq ss (ssget "_w" pt1 pt2))
  47.       )
  48.     (progn
  49.       (xdrx_begin)
  50.       (if (setq vh (ssget "w" pt1 pt2 (list (cons 0 "DIMENSION"))))
  51.         (progn
  52.           (xdrx_setenttodb (ssname vh 0))
  53.           (setq bl (substr (xdrx_getentdxf 3) 5 3))
  54.           (setq df (getint (strcat "\n请输入详图比例 <1:" bl ">  1:")))
  55.           (if (null df)
  56.             (setq df (* 0.01 (atoi bl)))
  57.             (setq df (* 0.01 df))
  58.           )
  59.           (xdrx_setsstodb vh 0)
  60.           (while (setq e (xdrx_getentdata 0))
  61.             (command "dim1" "res" (xdrx_getentdxf 3))
  62.             (setvar "dimlfac" 1)
  63.             (setvar "dimscale" df)
  64.             (command "dim1" "update" e "")
  65.           )
  66.         )
  67.         (setq df (* 0.01 (getint "\n请输入详图比例 <退出> 1: ")))
  68.       )
  69.       (setq q0 (xdrx_entity_box ss)
  70.             q0 (xdrx_midp (car q0) (cadr q0))
  71.       )
  72.       (command "scale" ss "" q0 df)
  73.       (if
  74.         (setq pt (xdrx_dragssmove "\n点取要移到的位置 <不移动>:" ss q0))
  75.          (command ".move" ss "" q0 pt)
  76.       )
  77.       (xdrx_end)
  78.     )
  79.   )
  80.   (princ)
  81. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-9-3 23:51:39 | 显示全部楼层
我觉的不用这么复杂,不同比例图放在一起打印,最好的办法是做成块,再放大或缩小块,要修改时,再缩回去或放大再双击修改,习惯仍然是一样的,所以只用到一个命令,scale就行了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-9-3 23:58:05 | 显示全部楼层
借这个程序,说明矩阵变换的用法,下面代码的效率要远远高于使用SCALE命令,所有的ACAD对实体编辑的操作,都可以使用矩阵使用矩阵变换来完成。

程序中用SCALE命令缩放选择集,可以通过矩阵的变换完成


  1. [FONT=courier new]
  2. (setq mMat (xdrx_matrix_identity) ;;构造单位矩阵
  3.         mMat (xdrx_matrix_setscale mMat 比例 (trans 基点 1 0));;构造缩放矩阵
  4. )

  5. ($xdlsp_pickset_transform 选择集 mMat)
  6. [/FONT]


就完成缩放操作了。上面的矩阵换平移,旋转,镜像,对齐等等,单独或组合,构造完毕转换矩阵后,一次性变换选择集。

$xdlsp_pickset_transform函数定义如下(在XDLSP.LSP)中:



  1. [FONT=courier new]
  2. ;|
  3.     选择集实体移动变换
  4. |;
  5. (defun $xdlsp_pickset_transform (ss mRMatrix / e)
  6.   (xdrx_setsstodb ss 0)
  7.   (while (setq e (xdrx_getentdata 0))
  8.     (xdrx_entity_transForm e mRMatrix)
  9.   )
  10.   (princ)
  11. )
  12. ;|
  13.    选择集实体拷贝变换
  14. |;
  15. (defun $xdlsp_pickset_transformedCopy (ss mRMatrix / e)
  16.   (xdrx_setsstodb ss 9)
  17.   (while (setq e (xdrx_getentdata 9))
  18.     (xdrx_entity_transFormedCopy e mRMatrix)
  19.   )
  20.   (princ)
  21. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2002-9-4 00:11:40 | 显示全部楼层
块可以用在位编辑修改,但是也有放缩问题,而且在位编辑影响速度,过程中无法save。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-9-4 00:20:48 | 显示全部楼层
是的,放缩是个问题,而且标注值在编辑里所表示的值是原值X放缩系数,所以要有这个概念,如果修改量比较大,可以放缩回原来的比例,再修改.哪果觉的过程中不能save,可以找散,再组块.或拷贝一个到别的地方做备份,再修改个备份,2002组块再定义很简单.
不知大家平时画高层立面是什么画的?我一般不同层组成一块,以后改立面只改块,非常方便,而且快.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2002-9-4 00:26:07 | 显示全部楼层
对,重复的东西要用块(或参照),修改一个,其它就更新了。这是一个很好用的cad技巧!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 11:06 , Processed in 0.325697 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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