q2284555 发表于 2023-12-17 12:04:37

膜拜大佬,

lxl217114 发表于 2024-1-9 15:32:52

飞雪神光 发表于 2023-10-10 13:07
就像这样 拾取一个原图块 批量覆盖有相同属性的属性块 不考虑数据是否对等

很好使,如果能把相近的替换完标记值以后,删除原块就完美了。

飞雪神光 发表于 2024-1-9 20:48:31

lxl217114 发表于 2024-1-9 15:32
很好使,如果能把相近的替换完标记值以后,删除原块就完美了。

加个entdel 删了就行了(defun c:tt(/ bj get-insert-tag&value lm-set-attribute obj ss ss-enlst sx sxlst ty)
        (defun get-insert-Tag&value (blk / lst)
                (if (= (type blk) 'ENAME)
                        (if (safearray-value(setq lst (vlax-variant-value(vla-getattributes (vlax-ename->vla-object blk)))))
                                (mapcar'(lambda (x)(cons (vla-get-tagstring x) (vla-get-textstring x)))(vlax-safearray->list lst))
                        )
                        nil
                )
        )
        (defun lm-set-attribute(ty biaoji va / att_list)
                (setq ty (if(=(type ty)'ename)(vlax-ename->vla-object ty)ty))
                (setq att_list (vlax-safeArray->list (vlax-variant-value (vla-getattributes ty))))
                (setq xx(vl-some'(lambda(a)(if(=(strcase(vla-get-TagString a))(strcase biaoji))a))att_list))
                (if xx
                        (vla-put-textstring xx va)
                )
                (princ)
        )
        (setq
                ty(car(entsel "\n原属性块:"))
                obj(vlax-ename->vla-object ty)
        )
        (setq sxlst (get-insert-Tag&value ty))
        (entdel ty)
        (princ"\n覆盖属性块:")
        (setq ss(ssget '((0 . "insert"))))
        (foreach ty (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex ss)))
                (foreach x sxlst
                        (setq
                                bj(car x)
                                sx(cdr x)
                        )
                        (lm-set-attribute ty bj sx)
                )
        )
        (princ)
)

lxl217114 发表于 2024-1-10 10:35:25

飞雪神光 发表于 2024-1-9 20:48
加个entdel 删了就行了
大佬,如果方便的话。
看看如图的这样可以实现么?

附件



飞雪神光 发表于 2024-1-10 11:18:06

lxl217114 发表于 2024-1-10 10:35
大佬,如果方便的话。
看看如图的这样可以实现么?



可以用红框查找对应的 原图签和新图签进行替换 也可以试试这个
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=189245&page=1#pid968104

飞雪神光 发表于 2024-1-10 11:30:39

lxl217114 发表于 2024-1-10 10:35
大佬,如果方便的话。
看看如图的这样可以实现么?



(defun c:tt(/ bj get-insert-tag&value lm-set-attribute obj ss ss-enlst sx sxlst ty)
        (defun get-insert-Tag&value (blk / lst)
                (if (= (type blk) 'ENAME)
                        (if (safearray-value(setq lst (vlax-variant-value(vla-getattributes (vlax-ename->vla-object blk)))))
                                (mapcar'(lambda (x)(cons (vla-get-tagstring x) (vla-get-textstring x)))(vlax-safearray->list lst))
                        )
                        nil
                )
        )
        (defun lm-set-attribute(ty biaoji va / att_list)
                (setq ty (if(=(type ty)'ename)(vlax-ename->vla-object ty)ty))
                (setq att_list (vlax-safeArray->list (vlax-variant-value (vla-getattributes ty))))
                (setq xx(vl-some'(lambda(a)(if(=(strcase(vla-get-TagString a))(strcase biaoji))a))att_list))
                (if xx
                        (vla-put-textstring xx va)
                )
                (princ)
        )
        (defun ss-enlst (ss / enlst)
                (cond
                        ((= (type ss) 'PICKSET)
                                (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
                        )
                        ((= (type ss) 'LIST)
                                (setq enlst (ssadd))
                                (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
                        )
                )
        )
        (defun lm-Get-LwPts(en / x)
                (mapcar
                        'cdr
                        (vl-remove-if-not
                                '(lambda(x)
                                       (= (car x) 10)
                               )
                                (entget en)
                        )
                )
        )
        (setq ss(ssget '((0 . "LWPOLYLINE")(8 . "jm-创建块图框"))))
        (foreach ty (ss-enlst ss)
                (setq pts (lm-Get-LwPts ty))
                (setq yss(ssget "cp" pts '((0 . "INSERT")(8 . "图签")(2 . "原始图签"))))
                (if (and yss (> (sslength yss) 0))
                        (progn
                                (setq
                                        ty (ssname yss 0)
                                        obj(vlax-ename->vla-object ty)
                                        sxlst (get-insert-Tag&value ty)
                                )
                                (entdel ty)
                                (setq xss(ssget "cp" pts '((0 . "INSERT")(2 . "新图签"))))
                                (foreach ty (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex xss)))
                                        (foreach x sxlst
                                                (setq
                                                        bj(car x)
                                                        sx(cdr x)
                                                )
                                                (lm-set-attribute ty bj sx)
                                        )
                                )
                        )
                )
        )
        (princ)
)

newmooooon 发表于 2024-1-10 12:55:41

本帖最后由 newmooooon 于 2024-1-10 13:02 编辑

lxl217114 发表于 2024-1-10 10:35
大佬,如果方便的话。
看看如图的这样可以实现么?


(defun c:sbb(/ i en ss_Block Block_Name att_list)
      (setq att_list '(2 8 41 42 43 50))
      (princ "\n源块:")
      (if sb_source_block (princ (strcat "默认:" (cdr (assoc 2 sb_source_block)))))
      (setq en (ssget "_+.:E:S" '((0 . "INSERT"))))
      (if en
                (setq sb_source_block (nw_get_assocs (entget (ssname en 0)) att_list))
      )
      (princ "\n需要被替换的块:")
      (setq ss_Block (ssget ":S" '((0 . "INSERT"))))
      (while ss_Block
                (setq i -1)
                (while (setq en (ssname ss_Block (setq i (1+ i))))
                        (setq en (entget en))
                        (entmod (nw_set_assocs en sb_source_block))
                )
                (setq ss_Block (ssget ":S" '((0 . "INSERT"))))
      )
)

;;返回图元中所有群码在dxf_lst中的表
(defun nw_get_assocs(en_data dxf_lst)
        (if (= 'ENAME (type en_data))
                (setq en_data (entget en_data))
        )
        (vl-remove-if-not '(lambda(x) (member (car x) dxf_lst)) en_data)
)

;;修改指定群码表
(defun nw_set_assocs(en_data assoc_lst1 / x y)
        (foreach x assoc_lst1
                (if (setq y (assoc (car x) en_data))
                        (setq en_data (subst x y en_data))
                        (setq en_data (cons x en_data))
                )
        )
)


自用的,只刷块,不刷属性
带记忆的块刷

lxl217114 发表于 2024-1-10 13:31:32

newmooooon 发表于 2024-1-10 12:55
自用的,只刷块,不刷属性
带记忆的块刷

厉害的,厉害的。

lxl217114 发表于 2024-1-10 13:38:51

飞雪神光 发表于 2024-1-10 11:30


还有一丢丢问题:
就是在图框是如下情况会①不是矩形 ②是图块③外部参照④没有矩形、没有图块、没有外部参照的图框
会失效

飞雪神光 发表于 2024-1-10 15:21:00

lxl217114 发表于 2024-1-10 13:38
还有一丢丢问题:
就是在图框是如下情况会①不是矩形 ②是图块③外部参照④没有矩形、没有图块、没有外 ...

这就是开始不停地加需求了么
页: 1 2 [3] 4
查看完整版本: 属性块参数复制到另一个属性块