朽木大师 发表于 2013-5-16 09:52:59

等待高人中........

本帖最后由 朽木大师 于 2013-5-16 12:23 编辑

(defun $xdob_Block_hasWipeout (blkname / e has) ;;判断BLOCK定义中是否已有wipeout
(setq has nil)
(if (xdrx_object_get "block" blkname)
    (progn
      (while (and
               (not has)
               (setq e (xdrx_object_next))
             )
      (if (= "AcDbWipeout" (car e))
          (setq has t)
      )
      )
    )
)
has
)

;;对象表、选择集删除
(defun $xdlsp_object_delete (el / e el1 ss x)
(cond
    ((= (type el) 'ename)
      (mapcar
      '(lambda (x)
         (xdrx_object_delete x)
         )
      el
      )
    )
    ((= 'pickset el)
      (xdrx_setsstodb ss 0)
      (while (setq e (xdrx_getentdxf 0))
      (xdrx_object_delete e)
      )
    )
)
)
;;主函数,给现有的BLOCK定义,添加wipeout实体,并放入块容器最前面(避免遮罩自身块内实体)
(defun $XDOB_Block_AppendWipeout (blkname tf / box e el el1 el2 ob x)
(if (and
      (setq ob (xdrx_object_get "block" blkname));;得到BLOCK 对象块容器对象
      (not ($xdob_block_haswipeout blkname))   ;; 判断是否已经制作过wipeout
      )
    (progn
      (while (setq e (xdrx_object_next))   ;;遍历块容器得到所有块内实体并copy到模型空间
      (setq e (cadr e))
      (setq el1 (cons e el))
      (xdrx_entity_transformedcopy e $xdtb_matrix_mat0)
      (setq el2 (cons (entlast) el2))
      )
      (setq el1 (reverse el1)
            el2 (reverse el2)
      )
      ($XDLSP_Object_Delete el1)   ;;删除块内的实体,清空块,以便在第一个位置插入wipeout
      (setq box (apply
                  'xdrx_entity_box         ;;实体包围盒
                  el2
                )
      )
      ($xdlsp_makewipeout box)   ;;制作wipeout
      (mapcar
      '(lambda (x)
         (xdrx_block_append_entity blkname x);;wipeout第一,然后依次插入原来的块内实体。
         )
      (setq el2 (cons (entlast) el2))
      )
      (xdrx_object_delete el2);; 删除临时copy的实体。
      (if tf
         (command ".wipeout" "f" "off");; 根据开关变量,是否显示wipeout外框
      )
    )
)
t
)


(defun c:t5 ( / blkname e e1 from_coord mat p1 to_coord to_vx to_vy to_vz)
(if (and
      (setq e (car (xdrx_entsel "\n拾取插入块<退出>:" '((0 . "INSERT"))))) ;;支持filter的xdrx_entsel
      (setq blkname (xdrx_getentdxf 2));;得到块名
      ($xdob_block_appendwipeout blkname t) ;; 制作遮罩块,不显示边框。
      )
    (progn
      (while (and
               (setq e1 (xdrx_entsel "\n拾取插入的曲线<退出>:" '((0 . "*line,arc,circle,ellipse")))) ;;拾取曲线实体
               (setq p1 (xdrx_curve_closestpoint (car e1) (cadr e1)));;保证点在曲线上,最近点。
             )
      (setq p1 (last p1)
            from_coord ($xdlsp_entity_getecscoordsystem e) ;; 得到插入块的 “源实体坐标系"
            to_vx (xdrx_curve_getfirstderiv (car e1) p1)         ;;目标坐标系的X轴
            to_vy (xdrx_vector_perpvector to_vx)                ;;目标坐标系的Y轴
            to_vz (xdrx_vector_crossproduct to_vx to_vy);;目标坐标系的Z轴
            to_coord (list (cadr e1) to_vx to_vy to_vz)          ;;向量叉乘得到Z轴
            mat (xdrx_matrix_aligncoordsystem from_coord to_coord) ;;求得源坐标系到目标坐标系的变换矩阵
      )
      (xdrx_entity_transformedcopy e mat);; 作用到实体上,完成一个对齐的插入块。
      )
    )
)
(princ)
)

朽木大师 发表于 2013-5-16 09:53:51

效果如上图,我不会改代码,希望有高手更新一下,原码引自XDCAD

朽木大师 发表于 2013-5-16 12:23:26

等待高人中........

朽木大师 发表于 2013-5-16 13:59:27

继续等待高人,高人

gzxl 发表于 2013-5-16 14:51:10

本帖最后由 gzxl 于 2013-5-16 15:02 编辑

那么多未知子函数,何必那么麻烦,记得Lee Mac有个完整的源码直接拿来用就是
看这里http://www.lee-mac.com/autoblockbreak.html

ll_j 发表于 2013-5-16 16:21:59

朽木大师 发表于 2013-5-16 09:53 static/image/common/back.gif
效果如上图,我不会改代码,希望有高手更新一下,原码引自XDCAD

你想怎样更新?
程序中使用的很多函数都是xdrx_api的通用函数,你下载安装就可以使用了,如果要再去重写这些函数,还是很要费点功夫的。

朽木大师 发表于 2013-5-16 16:25:47

gzxl 发表于 2013-5-16 14:51 static/image/common/back.gif
那么多未知子函数,何必那么麻烦,记得Lee Mac有个完整的源码直接拿来用就是
看这里http://www.lee-mac.co ...

试了一下,这个是打断,同时我也试过,发现并不是太好用,并不像演示的那样,一是打断了线,二是块也不会自动转到与线平的方式

朽木大师 发表于 2013-5-16 16:27:05

ll_j 发表于 2013-5-16 16:21 static/image/common/back.gif
你想怎样更新?
程序中使用的很多函数都是xdrx_api的通用函数,你下载安装就可以使用了,如果要再去重写 ...

xdrx_api的通用函数 那个ARX文件只支持04-06 版本有点低,而且加载还挺大

Lisper 发表于 2013-5-16 16:31:22

朽木大师 发表于 2013-5-16 09:53 static/image/common/back.gif
效果如上图,我不会改代码,希望有高手更新一下,原码引自XDCAD

既然不追求过程,那就只要结果!
加载晓东工具箱,程序拿来直接用不就行了!

朽木大师 发表于 2013-5-17 08:25:11

Lisper 发表于 2013-5-16 16:31 static/image/common/back.gif
既然不追求过程,那就只要结果!
加载晓东工具箱,程序拿来直接用不就行了!

一是支持的CAD版太低,二是为了一个功能,加载一个软件,有点不花算
页: [1] 2
查看完整版本: 等待高人中........