乐筑天下

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

[编程交流] 单层交叉窗

[复制链接]

35

主题

145

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

    使用道具 举报

    106

    主题

    1万

    帖子

    101

    银币

    顶梁支柱

    Rank: 50Rank: 50

    铜币
    1299
    发表于 2022-7-5 15:39:06 | 显示全部楼层
    Ssget可以有多个筛选器
     
    1. '((0 . "TEXT"))
    2. '((0 . "TEXT")(8 . "YYY"))
    3. also
    4. '((0 . "TEXT,INSERT")(8 . "YYY"))

    注意,要检查块中的文本是否需要在每个块项中查找文本。
     
    未测试
    1. (vlax-for block (vla-get-blocks doc)
    2. (if (not (wcmatch (strcase (vla-get-name block) t) "*_space*"))
    3. (vlax-for ent block
    4. (if (and (= (vla-get-layer ent ) "YYY")(= (vla-get-name ent) "AcDbtext"))
    5. (vla-put-layer ent "ZZZ")
    6. )
    7. ) ;_ end of vlax-for
    8. ) ;_ end of if
    9. ) ;_ end of vlax-for  block
    10. (vla-regen doc acactiveviewport)
    回复

    使用道具 举报

    66

    主题

    1552

    帖子

    1514

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    325
    发表于 2022-7-5 15:49:58 | 显示全部楼层
    未测试(当然):
     
    1. (defun C:test ( / SS nm nms enx e )
    2. (if (setq SS (ssget "_C" '(7.244 2.071) '(16.665 10.003) '((0 . "TEXT,INSERT"))))
    3.    (foreach enx (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex SS))))
    4.      (or
    5.        (and
    6.          (vl-every '(lambda (x) (member x enx)) '((0 . "TEXT")(8 . "YYY")))
    7.          (entmod (subst '(8 . "ZZZ") '(8 . "YYY") enx))
    8.        ); and
    9.        (and
    10.          (member '(0 . "INSERT") enx) (entmod (subst '(8 . "ZZZ") (assoc 8 enx) enx))
    11.          (setq nm (vla-get-EffectiveName (vlax-ename->vla-object (cdr (assoc -1 enx)))))
    12.          (not (member nm nms))
    13.          (setq nms (cons nm nms))
    14.          (setq enx (entget (tblobjname "BLOCK" nm)))
    15.          (setq e (cdr (assoc -2 enx)))
    16.          (while (and e (not (member '(0 . "SEQEND") (setq enx (entget e)))))
    17.            (and (member '(0 . "TEXT") enx) (entmod (subst '(8 . "0") (assoc 8 enx) enx)))
    18.            (setq e (entnext e))
    19.          ); while
    20.        ); and
    21.      ); or
    22.    ); foreach   
    23.    (alert "\nNo selection.")
    24. ); if SS
    25. (if nms (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport))
    26. (princ)
    27. ); defun
    28. (vl-load-com) (princ)
    回复

    使用道具 举报

    35

    主题

    145

    帖子

    114

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    180
    发表于 2022-7-5 15:50:59 | 显示全部楼层
     
    感谢BIGAL提供有关ssget过滤器的信息(我不知道)。
     
    第二部分独立代码是程序的一部分吗?我独立运行它,得到一个错误“error:bad参数类型:VLA-OBJECT nil”。
     
    格雷格
    回复

    使用道具 举报

    35

    主题

    145

    帖子

    114

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    180
    发表于 2022-7-5 15:57:53 | 显示全部楼层
     
    Grrr,您的代码完全正确地找到并更改了文本对象,但没有更改块对象。我会重新检查代码,确保没有任何复制错误。
     
    格雷格
    回复

    使用道具 举报

    35

    主题

    145

    帖子

    114

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    180
    发表于 2022-7-5 16:07:34 | 显示全部楼层
    吼叫声
     
    结果你的代码成功了!
     
    我是如何发现它的,我必须炸掉这个方块才能看到它的,如果我第一个去检查的话,我应该这么做。
     
    我试图添加以下代码。。。
     
    1. (command "explode")
    。。。
     
    1. (setq e (entnext e))
    。。。但它失败了,出现了一个错误。
     
     
    有没有办法添加命令来分解刚更改的块?
     
    格雷格
    回复

    使用道具 举报

    66

    主题

    1552

    帖子

    1514

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    325
    发表于 2022-7-5 16:12:08 | 显示全部楼层
    也许是为了避免积木爆炸
     
    更改:
    1. (and (member '(0 . "TEXT") enx) (entmod (subst '(8 . "ZZZ") (assoc 8 enx) enx)))

    收件人:
    1. (and (member '(0 . "TEXT") enx) (entmod (subst '(8 . "0") (assoc 8 enx) enx)))

     
     
     
    更改:
    1. (member '(0 . "INSERT") enx)

    收件人:
    1. 9
    回复

    使用道具 举报

    35

    主题

    145

    帖子

    114

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    180
    发表于 2022-7-5 16:22:44 | 显示全部楼层
    吼叫声
     
    谢谢你这么快回复。
     
    它可以正常加载,但当我关闭APPLOAD对话框时会出现语法错误。
     
    我仔细检查了代码以确保。
     
    有什么想法吗?
     
    格雷格
    回复

    使用道具 举报

    66

    主题

    1552

    帖子

    1514

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    325
    发表于 2022-7-5 16:29:09 | 显示全部楼层
    我修改了代码作为回复#3。
    回复

    使用道具 举报

    35

    主题

    145

    帖子

    114

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    180
    发表于 2022-7-5 16:36:48 | 显示全部楼层
    好的,那一次它加载时没有错误,并且成功了,但它超越了文本对象,改变了已经在正确图层上的多段线。
     
    例如,在运行初始程序并手动分解块后,将正确更改其中的文本,并将前一个块的周围多段线保留在其“自然”层上。这就是我的目标。
     
    现在,它将整个块转化为新层,包括块的多段线。
     
     
    格雷格
     
     
    我希望这有意义。
     
    很快就到了,我非常感谢你的帮助。
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-14 21:04 , Processed in 2.763175 second(s), 73 queries .

    © 2020-2025 乐筑天下

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