乐筑天下

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

[编程交流] 用chan重新定义块

[复制链接]

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:00:40 | 显示全部楼层 |阅读模式
我想重新定义一个块。旧块没有单独定义标记名,因此我正在重新定义标记名;问题是我丢失了输入的值。是否有lisp例程可以保存和刷新这些输入的值。有数百个图纸与这个旧块,所以重新打字一切都是过度。
 
到目前为止,我所做的是:
 
(1) 创建了新块,所有标记分别命名为
(2) 使用与旧块相同的名称保存块
(3) 插入新块并同意重新定义旧块
(4) 执行“attsync”以加快所有新属性标记名称的速度。
(5) *********这就是我丢失之前所有值的地方******
 
 
有人知道lisp会先存储这些值,然后在“attsync”完成后重新恢复它们吗。提示从旧块到新块保持不变,因此这可能是可以在存储过程中使用的共同点。
 
谢谢大家。。。喜欢这个网站
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:08:42 | 显示全部楼层
不确定这是否有帮助?
 
  1. (defun c:BlkRep (/ *error* nlk doc spc blk i ss uflag ent nObj aLst att tag)
  2. (vl-load-com)
  3. (setq nblk "C:\\...dwg")   ;; Filepath of New Block to Insert
  4. (defun *error* (msg)
  5.    (and uFlag (vla-EndUndoMark doc))
  6.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  7.        (princ (strcat "\n** Error: " msg " **")))
  8.    (princ))   
  9. (setq doc (vla-get-ActiveDocument
  10.              (vlax-get-Acad-Object))
  11.       
  12.        spc (if (zerop (vla-get-activespace doc))              
  13.              (if (= (vla-get-mspace doc) :vlax-true)
  14.                (vla-get-modelspace doc)
  15.                (vla-get-paperspace doc))
  16.              (vla-get-modelspace doc)))
  17. (while
  18.    (progn
  19.      (setq blk (getstring t "\nSpecify Block Name to Replace: "))
  20.      (cond (  (eq "" blk) nil)
  21.            (  (not (setq i -1 ss (ssget "_X" (list '(0 . "INSERT") (cons 2 blk)))))
  22.               (princ "\n** Block not Found in Drawing **")))))
  23. (if ss
  24.    (progn
  25.      (setq uflag (not (vla-StartUndomark doc)))
  26.      
  27.      (while (setq ent (ssname ss (setq i (1+ i))))
  28.        (setq nObj
  29.          (vla-Insertblock spc
  30.            (vla-get-InsertionPoint
  31.              (setq Obj (vlax-ename->vla-object ent))) nblk
  32.            (vla-get-Xscalefactor obj)
  33.              (vla-get-yScalefactor obj)
  34.                (vla-get-zscalefactor obj)
  35.                  (vla-get-Rotation obj)))
  36.        (setq aLst
  37.          (mapcar
  38.            (function
  39.              (lambda (x)
  40.                (cons (strcase (vla-get-TagString x)) (vla-get-TextString x))))
  41.            (vlax-invoke Obj 'GetAttributes)))
  42.        (foreach att (vlax-invoke nObj 'GetAttributes)
  43.          (if (setq tag (assoc (strcase (vla-get-TagString att)) aLst))
  44.            (vla-put-TextString att (cdr tag))))
  45.        (entdel ent))
  46.      (setq uflag (vla-EndUndoMark doc))))
  47. (princ))

 
在顶部用双反斜杠指定新块的文件路径。
回复

使用道具 举报

6

主题

249

帖子

247

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 12:09:44 | 显示全部楼层
 
麦克,它比鼻涕还滑!!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:16:47 | 显示全部楼层
 
哈哈,这是一种说法。。。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:19:05 | 显示全部楼层
谢谢李的快速回复。。好吧,这对我来说还不起作用。有两件事正在发生。首先,我得到一个错误,说块的定义重复。。。忽略,其次,如果我将传入的块更改为新的块名,它似乎不会出错,但该块会消失或在完成后从页面中删除。
 
谢谢
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:25:57 | 显示全部楼层
好啊不确定是否有人仍在阅读这篇文章或需要解决此问题的方法,但在进一步研究后,我似乎需要使用VBA搜索PromptString,并将其引用到标记字符串名称的更改:因此,我向所有VBA编写者发出挑战,要求他们提供帮助,因为我只使用lisp,而不是VBA。
 
属性标记示例(1):
标签:-
提示:REV 1绘制人
违约:
 
属性标记示例(2):
标签:-
提示:版本1日期
违约:
 
示例(1)和示例(2)是在称为“title\u block”的同一块中显示的标记
 
VBA需要搜索提示:REV 1 DATE,并将与该提示相关联的标记名从-更改为REV-1-DATE
 
VBA需要搜索提示:REV 1 Draw BY,并将与该提示关联的标记名从-更改为REV-1-Draw-BY
 
 
谢谢大家
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:27:44 | 显示全部楼层
 
我有一本是很多月前写的,刚刚换了
提示列表
当然,没有你的坏积木,我无法测试它
试试看
 
  1. (defun C:CTP(/)
  2. (defun change-tags-by-prompts (/ adoc att bname ent find obj prompts)
  3. (setq        adoc (vla-get-activedocument
  4.        (vlax-get-acad-object)
  5.      )
  6. )
  7. (setq prompts '("REV 1 DRAWN BY"
  8.           "REV 1 DATE")
  9. )
  10. (setq ent (car (entsel "\n        ***        Select block to change tags: ")))
  11. (if ent
  12.    (progn
  13.      (setq obj (vlax-ename->vla-object ent))
  14.      (if (eq :vlax-false (vla-get-isdynamicblock obj))
  15.      (setq bname (vla-get-name obj))
  16. (setq bname (vla-get-effectivename obj))
  17. )
  18.      (vlax-for        att (vla-item (vla-get-blocks adoc) bname)
  19. (if (eq (vla-get-objectname att) "AcDbAttributeDefinition")
  20.   (if (setq find (member (vla-get-promptstring att) prompts))
  21.       (vla-put-tagstring att (strcase (car find)))
  22.     )
  23. )
  24.      )
  25.      (setvar "cmdecho" 0)
  26.      (command "._attsync" "_N" bname)
  27.      (setvar "cmdecho" 1)
  28.      (vlax-release-object obj)
  29.    )
  30. )
  31. (princ)
  32. )
  33. (change-tags-by-prompts)
  34. (princ)
  35. )
  36. (vl-load-com)
  37. (princ "\n   ***   Type CTP to execute   **")
  38. (prin1)

 
~'J'~
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:33:06 | 显示全部楼层
谢谢你的回复。。。。。它几乎起作用了。
 
我附上了标题栏文件以供参考。当我运行CTP时,它会更改其他两个标记的标记名,而不是指定的标记名,并且所有输入的值都正好移动了2个空格。
 
我会尝试修改你给我的,因为这是一个很好的开始!!!!谢谢如果我有什么想法,我会发布。如果你有机会,可以试着在我附上的文件上运行它吗。思想???
 
非常感谢。
标题栏。图纸
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 12:37:51 | 显示全部楼层
 
这个版本怎么样
 
  1. (defun change-tags-by-prompts (/ acsp adoc att atts att_info blockname
  2.                         block_info bname cur_lst ent find ipt layer
  3.                         new_block obj prompts rot xscale yscale zscale)
  4. (setq        adoc (vla-get-activedocument
  5.        (vlax-get-acad-object)
  6.        )
  7. acsp (vla-get-block
  8.        (vla-get-activelayout adoc)
  9.        )
  10. )
  11. (setq ent (car (entsel "\n        ***        Select block to change tags tags: ")))
  12. (if ent
  13.    (progn
  14.      (setq obj (vlax-ename->vla-object ent))
  15.      (if (eq :vlax-false (vla-get-isdynamicblock obj))
  16. (setq bname (vla-get-name obj))
  17. (setq bname (vla-get-effectivename obj))
  18. )
  19.      (vlax-for        att  (vla-item (vla-get-blocks adoc) bname)
  20. (if (eq (vla-get-objectname att) "AcDbAttributeDefinition")
  21.   (progn (setq prompts (cons (vla-get-promptstring att) prompts))
  22.     (vla-put-tagstring att (strcase (vla-get-promptstring att)))
  23.   )
  24.   )
  25. )
  26.      (setq prompts (reverse prompts))
  27.      (vlax-release-object obj)
  28.      (vlax-for        layout        (vla-get-layouts adoc)
  29. (vlax-for blk  (vla-get-block layout)
  30.   (if (eq (vla-get-objectname blk) "AcDbBlockReference")
  31.     (progn
  32.     (if        (eq :vlax-false (vla-get-isdynamicblock blk))
  33.       (setq blockname (vla-get-name blk))
  34.       (setq blockname (vla-get-effectivename blk))
  35.       )
  36.     (if        (eq bname blockname)
  37.       (progn
  38.         (setq block_info nil)
  39.         (setq ipt    (vla-get-insertionpoint blk)
  40.               layer  (vla-get-layer blk)
  41.               rot    (vla-get-rotation blk)
  42.               xscale (vla-get-xscalefactor blk)
  43.               yscale (vla-get-yscalefactor blk)
  44.               zscale (vla-get-zscalefactor blk)
  45.               )
  46.         (foreach att  (vlax-invoke blk 'Getattributes)
  47.           (setq        att_info (cons (car prompts)
  48.                                (vla-get-textstring att)
  49.                                )
  50.                 )
  51.           (setq prompts (cdr prompts))
  52.           (setq block_info (cons att_info block_info))
  53.           )
  54.         (setq block_info (reverse block_info))
  55.         (setq new_block (vla-insertblock acsp ipt bname xscale yscale zscale rot))
  56.         (vla-put-layer new_block layer)
  57.         (setq atts (vlax-invoke new_block 'Getattributes))
  58.         (foreach att  atts
  59.           (if (setq find (assoc (vla-get-tagstring att) block_info))
  60.             (vla-put-textstring att (cdr find)))
  61.             )
  62.           )
  63.         )
  64.       )
  65.     )
  66.   )
  67. )
  68.      )
  69.    )
  70. (princ)
  71. )
  72. (defun C:CTP(/)
  73. (change-tags-by-prompts)
  74. (princ)
  75. )
  76. (vl-load-com)
  77. (princ "\n   ***   Type CTP to execute   **")
  78. (prin1)

 
~'J'~
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 12:42:05 | 显示全部楼层
太棒了!!!!!非常感谢菲索。还有一件事要补充。。。创建的标记名与提示完全相同,并且包含标记名不喜欢的属性空格。有没有办法指定标签名。。。。。。。因此,带有“REV 1 DATE”提示的标签现在变成了“REV_1_DATE”,甚至更具体地说是“R1DATE”
 
干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 10:15 , Processed in 0.937214 second(s), 72 queries .

© 2020-2025 乐筑天下

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