找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: XDSoft

[有奖答题] 将图块处理进行到底,能原位把块内的实体重新生成画出来吗?

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 09:25:41 | 显示全部楼层
看大家都说这个题目偏难实现,主要还是思路,我们使用LISP编程习惯了对实体数据表的处理,习惯了通过修改entget数据表,然后用entmod修改实体特性的思路,即使是用了VLISP,也还是停留在这个思路上。

先上的演示,看看这道题怎么做,会用很多的代码吗。





看完上面的演示,说下,其实,ACAD就是是一个图形数据库,数据库是由各种对象组成的一个树形结构。其中可见对象又成为实体,实体和任意个ACAD内部的对象一样,都由方法和数据构成。这些实体都是二进制数字方式存储在数据库中,ACAD所有的“编辑”命令,如COPY,MOVE,MIRROR,SCALE,ROTATE等等在实体编辑后显示前,都是经过一系列图形集合学的算法在计算,而图形几何学的一个“基石”就是“矩阵”的变换运算。ACAD内不向我们遇到旋转,缩放等,就先用几何知识先旋转到哪,旋转完后,在缩放到哪。在ACAD内,不管经过过少次的“编辑”,都是一次性的通过各种矩阵的组合运算,得到一个最终的转换矩阵,实体的数据作用上这个变换矩阵,实体的属性就一次性的发生改变。不管我们中间经过了多少次的“移动,缩放,旋转,镜像,对齐,坐标系的转换"等等。

我们平时绘图的一个经验就是实体越频繁的显示,生成,绘图”体验“就越差,而我们平时编程,如果中间有好多步骤才能得到最终的结果时候,中间频繁的”移动“,”旋转”,“缩放”等等每次都要有实体频繁的刷新,如果我们操作的实体是成千上万的,那么速度就如“蜗牛”般了。 有没有一种方法,不经过中间的这些步骤,直接生成最终的结果,最终的只显示刷新一次数据? 有,那就是“矩阵”运算。

计算机图形学中,缩放有缩放变换矩阵,平移有平移变换矩阵,旋转有旋转变换矩阵,拉伸、错切、投影、镜像都有,他们都是数学的描述,如果我们的操作需要各种组合,比如有缩放有平移有旋转,那么这些“基本”的变换矩阵可以组合运算,在计算机内存中通过数学的模型一次性算出最终的组合变换矩阵,而把这个矩阵作用到实体上,那么实体就一次性的改变了自身的数据,通过表象的显示,让我们看到最终的结果。

为什么推荐大家在ACAD开发中,尽量少用“command”去做,一个是ACAD命令的执行机制,在发出command时,到最终有ARX内部核心去执行需要个时间,另外就是每个命令都是一个单步的操作,如果需要很多命令去做,中间要操作的数据会频繁的进行“显示”,数据量小无所谓,数据量大的情况下,屏幕都拖不动。

推荐是能尽可能的让数据少进行显示刷新,能通过几何运算知识进行运算的尽可能都运算完毕后,进行少次的实体数据显示刷新。

做这个演示是使用了XDRX_API,核心实质是变换矩阵通过实体自身的transformby方法进行变换。

代码和思路如下:

[pcode=lisp,true]
(setq ob (xdrx_object_get "block" "abc"))   ;;从blocktable容器中得到块abc的实体名
[/pcode]

