设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1258|回复: 11

[源码] 填充式实体缩放

[复制链接]

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-10-24 19:15:25 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 q3_2006 于 2013-10-24 19:16 编辑
  1. (defun c:tt ( / blayer box box1 cnt el entl errexit ip mbx olderr oldvar rec ss tmp x x1 xscal y y1 yscal)
  2.   (xd::begin)
  3.   (xdrx_undostart)
  4.   (defun makeunblock (ss ip / tmp errexit mbx blayer)
  5.     (setq t (not nil))
  6.     (setq olderr *error*
  7.     *error* errexit
  8.     )
  9.     (setq oldvar (list (getvar "CMDECHO")))
  10.     (setvar "CMDECHO" 0)
  11.     (terpri)
  12.     (if blayer
  13.       (command "._LAYER" (if (tblsearch "LAYER" blayer)
  14.          "_S"
  15.          "_M"
  16.        ) blayer ""
  17.       )
  18.     )
  19.     (if (and
  20.     ip
  21.     ss
  22.   )
  23.       (progn
  24.   (entmake (list (cons '0 "BLOCK") (cons '2 "*U") (cons '70 1)
  25.            (cons '10 ip)
  26.      )
  27.   )
  28.   (setq cnt (sslength ss))
  29.   (while (>= (setq cnt (1- cnt))
  30.        0
  31.          )
  32.     (setq tmp (ssname ss cnt))
  33.     (entmake (setq el (entget tmp)))
  34.     (if (> (cdr (assoc 66 el)) 0)
  35.       (while (/= "SEQEND" (cdr (assoc 0 (entmake (setq el
  36.                    (entget
  37.                      (entnext
  38.                         (cdr
  39.                        (assoc -1 el)
  40.                         )
  41.                      )
  42.                    )
  43.                    )
  44.                 )
  45.              )
  46.         )
  47.        )
  48.       )
  49.     )
  50.     (entdel tmp)
  51.   )
  52.   (setq tmp (entmake (list (cons '0 "ENDBLK"))))
  53.   (entmake (list (cons '0 "INSERT") (cons '2 tmp) (cons '10 ip)))
  54.       )
  55.     )
  56.     (restore)
  57.   )
  58.   (setq ss (ssget))
  59.   (if ss
  60.     (progn
  61.       (setvar "cmdecho" 0)
  62.       (print "\n选择填充框:")
  63.       (setq rec (car (entsel))
  64.       box (xdrx_entity_box ss)
  65.       x (distance (nth 0 box) (nth 1 box))
  66.       y (distance (nth 0 box) (nth 3 box))
  67.       box1 (xdrx_entity_box rec)
  68.       x1 (distance (nth 0 box1) (nth 1 box1))
  69.       y1 (distance (nth 0 box1) (nth 3 box1))
  70.       xscal (/ x1 x)
  71.       yscal (/ y1 y)
  72.       )
  73.       (makeunblock ss (nth 0 box))
  74.       (setq entl (entget (entlast))
  75.       entl (subst
  76.        (cons 41 xscal)
  77.        (assoc 41 entl)
  78.        entl
  79.      )
  80.       entl (subst
  81.        (cons 42 yscal)
  82.        (assoc 42 entl)
  83.        entl
  84.      )
  85.       )
  86.       (entmod entl)
  87.       (command "move" (entlast) "" (nth 0 box) (nth 0 box1))
  88.       (command "_explode" "l" "")
  89.       (princ)
  90.     )
  91.   )
  92.   (xdrx_undoend)
  93.   (xd::end)
  94. )
网上找的代码改的,算是不等比缩放的扩展,希望高手给优化一下!
000.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-24 19:19:52 | 显示全部楼层
什么叫填充式实体缩放? 能详细说下吗。

看你用了API的函数,如果改,API写这个应该能减少代码到1/3.

点评

我用API还真是少。。。代码说实话,收集的挺多,看得少,这个代码我是能看懂的,所以版主用API优化及简化一下,我搞懂相关函数也不会有困难。  详情 回复 发表于 2013-10-24 19:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

已领礼包: 1259个

财富等级: 财源广进

发表于 2013-10-24 19:26:28 | 显示全部楼层
两个 Box 比出 XY 比例, 构造非等比矩阵, TransformedCopy 过去

点评

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-24 19:26:43 | 显示全部楼层
newer 发表于 2013-10-24 19:19
什么叫填充式实体缩放? 能详细说下吗。

看你用了API的函数,如果改,API写这个应该能减少代码到1/3.

我用API还真是少。。。代码说实话,收集的挺多,看得少,这个代码我是能看懂的,所以版主用API优化及简化一下,我搞懂相关函数也不会有困难。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-24 19:27:23 | 显示全部楼层
st788796 发表于 2013-10-24 19:26
两个 Box 比出 XY 比例, 构造非等比矩阵, TransformedCopy 过去

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-10-24 21:56:20 | 显示全部楼层
本帖最后由 Lispboy 于 2013-10-24 23:18 编辑

xdtb_nscale.gif

下面的代码虽然不多,但信息量大,没有用 xdrx_entity_transformedCopy,因为不是所有实体都支持非等比缩放,这个代码和你贴的是一个思路,做不等比块。

  1. (defun c:tt()
  2.    (if (and (setq ss (ssget))
  3.             (setq e (car (xdrx_entsel "\n选取一个外框确定比例<退出>:" '((0 . "*POLYLINE")(-4 . "&=")(70 . 1)))))
  4.        )
  5.      (progn
  6.         (XD::Begin)
  7.         (setq box1 (XD::Entity:Box ss)
  8.               p1 (car box1)
  9.               y1 (xdrx_vector_length (mapcar '- (last box1)p1))
  10.               x1 (xdrx_vector_length (mapcar '- (cadr box1)p1))
  11.               box2 (XD::Entity:Box e)
  12.               p2 (car box2)
  13.               y2 (xdrx_vector_length (mapcar '- (last box2)p2))
  14.               x2 (xdrx_vector_length (mapcar '- (cadr box2)p2))
  15.               scl (list (/ x2 x1)(/ y2 y1) 1.0)
  16.         )
  17.         (setq a (xdrx_block_make "temp" ss p1 t))
  18.         (xdrx_setpropertyvalue (entlast) "ScaleFactors" scl)
  19.         (setq mat0 (xdrx_matrix_identity 3)
  20.               mat1 (xdrx_matrix_settranslation mat0 (mapcar '- p2 p1))
  21.         )
  22.         (xdrx_entity_transform (entlast) mat1)
  23.         (xdrx_entity_explode (entlast))
  24.         (XD::End)
  25.      )
  26.    )
  27.    (princ)
  28. )


点评

就是这样。。学习了!  详情 回复 发表于 2013-10-25 06:51
这个里面的 Explode 不会是 一炸到底 吧, 如果源里面有块,填充后 一炸到底 就不好了  详情 回复 发表于 2013-10-24 22:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

已领礼包: 1259个

财富等级: 财源广进

发表于 2013-10-24 22:01:53 | 显示全部楼层
Lispboy 发表于 2013-10-24 21:56
下面的代码虽然不多,但信息量,没有用 xdrx_entity_transformedCopy,因为不是所有实体都支持等比缩放 ...

这个里面的 Explode 不会是 一炸到底 吧, 如果源里面有块,填充后 一炸到底 就不好了

点评

下版API给 xdrx_entity_explode 的深度炸开加个开关。  详情 回复 发表于 2013-10-24 22:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

点击这里给我发消息

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-24 22:21:49 | 显示全部楼层
st788796 发表于 2013-10-24 22:01
这个里面的 Explode 不会是 一炸到底 吧, 如果源里面有块,填充后 一炸到底 就不好了

下版API给 xdrx_entity_explode 的深度炸开加个开关。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-25 06:51:22 | 显示全部楼层
Lispboy 发表于 2013-10-24 21:56
下面的代码虽然不多,但信息量大,没有用 xdrx_entity_transformedCopy,因为不是所有实体都支持非等比 ...

就是这样。。学习了!

点评

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

使用道具 举报

点击这里给我发消息

已领礼包: 1259个

财富等级: 财源广进

发表于 2013-10-25 07:06:36 | 显示全部楼层
本帖最后由 st788796 于 2013-10-25 07:11 编辑
q3_2006 发表于 2013-10-25 06:51
就是这样。。学习了!

重复代码部分一般作成子函数
  1. (defun c:tt (/ getwh ss e box1 p1 scl a mat0 mat1)
  2.   (defun getwh (box)
  3.     (list (mapcar '- (cadr box) (car box))
  4.    (mapcar '- (last box) (car box))
  5.    1.
  6.     )
  7.   )
  8.   (if (and (setq ss (ssget))
  9.     (setq e (car (xdrx_entsel
  10.      "\n选取一个外框确定比例<退出>:"
  11.      '((0 . "*POLYLINE") (-4 . "&=") (70 . 1))
  12.    )
  13.      )
  14.     )
  15.       )
  16.     (progn
  17.       (XD::Begin)
  18.       (mapcar 'set
  19.        '(box1 box2)
  20.        (list (XD::Entity:Box ss) (XD::Entity:Box e))
  21.       )
  22.       (mapcar 'set '(p1 p2) (list (car box1) (car box2)))
  23.       (setq scl (mapcar '/ (getwh e) (getwh box1))
  24.      a (xdrx_block_make "temp" ss p1 t)
  25.       )
  26.       (xdrx_setpropertyvalue (entlast) "ScaleFactors" scl)
  27.       (setq mat0 (xdrx_matrix_identity 3)
  28.      mat1 (xdrx_matrix_settranslation mat0 (mapcar '- p2 p1))
  29.       )
  30.       (xdrx_entity_transform (entlast) mat1)
  31.       (xdrx_entity_explode (entlast))
  32.       (XD::End)
  33.     )
  34.   )
  35.   (princ)
  36. )

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

使用道具 举报

发表于 2020-6-8 17:04:10 | 显示全部楼层
Lispboy 发表于 2013-10-24 21:56
下面的代码虽然不多,但信息量大,没有用 xdrx_entity_transformedCopy,因为不是所有实体都支持非等比 ...

大神怎么改成拉伸缩放填充到矩形? 能把你贴的这个代码帮忙改一下吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2020-6-13 08:54:31 | 显示全部楼层
Lispboy 发表于 2013-10-24 21:56
下面的代码虽然不多,但信息量大,没有用 xdrx_entity_transformedCopy,因为不是所有实体都支持非等比 ...

填充进去,边距保持不变怎么弄?可以写个代码吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-10-20 14:00 , Processed in 0.209807 second(s), 79 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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