找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 962|回复: 0

[教学] 和晓东一起学矩阵(6)-- 兼谈调整问题图块到单位比例

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-30 22:44:57 | 显示全部楼层 |阅读模式

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

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

×
问题提出:

在工作中,有时候遇到一些图块,我们用程序处理时候会发生错误,原因主要是制作图块时候的实体坐标非常大,或者非常小,还有插入比例非常小,比如做个很大的块,然后用0.0001的比例插入,这时候ACAD图形数据库对它的操作会发生错误,怎么解决这类问题呢?

解决思路:

1、比例调整:

我们动态的在图中对这里块进行调整,把他们的插入比例设置成单位比例(X,Y,Z其中一个为1.0),对于插入比例很小的图块,我们设置比例为单位比例后,图块会变大,那么就需要我们在块定义中,把块容器内的实体缩小相应的倍数。

2、插入点调整

    如果制作图块的时候,插入点坐标值很大,比如大于1e7次方以上,那么很多时候会出现错误,那么我们动态的在图中把这类块的插入点移动到0,0,0,插入点变了,图中的引用INSERT实体位置肯定要跟着变化,那么就需要我们把所有的INSERT实体的插入点按照相反的位移移动回来。

经过上面两步调整,图块就变成插入比例为单位比例,插入点在坐标原点的块了,这样的块是非常“健康”的。

下面的附件,图中的块就是问题块,你用属性对象编辑器没法调整Y的比例,调整后,图块就没了,也不能用程序正常求出它的轮廓线
请点击此处下载

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

您的用户组是:游客

文件名称:新块.rar 
下载次数:13  文件大小:419.96 KB 
下载权限: 不限 以上  [免费赚D豆]





QQ截图20131001220104.png


上面这个块另外一个问题就是插入点离图非常远,插入时候非常不方便,下面我们就通过代码调整这样的:

1、比例非常小的块到正常的单位比例
2、移动插入点到图块包络的中心点


  (if (and
        (setq e (car (xdrx_entsel "\n拾取图块<退出>:" '((0 . "INSERT")))))
        (setq scl-l (xdrx_getpropertyvalue e "scalefactors")  ;;获得X,Y,Z插入比例
              scl (apply
                    'min
                    scl-l
                  )
        )
        (< scl 1.0) ;;只处理比例小于1的块
      )
    (progn

      (setq box (XD::Entity:BoxAtEcs e e) ;; 取得图块实体的准确的包围盒,适合实际转角的块的盒子
            box (XD::Geom:Box->9PT box)
            position (nth 4 box) ;; 图块的包络中心点(为以后移动回来准备)
            blk (xdrx_getpropertyvalue e "BlockTableRecord")
            blkname (car blk)
            blkent (cadr blk) ;;取得块名和块对象实体名
            scl-l (mapcar
                    '(lambda (x)
                       (* x (/ 1 scl))
                     )
                    scl-l
                  );;得到单位比例
            mat0 (xdrx_matrix_identity 3)
            mat1 (xdrx_matrix_setscale mat0 scl '(0 0 0));;缩放矩阵(把块内实体缩小到插入比例的倒数倍)
            ents (xdrx_getpropertyvalue blkent "Entities");;获得块定义容器内的所有实体
            box (xdrx_entity_box ents);;块容器实体的包围盒
            box (XD::Geom:Box->9PT box)
            cen (nth 4 box);;块容器包络图的中心,我们要把插入点移动到坐标原点
            v (mapcar
                '-
                '(0 0 0)
                cen
              );; 插入点到坐标原点的位移
            mat2 (xdrx_matrix_settranslation mat0 v) ;; 平移矩阵
      )
      (xdrx_entity_transform ents (xdrx_matrix_product mat1 mat2));;缩放、平移矩阵作用到块内所有实体
      (xdrx_setpropertyvalue blkent "Origin" '(0 0 0));; 设置插入点为坐标原点
      (xdrx_block_update blkname);;更新所有的引用该块的INSERT实体(这个时候,图中的INSERT实体位置要变化了)
      (setq position1 (xdrx_getpropertyvalue e "Position");;下面我们把INSERT实体移动回原来的位置
            v (mapcar
                '-
                position
                position1
              );;变化后的插入点和原来的插入点的位移
            mat4 (xdrx_matrix_settranslation mat0 v);;平移矩阵
      )
      (setq ents (xdrx_getpropertyvalue blkent "BlockReferenceEntities"));;获得所有的INSERT(因为引用该块的所有INSERT都变化了,都需要处理)
      (mapcar
        '(lambda (x)
           (xdrx_entity_transform x mat4);;矩阵作用,移动回原位
           (xdrx_setpropertyvalue x "scalefactors" scl-l);;块比例修改为单位比例
         )
        ents
      )
      (prompt "\n图块调整比例成功.")

    (progn
      (if scl
        (prompt "\n拾取的图块比例不小于1,不需要调整.")
      )
    )
  )
  (princ)
)


经过上面程序代码处理后的块,下面是动画演示,发现可以修改比例了,也可以准确求出轮廓线了。演示图如果看不清,点击放大观看。

xdtb_blockadj.gif



评分

参与人数 1D豆 +5 收起 理由
xshrimp + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

本版积分规则

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

GMT+8, 2024-9-25 06:28 , Processed in 0.315591 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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