francine2013 发表于 2022-7-5 17:43:52

我找到了一种没有txt Datei的oder方法,在lisp上我添加了两个函数,一个用于打开块,另一个用于重新定义块。
 
(defun partsearch (n /)
(cond
((findfile n)) ;;; first search the dir's in AutoCAD's "env" variable, then search the additional places listed below:
((findfile (strcat "H:/bloc/profile/" n))) ;;;<--- this is an example path
((findfile (strcat "H:/bloc/gomme/" n)));;;<--- this is another example path
;;; etc, etc. List as many block folder
;;; paths as you need, following the patterns
(t (progn
(prompt
(strcat "** PartSearch Error ** Required file (" n ") could not be found."))
(terpri)
)
)
)
);defun
;;; ----------- Open source drawing of selected Block--------------
(defun c:OpenBL ( / cmdecho regen n bpath)
(setq cmdecho (getvar "cmdecho"))
(setq regen (getvar "regenmode"))
(setvar "cmdecho" 0)
(setvar "regenmode" 0)
(setq ent (car (entsel "\nSelect Block Entity: ")))
                (if(eq (cdr (assoc 0 (entget ent))) "INSERT")
               (progn
               (setq BLKN (vla-get-effectivename
                                       (vlax-ename->vla-object ent)))
               )
               )
(setq bpath (partsearch (strcat blkn ".dwg")))
(if bpath
(if (= 0 (getvar "SDI"))
(vla-activate (vla-open (vla-get-documents (vlax-get-acad-object)) bpath))
(vla-sendcommand
(vla-get-activedocument
(vlax-get-acad-object))
(strcat "(command \"_.open\")\n" bpath "\n") )
)
)
(setvar "cmdecho" cmdecho)
(setvar "regenmode" 1)
(princ)
); close defun
(princ)
;;; ----------- Insert & rededine Block --------------
(defun c:ReInsertBL ( / cmdecho regen n bpath)
(setq cmdecho (getvar "cmdecho"))
(setq regen (getvar "regenmode"))
(setvar "cmdecho" 0)
(setvar "regenmode" 0)
(setq ent (car (entsel "\nSelect Block Entity: ")))
                (if(eq (cdr (assoc 0 (entget ent))) "INSERT")
               (progn
               (setq BLKN (vla-get-effectivename
                                       (vlax-ename->vla-object ent)))
               )
               )
(setq bpath (partsearch (strcat blkn ".dwg")))
(if bpath
(vl-cmdf "insert" (strcat blkn "=" bpath) )
(command)
)
(setvar "cmdecho" cmdecho)
(setvar "regenmode" 1)
(princ)
); close defun
(princ)

francine2013 发表于 2022-7-5 17:45:06

通过第一个lisp命令“openBL”,如果该图形已经打开,Autocad是否可能不打开该图形!!!!
谁能帮帮我吗?

Lee Mac 发表于 2022-7-5 17:49:46

请尝试以下代码:
 
(defun c:openbl ( / blk lst src usr )
   (cond
       (   (not (setq blk (selectblock "\nSelect block to open source drawing: "))))
       (   (not (setq src (findblock (strcat blk ".dwg"))))
         (princ (strcat "\n" blk ".dwg not found."))
       )
       (   (progn
               (vlax-for doc (vla-get-documents (vlax-get-acad-object))
                   (setq lst (cons (cons (strcase (vla-get-fullname doc)) doc) lst))
               )
               (assoc (strcase src) lst)
         )
         (vla-activate (cdr (assoc (strcase src) lst)))
       )
       (   (setq usr (LM:dwgopen-p src))
         (princ (strcat "\n" src " is currently in use by " usr))
       )
       (   (LM:open src))
   )
   (princ)
)

