乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 90|回复: 10

[编程交流] 用于切换布局的Lisp

[复制链接]

27

主题

113

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
132
发表于 2022-7-6 07:11:46 | 显示全部楼层 |阅读模式
你好
 
不这不是你认为它会问的问题。
 
我有大量的布局,所有的编号像'01-02-03-27-28-29-等等
 
这是一个项目,每年回来几次,我需要从布局切换到布局很多。
 
我想我可以通过LISP程序更快地完成。
 
我可以使用“-layout”命令从命令栏中的布局切换。使用“设置”选项手动输入我想要的布局。
然而,我只需要从当前布局转到下一个或上一个布局。
 
我的LISP知识还不足以满足我的需要。
 
我想这需要一些变量和计算。
 
就网站而言,在php中,应该是这样的:
 
  1. $var_next = + 1;
  2. $var_prev = - 1;
  3. $current = 'Find out what the current layout name is (i.e. 21)';
  4. Function next() {
  5. Command: Next
  6. ("-Layout" "set" "$var_next $current") #giving ("-Layout" "set" "+ 1 21")
  7. }
  8. Function previous() {
  9. Command: Prev
  10. ("-Layout" "set" "$var_prev $current") #giving ("-Layout" "set" "- 1 21")
  11. }

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

使用道具 举报

KFW

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:18:17 | 显示全部楼层
也许是这个^^
 
http://www.cadtutor.net/forum/showthread.php?36727-将“Ctrl Page Up Down”更改为“Shift Tab”
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:23:53 | 显示全部楼层
我知道在这里的某个地方有一个Alanjt写的漂亮的,你可以搜索一下。。。除此之外,这篇文章写得很快:
 
  1. (vl-load-com)
  2. (defun c:FOO (/ tab)
  3. (if (and (setq tab (strcase (getstring T "\nEnter tab name: ")))
  4.           (vl-position
  5.             tab
  6.             (mapcar 'strcase (cons "model" (layoutlist)))
  7.           )
  8.      )
  9.    (if (/= (strcase (getvar 'ctab)) tab)
  10.      (setvar 'ctab tab)
  11.      (prompt
  12.        (strcat "\n** "" tab "" tab is already current ** ")
  13.      )
  14.    )
  15.    (prompt (strcat "\n** "" tab "" tab not found ** "))
  16. )
  17. (princ)
  18. )
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:33:31 | 显示全部楼层
... 或者,您可以只使用CTAB命令,正如它所发生的那样,它只是修改了恰当命名的CTAB系统变量。
回复

使用道具 举报

27

主题

113

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
132
发表于 2022-7-6 07:40:56 | 显示全部楼层
这并不是我真正想要的,在压缩的形式下,它和我的allready是一样的;
 
  1. (Defun C:FOO ()
  2. (command "-layout" "set" pause)
  3. (princ)
  4. )

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

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:53:01 | 显示全部楼层
这会有帮助吗?
 
http://lee-mac.com/tabsort.html
回复

使用道具 举报

27

主题

113

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
132
发表于 2022-7-6 07:59:25 | 显示全部楼层
它需要更快,然后移动鼠标,点击布局选项卡我需要。
 
只要输入NEXT或PREV就可以切换布局。
 
目前,我正在搜索整个互联网络,以获取变量中的当前布局。
 
我找到了正确的号码
 
  1. (getvar 'ctab)

 
但我犯了一个错误;错误:错误的参数类型:numberp:“21”。21是当前布局的名称
 
我正在研究我能找到的每一个Lisp程序的单词,但我似乎找不到哪里出错了。
 
由于脚本停在那里,我不知道其余部分是否正确,但这是我到目前为止得到的。
 
  1. (Defun C:next(/ current newlayout)
  2. (setq current (getvar 'ctab))
  3. (setq newlayout (+ current 1))
  4. (command "-layout" "set" !newlayout)
  5. (princ)
  6. )

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:05:47 | 显示全部楼层
在更仔细地阅读后续帖子后,请尝试以下两个命令:
 
  1. ([color=BLUE]defun[/color] c:la+ ( [color=BLUE]/[/color] l n )
  2.    ([color=BLUE]setq[/color] l (getorderedlayouts)
  3.          n ([color=BLUE]length[/color] l)
  4.    )
  5.    ([color=BLUE]setvar[/color] 'ctab ([color=BLUE]nth[/color] ([color=BLUE]rem[/color] ([color=BLUE]1+[/color] ([color=BLUE]vl-position[/color] ([color=BLUE]getvar[/color] 'ctab) l)) n) l))
  6.    ([color=BLUE]princ[/color])
  7. )
  8. ([color=BLUE]defun[/color] c:la- ( [color=BLUE]/[/color] l n )
  9.    ([color=BLUE]setq[/color] l (getorderedlayouts)
  10.          n ([color=BLUE]length[/color] l)
  11.    )
  12.    ([color=BLUE]setvar[/color] 'ctab ([color=BLUE]nth[/color] ([color=BLUE]rem[/color] ([color=BLUE]+[/color] n -1 ([color=BLUE]vl-position[/color] ([color=BLUE]getvar[/color] 'ctab) l)) n) l))
  13.    ([color=BLUE]princ[/color])
  14. )
  15. ([color=BLUE]defun[/color] getorderedlayouts ( [color=BLUE]/[/color] l )
  16.    ([color=BLUE]vlax-for[/color] x (aclayouts)
  17.        ([color=BLUE]setq[/color] l ([color=BLUE]cons[/color] ([color=BLUE]list[/color] ([color=BLUE]vla-get-taborder[/color] x) ([color=BLUE]vla-get-name[/color] x)) l))
  18.    )
  19.    ([color=BLUE]mapcar[/color] '[color=BLUE]cadr[/color] ([color=BLUE]vl-sort[/color] l '([color=BLUE]lambda[/color] ( a b ) ([color=BLUE]<[/color] ([color=BLUE]car[/color] a) ([color=BLUE]car[/color] b)))))
  20. )
  21. ([color=BLUE]defun[/color] aclayouts [color=BLUE]nil[/color]
  22.    ([color=BLUE]eval[/color]
  23.        ([color=BLUE]list[/color] '[color=BLUE]defun[/color] 'aclayouts '[color=BLUE]nil[/color]
  24.            ([color=BLUE]vla-get-layouts[/color] ([color=BLUE]vla-get-activedocument[/color] ([color=BLUE]vlax-get-acad-object[/color])))
  25.        )
  26.    )
  27.    (aclayouts)
  28. )
  29. ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color])

 
我得到了“numberp”错误。
回复

使用道具 举报

27

主题

113

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 10:02 , Processed in 0.351331 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表