highflybir 发表于 2013-8-1 01:15:22

【DynamicLisp的高级应用】-- 带关键字的SSGET

还在为你的ssget不能带关键字烦恼么,那么你现在不必烦恼了。
DynamicLisp的新版本里面提供了带关键字的ssget。
下面是几个函数的用法
=============================================================
可定义提示、关键字的SSGET                                       
-------------------------------------------------------------
(HFB_initGet                                           
                                                               
                                                      
                                                      
                     )                                 
输入:                                                       
        <prompt>                                               
        提示字符串。选择时候的提示字符串。可缺省。               
        <kword>                                                       
        关键字.ARX选择关键字定义和一般的关键字有所不同,下划线前
        定义的是关键字下划线后定义的是输入关键字后返回的字符串。
   例如: XCircle XLine_XCircle XLine。可缺省。            
        <kwordCallback>                                               
        回调函数字符串,如不指定,选择关键字后将中断选择直接返回
        关键字字符串。可缺省。                                 
        <OtherCallback>                                               
        如果输入的非关键字,所进行的回调函数名。可缺省。       
        <RemovePrompt>                                               
        为移除所选的某些物体的提示字符串。可缺省。                
说明:                                                        
        所有参数均为可选,但如果指定关键字就必须指定提示字符串.
      选择集使用完,要使用HFB_ssFree (由于我没定义储存列队,记
        得使用完选择集后用HFB_ssFree 释放选择集,否则超过128个选
      择集后将 无法创建)。                                       
输出:如果成功返回T,否则返回nil.                                 
                                                              
-------------------------------------------------------------
(HFB_ssget                                     
                     ]                                       
                                                            
                     )                                    
参数说明与用法及返回值与SSGET相同.                           
使用前需要用HFB_initGet进行设置。如果不进行设置或者无参数调用
HFB_initGet,则与SSGET一致。如有设置,则有些模式可能无效果。
-------------------------------------------------------------
(HFB_ssFree )                                          
输入: 为选择集,可缺省。                              
说明: 不带参数调用为释放图中所有选择集,包括命名和未命名的。
      sel如果为pickset类型,则释放这个选择集。如果为命名的选
      择集,则这个参数应为字符串。                           
输出: 如果成功返回T,否则返回nil                           
=============================================================

测试样例:

(defun c:test (/ kwordCallback OtherCallback ss)
(defun kwordCallback (Kword /)                                ;关键字回调函数
    (princ (strcat "\n选择了关键字: " kword))
    (cond
      ( (= kword "XCircle")
      (ssget "x" '((0 . "CIRCLE")))
      )
      ( (= kword "XLine")
      (ssget "x" '((0 . "LINE")))
      )
      (T (princ "\n错误的关键字。"))
    )
)
(defun OtherCallback (Kword /)                                ;非关键字回调函数
    (princ (strcat "\n选择了非关键字: " kword))
    kword
)

(vl-acad-defun 'kwordCallback)                                ;让lisp函数能被arx调用
(vl-acad-defun 'OtherCallback)                                ;让lisp函数能被arx调用

(sssetfirst nil nil)                                          
(HFB_initGet"选择对象或[全部圆(XC)/所有直线(XL)]: "                ;选择时的提示
                     "XCircle XLine_XCircle XLine"                        ;关键字       
               "kwordCallback"                                ;关键字回调函数名
               "OtherCallback"                                ;非关键字回调函数名
               "移除物体: "                                        ;移除选择时的提示
)
(setq        ss (HFB_SSGet))                                                ;开始自定义关键字选择.
(cond
    ( (= (type ss) 'STR)
      (princ (strcat "\n你输入了关键字: " ss))
    )       
    ( (= (type ss) 'PICKSET)
      (princ "\n你的选择集是:")
      (princ ss)
      (princ ", 选择集中图元个数是: ")
      (princ (sslength ss))
      (sssetfirst ss ss)
      (HFB_ssFree ss)                                                ;释放选择集
    )
)
(princ)
)


cre8or 发表于 2013-8-3 00:38:12

让lisp能释放选择集是一件很惬意的事

583775698 发表于 2018-8-18 16:50:32

这是伪码吧,代码不全,运行不了
页: [1]
查看完整版本: 【DynamicLisp的高级应用】-- 带关键字的SSGET