乐筑天下

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

[编程交流] 第一次真正尝试VL。。。(一)

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:15:50 | 显示全部楼层 |阅读模式
大家晚上好-(或者有些人早上好…),
 
好的,这是我第一次真正尝试Visual LISP-我一直坚持尽可能多地使用通用LISP,直到现在,但我正在尝试深入研究VL的世界。。。。
 
下面是我第一次尝试VL。
 
请批评/赞扬你喜欢的一切。。。。我需要反馈来知道我做的事情是对还是错。
 
  1. (defun c:layupd (/ ent obj)
  2. (while
  3.    (setq ent (car (entsel)))
  4.     (setq obj (vlax-ename->vla-object ent))
  5.     (if (not (vl-catch-all-error-p (vla-put-layer obj "2")))
  6.       (princ "\nLayer Updated.")
  7.       (princ "\nError Updating Layer.")
  8.     )
  9.     (vlax-release-object obj)
  10. )
  11. (princ)
  12. )

 
我想我应该从简单的开始,只需一个LISP就可以将选定对象的层更改为第2层。
 
欢迎任何改进和批评。
 
干杯
 
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:24:35 | 显示全部楼层
  1. (defun c:layupd (/ ent obj)
  2. (while
  3.    (setq ent(entsel))
  4.     (setq obj (vlax-ename->vla-object(car ent)))
  5.     (if(not(vl-catch-all-error-p
  6.       (vl-catch-all-apply
  7.         'vla-put-layer (list obj "2"))))
  8.       (princ "\nLayer Updated.")
  9.       (princ "\nError Updating Layer.")
  10.     )
  11. )
  12. (princ)
  13. )

 
1.(setq ent(entsel)),因为(car nil)在输入为空的情况下会产生错误。
2.只有vl catch all apply函数将生成错误对象
3.vlax释放对象不需要活动文档对象。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:25:43 | 显示全部楼层
非常感谢您抽出时间指出我的错误-非常感谢。
 
 
无论如何,我真的应该知道这一点——它甚至不特定于VL——但谢谢你指出这一点。
 
 
好的,我应该成对使用函数:“vl-catch-all-error-p”和“vl-catch-all-apply”——很好。
 
 
啊,好吧,我前阵子和CAB谈过这件事,所以把它放进去以防万一——但谢谢你指出这一点。
回复

使用道具 举报

0

主题

269

帖子

279

银币

限制会员

铜币
-4
发表于 2022-7-6 15:33:24 | 显示全部楼层
1.(setq ent(entsel)),因为(car nil)在输入为空的情况下会产生错误。
为了不让任何人感到困惑,这一点不是真的,试试看。也许阿斯米在想“entget”在一个零上,这将给出一个错误。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:36:52 | 显示全部楼层
很好,卡尔,
 
只是试着打字
 
  1. (car nil)

 
在我的命令提示符中-返回
 
  1. nil

 
好样的-好人:眨眼:
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:43:21 | 显示全部楼层
使用从ASMI的帖子中获得的知识:
 
第二次实际尝试:
 
  1. (defun Make_Reactor ()
  2. (vl-load-com)
  3. (if (not vport:reactor)
  4.    (setq vport:reactor
  5.       (vlr-command-reactor nil '((:vlr-commandWillStart . vpPrompt)))))
  6. (princ))
  7. (Make_Reactor)
  8. (defun vpPrompt (Reac args / ss i vp ent obj)
  9. (if (and (= (car args) "QSAVE")
  10.           (setq ss (ssget "X" '((0 . "VIEWPORT"))))
  11.           (not (zerop (setq i (sslength ss)))))
  12.    (progn
  13.      (setq vp i)
  14.      (while (not (minusp (setq i (1- i))))
  15.       (setq ent (ssname ss i)
  16.             obj (vlax-ename->vla-object ent))
  17.       (if (not (vl-catch-all-error-p
  18.                   (vl-catch-all-apply
  19.                     'vla-put-DisplayLocked (list obj 1))))
  20.           (princ)))
  21.     (princ (strcat "\n" (rtos vp) " Viewport(s) Locked."))))
  22. (princ))
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:47:27 | 显示全部楼层
 
对不起,我想说(vlax ename->vla object nil)将生成一个错误。
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 15:51:24 | 显示全部楼层
  1. (defun vpPrompt (Reac args / ss sCnt eCnt ent obj)
  2. (if (and (= (car args) "QSAVE")
  3.           (setq ss (ssget "X" '((0 . "VIEWPORT"))))
  4.           (not(zerop (setq i (sslength ss)))))
  5.    (progn
  6.      (setq sCnt 0 eCnt 0)
  7.      (foreach vp [color="Blue"](mapcar 'vlax-ename->vla-object
  8.                    (vl-remove-if 'listp
  9.                      (mapcar 'cadr(ssnamex ss)))) ; transforms set to list[/color]
  10. (if(vl-catch-all-error-p
  11.      (vl-catch-all-apply
  12.        'vla-put-DisplayLocked(list vp [color="#0000ff"]:vlax-true[/color])))
  13.   [color="#0000ff"](setq eCnt(1+ eCnt))
  14.   (setq sCnt(1+ sCnt))[/color]
  15.   ); end if
  16. ); end foreach
  17.      [color="#0000ff"](princ(strcat "\n" (itoa sCnt) " Vieport(s) locked"
  18.             (if(/= 0 eCnt)
  19.               (strcat ", " (itoa eCnt) " were on locked layer! ")
  20.               "."
  21.               ); end if
  22.             ); end strcat
  23.     ); end princ[/color]
  24.      ); end progn
  25.    ); end if
  26. (princ)
  27. )

 
1.如果你进入一个更严肃的层次,那么使用选择集是没有多大意义的。LISP-一种处理列表并将选择集转换为列表的语言,它为您提供了许多新功能。例如,使用FOREACH、MAPCAR、APPLY、LAMBDA函数,而不是使用SSNAME进行标准和单调的实体提取。
 
2.当然,您可以使用整数作为系统常数,但仍建议使用全名:vlax true比1更具信息性,但如果你看其他常数,很难想象它对应于12个acAlignmentMiddleRight。
 
3.每次你告诉我所有的视口都被锁定了,事实上,有些可能被锁定了。所以我完成了你的提示。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:56:05 | 显示全部楼层
 
感谢这个指针——我必须承认,拥有所有实体的列表比手动逐个遍历集合要方便得多。
 
但是关于你插入的代码,我还有一个问题:
 
  1. (mapcar    'vlax-ename->vla-object ; [b][color=Blue]Produce a List of VL-Objects.[/color][/b]
  2.    (vl-remove-if 'listp ; [b][color=Blue]Why do you need this here? Surely there are only Entity Names in the List?[/color][/b]
  3.      (mapcar 'cadr (ssnamex ss)) ; [b][color=Blue]Creates a List of all the Entity Names (enames)[/color][/b]
  4.    )
  5. )

 
我的问题是,为什么需要“vl remove if’listp…”在那里?(mapcar'cadr(ssnamex ss))生成的原始列表肯定只包含实体名称?
 
 
这是一个很好的观点。我想:vlax true没有那么模棱两可。谢谢
 
 
谢谢你,这要专业得多我没有解释那种情况。
 
 
我非常感谢你指出这些事情-我可以从中学习。
 
 
干杯
 
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 16:00:47 | 显示全部楼层
 
不仅仅是搪瓷。查找列表的最终成员-可能是选择策略的点(取决于选择方法)。
 
vl remove if'listp-删除点列表。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 21:14 , Processed in 0.419297 second(s), 72 queries .

© 2020-2025 乐筑天下

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