一、同样一个块,在什么都不变,只改变NORMAL的情况下,如下图
斜的矩形,是平行那个矩形在WCS的投影的样子。
你的问题是现在有那个斜的矩形块, 想normal改成0,0,1,那改后,显示的样子就是水平那个矩形。
改这个很容易,得到原来的坐标系和WCS下对象坐标系的变换矩阵,作用下实体就可以了。
 - (defun c:tt ()
- (if (setq e (car (xdrx_entsel "\n拾取块:" '((0 . "insert")))))
- (progn (setq ecs (xdrx_entity_getecs e)
- ori (list (caar ecs) (cadar ecs) 0.0)
- ocs (list ori '(1 0 0) '(0 1 0) '(0 0 1))
- mat (xdrx_matrix_transcoordsys ecs ocs)
- )
- (xdrx_entity_transformedcopy e mat)
- (xdrx_setpropertyvalue (entlast) "color" 1)
- )
- )
- (princ)
- )
二、掰正后,normal变成 (0 0 1.0), 要想形状还不变,那只能是不等比例,算出原来的块和转NORMAL的块的夹角,在根据前后包围框,算出X,Y的比例,就可以实现了。
代码:
 - (defun c:tt ()
- (if (setq e (car (xdrx_entsel "\n拾取块:" '((0 . "insert")))))
- (progn (setq ecs (xdrx_entity_getecs e)
- ori (list (caar ecs) (cadar ecs) 0.0)
- ocs (list ori '(1 0 0) '(0 1 0) '(0 0 1))
- mat (xdrx_matrix_transcoordsys ecs ocs)
- )
- (xdrx_entity_transformedcopy e mat);;normal变(0 0 1.0)
- (setq blk (entlast)
- box (xdrx_entity_box blk)
- x2 (distance (car box) (cadr box));;转后的X方向的长度
- y2 (distance (car box) (last box));;转后的Y方向的长度
- an2 (angle (car box) (cadr box))
- xdir (cadr ecs);;原来normal平面的,块ECS的X轴
- box (xdrx_entity_box e xdir);;得到原来ECS下X轴方向的包围盒
- box (xd::pnts:setz box 0.0)
- x1 (distance (car box) (cadr box));;原来normal的X方向长度
- y1 (distance (car box) (last box));;原来normal的Y方向长度
- an1 (angle (car box) (cadr box));;原来normal的X角度
- sclx (/ x1 x2); 新x比例
- scly (/ y1 y2); 新y比例
- an (- an1 an2); 旋转角度
- )
- (setq mrot
- (xdrx_matrix_setrotation an '(0 0 1.0) (car box));;旋转矩阵
- )
- (xdrx_entity_transform blk mrot)
- (xdrx_setpropertyvalue
- blk
- "ScaleFactors"
- (list sclx scly 1.0)
- "color"
- 1
- )
- )
- )
- (princ)
- )
上面是API的实现,思路在这,你想用纯LISP,按思路,去实现相应的API函数即可。
|