RubberDinero 发表于 2022-7-5 17:14:09

全靠我自己。。。有点。属性

(defun c:awz ( / sUndo enx atent atent_list)
(setq sUndo (vlax-invoke (vla-get-ActiveDocument (vlax-get-acad-object)) 'StartUndoMark))
(setvar 'errno 0)
(while (/= 52 (getvar 'errno))
        (setvar 'errno 0)
        (setq atent (car (nentsel "\nSelect multiline attribute to change Defined Width to 0: ")))
        (cond
                (   (= 7 (getvar 'errno))
                        (prompt "\nNothing Selected.")
                )
                (   (null atent)
                        (prompt "\nExit.")
                )
                (   (/= "ATTRIB" (cdr (assoc 0 (setq enx (entget atent)))))
                        (prompt "\nSelected object is not an Attribute.")
                )
                (   (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 enx)))))))
                        (prompt "\nSelected Attribute is on a locked layer.")
                )
        (if atent (setq atent_list (entget atent))
        (setq atent_list (subst (cons 41 0) (assoc 42 atent_list) atent_list ))
        (entmod atent_list)
))
(if sUndo (vlax-invoke (vla-get-ActiveDocument (vlax-get-acad-object)) 'EndUndoMark))
)(princ)

)(vl-load-com)(princ)
 
通过研究Lee Mac和Grrr等专业人士过去的代码,我能够自己创建这个lisp。
 
在工作中,我们有一个程序,可以插入具有多行属性的块,其中包含信息集,每个值都是它自己的文本行。
不幸的是,有时,我的意思是,大多数时候,如果信息中有空格,它会“换行”并创建新行。
双击属性,然后“…”是非常烦人的然后更改有时超过100个属性的宽度。
 
出于挫折,这一代码诞生了。
 
我欢迎大家尽可能多地批评这段代码,我喜欢学习别人是如何写的。我补充的不需要,我需要的不需要,还有更简单的方法。什么都不要隐瞒!
 
如果我没有赞扬那些启发我的代码的创作者,我道歉。你们应该得到所有的赞扬。

Roy_043 发表于 2022-7-5 17:21:06

确实存在一些问题。。。
我能给你的最好建议是:在缩进代码时要更加小心。这将帮助您更好地理解程序结构。有了适当的缩进,您可能会注意到cond语句中奇怪的if语句。
注意,在整个程序中,sUndo为零,因此永远不会调用EndUndoMark。
(defun c:awz ( / doc enx atent)
(vla-startundomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))
(setvar 'errno 0)
(while (/= 52 (getvar 'errno))
   (setvar 'errno 0)
   (setq atent (car (nentsel "\nSelect multiline attribute to change Defined Width to 0: ")))
   (cond
   ( (= 7 (getvar 'errno))
       (prompt "\nNothing Selected.")
   )
   ( (null atent)
       (prompt "\nExit.")
   )
   ( (/= "ATTRIB" (cdr (assoc 0 (setq enx (entget atent)))))
       (prompt "\nSelected object is not an Attribute.")
   )
   ( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 enx)))))))
       (prompt "\nSelected Attribute is on a locked layer.")
   )
   ( T
       (entmod (append enx '((41 . 0.0))))
   )
   )
)
(vla-endundomark doc)
(princ)
)

(vl-load-com)
(princ)

Roy_043 发表于 2022-7-5 17:31:19

... 您是否尝试重新定义块?这显然会更有效率。

RubberDinero 发表于 2022-7-5 17:34:41

 
它看起来比我的版本更干净。也更容易理解。

RubberDinero 发表于 2022-7-5 17:41:06

 
与在blockeditor中将属性设置为宽度0?然后运行BATTMAN进行同步?这应该行得通,但每一项新工作都必须这样做。这是一个公司计划,我不会搞砸它。

Roy_043 发表于 2022-7-5 17:48:14

我在上一篇文章中编辑了代码。Gc 41在实体列表中出现两次,我的代码会错误地更改第一次出现的内容。我最初的想法是使用反向。但是,如果两个gc 41项具有相同的值,则仍然存在问题。使用append代替subst解决了这两个问题。
(subst '(41 . 0.0) '(41 . 1.0) '((41 . 1.0) (41 . 1.0))) => ((41 . 0.0) (41 . 0.0))

Grrr 发表于 2022-7-5 17:58:22

谢谢你的夸奖!
但我不认为自己是专业人士,也不认为自己是程序员。我目前的技能对编写代码非常感兴趣。。并向更熟练的用户学习(李·麦克和塔瓦在其中发挥了重要作用)。
我非常感谢他们的帮助,所以我尝试将我实践作品中的任何“版权”翻译成他们/他们的昵称。
作为证明,Roy_043提到了我在之前帖子中发布的示例中的一个错误:
我知道,在这些论坛上,有一些Lisp程序的巨人在游,在沼泽深处,我只是听从塔瓦的建议,尽可能多地参与线程。

RubberDinero 发表于 2022-7-5 18:01:21

 
这是我的目标。成为一名精通编写代码的人,这里的每个人都很有帮助。

Grrr 发表于 2022-7-5 18:14:08

 
可以因此,为了了解您目前正在处理的问题,请分析以下(entsel)示例:
[颜色=#8b4513];提供了4个示例来显示提示用户使用(entsel)(defun C:test();>>示例#1-简单示例#2版本1-中等示例#2版本2-中等示例#3-平均值

RubberDinero 发表于 2022-7-5 18:16:11

 
 
谢谢我一直很感谢反馈,我更感谢这些例子!期待分析!
页: [1]
查看完整版本: 全靠我自己。。。有点。属性