(defun c:reinsertbl ( / blk src val var )
   (cond
       (   (not (setq blk (selectblock "\nSelect block to redefine: "))))
       (   (not (setq src (findblock (strcat blk ".dwg"))))
         (princ (strcat "\n" blk ".dwg not found."))
       )
       (   (setq var '(cmdecho regenmode)
               val(mapcar 'getvar var)
         )
         (mapcar 'setvar var '(0 0))
         (command "_.-insert" (strcat blk "=" src) nil)
         (mapcar 'setvar var val)
       )
   )
   (princ)
)         

(defun selectblock ( msg / obj rtn )
   (while
       (progn (setvar 'errno 0) (setq obj (car (entsel msg)))
         (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.")
               )
               (   (/= "INSERT" (cdr (assoc 0 (entget obj))))
                   (princ "\nSelected object is not a block.")
               )
               (   (vlax-property-available-p (setq obj (vlax-ename->vla-object obj)) 'effectivename)
                   (null (setq rtn (vla-get-effectivename obj)))
               )
               (   (null (setq rtn (vla-get-name obj))))
         )
       )
   )
   rtn
)

(defun findblock ( dwg )
   (vl-some '(lambda ( p ) (findfile (strcat p dwg)))
      '(   ""
         "H:/bloc/profile/"
         "H:/bloc/gomme/"
       )
   )
)

;; Drawing Open-p-Lee Mac
;; Returns the owner of an open drawing, else nil if the drawing is unopen.
;; dwg - Drawing filename

(defun LM:dwgopen-p ( dwg / dwl tmp usr )
   (if (and (setq dwl (findfile (strcat (substr dwg 1 (- (strlen dwg) 3)) "dwl")))
            (null (vl-file-delete dwl))
       )
       (if (setq tmp (open dwl "r"))
         (progn
               (setq usr (read-line tmp)
                     tmp (close tmp)
               )
               usr
         )
         "<Unknown>"
       )
   )
)

;; Open-Lee Mac
;; Uses the 'Open' method of the Shell Object to open the specified file or folder.
;; tar - File, folder or ShellSpecialFolderConstants enum

(defun LM:open ( tar / shl rtn )
   (if (and (or (= 'int (type tar)) (setq tar (findfile tar)))
            (setq shl (vla-getInterfaceObject (vlax-get-acad-object) "shell.application"))
       )
       (progn
         (setq rtn (vl-catch-all-apply 'vlax-invoke (list shl 'open tar)))
         (vlax-release-object shl)
         (not (vl-catch-all-error-p rtn))
       )
   )
)

(vl-load-com) (princ)

francine2013 发表于 2022-7-5 17:53:20

嗨,李,
我测试了您的lisp,它与目录链接“H:/bloc/gomme/”和“H:/bloc/gomme/”一起工作。我将这个direntory链接更改为:
“P:/GBR\U GreatBritain/02-DESIGN/02-05-BLOCKS/Shields/”
“P:/GBR\u GreatBritain/02-DESIGN/02-05-BLOCKS/Casting/”
“P:/GBR\u GreatBritain/02-DESIGN/02-05-BLOCKS/Mouldings/”
“P:/GBR\u GreatBritain/02-DESIGN/02-05-BLOCKS/Accessories/”
现在lisp不起作用,块未找到。你知道为什么吗?

francine2013 发表于 2022-7-5 17:54:58

嗨,李,
我想我发现了问题:绿色改装
我还更改了块选择方法,因为我想选择嵌套块:修改为红色,可以吗???
 
 
(defun c:openbl ( / blk lst src usr )
   (cond
       (   (not (setq blk (selectblock "\nSelect block to open source drawing: "))))
       (   (not (setq src (findblock (strcat blk ".dwg"))))
         (princ (strcat "\n" blk ".dwg not found."))
       )
       (   (progn
               (vlax-for doc (vla-get-documents (vlax-get-acad-object))
                   (setq lst (cons (cons (strcase (vla-get-fullname doc)) doc) lst))
               )
               (assoc (strcase src) lst)
         )
         (vla-activate (cdr (assoc (strcase src) lst)))
       )
       (   (setq usr (LM:dwgopen-p src))
         (princ (strcat "\n" src " is currently in use by " usr))
       )
       (   (LM:open src))
   )
   (princ)
)
;;
(defun c:reinsertbl ( / blk src val var )
(while (/=(type(setq e (car(last(nentsel "\nSelect block to redefine: "))))) 'ENAME))
(setq obj (vlax-ename->vla-object e))
(if (= (vlax-get-property obj 'ObjectName) "AcDbBlockReference")
(setq blk (vlax-get-property obj
(if (vlax-property-available-p obj 'effectivename)'effectivename 'name))
);setq
);if
      (setq src (findblock (strcat blk ".dwg")))
         (princ (strcat "\n" blk ".dwg not found."))
      
       (   (setq var '(cmdecho regenmode)
               val(mapcar 'getvar var)
         )
         (mapcar 'setvar var '(0 0))
         (command "_.-insert" (strcat blk "=" src))
         (mapcar 'setvar var val)
       )
   
   (princ)
)      
;;   
(defun selectblock ( msg / obj rtn )
(while (/=(type(setq e (car(last(nentsel "\nSelect block to redefine: "))))) 'ENAME))
(setq obj (vlax-ename->vla-object e))
(if (= (vlax-get-property obj 'ObjectName) "AcDbBlockReference")
(setq rtn (vlax-get-property obj
(if (vlax-property-available-p obj 'effectivename)'effectivename 'name))
);setq
);if
)
;;
(defun findblock ( dwg )
   (vl-some '(lambda ( p ) (findfile (strcat p dwg)))
      '(   ""
"P:\\GBR_GreatBritain\\02-DESIGN\\02-05-BLOCKS\\Profiles\\"
"P:\\GBR_GreatBritain\\02-DESIGN\\02-05-BLOCKS\\Gaskets\\"
"P:\\GBR_GreatBritain\\02-DESIGN\\02-05-BLOCKS\\Castings\\"
"P:\\GBR_GreatBritain\\02-DESIGN\\02-05-BLOCKS\\MouldingPieces\\"
       )
   )
)
;; Drawing Open-p-Lee Mac
;; Returns the owner of an open drawing, else nil if the drawing is unopen.
;; dwg - Drawing filename
(defun LM:dwgopen-p ( dwg / dwl tmp usr )
   (if (and (setq dwl (findfile (strcat (substr dwg 1 (- (strlen dwg) 3)) "dwl")))
            (null (vl-file-delete dwl))
       )
       (if (setq tmp (open dwl "r"))
         (progn
               (setq usr (read-line tmp)
                     tmp (close tmp)
               )
               usr
         )
         "<Unknown>"
       )
   )
)
;; Open-Lee Mac
;; Uses the 'Open' method of the Shell Object to open the specified file or folder.
;; tar - File, folder or ShellSpecialFolderConstants enum
(defun LM:open ( tar / shl rtn )
   (if (and (or (= 'int (type tar)) (setq tar (findfile tar)))
            (setq shl (vla-getInterfaceObject (vlax-get-acad-object) "shell.application"))
       )
       (progn
         (setq rtn (vl-catch-all-apply 'vlax-invoke (list shl 'open tar)))
         (vlax-release-object shl)
         (not (vl-catch-all-error-p rtn))
       )
   )
)
(vl-load-com) (princ)

Lee Mac 发表于 2022-7-5 17:57:21

请尝试以下操作:
恐怕我无法就您的路径提供建议-如果找不到块,则路径一定不正确。
 

francine2013 发表于 2022-7-5 18:00:10

嗨,李
这正是我需要的,非常感谢
弗朗辛

francine2013 发表于 2022-7-5 18:04:56

你好
最后一个请求是,我有一个lisp用于重新定义图形中的许多块。这个lisp很好用,但是当一个有很多块的大图时,例程有时需要2分钟甚至更多。有没有办法优化这个lisp。也许只重新定义修改日期早于绘图日期的块!!!
我还希望通过脚本和批处理来实现这一点,我发现了这个解决方案:http://www.widom-assoc.com/AU-CP12-3L.pdf但我需要时间来理解它是如何工作的。
 
 
12

Lee Mac 发表于 2022-7-5 18:07:32

 
不客气,弗朗辛。
 
 
以下代码是否更快?
 
13

francine2013 发表于 2022-7-5 18:12:12

你好,李,
我尝试了你的Lisp程序,但我变成了唯一的信息,比如:
 
忽略块EF4318的重复定义。
忽略块EP1780的重复定义。
忽略块EP1781的重复定义。
页: 1 [2]
查看完整版本: Autocad开源绘图