tive29 发表于 2022-7-5 16:17:37

将宏脚本转换为lisp fo

这样做的目的是从模板中插入“块1”。将dwg转换为当前图形中的0,0,0,并将其分解。我的搜索路径中有文件夹位置。
 
请帮助将此宏脚本转换为lisp。如果可能的话,允许超过1个街区的选择。意味着按下B1插入“块1”。。。。。按B2插入“块B2”。。。。。。等等
 
提前感谢

BIGAL 发表于 2022-7-5 16:33:56

类似于此帖子http://www.cadtutor.net/forum/showthread.php?100855-LISP IF条件复制到现有图层
 
您可以只键入B1或b22 B345等,然后插入正确的块,这是一种返工反应器的情况,在这种情况下,它会查找前缀字符B或B。
 
你可以利用李的偷盗。Lisp程序
 

(load "stealV1-6.lsp")
(Steal "P:\\Autodesk\\c3d Templates\\XXXXG.dwt" (list (list "Blocks" "*")))

tive29 发表于 2022-7-5 16:43:38

比格尔,这看起来很先进。
如果更简单的话,我可以满足于一个简单的lisp命令,它与第一篇文章中的宏脚本完全相同。
然后,我可以为不同的块创建多个lisp。

BIGAL 发表于 2022-7-5 16:50:45

就像另一篇文章一样,它是在键盘上键入速记,然后将其与块名匹配,这样你就可以在文本文件中得到b1=块名1等等。再仔细想想,将所有块wblock到一个目录中比在指定的dwg中更容易。此代码存在。我每天使用反应器,它有5个不同的函数。方法在第一个字符中,在你的情况下,第一个字符是B或B。例如,只要在f123开始处输入一个“F”,fillet函数就可以输入您喜欢的任何半径。f123没有宏/lisp,错误会计算出来并设置圆角半径。按原样试一试注意,小数点是“-”f1-25作为“作为命令的一部分读取,而不是小数,但您已经习惯了。
 
它的工作方式是,Autocad报告一个错误,例如类型b56,这是一个“无效命令”,代码查看b并获得56,因此它知道您要插入块“56”,这是“截止阀类型56”,它将依赖于两项文件,快捷方式和全名。
 
我这个周末有一些时间,所以将重写为一个全局风格的功能,允许用户自定义,但阅读文本文件的正确答案。
 
lee macs steal中的一个优点是,你可以为块名做*并从dwg中提取所有块。全部插入并清除你不想要的内容。我用它定制了一个区块列表,节省了大量的时间。
 
最后,简单地说,我认为你可以有26x2+10个变量。Aa-Zz 0-9
 
思考B27哦,错误的块,只需键入b26,就是这个。那有多快。
 
哦,是的,它甚至可以在不同的目录区域块2*一个目录3*另一个等等,我已经做了,但没有张贴。

BIGAL 发表于 2022-7-5 16:59:00

这是对我的一些其他代码的修改,它现在可以作为输入块的快捷方式,例如B1会说“Block1”。唯一的规则是你必须使用B或B作为第一个字符,你可以使用数字或字母,这无关紧要,你需要更改几件事目录名并创建一个新的lst。这是版本1,因此使用当前图形中的现有块,该图形预计将成为dwg模板。正如其他人所建议的那样,我会将所有块加载到当前的dwg中,并在以后使用lee mac steal时清除它们。lsp首先从dwg加载所有块。
 

; original code and methology by Alan H
; assistance and code that worked by Lee-Mac
; Insert blocks by shortcut June 2017
(vl-load-com)

(   (lambda nil
       (foreach obj (cdar (vlr-reactors :vlr-command-reactor))
         (if (= "Blk-reactor" (vlr-data obj))
               (vlr-remove obj)
         )
       )
       (vlr-command-reactor "Blk-reactor" '((:vlr-unknowncommand . Blk-reactor-callback)))
   )
)

(defun blkins ( / blkname ans lst len acdoc x pt ptstr fname)
(setq acdoc (vla-get-activedocument (vlax-get-acad-object))) ; open database
(setq lst (list "1" "001" "2" "002" "3" "003" "4" "Northn")) ; test lst of blocks
(setq len (length lst)) ; how many items in lst
(setq ans(substr com 2)) ; return the characters after B or b
(setq x 0)
(repeat len
(if (= (nth x lst) ans)
(setq blkname (nth (+ x 1) lst)) ; find blockname in lst can be improved with a while
) ; if
(setq x (+ x 2)) ; lst is pairs
) ; repeat
(setq pt (getpoint "Select insertion point"))
(setq ptstr (strcat (rtos (car pt) 2 3) "," (rtos (cadr pt) 2 3))) ; convert pt to xy
(setq fname "C:\\Alan\\blkins.scr") ; script filename
(setq fo (open fname "w"))
(write-line (strcat "-insert " blkname " " ptstr " 1 1 0") fo)
(write-line "filedia 1" fo) ; turn dialouges abck on
(close fo) ; close file
(vla-sendcommand acdoc "filedia 0 ") ; turn off dialouges
(vla-sendcommand acdoc "_.script C:\\Alan\\blkins.scr") ; run script file as insert will read entire line
(vla-sendcommand acdoc (chr 13)) ; need a Cr press Enter
)


(defun Blk-reactor-callback ( obj com )
(setq com (vl-string-translate "-" "." (strcase (car com)))) ; strcase so B or b
   (cond   
      ((and
         (wcmatch com "~*[~B.0-9]*")
         (wcmatch com "B*")
         (wcmatch com "~B*B*")
         (wcmatch com "~*.*.*")
         ) ; and
         (blkins)
      )
   ) ; master cond
) ; defun


 
; make block list to file
; by Alan H june 2017
(vl-load-com)
(setq fo (open "c:\\alan\\block-names.txt" "w"))
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vlax-for blk (vla-get-blocks doc)
(write-line (vla-get-name blk) fo)
(princ (vla-get-name blk))
)
(close fo)

编辑文件块名称。我粘贴到excel的txt已排序并删除了一些块名。第二遍将数字添加到块名,并使LST粘贴到代码中。
 
4

tive29 发表于 2022-7-5 17:11:12

谢谢比格尔。让我研究一下。

BIGAL 发表于 2022-7-5 17:26:17

如果你卡住了就发帖子。
页: [1]
查看完整版本: 将宏脚本转换为lisp fo