BRC 发表于 2022-7-5 18:42:30

非动态lisp修改

您好,Lisp guru,
 
我搜索了一些可以将动态块转换为静态块的Lisp,我发现其中一个做得非常好的是MP的非动态
http://www.theswamp.org/index.php?topic=32681.msg382548#msg382548
 
(defun c:UnDynamic

   (   /
       _get_item
       _right
       _make_key
       _dynamic->static_block
       _get_locked
       _get_dynamic_inserts
       _main
   )

   (defun _get_item ( collection key / item )
       (vl-catch-all-apply
          '(lambda ( ) (setq item (vla-item collection key)))
       )
       item
   )

   (defun _right ( str n / len )
       (if (< n (setq len (strlen str)))
         (substr str (1+ (- len n)))
         str
       )
   )

   (defun _make_key ( collection prefix len / key )
       (   (lambda ( i pad )
               (while
                   (_get_item collection
                     (setq key
                           (strcat prefix
                               (_right
                                 (strcat pad (itoa (setq i (1+ i))))
                                 len
                               )
                           )
                     )
                   )
               )
               key
         )
         0
         (   (lambda ( pad )
                   (while (< (strlen pad) len)
                     (setq pad (strcat "0" pad))
                   )
                   pad
               )
               ""
         )
       )
   )

   (defun _dynamic->static_block ( blocks insert len )
       (vla-ConvertToStaticBlock
         insert
         (_make_key blocks "STATIC_" len)
       )
   )

   (defun _get_locked ( layers / locked )
       (vlax-for layer layers
         (if (eq :vlax-true (vla-get-lock layer))
               (setq locked (cons layer locked))
         )
       )
       locked
   )

   (defun _get_dynamic_inserts ( blocks / inserts )
       (vlax-for block blocks
         (vlax-for object block
               (if (eq "AcDbBlockReference" (vla-get-objectname object))
                   (if (eq :vlax-true (vla-get-isdynamicblock object))
                     (setq inserts (cons object inserts))
                   )
               )
         )
       )
       inserts
   )

   (defun _main ( document / blocks inserts locked len )
       (if
         (setq inserts
               (_get_dynamic_inserts
                   (setq blocks (vla-get-blocks document))
               )
         )
         (progn
               (foreach layer (setq locked (_get_locked (vla-get-layers document)))
                   (vla-put-lock layer :vlax-false)
               )
               (setq len (strlen (itoa (length inserts))))
               (foreach insert inserts
                   (_dynamic->static_block blocks insert len)
               )
               (foreach layer locked
                   (vla-put-lock layer :vlax-true)
               )
         )
       )
       (princ)
   )

   (_main (vla-get-activedocument (vlax-get-acad-object)))

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

Lee Mac 发表于 2022-7-5 19:03:21

您好,BRC,欢迎来到CADTutor
 
请尝试以下代码:

(defun c:undyn nil
   (undyn (vla-get-activedocument (vlax-get-acad-object)))
   (princ)
)
(defun undyn ( doc / blk lst )
   (vlax-for def (setq blk (vla-get-blocks doc))
       (if (= :vlax-false(vla-get-isxref def))
         (vlax-for obj def
               (and (= "AcDbBlockReference" (vla-get-objectname obj))
                  (= :vlax-true (vla-get-isdynamicblock obj))
                  (vlax-write-enabled-p obj)
                  (setq lst (cons obj lst))
               )
         )
       )
   )
   (foreach obj lst
       (vla-converttostaticblock obj
         (uniqueblock blk (strcat (vla-get-effectivename obj) "_DYNlocked"))
       )
   )
)
(defun uniqueblock ( col key / tmp )
   (cond
       (   (not (item-p col key)) key)
       (   (setq tmp 1)
         (while (item-p col (strcat key (itoa (setq tmp (1+ tmp))))))
         (strcat key (itoa tmp))
       )
   )
)
(defun item-p ( col key )
   (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list col key))))
)
(vl-load-com) (princ)

BRC 发表于 2022-7-5 19:17:25

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

Lee Mac 发表于 2022-7-5 19:37:47

 
谢谢你的客气话,我也很高兴见到你。
 
 
太好了,不客气。
 
 
您可能希望在扩展字典内或作为扩展数据将动态块属性值的列表附加到块,否则几乎不可能确定在插入动态块以替换静态插入时要使用的适当动态块属性。

BRC 发表于 2022-7-5 19:55:39

你们说得对,我刚刚试着做一个块替换,注意到它会恢复到原来插入的块。这比我想象的要复杂得多。我将研究上面提到的扩展字典和扩展数据。
页: [1]
查看完整版本: 非动态lisp修改