★飞飛★ 发表于 2012-8-1 13:00:58

按填充图案样式筛选出相同填充图案?问题已解决。

本帖最后由 ★飞飛★ 于 2012-8-2 10:48 编辑

  这是本人编写的程序,在两种以上的填充图案时会陷入死循环状态,不能筛选出相同的填充图案来。请教这里的高手们给修改一下,谢谢!如本程序修改完善,将对外幕墙等相关按填充图案表示材质的工程的算量将是非常有用的东西,能节省大量宝贵的时间。

(defun c:sxt () ;按填充图案样式过滤选择相同填充图案
   (setvar "cmdecho" 0)
   (princ "\n点选填充图案样式名称:")
   (setq fil (ssget (list '(0 . "HATCH"))))
   (setq sn (ssname fil 0)) ;图元名1
   (setq eg (entget sn)) ;图元名1列表
   (setq s1 (cdr (assoc 2 eg)) ) ;图元名1中填充图案名称

(setq ss (ssget (list '(0 . "HATCH"))))
(setq len (sslength ss)) ;确定选中的个数
(setq n 0)
(while (<= n (- len 1))
(progn
   (setq sn1 (ssname ss n)) ;图元名n
   (setq eg1 (entget sn1)) ;图元名n列表
   (setq s2 (cdr (assoc 2 eg1)) ) ;图元名n中填充图案名称
   (cond ((= s2 s1)
         (command "PSELECT" sn1 "")
         (setq n (+ 1 n))
         )
   ) ;cond
) ;progn
);while
(setvar "cmdecho" 1)
(princ)
)

★飞飛★ 发表于 2012-8-2 10:46:49

本帖最后由 ★飞飛★ 于 2012-8-6 18:42 编辑

问题已解决。在此粘贴出代码,供童鞋们工作学习使用。
如果不能亮显出对象,出现提示“未知命令PSELECT”时,解决方法是:请童鞋自己按下Ctrl+1,调出对象特性选项板,然后关闭对象特性选项板就能可以用了。
(defun c:sxt () ;按填充图案样式筛选出相同填充图案
(setvar "cmdecho" 0)
(princ "\n请点选需要过滤的填充图案:")
(setq fil (ssget ":E:S" (list '(0 . "HATCH"))))
(setq sn (ssname fil 0)) ;图元名1
(setq eg (entget sn)) ;图元名1列表
(setq s1 (assoc 2 eg)) ;图元名1中填充图案名称

(princ "\n请选择对象范围,过滤填充图案:")
(setq ss (ssget (list '(0 . "HATCH") s1)))
(setq len (sslength ss)) ;确定选中的个数
(setq n 0)
(repeat len
(setq sn1 (ssname ss n)) ;图元名n
(setq eg1 (entget sn1)) ;图元名n列表
(setq s2 (cdr (assoc 2 eg1)) ) ;图元名n中填充图案名称
(if (= s2 (cdr s1))
      (command "PSELECT" ss "")
      (setq n (1+ n))
);if
);repeat
(setvar "cmdecho" 1)
(princ)
)

半夜星星 发表于 2023-5-22 16:33:18

;;;下面这个可以选择相同图案一起移动到指定点,你们试试吧,
(defun c:sxt () ;按填充图案样式筛选出相同填充图案
        (setvar "cmdecho" 0)
        (princ "\n点选填充样图:")
        (setq sample (ssget(list '(0 . "HATCH"))))       
       
        (while(and(princ "\n框选相同图案范围:")(setq ss (ssget (list '(0 . "HATCH") (assoc 2(entget(ssname sample 0)))))))
          (setq ptz (T-get-object-center-pt (ssname ss 0 )))
                (command "move" ss "" ptz pause)
        )       
        (setvar "cmdecho" 1)
        (princ)
)

(defun T-get-object-center-pt (name)
      (setq obj (vlax-ename->vla-object name))
      (vla-GetBoundingBox obj 't-min 't-max)
      (setq t-min (safearray-value t-min))
      (setq t-max (safearray-value t-max))
      (polar t-min (angle t-min t-max) (/ (distance t-min t-max) 2))
)

999999 发表于 2022-3-19 20:34:12

★飞飛★ 发表于 2012-8-2 10:46
问题已解决。在此粘贴出代码,供童鞋们工作学习使用。
如果不能亮显出对象,出现提示“未知命令PSELECT” ...

感谢大佬分享,我这边试用了一下,您这个插件好像我选中了图案筛选后,按一下空格就又取消了选择呢,您知道是什么问题 吗

preone 发表于 2012-8-1 20:07:23

(command "PSELECT" sn1 "")
上句中的 PSELECT 是什么命令~?

★飞飛★ 发表于 2012-8-2 09:44:25

就是按Ctrl+1对象特性面板中的选择对象按钮,命令名为PSELECT,选择对象后就亮显的,之后就可以常规操作如移动,复制,删除等。

onandoff 发表于 2012-10-30 23:06:13

下载了待学习   

tianyi1230 发表于 2012-12-24 21:29:22

好东西,学习了,感谢楼主

bai2000 发表于 2012-12-26 10:04:46

楼主能继续开发下去,能自动计算填充面积就更好了

★飞飛★ 发表于 2014-10-19 15:39:50

bai2000 发表于 2012-12-26 10:04 static/image/common/back.gif
楼主能继续开发下去,能自动计算填充面积就更好了
可以的,只是加一小段统计汇总面积的程序即可,会者不难,难点是筛选相同填充图案,呵呵

434939575 发表于 2014-11-11 13:29:57

感谢大侠,今天正需要!

bai2000 发表于 2015-7-13 19:50:18

顶上去,希望能等到填充面积
页: [1] 2
查看完整版本: 按填充图案样式筛选出相同填充图案?问题已解决。