incluir un bloque en un archivo VLX

Ver el tema anterior Ver el tema siguiente Ir abajo

incluir un bloque en un archivo VLX

Mensaje por robierzo el Vie Oct 28, 2016 8:59 am

Hola amigos. Quería saber si se puede incluir un bloque en un archivo compilado VLX, para poder insertarlo desde la propia rutina, sin necesidad de crearlo cada vez que se ejecuta la rutina en un dibujo nuevo.
Saludos.
avatar
robierzo

Mensajes : 41
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por saulo2016 el Vie Oct 28, 2016 7:10 pm

Hola robierzo

Haber...vamos a clarificar un poco tu pregunta.....

Un Bloque no se puede meter en un LISP, porque son objetos que tendrias que traerte desde una carpeta fisicamente, entonces lo que puedes hacer es lo siguiente......

Programar un LISP para que éste te dibuje el bloque que tu necesitas, otra es conseguir un Administrador de BLOQUES como el BlockManager CADLIBDU, que es un administrador de bloques para insertar en cualquer dibujo de AutoCAD....

Entonces lo que necesitamos para poder ayudarte es que tu pregunta se un poco mas clara.



Saludos Amigo.
avatar
saulo2016

Mensajes : 109
Fecha de inscripción : 17/03/2016
Edad : 51
Localización : Monterrey, Nuevo León, Mexico

Ver perfil de usuario

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por robierzo el Vie Oct 28, 2016 7:31 pm

Hola saulo. OK. Creo que me queda claro. Ya imaginaba que no se podía, pero por si acaso..... Yo lo que pretendo es crear un archivo compilado (***.vlx) que tenga, entre otras cosas, la opción de insertar uno o varios bloques. Si se pudieran incluir en el *.VLX no haría falta programar para dibujar el propio bloque. Sólo es eso. Hay que tener en cuenta que este archivo *.VLX se va a utilizar en varios ordenadores, cada uno de su madre. Con lo cual, lo ideal es que no depender de ninguna otra aplicación. Bueno, pues nada. Me pondré a definir los bloques mediante lisp. Muchas gracias en todo caso. Un saludo.
avatar
robierzo

Mensajes : 41
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por nolo el Vie Oct 28, 2016 9:03 pm

Igual funciona adjuntando el bloque como texto como proponía mi Maestro Yarik en Hispacad para los sld de los dcl.

Osea, pasar los archivos de los bloques que son binario a texto (rutina ReadSLD) y compilarlos con el vlx.
Luego que el vlx los extraiga y con otra rutina suya (rutina writeSLD) volver a ponerlos en binario y renombrarlos como dwg.

