GregGleason 发表于 2022-7-5 15:30:56

单层交叉窗

我试图编写一个具有以下伪代码的例程:
 
[列表=1]
[*]选择对象窗口/交叉(这些坐标已知)
[*]在该窗口中标识所有具有“YYY”层的文本对象
[*]将上述对象更改为图层“ZZZ”
[*]在该窗口内用“YYY”层标识所有块(包含文本)
[*]将上述对象更改为图层“ZZZ”
[/列表]
这就是我取得的成绩:
 
这段代码只执行步骤1、2和3,我不知道如何让它只挑选初始层为“YYY”的项目。
 
我也需要第4步和第5步的帮助。
 
格雷格

BIGAL 发表于 2022-7-5 15:39:06

Ssget可以有多个筛选器
 

'((0 . "TEXT"))
'((0 . "TEXT")(8 . "YYY"))

also
'((0 . "TEXT,INSERT")(8 . "YYY"))

注意,要检查块中的文本是否需要在每个块项中查找文本。
 
未测试

(vlax-for block (vla-get-blocks doc)
(if (not (wcmatch (strcase (vla-get-name block) t) "*_space*"))
(vlax-for ent block
(if (and (= (vla-get-layer ent ) "YYY")(= (vla-get-name ent) "AcDbtext"))
(vla-put-layer ent "ZZZ")
)
) ;_ end of vlax-for
) ;_ end of if
) ;_ end of vlax-forblock
(vla-regen doc acactiveviewport)

Grrr 发表于 2022-7-5 15:49:58

未测试(当然):
 
(defun C:test ( / SS nm nms enx e )
(if (setq SS (ssget "_C" '(7.244 2.071) '(16.665 10.003) '((0 . "TEXT,INSERT"))))
   (foreach enx (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex SS))))
   (or
       (and
         (vl-every '(lambda (x) (member x enx)) '((0 . "TEXT")(8 . "YYY")))
         (entmod (subst '(8 . "ZZZ") '(8 . "YYY") enx))
       ); and
       (and
         (member '(0 . "INSERT") enx) (entmod (subst '(8 . "ZZZ") (assoc 8 enx) enx))
         (setq nm (vla-get-EffectiveName (vlax-ename->vla-object (cdr (assoc -1 enx)))))
         (not (member nm nms))
         (setq nms (cons nm nms))
         (setq enx (entget (tblobjname "BLOCK" nm)))
         (setq e (cdr (assoc -2 enx)))
         (while (and e (not (member '(0 . "SEQEND") (setq enx (entget e)))))
         (and (member '(0 . "TEXT") enx) (entmod (subst '(8 . "0") (assoc 8 enx) enx)))
         (setq e (entnext e))
         ); while
       ); and
   ); or
   ); foreach   
   (alert "\nNo selection.")
); if SS
(if nms (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport))
(princ)
); defun
(vl-load-com) (princ)

GregGleason 发表于 2022-7-5 15:50:59

 
感谢BIGAL提供有关ssget过滤器的信息(我不知道)。
 
第二部分独立代码是程序的一部分吗?我独立运行它,得到一个错误“error:bad参数类型:VLA-OBJECT nil”。
 
格雷格

GregGleason 发表于 2022-7-5 15:57:53

 
Grrr,您的代码完全正确地找到并更改了文本对象,但没有更改块对象。我会重新检查代码,确保没有任何复制错误。
 
格雷格

GregGleason 发表于 2022-7-5 16:07:34

吼叫声
 
结果你的代码成功了!
 
我是如何发现它的,我必须炸掉这个方块才能看到它的,如果我第一个去检查的话,我应该这么做。
 
我试图添加以下代码。。。
 
(command "explode")。。。
 
(setq e (entnext e))。。。但它失败了,出现了一个错误。
 
 
有没有办法添加命令来分解刚更改的块?
 
格雷格

Grrr 发表于 2022-7-5 16:12:08

也许是为了避免积木爆炸
 
更改:
(and (member '(0 . "TEXT") enx) (entmod (subst '(8 . "ZZZ") (assoc 8 enx) enx)))
收件人:
(and (member '(0 . "TEXT") enx) (entmod (subst '(8 . "0") (assoc 8 enx) enx)))
 
 
 
更改:
(member '(0 . "INSERT") enx)
收件人:
9

GregGleason 发表于 2022-7-5 16:22:44

吼叫声
 
谢谢你这么快回复。
 
它可以正常加载,但当我关闭APPLOAD对话框时会出现语法错误。
 
我仔细检查了代码以确保。
 
有什么想法吗?
 
格雷格

Grrr 发表于 2022-7-5 16:29:09

我修改了代码作为回复#3。

GregGleason 发表于 2022-7-5 16:36:48

好的,那一次它加载时没有错误,并且成功了,但它超越了文本对象,改变了已经在正确图层上的多段线。
 
例如,在运行初始程序并手动分解块后,将正确更改其中的文本,并将前一个块的周围多段线保留在其“自然”层上。这就是我的目标。
 
现在,它将整个块转化为新层,包括块的多段线。
 
 
格雷格
 
 
我希望这有意义。
 
很快就到了,我非常感谢你的帮助。
页: [1]
查看完整版本: 单层交叉窗