乐筑天下

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

[编程交流] Lisp更改文字层w

[复制链接]

2

主题

9

帖子

7

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:33:19 | 显示全部楼层 |阅读模式
有谁知道lisp例程会将块中的文本和属性移动到新层吗?我有100多个图形要更改,虽然我可以使用design center重新定义每个图形中的块,但我仍然需要创建一个模板图形,其中已经有100多个块。
 
总结一下
 
步骤1将块内的文本层和属性更改为新层(例如“块文本”)
 
第2步:批量处理100多张图纸,最好不必全部打开。
 
这是一个持续的问题,因为我无法控制如何创建图形或创建块。(我已经尝试过通过这条途径进行教育)
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:42:55 | 显示全部楼层
我还没有测试它,只是修改了我现有的一个例程,其次,appie没有检查层“BlockText”是否存在
 
 
  1. ;----------------------------------------------------------------------------------------------------------------------
  2. ; RlxOdbxCTL
  3. ; Rlx -23 mar 2017
  4. ; Change text layer all (m)text's & attributes
  5. ;----------------------------------------------------------------------------------------------------------------------
  6. (defun c:RlxOdbxCTL
  7.       ( / acApp acDocs objDBX all-open start sourcefolder subfolder file filelist doc  newlayer)
  8. (RlxOdbxCTL_Init)
  9. (if (and (setq newlayer (getstring "\nNew layer for entities : "))
  10.    (setq sourcefolder (RlxOdbxCTL_GetFolder "\nSelect source folder: ")))
  11.    (progn
  12.      (setq start (car (_vl-times)))
  13.      (foreach subfolder (getsubdirlist sourcefolder)
  14. (foreach file (vl-directory-files subfolder "*.dwg" 1)
  15.   (if (wcmatch (strcase file t) "*.dwg")
  16.     (setq filelist (cons (strcat subfolder "\" file) filelist)))))))
  17. (if filelist (princ (strcat "\nProcessing " (itoa (length filelist)) " drawings..."))
  18.    (princ "\nNo drawings were found..."))
  19. (foreach file filelist
  20.    (setq doc (odbx_open file)) (RlxOdbxCTL_ProcessEntities) (vla-saveas doc file))
  21. (vlax-release-object objDBX)(vlax-release-object acDocs)(vlax-release-object acApp)
  22. ;;;for testing
  23. (princ (strcat "\n\nProcessed  " (itoa (length filelist)) " drawings in "
  24.    (rtos (/ (- (car (_VL-TIMES)) start) 1000.) 2 4) " secs."))
  25. )
  26.    
  27. (defun RlxOdbxCTL_ProcessEntities ( / laycol lay layout obj )
  28. (setq laycol (vla-get-layers doc))
  29. (if (vl-catch-all-error-p (setq lay (vl-catch-all-apply 'vla-item (list laycol newlayer))))
  30.    (vl-catch-all-apply 'vla-add (list laycol newlayer)))
  31. (vlax-for layout (vla-get-layouts doc)
  32.    (vlax-for obj (vla-get-block layout)
  33.      (RlxOdbxCTL_CheckObjectLayer obj)
  34.    )
  35. )
  36. )
  37. (defun RlxOdbxCTL_CheckObjectLayer ( object / bn bent)
  38. (cond
  39.    ((member (vla-get-objectname object) '("AcDbText" "AcDbMText"))
  40.     (check_Layer object))
  41.    ((and (= (vla-get-objectname object) "AcDbBlockReference")(setq bent (get-block-ent object)))
  42.     (mapcar '(lambda(x)(check_Layer x)) bent))
  43. )
  44. )
  45. (defun check_Layer (%e)
  46. (if (/= (vlax-get-property %e 'layer) newlayer)
  47.    (vl-catch-all-apply 'vlax-put-property (list %e 'layer newlayer)) ))
  48. (defun get-block-ent ( b / bn lst block ent)
  49. (setq bn (vla-Get-EffectiveName b))
  50. ;;; get attributes
  51. (if (eq :vlax-true (vla-get-HasAttributes b))(setq lst (vlax-invoke b 'GetAttributes)))
  52. ;;; get text entities
  53. (vlax-for block (vla-get-Blocks doc)
  54.    (if (eq (vla-get-name block) bn)
  55.      (vlax-for ent block
  56. (if (member (vla-get-objectname ent) '("AcDbText" "AcDbMText"))
  57.   (setq lst (cons ent lst)))))) lst)
  58. (defun RlxOdbxCTL_Init (/ acVer)
  59. (vl-load-com)
  60. (setq acApp (vlax-get-acad-object) acDocs (vla-get-documents acApp)
  61. actDoc (vla-get-ActiveDocument acApp) acVer (atoi (getvar "ACADVER")))
  62. (setq all-open (vlax-for dwg acDocs (setq all-open (cons (strcase (vla-get-fullname dwg)) all-open))))
  63. (setq objDBX (vl-catch-all-apply 'vla-getinterfaceobject (list acApp (if (< acVer 16)
  64. "objectdbx.axdbdocument" (strcat "objectdbx.axdbdocument." (itoa acVer))))))
  65. (if (or (void objDBX)(vl-catch-all-error-p objDBX))(setq objDBX nil)))
  66. (defun RlxOdbxCTL_ReleaseAll ()
  67. (mapcar '(lambda(x)(if (and (= 'vla-object (type x)) (not (vlax-object-released-p x)))
  68.         (vlax-release-object x))(set (quote x) nil))
  69.       (list actDoc acDocs objDBX acApp)) (gc))
  70. (defun void (x) (if (member x (list "" " " "  " "   " " " nil '())) t nil))
  71. (defun *error* (s) (princ s)(RlxOdbxCTL_Exit))
  72. (defun RlxOdbxCTL_Exit () (RlxOdbxCTL_ReleaseAll))
  73. (defun odbx_open (dwg)
  74. (if objDBX (if (member (strcase dwg) all-open)
  75.        (odbx_open_copy (findfile dwg))(vla-open objDBX (findfile dwg))))  objDBX)
  76. (defun odbx_open_copy (dwg / copy)
  77. (vl-file-copy (findfile dwg) (setq copy (vl-filename-mktemp nil nil ".dwg")))
  78. (vla-open objDBX (findfile copy)) objDBX)
  79.      
  80. (defun RlxOdbxCTL_GetFolder (msg / sh objFolder objParentFolder strPath)
  81. (setq sh (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" ))
  82. (setq objFolder  (vlax-invoke sh 'BrowseForFolder 0 msg 0 ""))
  83. (if objFolder
  84.   (and
  85.     (setq strTitle (vlax-get objFolder "Title"))
  86.     (setq objParentFolder (vlax-get objFolder 'ParentFolder))
  87.     (setq strPath (vlax-get (vlax-invoke objParentFolder "Parsename" strTitle) "Path"))
  88.     (vlax-release-object objParentFolder)
  89.     (vlax-release-object objFolder))
  90.   (vlax-release-object sh)
  91. )
  92. strPath
  93. )
  94. (defun GetSubDirList (strPath / lstDirectories)
  95. (setq lstDirectories (SearchSubDirectories strPath (list strPath))))
  96. (defun SearchSubDirectories (strPath lstDirectories )
  97. (foreach strDirectory (vl-directory-files strPath nil -1)
  98.    (if (not (member strDirectory (list "." ".." "...")))
  99.      (progn
  100. (setq lstDirectories (cons (strcat strPath "\" strDirectory) lstDirectories))
  101. (setq lstDirectories (SearchSubDirectories (strcat strPath "\" strDirectory) lstDirectories)))))
  102. (reverse lstDirectories))
  103. (C:RlxOdbxCTL)

gr.R。
回复

使用道具 举报

2

主题

9

帖子

7

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 16:54:13 | 显示全部楼层
非常感谢您的快速响应,我在一个目录下运行了一个测试,Autocad返回了一个错误
 
“自动化错误。找不到密钥”
 
有什么想法吗?
 
还可以对其进行修改,以创建一个图层来放置文本,或在批处理之前在命令提示下指定一个图层
 
干杯
 
Whobe博士
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:05:06 | 显示全部楼层
 
 
我在帖子#2中更新了上述代码,添加了vl load com,为层名称添加了getstring,并检查层是否存在。。。所以,第二轮。。。
 
 
gr.R
回复

使用道具 举报

2

主题

9

帖子

7

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:11:37 | 显示全部楼层
再次感谢您的快速响应。你是一个传奇:)
 
它适用于块中的所有文本。
 
它没有重新层化属性,但这实际上不是目标图形的问题。
 
然而,它也转述了图纸中的所有文本。
 
有没有办法让它只改变块内的文本?
 
Whobe博士
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:24:45 | 显示全部楼层
 
 
当然,只需删除RlxOdbxCTL\u CheckObjectLayer中的以下行:
 
 
  1. ((member (vla-get-objectname object) '("AcDbText" "AcDbMText"))
  2.     (check_Layer object))

 
 
属性也应该重新层化,但如果它们是按颜色层,并且块位于另一层,则结果可能不明显。
 
 
gr.R。
回复

使用道具 举报

2

主题

9

帖子

7

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 17:31:07 | 显示全部楼层
Brilliant做了一件好事
 
(但愿我在学校坐得离前面近一点:)
 
Whobe博士
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 17:40:07 | 显示全部楼层
 
很高兴得到帮助:-)
 
Rlx公司
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 15:45 , Processed in 1.348271 second(s), 68 queries .

© 2020-2025 乐筑天下

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