Lee Mac 发表于 2022-7-6 15:15:50

第一次真正尝试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层。
 
欢迎任何改进和批评。
 
干杯
 

ASMI 发表于 2022-7-6 15:24:35

(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释放对象不需要活动文档对象。

Lee Mac 发表于 2022-7-6 15:25:43

非常感谢您抽出时间指出我的错误-非常感谢。
 
 
无论如何,我真的应该知道这一点——它甚至不特定于VL——但谢谢你指出这一点。
 
 
好的,我应该成对使用函数:“vl-catch-all-error-p”和“vl-catch-all-apply”——很好。
 
 
啊,好吧,我前阵子和CAB谈过这件事,所以把它放进去以防万一——但谢谢你指出这一点。

CarlB 发表于 2022-7-6 15:33:24

1.(setq ent(entsel)),因为(car nil)在输入为空的情况下会产生错误。
为了不让任何人感到困惑,这一点不是真的,试试看。也许阿斯米在想“entget”在一个零上,这将给出一个错误。

Lee Mac 发表于 2022-7-6 15:36:52

很好,卡尔,
 
只是试着打字
 

(car nil)

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

nil

 
好样的-好人:眨眼:

Lee Mac 发表于 2022-7-6 15:43:21

使用从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))

ASMI 发表于 2022-7-6 15:47:27

 
对不起,我想说(vlax ename->vla object nil)将生成一个错误。

ASMI 发表于 2022-7-6 15:51:24

(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.每次你告诉我所有的视口都被锁定了,事实上,有些可能被锁定了。所以我完成了你的提示。

Lee Mac 发表于 2022-7-6 15:56:05

 
感谢这个指针——我必须承认,拥有所有实体的列表比手动逐个遍历集合要方便得多。
 
但是关于你插入的代码,我还有一个问题:
 

(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没有那么模棱两可。谢谢
 
 
谢谢你,这要专业得多我没有解释那种情况。
 
 
我非常感谢你指出这些事情-我可以从中学习。
 
 
干杯
 

ASMI 发表于 2022-7-6 16:00:47

 
不仅仅是搪瓷。查找列表的最终成员-可能是选择策略的点(取决于选择方法)。
 
vl remove if'listp-删除点列表。
页: [1] 2
查看完整版本: 第一次真正尝试VL。。。(一)