乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 150|回复: 9

如何只选择屏幕上的圆弧和线?

[复制链接]

46

主题

252

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
436
发表于 2004-3-25 21:31:00 | 显示全部楼层 |阅读模式
用选择集的SelectOnScreen方法,如何过滤其它元素,而只选择线和圆弧?
回复

使用道具 举报

yxp

122

主题

702

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1188
发表于 2004-3-25 21:35:00 | 显示全部楼层
(ssget '((-4 . "")))
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-25 21:37:00 | 显示全部楼层
(ssget '((0 . "ARC,LINE,LWPOLYLINE,POLYLINE")))
回复

使用道具 举报

6

主题

412

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
436
发表于 2004-3-26 10:00:00 | 显示全部楼层
直接處理螢幕看得到的
  1. (defun c:test()
  2.    (setq cp (trans (getvar "viewctr") 1 2))
  3.    (setq pt1 (trans (getvar "vsmin") 1 2))
  4.    (setq pt2 (trans (getvar "vsmax") 1 2))
  5.    (setq xscl (- (car pt2) (car pt1)))
  6.    (setq yscl (- (cadr pt2) (cadr pt1)))
  7.    (setq sh (getvar "viewsize"))
  8.    (setq sw (* sh (/ xscl yscl)))
  9.    (setq p1 (list (- (car cp) (* 0.5 sw)) (- (cadr cp) (* 0.5 sh))))
  10.    (setq p3 (list (+ (car cp) (* 0.5 sw)) (+ (cadr cp) (* 0.5 sh))))
  11.   
  12.    (setq ss (ssget "c" p1 p3 '((0 . "ARC,LINE"))))
  13.    (command "chprop" ss "" "c" 1 "")(prin1)
  14. )
回复

使用道具 举报

22

主题

48

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2004-3-27 21:44:00 | 显示全部楼层
如果在CAD内部直接操作,可以采用过滤器操作,如果用好了,不比LISP程序慢!!!
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2004-3-28 01:36:00 | 显示全部楼层
我想,顶楼问的是SelectOnScreen方法如何在Vlisp中表达。楼上们的回答似乎都是答非所问。
我与他有同样的问题:不带过滤参数是比较方便的,使用上也没有什么问题。但是,如果要加过滤的话,我怎么也试不出如何加上这个GroupCode。直接用整数,用vlax-variant-value, 用SafeArray都弄不出来。
在运行效率要求比较高的情况下,我试验得出
(Vlax-for obj selection ...)
比用
(while (vla-object)...)        
效率要明显的高,速度大概可以提高1/3到1/4。因此,我认为这个还是值得讨论的。
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-28 10:01:00 | 显示全部楼层
有感于vla-setxdata的参数设置,没想到竟对了...
(defun c:test( / doc sets set1 Filtertype Filterdata item)
         (setq doc (vla-get-activedocument (vlax-get-acad-object)))
         (setq sets (vla-get-SelectionSets doc))
         (setq set1 (vla-item sets "set1"))
         (setq Filtertype (vlax-make-safearray vlax-vbInteger '(0 . 0)))
         (vlax-safearray-fill Filtertype '(0))
         (setq Filterdata (vlax-make-safearray vlax-vbvariant '(0 . 0)))
         (vlax-safearray-fill Filterdata '("circle"))
         (vla-selectonscreen set1 Filtertype Filterdata)
         (vlax-for item set1
                                 (vla-delete item)
         )
)
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2004-3-28 15:24:00 | 显示全部楼层
谢谢飞兄,:)我也作点贡献,通用函数吧~~;;; ax:ssget
;;; 返回ActiveX形式的选择集
  1. ;;; ax:ssget
  2. ;;; 返回ActiveX形式的选择集(vl-load-com)(defun ax:ssget (FilterTypeList FilterDataList / sets ss ft fd)
  3.    (setq sets (vla-get-SelectionSets
  4.                              (vla-get-activedocument (vlax-get-acad-object))
  5.                          )
  6.    )
  7.    (if (vl-catch-all-error-p
  8.                (vl-catch-all-apply
  9.                    (function (lambda ()
  10.                                            (setq ss (vla-item sets "ax_ssget"))
  11.                                            (vla-clear ss)
  12.                                        )
  13.                    )
  14.                    nil
  15.                )
  16.            )
  17.        (setq ss (vla-add sets "ax_ssget"))
  18.    )
  19.    (if (and FilterTypeList FilterDataList)
  20.        (progn
  21.            (setq ft (vlax-make-safearray
  22.                                  vlax-vbInteger
  23.                                  (cons 0 (1- (length FilterTypeList)))
  24.                              )
  25.            )
  26.            (vlax-safearray-fill ft FilterTypeList)
  27.            (setq fd (vlax-make-safearray
  28.                                  vlax-vbVariant
  29.                                  (cons 0 (1- (length FilterDataList)))
  30.                              )
  31.            )
  32.            (vlax-safearray-fill fd FilterdataList)
  33.            (vla-selectOnScreen ss ft fd)
  34.        )
  35.        (vla-selectOnScreen ss)
  36.    )
  37.    ss
  38. );;;(defun c:test1 (/ item)
  39. ;;;   (vlax-for item (ax:ssget nil nil)
  40. ;;;       (vla-delete item)
  41. ;;;   )
  42. ;;;)
  43. ;;;
  44. ;;;(defun c:test2 (/ item)
  45. ;;;   (vlax-for item (ax:ssget '(0) '("circle"))
  46. ;;;       (vla-delete item)
  47. ;;;   )
  48. ;;;)
  49. ;;;
  50. ;;;(defun c:test3 (/ item)
  51. ;;;   (vlax-for item (ax:ssget '(0) '("circle,*line"))
  52. ;;;       (vla-delete item)
  53. ;;;   )
  54. ;;;)
  55. ;;;
  56. ;;;(defun c:test4 (/ item)
  57. ;;;   (vlax-for item (ax:ssget '(0 8) '("circle,*line" "layer1"))
  58. ;;;       (vla-delete item)
  59. ;;;   )
  60. ;;;)
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-3-28 16:43:00 | 显示全部楼层
楼上程序还是有诸多问题,
如:(setq ss (ax:ssget nil nil))
(setq ss2 (ax:ssget nil nil))
这样如果两次选择不一样,ss会被改变
另,vla-item正确返回的情况下,vla-clear也可能出错(原因还未找到),导致执行vla-add程序出错。
在命名上是否还须再智能一点,以及vla-item和vla-clear要分开捕捉错误,以尽量避免程序的出错?
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2004-3-28 18:53:00 | 显示全部楼层
我在发表之前用的是这个 "ax:ssget"(setq ss (vla-item sets "ax:ssget"))
(vla-clear ss)
在AutoCAD2005下面出错。后来发现是":"的原因,第一句没关系,不出错,第二句不知道为什么与选择集名称有关,改成"ax_ssget"就行了。
meflying兄不知道是在什么环境下调试的,是不是AutoCAD 2002下面?难道AutoCAD 2002下不承认"_"下划线的原因?
关于ss与ss2的问题的确存在,我想这两个SS相当于“指针”吧,指向同一个物体的缘故。如果在命名上“智能”一点,可能会造成选择集不释放?不知道有没有好的解决办法。一种就是随机取名,但引用的程序中最后必须释放选择集。不然就是程序造成内存泄漏了?
(setq ss1 (ax:ssCreate nil nil))
(setq ss2 (ax:ssCreate nil nil))
...
(vla-delete ss1)
(vla-delete ss2)
这种形式如何?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-15 15:50 , Processed in 2.669110 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表