明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2869|回复: 1

[函数] 应用sssetfirst后,可能导致程序死循环

[复制链接]
发表于 2013-4-19 10:16:00 | 显示全部楼层 |阅读模式
本帖最后由 USER2128 于 2013-4-19 10:20 编辑

我的机器配置:ACAD2012,32位,WINXP 8G内存
应用sssetfirst后,可能会导致程序死循环(绝大多数情况是)

以下有两个主程序TT1和TT2。
程序TT1应用了sssetfirst,导致死循环,程序TT2避开了sssetfirst,运行正常。
  1. ;;; 程序作者:USER2128,QQ:781400968,如有建议望联系。
  2. ;;;----------------------------------------------------
  3. ;;; 本段程序有可能导致死循环,请及时按“Esc”键终止,否则导致CAD崩溃
  4. (defun c:tt1()
  5.   (while (setq ss (ssget ":s"))
  6.     (setq blk-a1 (ssget "p" '((0 . "INSERT") (2 . "A3"))))
  7.     (if blk-a1
  8.       (progn        ;有"A3"块的情况,亮显"A3"块
  9.         (repeat (setq cnt (sslength blk-a1))
  10.         (setq con-pt (GetSSBoundingbox ss))        ;单个实体或选择集的最小包围框
  11. ;;; 高亮"A3"块:
  12.           (redraw (ssname blk-a1 (setq cnt (1- cnt))) 3)
  13.           );repeat.
  14.         );progn
  15.       (progn        ;无"A1,AA1"块时,亮显选择集
  16.         (setq con-pt (GetSSBoundingbox ss))        ;单个实体或选择集的最小包围框
  17. ;;; 亮显选择集
  18.         (ayEntSSHighLight SS)        ;导致本段progn程序, 在此反复执行
  19.         );progn
  20.       );if
  21.     );while
  22.   con-pt);defun

  23. ;;;---------------------------------------------------
  24. ;;; 本段程序放心运行
  25. (defun c:tt2()
  26.   (while (setq ss (ssget ":s"))
  27.     (setq blk-a1 (ssget "p" '((0 . "INSERT") (2 . "A3"))))
  28.     (if blk-a1
  29.       (progn        ;有"A3"块的情况,亮显"A3"块
  30.         (repeat (setq cnt (sslength blk-a1))
  31.         (setq con-pt (GetSSBoundingbox ss))        ;单个实体或选择集的最小包围框
  32. ;;; 高亮"A3"块:
  33.           (redraw (ssname blk-a1 (setq cnt (1- cnt))) 3)
  34.           );repeat.
  35.         );progn
  36.       (progn        ;无"A1,AA1"块时,亮显选择集
  37.         (setq con-pt (GetSSBoundingbox ss))        ;单个实体或选择集的最小包围框
  38. ;;; 亮显选择集
  39.         (repeat (setq cnt (sslength ss))
  40.           (redraw (ssname ss (setq cnt (1- cnt))) 3)
  41.           )
  42.         );progn
  43.       );if
  44.     );while
  45.   con-pt);defun
  46. ;;;----------------------------------------------------------
  47. ;;; 以下为上述程序要用到的子函数, 都来源于明经,部分稍有修改.
  48. ;;;----------------------------------------------------------
  49. ;功能:返回选择集包围盒
  50. ;参数: ss--选择集
  51. ;返回值:选择集所有实体做为整体的包围盒
  52. ;| (setq ssbox (GetSSBoundingbox (ssget)))
  53.          (command "._pline" "_non" (car ssbox) "_non" (list (caar ssbox) (cadadr ssbox))
  54.              "_non" (cadr ssbox) "_non" (list (caadr ssbox) (cadar ssbox)) "_c")
  55. |;
  56. (defun GetSSBoundingbox (sse / ss i ssn ll rr box ptlist ssbox)
  57.   (if (= 'ENAME (type sse))
  58.     (progn (setq ss (ssadd)) (ssadd sse ss))
  59.     (setq ss sse))
  60.   (if ss
  61.     (progn
  62.       (setq i -1)
  63.       (repeat (sslength ss)
  64.         (setq ssn (ssname ss (setq i (1+ i))))
  65.         (vla-GetBoundingBox (vlax-ename->vla-object ssn) 'll 'rr)  ;得到对象的包围盒
  66.         (setq box (list (vlax-safearray->list ll) (vlax-safearray->list rr)))
  67.         (setq ptlist (append ptlist box))
  68.         )
  69.       (setq ssbox (mapcar '(lambda (x) (apply 'mapcar (cons x ptlist))) (list 'min 'max)))
  70.       )
  71.     )
  72.   )
  73. ;;; 中心点:
  74. ;   (setq midpt (mapcar '(lambda (a b) (/ (+ a b) 2)) (car ssbox) (cadr ssbox)))
  75. ;;; 或:
  76. ;   (setq midpt (apply 'mapcar (cons (function (lambda (a b) (/ (+ a b) 2))) ssbox)))


  77. ;;;---------------------------------------------------
  78. ;;;*****************************************
  79. ;; No.6-3 亮显选择集或对象(夹点不显示) 函数
  80. ;;;*****************************************
  81. (defun ayEntSSHighLight(SSorEntName / oldGrips)
  82.   (setq oldGrips (getvar "Grips"))
  83.   (setvar "Grips" 0)
  84.   (cond
  85.     ((= (type SSorEntName) 'PICKSET);选择集.
  86.      (sssetfirst nil SSorEntName)
  87.      );end_switch
  88.     ((= (type SSorEntName) 'ENAME);单一实体.
  89.      (sssetfirst nil (ssadd SSorEntName (ssadd)))
  90.      );end_switch
  91.     );end_cond
  92.   (setvar "Grips" oldGrips)
  93. );end_defun
  94. ;;;---------------------------------------------------
  95. (princ)

测试图(R14格式):


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2016-3-2 16:31:27 | 显示全部楼层
我调试了一下,发现是没跳出while循环的条件,跟sssetfirst没关吧?

点评

正解  发表于 2016-3-2 16:41
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-14 03:04 , Processed in 0.214638 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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