乐筑天下

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

[编程交流] 要更改的AutoCAD Lisp例程

[复制链接]

2

主题

4

帖子

2

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:24:02 | 显示全部楼层 |阅读模式
大家好,
 
我想知道你能否帮我解决一个难题。
 
我们有一个很大的自定义块库,其中包含大小不同的文本和属性的块。
 
并非所有这些高度都与样式相链接,因为它们的特性已手动更改。
 
我接到指示,要把这些画改成统一尺寸。
这似乎是一个lisp的例子,我对使用这些是新的,并修改了一个我在网上找到以下,我做了一些错误的事情。
 
  1. (defun C:CHANGESTYLE (/ entities len count ent ent_data ent_name new_style_name)
  2. (command "STYLE" "Company_Name" "Arial Narrow.ttf" "" "" "" "" "")
  3. (setq entities (ssget "x" '((0 . "attdef")))
  4.      len      (sslength entities)
  5.      count 0
  6. );setq
  7. (while (< count len)
  8.       (setq ent      (ssname entities count)
  9.             ent_data (entget ent)
  10.             ent_name (cdr (assoc 7 ent_data))
  11.       );setq
  12. (setq new_style_name (cons 7 "Company_Name"))
  13. (setq ent_data (subst new_style_name (assoc 7 ent_data) ent_data))
  14. (entmod ent_data)
  15. (setq count (+ count 1))
  16. );while
  17. (princ)
  18. );defun

 
任何帮助都将不胜感激。
回复

使用道具 举报

13

主题

146

帖子

136

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2022-7-5 15:29:59 | 显示全部楼层
据我所知,Autocad的LT版本本机不支持LISP。
 
史蒂夫
回复

使用道具 举报

2

主题

4

帖子

2

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 15:31:40 | 显示全部楼层
很抱歉
 
我现在可以访问autoCAD的完整版本,更新了我的个人资料。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:36:40 | 显示全部楼层
  1. (defun c:changestyle  (/ entities len count ent ent_data ent_name new_style_name)
  2. (command "STYLE" "Company_Name" "Arial Narrow.ttf" "" "" "" "" "")
  3. (if (setq entities (ssget "x" '((0 . "attdef"))))
  4.    (progn
  5.      (setq len (sslength entities) count 0)
  6.      (while (< count len)
  7.        (setq ent (ssname entities count) ent_data (entget ent) ent_name (cdr (assoc 7 ent_data))
  8.                new_style_name (cons 7 "Company_Name") ent_data (subst new_style_name (assoc 7 ent_data) ent_data))
  9.        (entmod ent_data) (setq count (+ count 1))))
  10.    (princ "\nNo valid objects (ATTDEF) found in this drawing")
  11. )
  12. (princ)
  13. )
Rlx级
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 15:39:50 | 显示全部楼层
劳斯特
 
Rlx已固定(setq实体(ssget“x”'((0。“attdef”))现在具有正确的括号数
 
Rlx(setq entities(ssget“x”'((0。“attdef”))返回nil你在块编辑器中运行吗?需要在dwg中运行!只需在块编辑器中选择文本,使用“属性”更改为arial narrow,无需lisp。不要忘记attsync。
 
一直在玩改变方块表
  1. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  2. (vlax-for blk (vla-get-blocks doc)
  3. (princ (strcat "\n " (vla-get-name blk)))
  4. ; check hasattributes
  5. ; go inside block and look at "Items"
  6. ; change stylename
  7. )
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:41:43 | 显示全部楼层
@比加尔,哦,我已经看到更多了哈哈。例程只在符号本身的绘图中起作用,否则ssget将始终返回nil。如果OP希望它在已经包含符号的图形中运行,则必须先扫描插入,然后扫描属性。。。但这是一个学习网站,而不是一个购物网站
 
 
gr.Rlx
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-5 15:44:00 | 显示全部楼层
请阅读代码发布指南,您的代码应该在代码标签中(您使用的是报价标签)。[NOPARSE]
  1. Your Code Here[/NOPARSE]
=
  1. Your Code Here
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:48:14 | 显示全部楼层
如果你想一次处理整个文件夹,你可以试试这个,墨水还是湿的,我希望这次我没有忘记包括任何自动加载的库函数。
 
  1. ; change text style - written by rlx 2 feb 2018 for Lawrst on CadTutor
  2. ; uses odbx to process entire folder , type 'cts' on commandline to start program
  3. (defun c:cts (/ err acapp actdoc actspace acdocs all-open objdbx sf dwg-list start) (_init) (_exit) (terpri) (princ))
  4. (defun change_text_style  ( $dwg / odbxdoc acstyles style-obj fnt layout obj o-name bn bn-list ent)
  5. (if (and (setq odbxdoc (odbx_open $dwg)) (setq acstyles (vla-get-textstyles odbxdoc))
  6.    (setq style-obj (vla-add acstyles "Company_Name")) (setq fnt (findfile "C:\\Windows\\Fonts\\arialn.ttf")))
  7.    (progn
  8.      (vla-put-fontfile style-obj fnt)
  9.      (vlax-for layout (vla-get-layouts odbxdoc)
  10.        (vlax-for obj (vla-get-block layout)
  11.          (cond
  12.            ; remove "AcDbText" "AcDbMText" to NOT update (m)text's
  13.            ((member (vla-get-objectname obj) '("AcDbText" "AcDbMText" "AcDbAttributeDefinition"))
  14.             (vla-put-StyleName obj "Company_Name"))
  15.            ((= (vla-get-objectname obj) "AcDbBlockReference")
  16.             (mapcar '(lambda(x) (vla-put-StyleName x "Company_Name")) (get-block-ent obj)))
  17.          )
  18.        )
  19.      )
  20.      (vl-catch-all-error-p (vl-catch-all-apply 'vla-saveas (list odbxdoc $dwg)))
  21.    )
  22. )
  23. )
  24. (defun get-block-ent ( b / bn lst block ent)
  25. (setq bn (vla-Get-EffectiveName b))
  26. ;;; get attributes
  27. (if (eq :vlax-true (vla-get-HasAttributes b))(setq lst (vlax-invoke b 'GetAttributes)))
  28. ;;; get text entities - just remove next 4 lines to NOT update (m)text
  29. (vlax-for block (vla-get-Blocks odbxdoc)
  30.    (if (eq (vla-get-name block) bn)
  31.      (vlax-for ent block (if (member (vla-get-objectname ent) '("AcDbText" "AcDbMText")) (setq lst (cons ent lst)))))
  32. )
  33. lst
  34. )
  35. ;--- Init ----------------------------------------------- Begin of Init section -------------------------------------------------- Init ---
  36. (defun _init  ()
  37. (vl-load-com)
  38. (setq err *error*)
  39. (defun *error* (s) (princ s) (_exit))
  40. (defun _exit () (odbx_releaseall) (setq *error* err))
  41. (odbx_init)
  42. (if (and (setq sf (getfolder "Select source folder for drawings")) (vl-consp (setq dwg-list (fido sf))))
  43.    (progn (setq start (car (_vl-times)))
  44.    (princ (strcat "\nProcessing " (setq l (itoa (length dwg-list))) " drawings..."))
  45.    (foreach dwg dwg-list (change_text_style dwg))
  46.    (princ (strcat "\n\nProcessed " l " drawings in " (rtos (/ (- (car (_vl-times)) start) 1000.) 2 4) " secs.")))
  47.    (princ "\nNo files to process...")
  48. )
  49. )
  50. ;--- Init ------------------------------------------------ End of Init section --------------------------------------------------- Init ---
  51. ;--- Scripting Object --------------------------------- Begin of Scripting Object ------------------------------------ Scripting Object ---
  52. ; Thanks to TonyT - just compressed and tweaked it a little bit
  53. (defun load_fso_scripting  (/ server fso:progid fso:prefix)
  54. (setq fso:progid "Scripting.FileSystemObject" fso:prefix "wsh-")
  55. (if (not wsh-get-drives)
  56.    (if (not (setq server (cogetclassserver fso:progid))) (alert "Error: Windows Scripting Host is not installed")
  57.      (vlax-import-type-library :tlb-filename server :methods-prefix fso:prefix :properties-prefix fso:prefix :constants-prefix
  58. (strcat ":" fso:prefix)))))
  59. (defun progid->clsid (progid) (vl-registry-read (strcat "HKEY_CLASSES_ROOT\" progid "[url="file://\\CLSID"]\\CLSID[/url]")))
  60. (defun cogetclassserver (progid) (cogetclassproperty progid "InprocServer32"))
  61. (defun cogetclassproperty  (progid property / clsid)
  62. (if (setq clsid (progid->clsid progid)) (vl-registry-read (strcat "HKEY_CLASSES_ROOT\\CLSID\" clsid "\" property))))
  63. ; Find Drawing Objects - test : (setq lst (fido (dos_path "c:/temp/lisp"))) works also with networkpaths
  64. (defun fido  ($f / fso fld rslt)
  65. (load_fso_scripting) (setq fso (vla-getinterfaceobject (vlax-get-acad-object) "Scripting.FileSystemObject"))
  66. (setq fld  (wsh-getfolder fso $f) rslt (fifo fld "*.dwg"))(vlax-release-object fld)(vlax-release-object fso)  rslt)
  67. ; find in folders fl=file ,fls=files, sf=subfolder, sfl=subfolderlist, res=result
  68. (defun fifo  (%dir %ext / fl fls sf sfl res)
  69. (vlax-for fl (setq fls (wsh-get-files %dir))
  70.    (if (wcmatch (strcase (wsh-get-name fl) t) %ext) (setq res (cons (wsh-get-path fl) res)))(vlax-release-object fl))
  71. (vlax-release-object fls)
  72. (vlax-for sf (setq sfl (wsh-get-subfolders %dir)) (setq res (append res (fifo sf %ext)))(vlax-release-object sf))
  73. (release_me (list sfl)) res)
  74. ;--- Scripting Object ---------------------------------- End of Scripting Object ------------------------------------- Scripting Object ---
  75. ;--- Odbx ------------------------------------------------- Begin Odbx Section --------------------------------------------------- Odbx ---
  76. (defun odbx_init  (/ acver)
  77. (setq acapp (vlax-get-acad-object) actdoc (vla-get-activedocument acapp) actspace (vla-get-modelspace actdoc)
  78. acdocs (vla-get-documents acapp) acver (atoi (getvar "ACADVER"))
  79. all-open (vlax-for dwg acdocs (setq all-open (cons (strcase (vla-get-fullname dwg)) all-open)))
  80. objdbx (vl-catch-all-apply 'vla-getinterfaceobject
  81.   (list acapp (if (< acver 16) "objectdbx.axdbdocument" (strcat "objectdbx.axdbdocument." (itoa acver))))))
  82. (if (or (void objdbx) (vl-catch-all-error-p objdbx)) (setq objdbx nil)))
  83. (defun odbx_releaseall ()
  84. (mapcar '(lambda (x) (if (and (= 'vla-object (type x)) (not (vlax-object-released-p x)))(vlax-release-object x))(set (quote x) nil))
  85.    (list odbxdoc acdocs objdbx actspace actdoc acapp)) (gc))
  86. (defun odbx_open  (dwg)
  87. (if objdbx (if (member (strcase dwg) all-open)
  88.        (odbx_open_copy (findfile dwg))(vl-catch-all-apply 'vla-open (list objdbx (findfile dwg))))) objdbx)
  89. (defun odbx_open_copy  (dwg / copy)
  90. (vl-file-copy (findfile dwg) (setq copy (vl-filename-mktemp nil nil ".dwg")))(vla-open objdbx (findfile copy))  objdbx)
  91. ;--- Odbx -------------------------------------------------- End Odbx Section ---------------------------------------------------- Odbx ---
  92. ;--- + + + --------------------------------------------- Begin of tiny lisp section --------------------------------------------- + + + ---
  93. (defun wait  (sec / stop) (setq stop (+ (getvar "DATE") (/ sec 86400.0))) (while (> stop (getvar "DATE"))))
  94. (defun void  (x) (if (member x (list "" " " "  " "   " "       " nil '())) t nil))
  95. (defun e2v (e)(vlax-ename->vla-object e)) ;||; (defun v2e (o)(vlax-vla-object->ename o)) ;||; (defun _type (e)(cdr (assoc 0 (entget e))))
  96. (defun release_me  (lst)
  97. (mapcar '(lambda (x)(if (and (= 'vla-object (type x))(not (vlax-object-released-p x)))(vlax-release-object x))(set (quote x) nil)) lst))
  98. (defun getfolder  (msg / fl sh)
  99. (if (and (setq sh (vlax-create-object "Shell.Application"))(setq fl (vlax-invoke sh 'browseforfolder 0 msg 0 "")))
  100.    (setq fl (vlax-get-property (vlax-get-property fl 'self) 'path))(setq fl nil))(release_me (list sh)) fl)
  101. (defun get_block_name (b)
  102. (cond ((vlax-property-available-p b 'effectivename) (vla-get-effectivename b)) ((vlax-property-available-p b 'name) (vla-get-name b))))
  103. ; make sure path is corect for scripting object (dos_path (strcat (getvar "dwgprefix") (getvar "dwgname")))
  104. (defun dos_path  ($p) (if (= (type $p) 'str) (strcase (vl-string-translate "/" "\" $p)) ""))
  105. ;--- + + + ---------------------------------------------- End of tiny lisp section ---------------------------------------------- + + + ---
  106. (princ "\nRlx 2 feb 2018 : Type 'CTS' on commandline to start program\n")
  107. (princ)

更新了代码并认为(希望)它现在可以按预期工作。它将更改所有属性和(m)文本,以便根据需要启用/或禁用过滤器。
 
 
gr.Rlx
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 15:50:43 | 显示全部楼层
 
你好,Rlx,
我不知道你的意思是什么-你能提供一个例子,你通常如何做(没有odbx)。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:54:16 | 显示全部楼层
 
 
正常情况下,您可以使用
但在odbx中(见上面代码中的第15行),这显然不起作用(所以我现在通过放置xxAcDbBlockReference禁用了这个选项,前面有2个x)。这似乎只适用于块定义(代码中的第18行)。
 
 
这就是为什么我继续下一个条件,并使用vlax invoke的getattributes版本(代码中的第22行)
 
 
gr.Rlx
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 03:21 , Processed in 0.396775 second(s), 72 queries .

© 2020-2025 乐筑天下

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