用于切换布局的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的布局。
有没有办法(当然有)和/或有人能做到这一点?
这对我有很大帮助。 也许是这个^^
http://www.cadtutor.net/forum/showthread.php?36727-将“Ctrl Page Up Down”更改为“Shift Tab” 我知道在这里的某个地方有一个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)
)
... 或者,您可以只使用CTAB命令,正如它所发生的那样,它只是修改了恰当命名的CTAB系统变量。 这并不是我真正想要的,在压缩的形式下,它和我的allready是一样的;
(Defun C:FOO ()
(command "-layout" "set" pause)
(princ)
)
我的主要问题是如何找出当前布局名称并将其放入变量(setq???)中
然后我需要计算(-或+1 21);给我20或22,如前一个例子。
然后我需要一种读取变量的方法,这样我就可以把它放在上面lisp中的暂停位置。
考虑上面已经提到的CTAB系统变量。
如果CTAB系统变量为“21”,则通过ATOI函数将字符串转换为整数,然后执行数学计算。要从整数转换回字符串,RTOS或ITOA函数中的任何一个都应该工作。
为什么不先使用IF语句测试有效输入,然后提供有效输入来代替暂停,否则将报告给用户。柠檬挤压。。。并且已经包含在CTAB命令中(因为您正在重新发明轮子)。 这会有帮助吗?
http://lee-mac.com/tabsort.html 它需要更快,然后移动鼠标,点击布局选项卡我需要。
只要输入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和类似的东西甚至比弄清楚如何设置变量更难理解。所以我尽量保持简单。 在更仔细地阅读后续帖子后,请尝试以下两个命令:
(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”错误。
请注意,CTAB系统变量包含字符串类型的值,并且您正试图对字符串执行数字操作,这会导致错误的参数类型:numberp error(numberp,因为算术函数正在测试提供的参数的数据类型,以确保其为数字)。
为了修复代码,在执行算术运算之前,需要使用atoi函数或atof将字符串转换为浮点整数。但是,要使此解决方案成功,您需要确保所有布局都以数字命名,并且在尝试切换到下一个布局之前,下一个布局存在。
在我的示例中,我使用Layouts集合中每个布局的taborder属性,以便程序独立于图形中使用的布局命名约定执行;当到达最后一个布局时,我还使用模块算术的rem函数循环回到第一个布局。
页:
[1]
2