Código:
;;; para pasar a texto
(defun ReadSLD (filename output)
  (if (setq wsObj (vlax-create-object "ScriptControl"))
    (progn
      (vlax-put wsObj "language" "VBS")
      (setq str
       "Function ReadBinary(FileName)
   Const adTypeBinary = 1
   Dim stream, xmldom, node
   Set xmldom = CreateObject(\"Microsoft.XMLDOM\")
   Set node = xmldom.CreateElement(\"binary\")
   node.DataType = \"bin.hex\"
   Set stream = CreateObject(\"ADODB.Stream\")
   stream.Type = adTypeBinary
   stream.Open
   stream.LoadFromFile FileName
   node.NodeTypedValue = stream.Read
   stream.Close
   Set stream = Nothing
   ReadBinary = node.Text
   Set node = Nothing
   Set xmldom = Nothing
   End Function"
      )
      (vlax-invoke wsObj 'ExecuteStatement str)
      (setq str (vlax-invoke wsObj 'run "ReadBinary" filename))
      (vlax-release-object wsObj)
      
    )
  )
  (setq file(open output "w"))
  (princ str file)
  (close file)
)
;;; utilizar como ejemplo
;;; (readsld "c:/Acad/ejemplo.sld" "c:/Acad/ejemplo.txt")

Código:
(defun writeSLD (FileName textfile / wsObj str)
  (if (setq wsObj (vlax-create-object "ScriptControl"))
    (progn
      (vlax-put wsObj "language" "VBS")
      (setq str
       "Sub WriteBinary(FileName, Buf)
   Const adTypeBinary = 1
   Const adSaveCreateOverWrite = 2
   Dim stream, xmldom, node
   Set xmldom = CreateObject(\"Microsoft.XMLDOM\")
   Set node = xmldom.CreateElement(\"binary\")
   node.DataType = \"bin.hex\"
   node.Text = Buf
   Set stream = CreateObject(\"ADODB.Stream\")
   stream.Type = adTypeBinary
   stream.Open
   stream.write node.NodeTypedValue
   stream.saveToFile FileName, adSaveCreateOverWrite
   stream.Close
   Set stream = Nothing
   Set node = Nothing
   Set xmldom = Nothing
        End Sub"
      )
      (vlax-invoke wsObj 'ExecuteStatement str)
      (vlax-invoke wsObj 'run "WriteBinary" Filename (vl-get-resource textfile))
      (vlax-release-object wsObj)
      (princ)
    )
  )
)
;;; uitilizar así
;;; (writesld "c:/Acad/ejemplo.sld" "ejemplo")

Yo llegué a probarlo hace mucho tiempo y cuando me pasaron el Autocad 64 bits dejó de funcionar la llamada al ScriptControl por lo que lo he encontrado de milagro.
Si son muchos bloques igual te merece la pena investigar sobre esto. A mi me supera  ......

Si no son bloques dinámicos, yo tenía un lisp para extraer todos los de un dibujo en un .lsp pero fallaba en alguna ocasión  aunque igual te simplifica el trabajo.
Si te interesa te lo busco pero debo mandártelo a un correo privado.

Un saludo

nolo

Mensajes : 111
Fecha de inscripción : 17/03/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por robierzo el Vie Oct 28, 2016 10:31 pm

Uffff, eso suena un poco a chino mandarín.jajaja. Lo guardaré, pero no sé si tendré tiempo y paciencia para ojearlo. Gracias Nolo.
La verdad es que no son muchos bloques. Pero el saber no ocupa lugar. Así que, si tengo tiempo miraré estas dos rutinas.

Saludos.
avatar
robierzo

Mensajes : 41
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por saulo2016 el Lun Oct 31, 2016 4:01 pm

Robierzo buenos dias desde Monterrey, N.L. Mexico

Oye..........pregunta.........¿¿¿¿que AutoCAD tienes????..........¿¿¿porque no utilizas el CADLIBDU MANAGER????....es muy sencillo y practico, puedes organizar tooooooodos tus bloques....
este es el que yo utilizo....



Si te interesa enviame tu correo personal e intento compartirtelo.....


Saludos
avatar
saulo2016

Mensajes : 109
Fecha de inscripción : 17/03/2016
Edad : 51
Localización : Monterrey, Nuevo León, Mexico

Ver perfil de usuario

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por Marco Jacinto el Lun Oct 31, 2016 5:37 pm

Dependiendo de la complejidad de tus bloques, podrias crearlos mediante codigo, por ejemplo el codigo que anexo crea un circulo, dos lineas y un atributo, esto para usarse dentro de una rutina que numera los vertices de una polilinea. Podrias usar el mismo esquema para crear los bloques que necesites.

Código:

(or mu:thisdrawing
    (setq mu:thisdrawing (vla-get-activedocument (vlax-get-acad-object)))
)

(defun CT:CreaBloque (/ block att)
  (if (vl-catch-all-error-p
 (vl-catch-all-apply
  'vla-item
  (list (setq *Blocks* (vla-get-Blocks mu:ThisDrawing))
 "Simb_Plat_Coord_Mco"
  )
 )
      )
    (progn
      (setq
 block
 (vla-add *blocks*
  (vlax-make-safearray vlax-vbDouble '(0 . 2))
  "Simb_Plat_Coord_Mco"
 )
      )
      (vla-addline
 block
 (vlax-3d-point '(0 -1.00 0))
 (vlax-3d-point '(0 1.00 0))
      )
      (vla-addline
 block
 (vlax-3d-point '(-1.00 0 0))
 (vlax-3d-point '(1.00 0 0))
      )
      (vla-addcircle
 block
 (vlax-3d-point '(0 0 0))
 (vlax-make-variant 0.50 vlax-vbDouble)
      )
      (setq att (vla-addattribute
  block
  (vlax-make-variant 1.25 vlax-vbDouble)
  acAttributeModeNormal
  "Numero de punto:"
  (vlax-3d-point '(0.25 0.25 0))
  "Simb_Plat_Coord_Mco"
  "1"
 )
      )
    )
  )
)

(defun c:Prueba ()
  (CT:CreaBloque)
  (vla-InsertBlock
    (vla-get-ModelSpace MU:THISDRAWING)
    (vlax-3d-point
      (GETPOINT
 "\n Selecciona punto para la insercion del bloque: "
      )
    )
    "Simb_Plat_Coord_Mco"
    1
    1
    1
    0
  )
  (princ)
)

Solo considera que si tienes bloques dinámicos, estos no se pueden crear con programación.

Saludos

Marco Jacinto

Mensajes : 18
Fecha de inscripción : 12/08/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por robierzo el Mar Nov 01, 2016 8:22 pm

Hola Saulo. Yo tengo Autocad 2012. Pero ya no es por el tema de versión. Es por el tema de facilitar la rutina a terceros, que pueden tener o no el MANAGER. Yo la verdad es que desconocía que existiera tal cosa. Estoy muy verde.!!!!! jejejeje. Gracias en todo caso.

Marco, muchas gracias por el ejemplo. También me lo copio en mi librería de funciones. Sin duda lo utilizaré en breve.

Saludos y gracias a los dos!!!!
avatar
robierzo

Mensajes : 41
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por amc.dicsac el Jue Nov 03, 2016 6:27 pm

Hola robierzo , una solucion podria ser que crearas un instalador con el inosetup en el cual le das la ruta de ubicacion de una carpeta donde podrias tener todos tus bloques y otra donde se instale tu *.vlx

Este es un lisp que inserta bloques de una carpeta determinada http://axprogramlisp.blogspot.pe/2016/04/biblockvlx.html
avatar
amc.dicsac

Mensajes : 78
Fecha de inscripción : 17/03/2016
Edad : 27
Localización : Lima - Perú

Ver perfil de usuario http://axprogramlisp.blogspot.pe/

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por robierzo el Vie Nov 04, 2016 10:24 am

Gracias amc.dicsac. Al final he optado por crear el bloque mediante código. Una vez que le coges el tranquillo no es tan complicado.
Gracias en todo caso. Le echo un ojo al enlace que me has dejado.
Saludos.
avatar
robierzo

Mensajes : 41
Fecha de inscripción : 17/03/2016
Localización : La Coruña

Ver perfil de usuario http://www.selmotopografia.es

Volver arriba Ir abajo

Re: incluir un bloque en un archivo VLX

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.