pmxcad 发表于 2022-7-5 23:46:16

这个口齿不清需要帮助

大家好!
我必须在现有块(RMELDER.dwg)的顶部放置一个块(BISATT.dwg)。
我在这个论坛上找到了一个lisp(FOO.lsp),它可以把一个块放在一个已有的块上。然而,它每次只能进行1次拦截。我想选择所有RMELDER块,运行lisp将BISATT块放在所有RMELDER块的顶部,接管块比例,并从激活块RMELDER复制属性(TAG1和HYPERLINK)
 
提前感谢
傅。lsp
测试。图纸
比萨特。图纸

ymg3 发表于 2022-7-5 23:51:17

pmxcad,
 
在这里,但要小心,因为在您的绘图中的每个块
将覆盖块BISATT。
 
ymg公司
 

(defun c:test ()
; Be careful with this routine as Every Block in your Drawing will be;
; Overlayed with block BISATT                                          ;
(if (and (setq ss (ssget "_X" '((0 . "INSERT"))))
         (findfile "BISATT.dwg")
   )
   (repeat (setq i (sslength ss))
      (command "._-insert""BISATT" (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))) 1.0 1.0 0.0)
   )
   (cond
      (ss (prompt "\n** \"BISATTdwg\" cannot be found ** "))
      (t(prompt "\n** Nothing selected ** "))
   )
)
)

pmxcad 发表于 2022-7-5 23:53:23

好的,谢谢你的回答,但是。。。。。。。。
我只需要在所选块的顶部使用BISATT块,如果可能的话,可以将属性数据从BISATT块下的块复制到BISATT块。
 
提前感谢
 
Pmxcad

ymg3 发表于 2022-7-5 23:59:09

pmxcad,
 
当我在随附的图纸上运行它时,我确实在门的原点插入了bisatt块。
 
但是,图形中的任何块似乎都没有属性。
 
此外,似乎还有块的重影插入点,因为正在插入额外的bisatt。
 
所以给我们一个运行Lisp前后的图形,并给我们一些门的属性。
目前,Bissatt只有两个属性,其中一个是超链接
 
ymg公司

pmxcad 发表于 2022-7-6 00:02:28

YMG,我画了3张图:
-之前=开始绘图
-之后=使用插入的BISATT块绘制。
-最终=关闭某个图层后的最终结果绘图。
 
最终的图纸是我喜欢的。
 
黄色/红色块是火灾探测器,在最终图纸中,该层已关闭。这些BIS-ATT块获得一个超链接,并链接到带有火灾报警系统的系统。我将图形打印为DWF。DWF显示在建筑系统中,在BIS-ATT广场上的监视器屏幕上显示闪烁的火灾图标。万一发生火灾。
 
 
谢谢
PmxCAD

pmxcad 发表于 2022-7-6 00:05:17

当然还有图纸。。。。。。。。。。
之前图纸
之后图纸
最终的图纸

ymg3 发表于 2022-7-6 00:07:06

试试这个,
 

;; getblkename       by ymg                                                   ;
;;                                                                            ;
;; Original Code by Tim Wiley                                                 ;
;; Argument: Block Name                                                       ;
;;Returns: list of enames Block in Drawing                                  ;
(defun getblkename (blkname / blklst)
(vlax-for obj (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-Acad-Object)))
      (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference")
               (= (vla-get-EffectiveName obj) blkname)
          )
         (setq blkLst (cons (vlax-vla-object->ename obj) blkLst))
      )
)
)

(defun c:test (/ al bl el en pos stl svl)
(setq bl (getblkename "RMELDER")
       al nil
)
(foreach ent bl
   (vl-cmdf "._-insert""BISATT" (cdr (assoc 10 (entget ent))) 100.0 100.0 0.0)
   (setq al (cons (entlast) al))
)
(setq al (reverse al))
(foreach e bl   
    (setq en (entnext e)
         svl nil
         stl nil   
    )   
    (while (= (cdr (assoc 0 (setq el (entget en)))) "ATTRIB")      
       (setq stl (cons (cdr (assoc 2 el)) stl)
             svl (cons (cdr (assoc 1 el)) svl)
            en (entnext en)            
       )   
    )
    (setq en (entnext (car al))
          al (cdr al)      
    )   
    (while (= (cdr (assoc 0 (setq el (entget en)))) "ATTRIB")
       (if (setq pos (vl-position (cdr (assoc 2 el)) stl))
          (entmod (subst (cons1 (nth pos svl)) (assoc 1 el) el))         
       )
       (setq en (entnext en))   
    )
)
)

pmxcad 发表于 2022-7-6 00:10:42

是的。。。YMG。。。。。。。。几乎
 
这些是动态块,有自己的匿名名称。Lisp程序不需要所有的块,只有2个。这些是副本。
是否有方法更改lisp以使其与动态块配合良好,或者是否有可能更改lisp以影响选定的块?
如按图层或块名快速选择,在选择后运行lisp。
 
谢谢
 
PmxCAD

ymg3 发表于 2022-7-6 00:15:26

pmxcad,
 
函数GetBlkEname()通常返回给定动态块名的所有名称的列表。
 
当我运行它与您之前的绘图4“RMELDER”块被发现并替换。
 
所以,我不太明白你在说什么。
现在,如果您有不同于“RMELDER”的块,则需要指定它们。
 
ymg公司

pmxcad 发表于 2022-7-6 00:18:44

嗨,YMG
 
这是之前lisp的结果。图纸。两个街区的顶部是比萨特。这些属性不会从bmelder块中获取/复制正确的数据。看起来很重要。
 
PmxCAD
Acad 2014
在_2之前。图纸
页: [1] 2
查看完整版本: 这个Lisp程序需要帮助