乐筑天下

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

[编程交流] 块和层

[复制链接]

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 16:28:24 | 显示全部楼层 |阅读模式
我在画图中用了很多积木。所有块都有自己的层。有时会变得一团糟,因为相同的块会被转移到其他层。是否有lisp检查所有图形并将所有块放在正确的图层中?
 
谢谢
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

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

铜币
260
发表于 2022-7-5 16:42:40 | 显示全部楼层
lisp如何知道每个块属于哪一层?从来没有见过一张每个区块都有自己图层的图纸。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:49:41 | 显示全部楼层
这在理论上应该可以工作,但我不知道回调函数失败的原因-返回的参数是“无效”的ename:
 
  1. ; (setq *LinkLyrBlk* nil)
  2. (defun C:LinkLayerBlock ( / SymNms Lyrs Blks Lyr Blk itm )
  3. (defun SymNms ( tbl / d L )
  4.    (while (setq d (tblnext tbl (not d))) (setq L (cons (cdr (assoc 2 d)) L)) )
  5.    (acad_strlsort L)
  6. ); defun SymNms
  7. (if
  8.    (and
  9.      (setq Lyrs (SymNms "LAYER"))
  10.      (setq Blks (SymNms "BLOCK"))
  11.      (setq Blks (vl-remove-if '(lambda (x) (wcmatch x "`*U*,_*,`*T*")) Blks))
  12.      (setq Lyr (car (LM:listbox "Select Layer" Lyrs 0)))
  13.      (setq Blk (car (LM:listbox (strcat "Select Block to link with " Lyr) Blks 0)))
  14.    )
  15.    (progn
  16.      (foreach rtr (cdar (vlr-reactors :vlr-AcDb-reactor)) (if (= "LinkLyrBlk" (vlr-data rtr)) (vlr-remove rtr)))
  17.      (vlax-for o (vla-get-Block (vla-get-ActiveLayout (vla-get-ActiveDocument (vlax-get-acad-object))))
  18.        (and
  19.          (vlax-write-enabled-p o)
  20.          (eq "AcDbBlockReference" (vla-get-ObjectName o))
  21.          (eq Blk (vla-get-EffectiveName o))
  22.          (vla-put-Layer o Lyr)
  23.        ); and
  24.      ); vlax-for
  25.      (cond
  26.        ( (setq itm (assoc Lyr *LinkLyrBlk*))
  27.          (setq *LinkLyrBlk* (mapcar '(lambda (x) (vl-remove-if '(lambda (b) (eq b Blk)) (cdr x))) *LinkLyrBlk*)); Remove duplicate blocks
  28.          (setq *LinkLyrBlk* (subst (append itm (list Blk)) itm *LinkLyrBlk*))
  29.        )
  30.        ( (setq *LinkLyrBlk* (cons (list Lyr Blk) *LinkLyrBlk*)) )
  31.      ); cond
  32.      (vlr-AcDb-reactor "LinkLyrBlk"
  33.        '((:vlr-objectAppended . LinkLyrBlk:callback)
  34.          (:vlr-objectReAppended . LinkLyrBlk:callback)
  35.          (:vlr-objectModified . LinkLyrBlk:callback)
  36.        )
  37.      ); vlr-AcDb-reactor
  38.    ); progn
  39. ); if
  40. (princ)
  41. ); defun C:LinkLayerBlock
  42. (defun LinkLyrBlk:callback (rtr arg / e o nm )
  43. (and
  44.    *LinkLyrBlk*
  45.    (eq 'ENAME (type (setq e (cadr arg))))
  46.    (= "INSERT" (cdr (assoc 0 (entget e))))
  47.    (setq o (vlax-ename->vla-object e))
  48.    (vlax-write-enabled-p o)
  49.    (eq "AcDbBlockReference" (vla-get-ObjectName o))
  50.    (setq nm (vla-get-EffectiveName o))
  51.    (vl-some
  52.      '(lambda (a)
  53.        (vl-some
  54.          '(lambda (b)
  55.            (if (eq b nm) (progn (vla-put-Layer o (car a)) T))
  56.          ); lambda b
  57.          (cdr a)
  58.        ); vl-some
  59.      ); lambda a
  60.      *LinkLyrBlk*
  61.    ); vl-some
  62. ); and
  63. ); defun LinkLyrBlk:callback
  64. ;; List Box  -  Lee Mac
  65. ;; Displays a DCL list box allowing the user to make a selection from the supplied data.
  66. ;; msg - [str] Dialog label
  67. ;; lst - [lst] List of strings to display
  68. ;; bit - [int] 1=allow multiple; 2=return indexes
  69. ;; Returns: [lst] List of selected items/indexes, else nil
  70. (defun LM:listbox ( msg lst bit / dch des tmp rtn )
  71. (cond
  72.    (   (not
  73.      (and
  74.        (setq tmp (vl-filename-mktemp nil nil ".dcl"))
  75.        (setq des (open tmp "w"))
  76.        (write-line
  77.          (strcat "listbox:dialog{label="" msg "";spacer;:list_box{key="list";multiple_select="
  78.            (if (= 1 (logand 1 bit)) "true" "false") ";width=50;height=15;}spacer;ok_cancel;}"
  79.          )
  80.          des
  81.        )
  82.        (not (close des))
  83.        (< 0 (setq dch (load_dialog tmp)))
  84.        (new_dialog "listbox" dch)
  85.      )
  86.    )
  87.    (prompt "\nError Loading List Box Dialog.")
  88.    )
  89.    (   t     
  90.      (start_list "list")
  91.      (foreach itm lst (add_list itm))
  92.      (end_list)
  93.      (setq rtn (set_tile "list" "0"))
  94.      (action_tile "list" "(setq rtn $value)")
  95.      (setq rtn
  96.        (if (= 1 (start_dialog))
  97.          (if (= 2 (logand 2 bit))
  98.            (read (strcat "(" rtn ")"))
  99.            (mapcar '(lambda ( x ) (nth x lst)) (read (strcat "(" rtn ")")))
  100.          )
  101.        )
  102.      )
  103.    )
  104. )
  105. (if (< 0 dch)
  106.    (unload_dialog dch)
  107. )
  108. (if (and tmp (setq tmp (findfile tmp)))
  109.    (vl-file-delete tmp)
  110. )
  111. rtn
  112. )                     
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 16:55:26 | 显示全部楼层
您好,Grrr。你的代码运行良好。谢谢
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:03:06 | 显示全部楼层
最初改变层的部分工作,但反应器不工作-它应该检查块是否被修改,如果块的层被更改,反应器将其切换回(锁定层)。
但就像我说的,我得到了一个奇怪的无效实体名参数:
 

                               
登录/注册后可看大图

 
尽管一些其他类型的反应堆可能会工作-例如图纸将被保存/将被关闭/变量更改-并迭代所有块并重置其层。
回复

使用道具 举报

107

主题

615

帖子

575

银币

中流砥柱

Rank: 25

铜币
521
发表于 2022-7-5 17:09:28 | 显示全部楼层
我用我的一些代码块检查代码,直到现在都很好。。。如果我看到任何错误,我会告诉你。谢谢
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:14:33 | 显示全部楼层
@Grrr:
也许这有助于澄清你的反应堆问题:
https://www.theswamp.org/index.php?topic=52466.0
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:21:57 | 显示全部楼层
 
谢谢,罗伊!
我已经忘记了那个线程(当时我还是一个反应器假人,所以有点忽略了它)。
从图中你可能会看到,我试图获取或错误捕获结果-这些将停止进一步的评估,并且不会解决问题。
我下载了您上传的最新的“ConnectObjects\u AutoCAD.lsp”,并粗略检查了您的代码(没有仔细分析),这是一种非常有趣的扩展数据技术。
这几天我太忙了,所以我只想问一个简单的问题——你找到解决办法了吗?(没有时间测试代码)。
 
最后,我在这个任务中扮演了DCL部分,但我把反应堆问题留给了甜点:
 

                               
登录/注册后可看大图
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:28:44 | 显示全部楼层
两位AutoCAD用户已确认ConnectObjects\u AutoCAD。lsp在该程序中起作用。您使用entget让我想起了ConnectObjects代码的问题。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:09 , Processed in 0.518701 second(s), 73 queries .

© 2020-2025 乐筑天下

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