- UID
- 1
- 积分
- 15926
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
楼主 |
发表于 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内部所有的编辑命令,都可以用变换矩阵实现,希望大家以后再遇到跟“编辑”相关的应用,首先想到的是“矩阵”。 |
|