找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 723|回复: 11

[求助] [求助]:如何用vl类函数实现类似ssget的功能

[复制链接]

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2004-1-30 14:57:05 | 显示全部楼层 |阅读模式

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

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

×
如何用vl类函数实现类似ssget的功能,是不是用vla-select,怎么加上过滤表,我试了试都不行,每次选择都是获得全图的实体。请给出代码实例。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-1-30 17:02:54 | 显示全部楼层

  1. ;;轉貼
  2. (defun VLASSGET        (DXFCODE FLG / SELSETCOL SELSET FILTER)
  3.   (vl-load-com)
  4.   (or *ACADOBJ*
  5.       (setq *ACADOBJ* (vlax-get-acad-object))
  6.   )
  7.   (or *ACTDOC*
  8.       (setq *ACTDOC* (vla-get-activedocument *ACADOBJ*))
  9.   )
  10.   (setq        SELSETCOL (vla-get-selectionsets *ACTDOC*)
  11.         FILTER          (list (mapcar 'car DXFCODE) (mapcar 'cdr DXFCODE))
  12.   )
  13.   (if (not
  14.         (vl-catch-all-error-p
  15.           (vl-catch-all-apply 'vla-item (list SELSETCOL "Selection"))
  16.         )
  17.       )
  18.     (vla-clear (setq SELSET (vla-item SELSETCOL "Selection")))
  19.     (setq SELSET (vla-add SELSETCOL "Selection"))
  20.   )
  21.   (if (not FLG)
  22.     (vla-selectonscreen
  23.       SELSET
  24.       (vlax-safearray-fill
  25.         (vlax-make-safearray
  26.           vlax-vbinteger
  27.           (cons 0 (1- (length (car FILTER))))
  28.         )
  29.         (car FILTER)
  30.       )
  31.       (vlax-safearray-fill
  32.         (vlax-make-safearray
  33.           vlax-vbvariant
  34.           (cons 0 (1- (length (cadr FILTER))))
  35.         )
  36.         (cadr FILTER)
  37.       )

  38.     )
  39.     (vla-select
  40.       SELSET
  41.       acselectionsetall
  42.       (vlax-safearray-fill
  43.         (vlax-make-safearray
  44.           vlax-vbinteger
  45.           (cons 0 (1- (length (car FILTER))))
  46.         )
  47.         (car FILTER)
  48.       )
  49.       (vlax-safearray-fill
  50.         (vlax-make-safearray
  51.           vlax-vbvariant
  52.           (cons 0 (1- (length (cadr FILTER))))
  53.         )
  54.         (cadr FILTER)
  55.       )
  56.     )
  57.   )
  58.   SELSET
  59. )


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

使用道具 举报

发表于 2004-1-30 18:16:41 | 显示全部楼层
一个偷懒的办法

  1. (setq doc (vla-get-activedocument(vlax-get-acad-object)))
  2. (setq ss (ssget '((0 . "*TEXT")))
  3.       vss (vla-get-activeselectionset doc))
  4. (vlax-for obj vss (vla-erase obj))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-1-30 18:37:49 | 显示全部楼层
最初由 陌生人 发布
[B]一个偷懒的办法

  1. (setq doc (vla-get-activedocument(vlax-get-acad-object)))
  2. (setq ss (ssget '((0 . "*TEXT")))
  3.       vss (vla-get-activeselectionset doc))
  4. (vlax-for obj vss (vla-erase obj))
[/B]

  1. (if (setq ss (ssget '((0 . "text"))))
  2. (vlax-for item (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
  3.   .....;;你的代码
  4. )
  5. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-31 20:33:50 | 显示全部楼层
我在程序中是这样做的:
1.用(entsel)函数获取对象图元名
2.用(vlax-ename->vla-object)函数将象图元名称转换为VLA对象
反之也可以用(vlax-vla-object->ename)函数将VLA对象转换为图元对象。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2004-2-2 12:05:50 | 显示全部楼层
2楼的程序用如下代码测试会删除所有实体,起不到过滤效果,不只是为什么?这也是我发这个帖子的初衷。
(defun C:TEST (/ SSOBJ)
  (setq SSOBJ (VLASSGET '((0 . "line") (8 . "0")) T))
  (vlax-for obj ssobj (vla-erase obj))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-2 13:00:35 | 显示全部楼层
最初由 zhang8755 发布
[B]2楼的程序用如下代码测试会删除所有实体,起不到过滤效果,不只是为什么?这也是我发这个帖子的初衷。
(defun C:TEST (/ SSOBJ)
  (setq SSOBJ (VLASSGET '((0 . "line") (8 . "0")) T))
  (vlax-for obj ssobj (... [/B]

还不如  

  1. (defun c:test (/ ss)
  2. (if (setq ss (ssget  '((0 . "line") (8 . "0")) )
  3.    (vl-cmdf ".erase" "p" "")
  4. )
  5. (princ)
  6. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-3 08:03:15 | 显示全部楼层

  1. 這可能又是VLISP的BUG,我很久以前也發現了一個對POLYLINE寬度(VLA-GETWIDTH)的BUG。
  2. 內容如下:
  3. ;;FOR TEST VLA-GETWIDTH
  4. ;;Why not work for "polyline"
  5. (vl-load-com)
  6. (defun C:TT (/ SW EW)
  7.   (entmake '((0 . "LWPOLYLINE")
  8.              (100 . "AcDbEntity")
  9.              (67 . 0)
  10.              (410 . "Model")
  11.              (8 . "0")
  12.              (100 . "AcDbPolyline")
  13.              (90 . 5)
  14.              (70 . 0)
  15.              (38 . 0.0)
  16.              (39 . 0.0)
  17.              (10 76.0664 72.0219)
  18.              (40 . 0.0)
  19.              (41 . 5.0)
  20.              (42 . 0.0)
  21.              (10 97.0601 104.074)
  22.              (40 . 5.0)
  23.              (41 . 5.0)
  24.              (42 . -0.78921)
  25.              (10 155.376 83.0943)
  26.              (40 . 5.0)
  27.              (41 . 12.0)
  28.              (42 . 1.4926)
  29.              (10 214.275 99.9943)
  30.              (40 . 12.0)
  31.              (41 . 1.0)
  32.              (42 . 0.0)
  33.              (10 213.109 171.091)
  34.              (40 . 1.0)
  35.              (41 . 1.0)
  36.              (42 . 0.0)
  37.              (210 0.0 0.0 1.0)
  38.             )
  39.   )
  40.   (vla-getwidth (vlax-ename->vla-object (entlast)) 2 'SW 'EW)
  41.   (print SW)
  42.   (print EW)
  43.   (SETQ        SW NIL
  44.         EW NIL
  45.   )
  46.   (entmake '((0 . "POLYLINE")
  47.              (62 . 5)
  48.              (6 . "CONTINUOUS")
  49.              (66 . 1)
  50.             )
  51.   )
  52.   (entmake '((0 . "VERTEX")
  53.              (10 76.0664 72.0219)
  54.              (40 . 0.0)
  55.              (41 . 5.0)
  56.              (42 . 0.0)
  57.             )
  58.   )
  59.   (entmake '((0 . "VERTEX")
  60.              (10 97.0601 104.074)
  61.              (40 . 5.0)
  62.              (41 . 5.0)
  63.              (42 . -0.78921)
  64.             )
  65.   )
  66.   (entmake '((0 . "VERTEX")
  67.              (10 155.376 83.0943)
  68.              (40 . 5.0)
  69.              (41 . 12.0)
  70.              (42 . 1.4926)
  71.             )
  72.   )
  73.   (entmake '((0 . "VERTEX")
  74.              (10 214.275 99.9943)
  75.              (40 . 12.0)
  76.              (41 . 1.0)
  77.              (42 . 0.0)
  78.             )
  79.   )
  80.   (entmake '((0 . "VERTEX")
  81.              (10 213.109 171.091)
  82.              (40 . 1.0)
  83.              (41 . 1.0)
  84.              (42 . 0.0)
  85.             )
  86.   )
  87.   (entmake '((0 . "SEQEND")))
  88.   (PRINT (ENTGET (ENTLAST)))
  89. ;;;why not work for "polyline"
  90.   (vla-getwidth (vlax-ename->vla-object (entlast)) 2 'SW 'EW)
  91.   (print SW)
  92.   (print EW)
  93. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-4 08:41:20 | 显示全部楼层
;;;why not work for "polyline"
  (vla-getwidth (vlax-ename->vla-object (entlast)) 2 'SW 'EW)
  (print SW)
  (print EW)
)

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

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2004-2-4 11:47:59 | 显示全部楼层
最初由 21cn 发布
[B][QUOTE]最初由 zhang8755 发布
[B]2楼的程序用如下代码测试会删除所有实体,起不到过滤效果,不只是为什么?这也是我发这个帖子的初衷。
(defun C:TEST (/ SSOBJ)
  (setq SSOBJ (VLASSGET '((0 . "line")... [/B]


用ssget只能在当前图形中选择,而用vl-select可以支持MDI,获得其它已打开图形中的实体。从而编出类似批处理的的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-4 12:37:06 | 显示全部楼层
最初由 陌生人 发布
[B];;;why not work for "polyline"
  (vla-getwidth (vlax-ename->vla-object (entlast)) 2 'SW 'EW)
  (print SW)
  (print EW)
)

是不是认为entlast是 seqend段,而不是polyline? [/B]


你认為(entlast)會抓到seqend段?

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 02:01 , Processed in 0.201697 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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