找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: XDSoft

[有奖答题] 窗选获得INSERT、XREF内部分需要的实体

[复制链接]

已领礼包: 345个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-1 11:32:06 来自手机 | 显示全部楼层
userzhl 发表于 2013-5-1 10:43
没复制物体过来。

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

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

发表于 2013-5-1 12:05:38 | 显示全部楼层
并利用上面写的函数,写个测试命令,把XREF在框内的数字文字实体“原位”的拷贝在图中。

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-1 12:24:18 | 显示全部楼层
按照老大的要求,写了一个COPYN的命令,可以窗口选择要拷贝出来的XREF和INSERT里面的实体,分别考虑的XREF和INSERT不同的情况。演示见下面,UCS下测试没问题。

处理XREF实体

test9.gif

处理普通的图块

test10.gif

核心代码如下:

[pcode=lisp,true]
(defun c:copyn (/ be blk blks e elist ent i lst n o obj p1 p2 pts4 ss tm)
  (setq blks (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
        ss (ssadd)
  )
  (if (and
        (setq e (nentselp "拾取要拷贝的INSERT或XREF实体<退出>: "))
        (setq tm (caddr e))
        (setq ent (car (cadddr e)))
        (setq blk (vlax-ename->vla-object ent))
        (setq i (vla-item blks (vla-get-name blk)))
        (progn
          (initget "C W")
          (if (not (setq sel (getkword "\n选择方式[C-交叉/W-窗口]<C>")))
            (setq sel "C")
          )
          t
        )
        (setq p1 (getpoint "\n拷贝范围窗口第一点<退出>:"))
        (setq p2 (getcorner p1 "\n窗口第二点<退出>:"))
        (setq elist (block:select ent (setq pts4 (list p1 (mapcar
                                                            '+
                                                            p1
                                                            (list (car (mapcar
                                                                         '-
                                                                         p2
                                                                         p1
                                                                       )
                                                                  ) 0 0
                                                            )
                                                          ) p2 (mapcar
                                                                 '+
                                                                 p1
                                                                 (list 0 (cadr (mapcar
                                                                                 '-
                                                                                 p2
                                                                                 p1
                                                                               )
                                                                         ) 0
                                                                 )
                                                               )
                                                 )
                                      )
                                  sel nil
                    )
        )
      )
    (progn
      (if (= (vla-get-isxref i) :vlax-false)
        (progn
          (foreach n elist
            (if (and
                  (setq e (entget n))
                  (not (cdr (assoc 102 e)))
                  (setq obj (entmakex e))
                  (setq obj (vlax-ename->vla-object obj))
                )
              (progn
                (vla-transformby obj (vlax-tmatrix tm))
                (setq lst (cons (list obj (vla-get-color obj)) lst))
;                (vla-put-color obj 1)
;                (vla-update obj)
              )
              (princ (strcat "\nComplex entity not created [ " (cdr (assoc 0 e)) " ]"))
            )
          )
        )
        (progn
          (foreach n elist
            (setq obj (vlax-ename->vla-object (entmakex (entget n))))
            (vla-transformby obj (vlax-tmatrix tm))
            (setq lst (cons (list obj (vla-get-color obj)) lst))
;            (vla-put-color obj 1)
;            (vla-update obj)
          )
        )
      )
    )
  )
  (if lst
    (progn
      (foreach o lst                       ; (vla-put-color (car o) (cadr o))
        (setq ss (ssadd (vlax-vla-object->ename (car o)) ss))
        (command ".draworder" (vlax-vla-object->ename (car o)) "" "front")
      )
      (sssetfirst nil ss)
    )
  )
  (princ)
)
[/pcode]

完整程序下载见附件,如果需要过滤指定的实体,自己修改里面的 filter 如:

[pcode=lisp,true]
(setq filter '((0 . "TEXT")(62 . 2)(7 . "STANDARD"))) ;;表示选取TEXT类实体,颜色黄色、字型STANDARD。
[/pcode]

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CopyN.rar 
下载次数:73  文件大小:12.41 KB  售价:10D豆 [记录]
下载权限: 学生 以上  [免费赚D豆]




点评

adc
这个很给力  详情 回复 发表于 2013-8-27 15:23
能不能实现xref内删除或者移动,以前用过一个,重新打开图后删除的又恢复了  详情 回复 发表于 2013-6-3 19:37

评分

参与人数 1威望 +3 D豆 +10 贡献 +3 收起 理由
XDSoft + 3 + 10 + 3 很给力!

查看全部评分

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2013-5-1 12:59:06 | 显示全部楼层

精彩,和mircostation里面的基本一样了,可以在完善下,让用户可以先画一个多边形,然后去选这个多边形把XREF里面的实体给“抠"出来。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

发表于 2013-5-1 14:58:50 | 显示全部楼层
换了一个文件测试了一下,出错了。
QQ截图20130501144836.jpg
QQ截图20130501144116.jpg

窗选获得INSERT、XREF内部分需要的实体——测试文件.rar

94 KB, 下载次数: 16, 下载积分: D豆 -1 , 活跃度 1

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-1 17:33:57 | 显示全部楼层
研究了下XDRX_API,试着用API写个同功能的函数

[pcode=lisp,true]
;;;-----------------------------------------------------------;;
;;; 获得INSERT,XREF在多边形顶点内的实体名                     ;;
;;; 支持过滤表,如'((0 . "TEXT")(62 . 1)...)                  ;;
;;; 参数:                                                    ;;
;;;     ent--INSERT,XREF实体名                                ;;
;;;     pts--顶点表                                           ;;
;;;     sel--方式  "C" 交叉窗口 其他"W"                       ;;
;;;     filter--类SSGET过滤表                                 ;;
;;;返回值:实体名表
;;;-----------------------------------------------------------;;

(defun Block:Select (ent pts sel filter / box cname e elist lst m_b2w m_w2b n ob pts2 x)
  (if (and
        (setq cname (xdrx_object_classname ent))
        (eq (car cname) "INSERT")
      )
    (progn
      (setq m_b2w (xdrx_matrix_block2wcs ent)
            m_w2b (xdrx_matrix_inverse m_b2w)
            pts (mapcar
                  '(lambda (x)
                     (trans x 1 0)
                   )
                  pts
                )
            pts2 (mapcar
                   '(lambda (x)
                       (trans (xdrx_point_transform x m_w2b) 0 1)
                    )
                   pts
                 )
      )
      (setq ob (xdrx_object_get "block" (cdr (assoc 2 (entget ent)))))
      (while (setq e (xdrx_object_next))
        (setq elist (cons e elist))
      )
      (setq elist (mapcar
                    'cadr
                    elist
                  )
      )
      (foreach n elist
        (if (or
              (not filter)
              (and
                filter
                (vl-every '(lambda (x)
                             (member x (entget e))
                           ) filter
                )
              )
            )                               ; 过滤表
          (progn
            (setq box (xdrx_entity_box n))
            (cond
              ((= "C" (strcase sel))   ; _ 交叉窗交
                (if (vl-some '(lambda (x)
                                (apply
                                  'xdrx_isinside
                                  (cons x pts2)
                                )
                              ) box
                    )                       ; _ 文字四角点中任一点落在多边形内即被选中
                  (progn
                    (setq lst (cons n lst))
                  )
                )
              )
              (t
                (if (vl-every '(lambda (x)
                                (apply
                                  'xdrx_isinside
                                  (cons x pts2)
                                )
                              ) box
                    )                       ; _ 文字四角点全部落在多边形内即被选中
                  (setq lst (cons n lst))
                )
              )
            )
          )
        )
      )
    )
  )
  lst
)
[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-1 17:36:13 | 显示全部楼层
userzhl 发表于 2013-5-1 14:58
换了一个文件测试了一下,出错了。

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-1 17:41:14 | 显示全部楼层
贴个用XDRX_API方法做的同样的COPYN命令,没XDRX_API下载晓东工具箱安装就行了,在2005下用。

测试了下上面朋友提供的图形,没发现问题。请测试下这个。

test11.gif

请下载附件。

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CopyN-XD.rar 
下载次数:15  文件大小:1.27 KB  售价:5D豆 [记录]
下载权限: 不限 以上  [免费赚D豆]




评分

参与人数 1威望 +2 D豆 +10 贡献 +2 收起 理由
XDSoft + 2 + 10 + 2 很给力!

查看全部评分

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

使用道具 举报

已领礼包: 207个

财富等级: 日进斗金

发表于 2013-5-1 20:20:33 | 显示全部楼层
可以参考一下
[Select nested]
http://www.theswamp.org/index.php?topic=27786.0

评分

参与人数 1D豆 +4 收起 理由
XDSoft + 4 热心帮忙奖!

查看全部评分

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-5-1 20:29:02 | 显示全部楼层
xshrimp 发表于 2013-5-1 20:20
可以参考一下
[Select nested]
http://www.theswamp.org/index.php?topic=27786.0

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

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-1 21:58:08 | 显示全部楼层
本帖最后由 Lispboy 于 2013-5-1 22:03 编辑
userzhl 发表于 2013-5-1 20:37
Lispboy , 是否19楼的Block:Select 要修改才可以用于21楼的测试文件呢?

下载那个  CopyN-XD.rar 里面都带了。XDRX_API的 Block:Select 是 22楼那个版本。XDRX_API的,只要在晓东工具箱环境里面就能用了,不需要额外的高飞鸟斑竹的矩阵库。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-1 22:54:53 来自手机 | 显示全部楼层
多年没用api了,不过我觉得用api应该还可以更简单,用transformcopy配合选择集函数会更简化来自: Android客户端
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 345个

财富等级: 日进斗金

发表于 2013-5-1 22:58:40 | 显示全部楼层
Lispboy , 能否搞个脱离晓东工具箱环境,也可以对21楼的测试文件进行操作的lsp呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:12 , Processed in 0.343602 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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