xj6019 发表于 2020-9-24 22:20:42

怎么通过模糊输入快速切换布局

本帖最后由 xj6019 于 2020-9-27 10:49 编辑

经过两天的思考,大体找出来两个思路,但是都没成功,请求大神指点,看看哪里不对呀:
思路是,获得布局列表,与输入的变量做比较,找到有变量的列表中的一个,返回该布局名称
(setq lsta(vl-string-search输入的变量   布局列表)) ;获得有变量字符的布局名
方法1:用start4444老师的函数,找到了两组获得布局列表的代码,这两种都没成功,代码如下:


(defun c:nm()
(setq ww (getreal "布局名:"))
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq layouts (vla-get-layouts doc))
(setq count (vla-get-count layouts))
(repeat count
   (setq co(vla-get-name (vla-item layouts (1- count))))
    (setq count (1- count))               
(setq lsta(vl-string-searchwwco)) ;直接匹配列表也失败了,不能为后边调用(第一种获得布局列表方式)
;(setq lsta(vl-string-searchww(LayoutSortedList)));取得列表后匹配失败,不能调用(第二种获得布局列表方式)
(command "CTAB" lsta )
)
)

;从左到右依次取得布局名称列表
(defun LayoutSortedList (/ layout_lst);
(setq layouts (vla-get-layouts
    (vla-get-activedocument (vlax-get-acad-object))
)
)
(vlax-for layout layouts
    (setq layout_lst (cons layout layout_lst))
)
(vlax-release-object layouts)
(mapcar 'vla-get-name
   (vl-sort layout_lst
   '(lambda (l1 l2)
      (< (vla-get-taborder l1) (vla-get-taborder l2))
      )
   )
)
)

方法二:先获得布局列表当中的一个布局名称,下面的代码是取得第二个布局的名字str,然后提前该布局名字的数字lsta
然后用字符替换函数,将名字str中的数字lsta替换成输入的变量ww。返回一个新的布局名字lstb。
只是这个方法也没成功。

