第一次真正尝试VL。。。(一)
大家晚上好-(或者有些人早上好…),好的,这是我第一次真正尝试Visual LISP-我一直坚持尽可能多地使用通用LISP,直到现在,但我正在尝试深入研究VL的世界。。。。
下面是我第一次尝试VL。
请批评/赞扬你喜欢的一切。。。。我需要反馈来知道我做的事情是对还是错。
(defun c:layupd (/ ent obj)
(while
(setq ent (car (entsel)))
(setq obj (vlax-ename->vla-object ent))
(if (not (vl-catch-all-error-p (vla-put-layer obj "2")))
(princ "\nLayer Updated.")
(princ "\nError Updating Layer.")
)
(vlax-release-object obj)
)
(princ)
)
我想我应该从简单的开始,只需一个LISP就可以将选定对象的层更改为第2层。
欢迎任何改进和批评。
干杯
李 (defun c:layupd (/ ent obj)
(while
(setq ent(entsel))
(setq obj (vlax-ename->vla-object(car ent)))
(if(not(vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-layer (list obj "2"))))
(princ "\nLayer Updated.")
(princ "\nError Updating Layer.")
)
)
(princ)
)
1.(setq ent(entsel)),因为(car nil)在输入为空的情况下会产生错误。
2.只有vl catch all apply函数将生成错误对象
3.vlax释放对象不需要活动文档对象。 非常感谢您抽出时间指出我的错误-非常感谢。
无论如何,我真的应该知道这一点——它甚至不特定于VL——但谢谢你指出这一点。
好的,我应该成对使用函数:“vl-catch-all-error-p”和“vl-catch-all-apply”——很好。
啊,好吧,我前阵子和CAB谈过这件事,所以把它放进去以防万一——但谢谢你指出这一点。 1.(setq ent(entsel)),因为(car nil)在输入为空的情况下会产生错误。
为了不让任何人感到困惑,这一点不是真的,试试看。也许阿斯米在想“entget”在一个零上,这将给出一个错误。 很好,卡尔,
只是试着打字
(car nil)
在我的命令提示符中-返回
nil
好样的-好人:眨眼: 使用从ASMI的帖子中获得的知识:
第二次实际尝试:
(defun Make_Reactor ()
(vl-load-com)
(if (not vport:reactor)
(setq vport:reactor
(vlr-command-reactor nil '((:vlr-commandWillStart . vpPrompt)))))
(princ))
(Make_Reactor)
(defun vpPrompt (Reac args / ss i vp ent obj)
(if (and (= (car args) "QSAVE")
(setq ss (ssget "X" '((0 . "VIEWPORT"))))
(not (zerop (setq i (sslength ss)))))
(progn
(setq vp i)
(while (not (minusp (setq i (1- i))))
(setq ent (ssname ss i)
obj (vlax-ename->vla-object ent))
(if (not (vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-DisplayLocked (list obj 1))))
(princ)))
(princ (strcat "\n" (rtos vp) " Viewport(s) Locked."))))
(princ))
对不起,我想说(vlax ename->vla object nil)将生成一个错误。 (defun vpPrompt (Reac args / ss sCnt eCnt ent obj)
(if (and (= (car args) "QSAVE")
(setq ss (ssget "X" '((0 . "VIEWPORT"))))
(not(zerop (setq i (sslength ss)))))
(progn
(setq sCnt 0 eCnt 0)
(foreach vp (mapcar 'vlax-ename->vla-object
(vl-remove-if 'listp
(mapcar 'cadr(ssnamex ss)))) ; transforms set to list
(if(vl-catch-all-error-p
(vl-catch-all-apply
'vla-put-DisplayLocked(list vp :vlax-true)))
(setq eCnt(1+ eCnt))
(setq sCnt(1+ sCnt))
); end if
); end foreach
(princ(strcat "\n" (itoa sCnt) " Vieport(s) locked"
(if(/= 0 eCnt)
(strcat ", " (itoa eCnt) " were on locked layer! ")
"."
); end if
); end strcat
); end princ
); end progn
); end if
(princ)
)
1.如果你进入一个更严肃的层次,那么使用选择集是没有多大意义的。LISP-一种处理列表并将选择集转换为列表的语言,它为您提供了许多新功能。例如,使用FOREACH、MAPCAR、APPLY、LAMBDA函数,而不是使用SSNAME进行标准和单调的实体提取。
2.当然,您可以使用整数作为系统常数,但仍建议使用全名:vlax true比1更具信息性,但如果你看其他常数,很难想象它对应于12个acAlignmentMiddleRight。
3.每次你告诉我所有的视口都被锁定了,事实上,有些可能被锁定了。所以我完成了你的提示。
感谢这个指针——我必须承认,拥有所有实体的列表比手动逐个遍历集合要方便得多。
但是关于你插入的代码,我还有一个问题:
(mapcar 'vlax-ename->vla-object ; Produce a List of VL-Objects.
(vl-remove-if 'listp ; Why do you need this here? Surely there are only Entity Names in the List?
(mapcar 'cadr (ssnamex ss)) ; Creates a List of all the Entity Names (enames)
)
)
我的问题是,为什么需要“vl remove if’listp…”在那里?(mapcar'cadr(ssnamex ss))生成的原始列表肯定只包含实体名称?
这是一个很好的观点。我想:vlax true没有那么模棱两可。谢谢
谢谢你,这要专业得多我没有解释那种情况。
我非常感谢你指出这些事情-我可以从中学习。
干杯
李
不仅仅是搪瓷。查找列表的最终成员-可能是选择策略的点(取决于选择方法)。
vl remove if'listp-删除点列表。
页:
[1]
2