找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1777|回复: 12

[编程大擂台]:如何将选择集X,Y方向不同比例伸缩,要求...

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-4-30 21:18:41 | 显示全部楼层 |阅读模式

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

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

×
如何将选择集(非INSERT)X,Y方向不同比例伸缩,要求伸缩后的,其中的POLYLINE实体(仅包括直线段即可)能保持原来的线宽

希望大家讨论,贴出实现代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-5-1 09:12:05 | 显示全部楼层
含块内的吗?——应该包含的。
我倒觉得应该用solid四边形来表达宽线的变异,而不是保持原宽。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-1 19:32:21 | 显示全部楼层
没弧就简单.

  1. (defun sca-pl(e p x y / en li pt2 pt-xy-scale)
  2. (defun pt-xy-scale(p pbase x y)
  3. (list(+(car pbase)(* x(-(car p)(car pbase))))
  4.       (+(cadr pbase)(* y(-(cadr p)(cadr pbase)))) )
  5. )
  6. (setq en(entget e)li '() )
  7. (foreach k en
  8.   (cond((= 10(car k))
  9.         (setq pt2(cdr k))  
  10.         (setq  li(cons(cons 10(pt-xy-scale pt2 p x y))li))
  11.         )
  12.        (t(setq li(cons k li)))
  13.       )
  14.    )
  15. (entmod (reverse li))
  16. )


下面试验:

  1. (defun c:test( / pl pt x y)
  2. ;(setq x 1.5 y 3)
  3. (if(and(setq pl(car(entsel)))
  4.         (setq pt(getpoint"\nBase point:"))  
  5.         (setq x(getreal"X="))
  6.         (setq y(getreal"\nY=")) )   
  7.      (sca-pl pl pt x y)
  8.   ))


弧线是比较困难的.应该变为椭圆.
谁写一下变arc的.



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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2003-5-1 19:44:57 | 显示全部楼层
抛砖引玉,我先写一个,在xdrx_api下面用。

适合任何实体,对于POLYLINE能保证原来的宽度信息。


  1. <normalfont>
  2. ($xdrx_load '("xdlsp.lsp"))
  3. ;|
  4.   将选择集X,Y不同比例缩放
  5. |;
  6. (defun c:XDTB_EntXScale (/ $XScale_Pro box pj ss)
  7.   (defun $XScale_Pro (blkname / mat eblk plent blkent e1 n ed i p1 p2)
  8.     (command ".insert" blkname pj x y "")
  9.     (setq eblk (entlast))
  10.     (setq mat (xdrx_matrix_block2wcs eblk))
  11.     (setq plent nil)
  12.     (setq blkent (xdrx_object_get "block" blkname))
  13.     (while (setq e (xdrx_object_next))
  14.       (setq e1 (cadr e))
  15.       (if (= "AcDbPolyline" (car e))
  16.         (setq plent (cons e1 plent))
  17.       )
  18.     )
  19.     (foreach n plent
  20.       (setq ed (entget n)
  21.             ed (member '(100 . "AcDbEntity") ed)
  22.             ed (cons '(0 . "LWPOLYLINE") ed)
  23.       )
  24.       (xdrx_object_delete n)
  25.       (entmake ed)
  26.       (setq e (entlast))
  27.       (setq num (xdrx_polyline_numVerts e))
  28.       (setq i 0)
  29.       (repeat num
  30.         (setq p1 (xdrx_polyline_getpointAt e i)
  31.               p1 (mapcar
  32.                    '-
  33.                    p1
  34.                    pj
  35.                  )
  36.               p2 (xdrx_point_transform p1 mat)
  37.         )
  38.         (xdrx_polyline_setpointAt e i p2)
  39.         (setq i (1+ i))
  40.       )
  41.     )
  42.     (xdrx_entity_explode eblk)
  43.     (xdrx_object_delete blkent)
  44.   )
  45.   (prompt "\n请选取要缩放的实体<退出>:")
  46.   (if (and
  47.         (setq ss (ssget))
  48.         (setq x (getreal "\nX方向比例<退出>:"))
  49.         (setq y (getreal "\nY方向比例<退出>:"))
  50.       )
  51.     (progn
  52.       (xdrx_begin)
  53.       (setq box (xdrx_entity_box ss)
  54.             pj (car box)
  55.       )
  56.       (setq blkname (strcat "xdtb_" (xdrx_gettime)))
  57.       (xdrx_block_make blkname ss pj)
  58.       ($xdlsp_pickset_erase ss)
  59.       ($XScale_Pro blkname)
  60.       (xdrx_end)
  61.     )
  62.   )
  63.   (princ)
  64. )
  65. </normalfont>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-5-1 20:15:55 | 显示全部楼层
我的思路是:作块,不等比插入,遍历块内实体-》找出pline信息存到一个表-》删除块内非零宽Pline-》分解-》根据保存的Pline信息表entmake pline。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2003-5-1 20:19:46 | 显示全部楼层
最初由 eachy 发布
[B]我的思路是:作块,不等比插入,遍历块内实体-》找出pline信息存到一个表-》删除块内非零宽Pline-》分解-》根据保存的Pline信息表entmake pline。 [/B]


你的思路就是我上面那个程序的实现。

不过是保存的是BLOCK定义里面的PLINE的信息,然后得到BLOCK到INSERT的转换矩阵,然后ENTAMKE生成PLINE,把矩阵作用到PLINE的每个顶点变换,最后从块定义里面删除POLYLINE实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2003-5-1 20:20:21 | 显示全部楼层
最初由 aeo 发布
[B]不可能全部实体的
你的还不是block--块里改宽--insert吗?
我写的直接改pl线 [/B]


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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-1 20:38:07 | 显示全部楼层
真土,对才怪,和我写的一个样.只能说有弧不对,但近视.

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2003-5-1 20:59:12 | 显示全部楼层 |阅读模式

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

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

×
最初由 aeo 发布
[B]真土,对才怪,和我写的一个样.只能说有弧不对,但近视.

要知道arc会变椭圆,pl就不是pl.就应该没宽度. [/B]


第一个帖子里面说过,POLYLINE实体不考虑有凸度信息的。我说的适合全部实体,是指时候文字等等所有实体,变换的结果当然要依据ACAD里面的规则,ARC、圆是要肯定变椭圆的,这是实体的“歧变”(不同比例嘛)

用ACAD的块做中间,POLYLINE实体炸开后是要变LINE的,失去宽度信息。所以上面程序对POLYLINE进行了处理,回复原来的宽度,这也符合实际应用中用户只在意的是X,Y不同比例的伸缩。

之所以没有考虑带弧段的PL,是因为实际中不会有这样的要求。或者说一个弧要求不同比例,变换后还是弧,这个不会在应用中出现(也不可能实现)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-5-1 21:17:12 | 显示全部楼层
你不是写过一个改线宽的_plw_match
把椭圆用pl线模拟.
用到这里就不会出现近似的情况,虽然也是近似,但总比不理它好.
因为纯粹的半圆的pl线,xy相差远的情况下,失真太大了.

还有里面的文字,大家希望的应该是大小不变或随一个方向改的.
好象有人这样要求过.

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

使用道具 举报

发表于 2006-11-17 03:15:33 | 显示全部楼层
晓东工具箱里有,但是有的时候执行完后,整个快不见了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 02:50 , Processed in 0.450389 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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