乐筑天下

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

[编程交流] 非动态lisp修改

[复制链接]
BRC

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:42:30 | 显示全部楼层 |阅读模式
您好,Lisp guru,
 
我搜索了一些可以将动态块转换为静态块的Lisp,我发现其中一个做得非常好的是MP的非动态
http://www.theswamp.org/index.php?topic=32681.msg382548#msg382548
 
  1. (defun c:UnDynamic
  2.    (   /
  3.        _get_item
  4.        _right
  5.        _make_key
  6.        _dynamic->static_block
  7.        _get_locked
  8.        _get_dynamic_inserts
  9.        _main
  10.    )
  11.    (defun _get_item ( collection key / item )
  12.        (vl-catch-all-apply
  13.           '(lambda ( ) (setq item (vla-item collection key)))
  14.        )
  15.        item
  16.    )
  17.    (defun _right ( str n / len )
  18.        (if (< n (setq len (strlen str)))
  19.            (substr str (1+ (- len n)))
  20.            str
  21.        )
  22.    )
  23.    (defun _make_key ( collection prefix len / key )
  24.        (   (lambda ( i pad )
  25.                (while
  26.                    (_get_item collection
  27.                        (setq key
  28.                            (strcat prefix
  29.                                (_right
  30.                                    (strcat pad (itoa (setq i (1+ i))))
  31.                                    len
  32.                                )
  33.                            )
  34.                        )
  35.                    )
  36.                )
  37.                key
  38.            )
  39.            0
  40.            (   (lambda ( pad )
  41.                    (while (< (strlen pad) len)
  42.                        (setq pad (strcat "0" pad))
  43.                    )
  44.                    pad
  45.                )
  46.                ""
  47.            )
  48.        )
  49.    )
  50.    (defun _dynamic->static_block ( blocks insert len )
  51.        (vla-ConvertToStaticBlock
  52.            insert
  53.            (_make_key blocks "STATIC_" len)
  54.        )
  55.    )
  56.    (defun _get_locked ( layers / locked )
  57.        (vlax-for layer layers
  58.            (if (eq :vlax-true (vla-get-lock layer))
  59.                (setq locked (cons layer locked))
  60.            )
  61.        )
  62.        locked
  63.    )
  64.    (defun _get_dynamic_inserts ( blocks / inserts )
  65.        (vlax-for block blocks
  66.            (vlax-for object block
  67.                (if (eq "AcDbBlockReference" (vla-get-objectname object))
  68.                    (if (eq :vlax-true (vla-get-isdynamicblock object))
  69.                        (setq inserts (cons object inserts))
  70.                    )
  71.                )
  72.            )
  73.        )
  74.        inserts
  75.    )
  76.    (defun _main ( document / blocks inserts locked len )
  77.        (if
  78.            (setq inserts
  79.                (_get_dynamic_inserts
  80.                    (setq blocks (vla-get-blocks document))
  81.                )
  82.            )
  83.            (progn
  84.                (foreach layer (setq locked (_get_locked (vla-get-layers document)))
  85.                    (vla-put-lock layer :vlax-false)
  86.                )
  87.                (setq len (strlen (itoa (length inserts))))
  88.                (foreach insert inserts
  89.                    (_dynamic->static_block blocks insert len)
  90.                )
  91.                (foreach layer locked
  92.                    (vla-put-lock layer :vlax-true)
  93.                )
  94.            )
  95.        )
  96.        (princ)
  97.    )
  98.    (_main (vla-get-activedocument (vlax-get-acad-object)))
  99. )

 
