OMEGA-ThundeR 发表于 2022-7-6 07:11:46

用于切换布局的Lisp

你好
 
不这不是你认为它会问的问题。
 
我有大量的布局,所有的编号像'01-02-03-27-28-29-等等
 
这是一个项目,每年回来几次,我需要从布局切换到布局很多。
 
我想我可以通过LISP程序更快地完成。
 
我可以使用“-layout”命令从命令栏中的布局切换。使用“设置”选项手动输入我想要的布局。
然而,我只需要从当前布局转到下一个或上一个布局。
 
我的LISP知识还不足以满足我的需要。
 
我想这需要一些变量和计算。
 
就网站而言,在php中,应该是这样的:
 


$var_next = + 1;
$var_prev = - 1;

$current = 'Find out what the current layout name is (i.e. 21)';

Function next() {

Command: Next
("-Layout" "set" "$var_next $current") #giving ("-Layout" "set" "+ 1 21")
}

Function previous() {

Command: Prev
("-Layout" "set" "$var_prev $current") #giving ("-Layout" "set" "- 1 21")
}

 
因此,当我输入命令NEXT时,我转到名为22的布局,当我输入PREV命令时,我转到名为20的布局。
 
 
有没有办法(当然有)和/或有人能做到这一点?
 
这对我有很大帮助。

KFW 发表于 2022-7-6 07:18:17

也许是这个^^
 
http://www.cadtutor.net/forum/showthread.php?36727-将“Ctrl Page Up Down”更改为“Shift Tab”

BlackBox 发表于 2022-7-6 07:23:53

我知道在这里的某个地方有一个Alanjt写的漂亮的,你可以搜索一下。。。除此之外,这篇文章写得很快:
 

(vl-load-com)

(defun c:FOO (/ tab)
(if (and (setq tab (strcase (getstring T "\nEnter tab name: ")))
          (vl-position
            tab
            (mapcar 'strcase (cons "model" (layoutlist)))
          )
   )
   (if (/= (strcase (getvar 'ctab)) tab)
   (setvar 'ctab tab)
   (prompt
       (strcat "\n** \"" tab "\" tab is already current ** ")
   )
   )
   (prompt (strcat "\n** \"" tab "\" tab not found ** "))
)
(princ)
)

BlackBox 发表于 2022-7-6 07:33:31

... 或者,您可以只使用CTAB命令,正如它所发生的那样,它只是修改了恰当命名的CTAB系统变量。

OMEGA-ThundeR 发表于 2022-7-6 07:40:56

这并不是我真正想要的,在压缩的形式下,它和我的allready是一样的;
 

(Defun C:FOO ()
(command "-layout" "set" pause)
(princ)
)

 
我的主要问题是如何找出当前布局名称并将其放入变量(setq???)中
 
然后我需要计算(-或+1 21);给我20或22,如前一个例子。
 
然后我需要一种读取变量的方法,这样我就可以把它放在上面lisp中的暂停位置。

BlackBox 发表于 2022-7-6 07:43:33

 
考虑上面已经提到的CTAB系统变量。
 
 
如果CTAB系统变量为“21”,则通过ATOI函数将字符串转换为整数,然后执行数学计算。要从整数转换回字符串,RTOS或ITOA函数中的任何一个都应该工作。
 
 
为什么不先使用IF语句测试有效输入,然后提供有效输入来代替暂停,否则将报告给用户。柠檬挤压。。。并且已经包含在CTAB命令中(因为您正在重新发明轮子)。

Lee Mac 发表于 2022-7-6 07:53:01

这会有帮助吗?
 
http://lee-mac.com/tabsort.html

OMEGA-ThundeR 发表于 2022-7-6 07:59:25

它需要更快,然后移动鼠标,点击布局选项卡我需要。
 
只要输入NEXT或PREV就可以切换布局。
 
目前,我正在搜索整个互联网络,以获取变量中的当前布局。
 
我找到了正确的号码
 

(getvar 'ctab)

 
但我犯了一个错误;错误:错误的参数类型:numberp:“21”。21是当前布局的名称
 
我正在研究我能找到的每一个Lisp程序的单词,但我似乎找不到哪里出错了。
 
由于脚本停在那里,我不知道其余部分是否正确,但这是我到目前为止得到的。
 

(Defun C:next(/ current newlayout)

(setq current (getvar 'ctab))

(setq newlayout (+ current 1))

(command "-layout" "set" !newlayout)
(princ)
)

 
而@RenderMan、IFs、WHILEs和类似的东西甚至比弄清楚如何设置变量更难理解。所以我尽量保持简单。

Lee Mac 发表于 2022-7-6 08:05:47

在更仔细地阅读后续帖子后,请尝试以下两个命令:
 

(defun c:la+ ( / l n )
   (setq l (getorderedlayouts)
         n (length l)
   )
   (setvar 'ctab (nth (rem (1+ (vl-position (getvar 'ctab) l)) n) l))
   (princ)
)

(defun c:la- ( / l n )
   (setq l (getorderedlayouts)
         n (length l)
   )
   (setvar 'ctab (nth (rem (+ n -1 (vl-position (getvar 'ctab) l)) n) l))
   (princ)
)

(defun getorderedlayouts ( / l )
   (vlax-for x (aclayouts)
       (setq l (cons (list (vla-get-taborder x) (vla-get-name x)) l))
   )
   (mapcar 'cadr (vl-sort l '(lambda ( a b ) (< (car a) (car b)))))
)

(defun aclayouts nil
   (eval
       (list 'defun 'aclayouts 'nil
         (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
       )
   )
   (aclayouts)
)

(vl-load-com) (princ)

 
我得到了“numberp”错误。

OMEGA-ThundeR 发表于 2022-7-6 08:09:59

 
请注意,CTAB系统变量包含字符串类型的值,并且您正试图对字符串执行数字操作,这会导致错误的参数类型:numberp error(numberp,因为算术函数正在测试提供的参数的数据类型,以确保其为数字)。
 
为了修复代码,在执行算术运算之前,需要使用atoi函数或atof将字符串转换为浮点整数。但是,要使此解决方案成功,您需要确保所有布局都以数字命名,并且在尝试切换到下一个布局之前,下一个布局存在。
 
在我的示例中,我使用Layouts集合中每个布局的taborder属性,以便程序独立于图形中使用的布局命名约定执行;当到达最后一个布局时,我还使用模块算术的rem函数循环回到第一个布局。
页: [1] 2
查看完整版本: 用于切换布局的Lisp