[pcode=lisp,true]
;|遍历块ABC,得到组成块定义的所有的实体。|;
(while (setq e (xdrx_object_next))
    (setq el8 (cons e el8))
)  
(setq el (mapcar 'cadr el8))
[/pcode]

[pcode=lisp,true]
;|提示,用一个单位矩阵作用到实体,如果用transFormedCopy方法,就是得到一个实体的“拷贝”。拷贝操作、无变换。
(mapcar '(lambda(x) (xdrx_entity_transformedCopy x $XDTB_Matrix_Mat0)) el)
[/pcode]

这句执行后,块定义中的每个实体都会得到一份拷贝,根据插入点,画在模型空间相对位置中。想到于在0,0点插入的块。但他们是单独的,相当于“炸开”的。

块定义中每个实体得到“拷贝后”,就是我们怎么把他们变换到需要的位置,需要的形状。


[pcode=lisp,true]
;|得到块定义到UCS的变换矩阵,对这个应用变换矩阵不用我们去算,就是nentsel得到的那个变换下|;
(setq mat (xdrx_matrix_block2wcs (car (entsel))))
[/pcode]

剩下的工作就是简单直接的把上面的矩阵作用到实体上。

[pcode=lisp,true]
;|ss是所有拷贝的选择集,mat是变换矩阵|;
(xdrx_entity_transform  ss mat)
[/pcode]

完了,就上面几个步骤就实现了。出于习惯,我使用了XDRX_API,VLISP中也有vla-TransformBy,大家可以用上面的思路得到变换矩阵后就实现了,哪位朋友用VLISP实现后,希望贴个代码上论坛。

这几天出的几个题目,都是因为
Highflybird版主发的“矩阵”相关帖子有感,出了几个类似的题目,让大家体会,所有关于矩阵的相关知识、运算函数都在Highflybird版主的帖子,不清楚的,点下面链接查看。

http://bbs.xdcad.net/forum.php?mod=viewthread&tid=667494

AUTOCAD内部所有的编辑命令,都可以用变换矩阵实现,希望大家以后再遇到跟“编辑”相关的应用,首先想到的是“矩阵”

点评

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

使用道具 举报

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

使用道具 举报

已领礼包: 987个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 14:06:25 | 显示全部楼层

一直用自己的API,还不知道VLA的transformby不支持不同比例的。ARX的没问题。
另外想知道下,VLA里面有 transFormedCopy这个方法吗,不移动,只拷贝?

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 14:07:17 | 显示全部楼层
tjuzkj 发表于 2013-4-25 11:52
XDRX_API在哪里可以下载

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 14:38:35 | 显示全部楼层
处处问题鸟 发表于 2013-4-25 10:51
需注意的是,Vla-transformby方法对于非同一比例的矩阵无效!

会不会是矩阵没有写对的缘故? VLA最终也是绕不过ARX去实现的,试试我的图块内原位拷贝那个帖子块实体的不等比变换矩阵,用VLA transformby 对它测试下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-25 14:50:14 | 显示全部楼层
Free-Lancer 发表于 2013-4-25 14:41
非等比的,alisp vlisp 玩不了,不想了

别这么着急下结论,会不是是矩阵没有写对?

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

使用道具 举报

发表于 2013-4-25 14:54:33 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-4-25 14:57 编辑

箱子了翻出来一段程序,有点看不懂了
[pcode=lisp,true](if (null *doc)
  (setq *doc (vla-get-activedocument (vlax-get-acad-object)))
)
;;;-----------------------------------------------------------;;
;;; 匿名块程序                                                ;;
;;;-----------------------------------------------------------;;
(defun make-anonymous-block (obj / BLKOBJ origin bkName *space)
  (setq        origin (vlax-3d-point '(0.0 0.0 0.0))
        blkobj (vla-add (vla-get-blocks *doc) origin "*U")
        bkName (vla-get-name blkobj)
  )
  (vlax-invoke *doc 'copyobjects (list obj) blkobj)
  (if (zerop (vla-get-ActiveSpace *doc))
    (setq *space (vla-get-PaperSpace *doc))
    (setq *space (vla-get-modelspace *doc))
  )
  (vla-insertblock *space origin bkName 1 1 1 0)
  (vla-put-Explodable blkobj :vlax-true)
  blkobj
)
;;;-----------------------------------------------------------;;
;;; 矩阵转置                                                  ;;
;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
;;;-----------------------------------------------------------;;
(defun MAT:trp (m)
  (apply 'mapcar (cons 'list m))
)
;;;-----------------------------------------------------------;;
;;; 向量的矩阵变换(向量乘矩阵)                                ;;
;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
;;; Args: m - nxn matrix, v - vector in R^n                   ;;
;;;-----------------------------------------------------------;;
(defun MAT:mxv (m v)
  (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
          m
  )
)
;;;-----------------------------------------------------------;;
;;; 矩阵相乘                                                  ;;
;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
;;;-----------------------------------------------------------;;
(defun MAT:mxm (m q)
  (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
)
(defun CopyBlockEnt (ret   /         blk   ent   lx           ly         lz    mat
                     obj   ref         sclmat             sx           sy         sz    trsmat
                     vv           vx         vy    vz    new   *space      _lastent
                    )
  (setq _lastent (entlast))
  (setq        mat (caddr ret) ;_这个是变换矩阵
        vv  (reverse (cdr (reverse mat))) ;_去掉第四行(0 0 0 1)
        vX  (mapcar 'car vv) ;_X 向量
        vY  (mapcar 'cadr vv) ;_Y 向量
        vZ  (mapcar 'caddr vv) ;_Z 向量
        lX  (distance vX '(0 0 0)) ;_X 比例因子
        lY  (distance vY '(0 0 0)) ;_Y 比例因子
        lZ  (distance vZ '(0 0 0)) ;_Z 比例因子
        ent (car ret)
        obj (vlax-ename->vla-object ent)
  )
  (if (and (equal lX lY 1e-8) (equal lY lZ 1e-8)) ;_如果是均匀缩放
    (progn
      (if (zerop (vla-get-ActiveSpace *doc))
        (setq *space (vla-get-PaperSpace *doc))
        (setq *space (vla-get-modelspace *doc))
      )
      (vlax-invoke *doc 'copyobjects (list obj) *space) ;_则仅仅是copyObjects方式添加到空间中
      (setq new (vlax-ename->vla-object (entlast)))
      (vla-transformby new (vlax-tmatrix mat)) ;_然后再矩阵变换
    )
    (progn
      (setq blk        (make-anonymous-block obj) ;_先做一个匿名图块
            ref        (vlax-ename->vla-object (entlast)) ;_插入块参照
            sX        (/ 1 lx) ;_非均匀缩放则要取得各个比例值
            sY        (/ 1 lY)
            sZ        (/ 1 lZ)
      )
      (setq sclMat (list (list sX 0 0 1) ;_乘以一个比例缩放矩阵使得比例均匀
                         (list 0 sY 0 1)
                         (list 0 0 sZ 1)
                         (list 0 0 0 1)
                   )
            trsmat (MAT:mxm mat sclMat)
      ) ;_得到一个均匀缩放的变换矩阵
      (vla-transformby ref (vlax-tmatrix trsmat)) ;_变换参照
      ;;最后需要变换回去
      (vla-put-xscalefactor ref (* (vla-get-xscalefactor ref) lX))
      (vla-put-yscalefactor ref (* (vla-get-yscalefactor ref) lY))
      (vla-put-zscalefactor ref (* (vla-get-zscalefactor ref) lZ))
      (vlax-put ref 'insertionpoint (mapcar 'last vv))
      (command "explode" "L") ;_炸开匿名块参照
      (vla-delete blk) ;_删除匿名块定义
    )
  )
  (if (equal (entlast) _lastent)
    nil
    (list (entlast) (cadr ret))
  )
)[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-4-25 21:45:11 | 显示全部楼层
本帖最后由 牢固 于 2013-4-25 21:53 编辑

对于非等比嵌套图块,如果不许用explode,则此题用VLisp方法是无解的!
翻出来以前写的非等比例嵌套图块打散程序,方法是用explode!可以打散任意嵌套非等比例图块!对于有些嵌套非等比例图块,命令explode是无法炸开的!见下面测试文件!
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:块.rar 
下载次数:10  文件大小:15.45 KB 
下载权限: 学生 以上  [免费赚D豆]


程序缺点是嵌套的多段线被打散成line了!源码如下:
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:非等比例块打散程序.LSP 
下载次数:23  文件大小:4.68 KB 
下载权限: 学生 以上  [免费赚D豆]

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-6-2 09:46:04 | 显示全部楼层
XDSoft 发表于 2013-4-25 09:25
看大家都说这个题目偏难实现,主要还是思路,我们使用LISP编程习惯了对实体数据表的处理,习惯了通过修改en ...

老大这个录像是用啥软件做的?

点评

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-6-3 01:01:30 | 显示全部楼层
http://www.theswamp.org/index.php?topic=44700.0

请了洋高手,俺英文表达不行,人家可能没看懂。目前结果对非等比也还是没搞定

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-6-3 01:04:04 | 显示全部楼层
taner 发表于 2013-6-2 09:46
老大这个录像是用啥软件做的?

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 08:31 , Processed in 0.249146 second(s), 65 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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