我是个Lisp程序的笨蛋(但我正在努力学习)。你们能帮我以某种方式将(strcat(vlax get property obj'Name)“_DYNlocked”)合并到上面的lisp中(抱歉,MP进行了修改),以便替换的静态块保留原始的动态块名称吗。
 
我希望将来可以对静态块进行块替换,将其更新回动态块以供使用。
 
谢谢你的帮助!
当做
BRC公司
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:03:21 | 显示全部楼层
您好,BRC,欢迎来到CADTutor
 
请尝试以下代码:
  1. ([color=BLUE]defun[/color] c:undyn [color=BLUE]nil[/color]
  2.    (undyn ([color=BLUE]vla-get-activedocument[/color] ([color=BLUE]vlax-get-acad-object[/color])))
  3.    ([color=BLUE]princ[/color])
  4. )
  5. ([color=BLUE]defun[/color] undyn ( doc [color=BLUE]/[/color] blk lst )
  6.    ([color=BLUE]vlax-for[/color] def ([color=BLUE]setq[/color] blk ([color=BLUE]vla-get-blocks[/color] doc))
  7.        ([color=BLUE]if[/color] ([color=BLUE]=[/color] [color=BLUE]:vlax-false[/color]  ([color=BLUE]vla-get-isxref[/color] def))
  8.            ([color=BLUE]vlax-for[/color] obj def
  9.                ([color=BLUE]and[/color] ([color=BLUE]=[/color] [color=MAROON]"AcDbBlockReference"[/color] ([color=BLUE]vla-get-objectname[/color] obj))
  10.                     ([color=BLUE]=[/color] [color=BLUE]:vlax-true[/color] ([color=BLUE]vla-get-isdynamicblock[/color] obj))
  11.                     ([color=BLUE]vlax-write-enabled-p[/color] obj)
  12.                     ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] obj lst))
  13.                )
  14.            )
  15.        )
  16.    )
  17.    ([color=BLUE]foreach[/color] obj lst
  18.        ([color=BLUE]vla-converttostaticblock[/color] obj
  19.            (uniqueblock blk ([color=BLUE]strcat[/color] ([color=BLUE]vla-get-effectivename[/color] obj) [color=MAROON]"_DYNlocked"[/color]))
  20.        )
  21.    )
  22. )
  23. ([color=BLUE]defun[/color] uniqueblock ( col key [color=BLUE]/[/color] tmp )
  24.    ([color=BLUE]cond[/color]
  25.        (   ([color=BLUE]not[/color] (item-p col key)) key)
  26.        (   ([color=BLUE]setq[/color] tmp 1)
  27.            ([color=BLUE]while[/color] (item-p col ([color=BLUE]strcat[/color] key ([color=BLUE]itoa[/color] ([color=BLUE]setq[/color] tmp ([color=BLUE]1+[/color] tmp))))))
  28.            ([color=BLUE]strcat[/color] key ([color=BLUE]itoa[/color] tmp))
  29.        )
  30.    )
  31. )
  32. ([color=BLUE]defun[/color] item-p ( col key )
  33.    ([color=BLUE]not[/color] ([color=BLUE]vl-catch-all-error-p[/color] ([color=BLUE]vl-catch-all-apply[/color] '[color=BLUE]vla-item[/color] ([color=BLUE]list[/color] col key))))
  34. )
  35. ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color])
回复

使用道具 举报

BRC

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:17:25 | 显示全部楼层
哇,著名的李麦克!我在论坛上看到了你的传奇作品。很高兴认识你。
 
这非常有效。非常感谢。
下一步,我将尝试使用lisp将块替换回动态块我将为这个阶段做一些研究。
 
计划是在发送到客户端时静态数据块,然后在收到文件时阻止替换以恢复动态
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:37:47 | 显示全部楼层
 
谢谢你的客气话,我也很高兴见到你。
 
 
太好了,不客气。
 
 
您可能希望在扩展字典内或作为扩展数据将动态块属性值的列表附加到块,否则几乎不可能确定在插入动态块以替换静态插入时要使用的适当动态块属性。
回复

使用道具 举报

BRC

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:55:39 | 显示全部楼层
你们说得对,我刚刚试着做一个块替换,注意到它会恢复到原来插入的块。这比我想象的要复杂得多。我将研究上面提到的扩展字典和扩展数据。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 13:44 , Processed in 0.664891 second(s), 62 queries .

© 2020-2025 乐筑天下

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