Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Redefining blocks

4 REPLIES 4
Reply
Message 1 of 5
Anonymous
409 Views, 4 Replies

Redefining blocks

Does anyone have a lisp routine that redefines a block from a specific file
location for example I want to replace all the logo-2003 blocks with the
newly redesigned block logo-2005 from a specific file location c:\mydocs
4 REPLIES 4
Message 2 of 5
Anonymous
in reply to: Anonymous

Try this, sorry the comments are in Spanish,
all you have to do is change the lb variable, something like this:
(setq lb '(("MyOldBlock" "MyNewBlock")))




;;;---------------------------------------------------------------------;
;;;---------------------------------------------------------------------;
;;; BlockRefesh Mcoan2005 ;
;;;---------------------------------------------------------------------;
;;;Esta rutina redefine un bloque por un archivo indicado, si ;
;;;no se proporciona el nombre del archivo a insertar, entonces ;
;;;el programa buscara en las carpetas de soporte un archivo con ;
;;;el mismo nombre del bloque, para despues insertarlo. ;
;;;Si el Nombre del archivo se proporciona, entonces BlockRefresh ;
;;;insertara el archivo, si el nombre del bloque y el archivo no ;
;;;son iguales se cambiara el nombre del bloque para coincidir ;
;;;con el nombre del archivo. ;
;;;Esta ultima opcion la utilizo para forzar el uso de estandares ;
;;;dentro de la empresa en la que laboro ;
;;;---------------------------------------------------------------------;
;;;Notas ;
;;;---------------------------------------------------------------------;
;;;Se deber� tener cuidado que el punto de insercion del bloque y del ;
;;;archivo coincidan, ya que si no es as�, entonces se comenzaran ;
;;;a tener problemas con el dibujo ;
;;;Si el bloque o el archivo a insertar contienen atributos estos no se ;
;;;actualizaran, debido a un problema de sincronia. ;
;;;En caso de que haya atributos en alguno de los bloques se puede usar ;
;;;el commando AttSync, pero si el bloque con atributos esta espejeado ;
;;;despues de correr el comando, los atributo se leeran al reves, ;
;;;actualmete estoy trabajando en la solucion a este problema. ;
;;;---------------------------------------------------------------------;
;;;---------------------------------------------------------------------;
(defun c:BlockRefresh (/ LB *BLOCKS* CNT BKLST NwBkName bkObj)
(setq lb '(
("Simb_Arb_Maceta_Alzado" "Simb_Arb_Maceta_Alzado")
;("AA-19" nil)
;("Palmerita" "AA-19")
;;; el bloque Palmerita, ser� reemplazado por el bloque AA-19
; ("AA-19" "AA-19")
;;; El bloque "AA-19" es reemplazado por un archivo con el mismo nombre del
bloque -"AA-19"-.
)
)
;;;Obtenemos todos las definiciones de bloques dentro del archivo
(setq *adoc* (vla-get-activedocument (vlax-get-acad-object))
*blocks* (vla-get-blocks *adoc*)
bklst nil
)
;;; Convertimos la colleccion en un lista, y descartamos los bloques que
;;; corresponden a los layouts
(vlax-for block *blocks*
(if (/= (vla-get-IsLayout block) :vlax-true)
(setq bklst (cons (vla-get-name block) bklst))
)
)
(setq cnt 0)
;;; se va a iterar dentro de cada elemento de la lista de bloques que estan
en el dibujo
(foreach bk bklst
;;; y se compara con la lista de los bloques a reemplazar y su nueva
definicion
(foreach bkl lb
;;;checamos que el bloque en el dibujo este dentro de la lista a reemplazar
(if (wcmatch (strcase bk) (strcase (car bkl)))
(progn
;;;si esta dentro de la lista, entonces obtenemos el objeto la defininicion
del bloque
(setq bkObj (vla-item *blocks* bk))
; _y le cambiamos el nombre al que esta en la lista de reemplazo
(vl-catch-all-apply 'vla-put-name (list bkObj (cadr bkl)))
;;; Si no se esta especificando un bloque de reemplazo, buscar el que este
en el primer elemento de la lista
(or (setq NwBkName (cadr bkl)) (setq NwBkName (car bkl)))
(setq blkPath nil
blkPath
;;;La rutina checar� si el bloque existe en la ruta de soporte actual
(findfile
;;; Quitar el siguiente comentario y cambiar el diectorio si no esta en la
ruta de soporte
;;;"C:\\Temp\\"
(strcat NwBkName ".dwg")
)
)
(if blkPath
;;; Si el archivo existe, insertarlo como bloque, para asi redefinir las
inserciones del bloque mediante
;;;la opcion del comando -insert "BloqueAReemplazar=BloqueDeRemplazo"
(progn
(mapcar 'princ
(list "\n Replacing Old Block "
(car bkl)
" with updated Block "
NwBkName
)
)
(vla-delete
(vla-InsertBlock
(vla-get-ModelSpace *adoc*)
(vlax-make-variant
(vlax-safearray-fill
(vlax-make-safearray
vlax-vbdouble
'(0 . 2)
)
'(0 0 0)
)
)
blkPath
1
1
1
0
)
)
;;; descarte el uso de command por el metodo Vla-InsertBlock, aunque este
metodo requiere de
;;; un regen adicional para poder ver el cambio. Este regen esta justo antes
del princ final
;;; para hecerlo solo una vez. En las versiones posteriores a 2004, al
redefinir un bloque
;;; mediante -insert ya no regenera el dibujo, lo cual si se estan
redefiniendo muchos bloques
;;; resultaba algo tardado.


;;; (command "-insert" (strcat NwBkName "=" blkPath))
;;; (command)
(setq cnt (1+ cnt))
)
)
)
)
)
)
;;; esta linea actua igual que (princ (stcat "string"(itoa int))), con la
;;; diferencia que la conversion de cualquier valor a string no es necesaria
(mapcar 'princ
(list "\n Number of blocks updated: " cnt "\n")
)
(vla-purgeall
(vla-get-activedocument (vlax-get-acad-object))
)
;;;Si se usa command se puede borrar la siguiente linea
(vla-regen *adoc* t)
(princ)


)
(princ
(strcat
"\n
\n ******************************************************
* MU_Utils loaded � 2003-2005 Mcoan. Inc *
******************************************************
* Developed by Arch. Marco Jacinto *
* For information about Mcommands, please contact *
* me at (33) 38269184 Guadalajara, Mexico *
* email: mcoan001@hotmail.com *
******************************************************\n"
)
)
(prompt "\n Type RefreshBlocks to run program.")
(princ)


--
Saludos


Marco Jacinto


"James Tobbe" escribi� en el mensaje
news:4812417@discussion.autodesk.com...
> Does anyone have a lisp routine that redefines a block from a specific
> file location for example I want to replace all the logo-2003 blocks with
> the newly redesigned block logo-2005 from a specific file location
> c:\mydocs
Message 3 of 5
Anonymous
in reply to: Anonymous

INSERT->BROWSE find the new file and insert it, you'll be asked if you want
it re-defined, say yes.


"James Tobbe" wrote in message
news:4812417@discussion.autodesk.com...
> Does anyone have a lisp routine that redefines a block from a specific
> file location for example I want to replace all the logo-2003 blocks with
> the newly redesigned block logo-2005 from a specific file location
> c:\mydocs
Message 4 of 5
Anonymous
in reply to: Anonymous

(command "insert" "logo-2003=C:/mydocs/logo-2005")
(command)


Regenerate to see the changed block, if you want.
--
Kent Cooper




"James Tobbe" wrote...
> Does anyone have a lisp routine that redefines a block from a specific
> file location for example I want to replace all the logo-2003 blocks with
> the newly redesigned block logo-2005 from a specific file location
> c:\mydocs
Message 5 of 5
Anonymous
in reply to: Anonymous

It's just occurred to me that my first suggestion, of course, leaves the
block with its old name, which you may not want. Instead, you could do
this:


(command "rename" "b" "logo-2003" "logo-2005")
(command "insert" "logo-2005=")
(command)


Or take the top line from above and put it after the previous suggestion.
--
Kent Cooper




Kent Cooper wrote...
> (command "insert" "logo-2003=C:/mydocs/logo-2005")
> (command)
>
> Regenerate to see the changed block, if you want.
> --
> Kent Cooper
>
> "James Tobbe" wrote...
>> Does anyone have a lisp routine that redefines a block from a specific
>> file location for example I want to replace all the logo-2003 blocks with
>> the newly redesigned block logo-2005 from a specific file location
>> c:\mydocs

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

AutoCAD Inside the Factory


Autodesk Design & Make Report