(defun c:nm()
(setq ww (getreal "布局名:"))
(setq str(XD:: Layout:FirstTab));取得布局列表的第二个布局名
(setq lsta(wyb-str-getNum str));提取str里面的数字为lsta
(setq lstb(wyb-str-replace ww lsta str);将lsta替换成ww
(command "CTAB" lstb )
(princ)      
)

; (wyb-str-replace 目标字符 替换字符 str)
(defun wyb-str-replace (o n s )
    (wyb-str-replace-reg (strcat "[" o "]") s n "I")
)

(defun wyb-str-replace-reg (regexp str nstr key / vbsexp keys)
    (setq vbsexp (vlax-get-or-create-object "VBScript.RegExp"))
    (vlax-put vbsexp 'Pattern regexp)
    (if (not key) (setq key ""))
    (setq key (strcase key))
    (setq keys '(("I" "IgnoreCase") ("G" "Global") ("M" "Multiline")))
    (mapcar
      '(lambda (x)
            (if (wcmatch key (strcat "*" (car x) "*"))
                (vlax-put vbsexp (read (cadr x)) 0)
                (vlax-put vbsexp (read (cadr x)) -1)
            )
      )
      keys
    )
    (vlax-invoke vbsexp 'replace str nstr)
)

; (wyb-str-getNum str)
(defun wyb-str-getNum (str )
    (wyb-str-regExps "(\\d+)?[.]?(\\d+)+" str "")
)

(defun wyb-str-regExps (regexp str key / vbsexp keys matches x end)
    (setq vbsexp (vlax-get-or-create-object "VBScript.RegExp"))
    (vlax-put vbsexp 'Pattern regexp)
    (if (not key) (setq key ""))
    (setq key (strcase key))
    (setq keys '(("I" "IgnoreCase") ("G" "Global") ("M" "Multiline")))
    (mapcar
      '(lambda (x)
            (if (wcmatch key (strcat "*" (car x) "*"))
                (vlax-put vbsexp (read (cadr x)) 0)
                (vlax-put vbsexp (read (cadr x)) -1)
            )
      )
      keys
    )
    (setq matches (vlax-invoke vbsexp 'Execute str))
    (vlax-for x matches (setq end (cons (vla-get-value x) end)))
    (reverse end)
)
(defun XD:: Layout:FirstTab (/ Lcoll)
(setq Lcoll (vla-get-Layouts
                (vla-get-ActiveDocument (vlax-get-acad-object))
            )
)
(vl-some '(lambda (x)
            (if (= 2 (vla-get-TabOrder x))
                (vla-get-Name x)
            )
            )
         (mapcar '(lambda (x) (vla-item Lcoll x)) (layoutlist))
)
)

xj6019 发表于 2020-9-27 10:45:33

start4444 发表于 2020-9-24 22:54
(vl-string-search "20" "MKY-20")看看这个函数能不能用上

按照你的方法试了,不行呢,我又重新整理了帖子,用了两种方式,都没有实验成功,有时间的话,帮我看看,哪个地方有问题呀,谢谢

start4444 发表于 2020-9-27 17:45:27

鼠标选的要搞dcl,很麻烦了,按序号选
(defun c:tt5 (/ i layout_lst lst_tmp txt ww)
(setq ww (getstring "\n输入布局名关键字:"))
(setq layout_lst (LayoutSortedList))
(setq lst_tmp (vl-remove-if-not '(LAMBDA (x) (vl-string-search ww x)) layout_lst));找出符合的布局名表

(if (cadr lst_tmp) (progn (setq txt "\n符合的布局:" i 0) (foreach x lst_tmp (setqtxt (strcat txt (itoa (setq i (1+ i))) ": " x ""))) (princ txt)
(princ)
(if (setq ww (getint (strcat "\n选择布局序号:"))) () (setq ww 1))
(setvar "ctab" (nth (1- ww) lst_tmp))) (setvar "ctab" (car lst_tmp)))       
(princ)
)

;从左到右依次取得布局名称列表
(defun LayoutSortedList (/ layout_lst);
(setq layouts (vla-get-layouts
    (vla-get-activedocument (vlax-get-acad-object))
)
)
(vlax-for layout layouts
    (setq layout_lst (cons layout layout_lst))
)
(vlax-release-object layouts)
(mapcar 'vla-get-name
   (vl-sort layout_lst
   '(lambda (l1 l2)
      (< (vla-get-taborder l1) (vla-get-taborder l2))
      )
   )
)
)

start4444 发表于 2020-9-27 11:36:01

你没搞清楚思路呢,没你想的那么复杂的,得出布局名列表已经完成大半了,再用vl-string-search 核对一下就成了。我已经帮你把符合的布局名表找出来了,如果只有一个就ok了,如果不止一个的那就列出来自己选一下,这个你自己去搞了。

(defun c:tt5 (/ layout_lst lst_tmp ww)
(setq ww (getstring "\n输入切换的布局名:"))
(setq layout_lst (LayoutSortedList))
(setq lst_tmp (vl-remove-if-not '(LAMBDA (x) (vl-string-search ww x)) layout_lst));找出符合的布局名表
(setvar "ctab" (car lst_tmp))
(princ)
)

;从左到右依次取得布局名称列表
(defun LayoutSortedList (/ layout_lst);
(setq layouts (vla-get-layouts
    (vla-get-activedocument (vlax-get-acad-object))
)
)
(vlax-for layout layouts
    (setq layout_lst (cons layout layout_lst))
)
(vlax-release-object layouts)
(mapcar 'vla-get-name
   (vl-sort layout_lst
   '(lambda (l1 l2)
      (< (vla-get-taborder l1) (vla-get-taborder l2))
      )
   )
)
)

start4444 发表于 2020-9-24 22:54:06

(vl-string-search "20" "MKY-20")看看这个函数能不能用上

xj6019 发表于 2020-9-25 08:09:44

start4444 发表于 2020-9-24 22:54
(vl-string-search "20" "MKY-20")看看这个函数能不能用上

我试着找一下这个函数怎么用,布局名字是多样化的哦,并不是某个固定的,我也又想到一个问题,因为切换布局的时候并不一定是在布局里面,也会在模型中运行切换布局的操作,那样的话开始的思路,获取当前布局名字,就没什么意义了,一时又陷入了迷惑。

xj6019 发表于 2020-9-27 11:57:33

start4444 发表于 2020-9-27 11:36
你没搞清楚思路呢,没你想的那么复杂的,得出布局名列表已经完成大半了,再用vl-string-search 核对一下就 ...

嗯有重复的也是个问题哈,不好意思,要不还是麻烦你帮我添加上吧,重复项怎么列出来,想了想,还真没一点思路呢,这个该怎么搞,是真不知道咋弄,不好意思,不好意思,拜托你再帮我添加一下吧,谢谢了

xj6019 发表于 2020-9-27 16:51:54

本帖最后由 xj6019 于 2020-9-27 16:58 编辑

start4444 发表于 2020-9-27 11:36
你没搞清楚思路呢,没你想的那么复杂的,得出布局名列表已经完成大半了,再用vl-string-search 核对一下就 ...
你说的列出来,我理解的是判断代码是否存在重复项,没有就直接切换,有的话就在鼠标的位置出现一个重复名字的各个选项,然后鼠标选择重复项中的一个切换,这个操作好不好帮我加一下呀,弄一次就弄的完美点吧。我的认知里,只知道这个函数
(initget "1 2 3")
(setq i (getkword"\n选项1 <1>;选项2 <2>;选项3<3>"))
(cond
((= i "1")(选项命令1))
((= i "2")(选项命令2))
((= i "3")(选项命令3)))
(princ)
)
但是好像这个代码,不适合判断重复项的情况下使用吧。

xj6019 发表于 2020-9-27 17:55:18

本帖最后由 xj6019 于 2020-9-27 18:01 编辑

start4444 发表于 2020-9-27 17:45
鼠标选的要搞dcl,很麻烦了,按序号选
(defun c:tt5 (/ i layout_lst lst_tmp txt ww)
(setq ww (getstri ...
选择布局编号的时候,显示的符合的布局名字,怎么改改,可以在鼠标的位置显示,那样看的更显眼一点,在命令行显示的话,过两三秒就会消失,会来不及看,在鼠标位置的话,可以更直观一点,还有,可以不判断个位数吗,比方说输入1-9的话,后面的两位数,都会出现判断,这样就麻烦了,好不好只判断输入的两位数以上的情况

start4444 发表于 2020-9-27 18:26:19

鼠标那里提示我都没用过,不知道咋搞的。
如果你的布局那么多那么复杂估计要另开一个论题是专门判断名称才行,不是简单处理能解决的
页: [1] 2
查看完整版本: 怎么通过模糊输入快速切换布局