This project has moved. For the latest updates, please go here.

entendiendo bloques e inserts

Mar 17, 2013 at 8:07 PM
Hola Daniel. Es mi primer post así que partiré felicitándote enormemente por este inmenso proyecto que, luego de darme mil vueltas, se puede decir que es único en su tipo, aparte de uno de menor profundidad.

Estuve tratando de trabajar con la librería, pero me es imposible porque ella solo acepta archivos de autocad 2000, eso está claro en la especificación, pero además porque estoy intentando abrir dxfs creados en otros programas, en este caso en una suite de acústica llamada EASE y también desde dxfs generados por sketchup. Yo tengo un pequeño programa de simulación acústica freeware (http://gpa.hms2k.cl) y desearía mucho complacer a los usuarios importando dxf desde ellos. Pero se entiende que tu proyecto no va en ese sentido. Sin embargo, quizá podrías dar la posibilidad... "a riesgo de..." de importar archivos anteriores a autocad 2000 o anteriores, o externos, pero solo para un número limitado de entidades, por ejemplo...

Bueno luego de este rodeo, quisiera que me ayudaras a entender la relación entre estos elementos: block record, blocks y insert.

¿Solamente los insert que están en la sección ENTITIES son dibujados verdad?

¿en las definiciones de bloques, en la sección BLOCKS, los bloques pueden llevar INSERT cierto? Pero que pasa si a un bloque se le INSERTA un bloque, y ese bloque tiene un INSERT apuntando al primer bloque??? ¿permite esto las referencias circulares?

En fin Daniel, en la internet verdaderamente no existe información clara sobre estos conceptos. He leído la especificación varias veces en estos temas y simplemente no logro dar con la respuesta. Agradecería muchísimo tu explicación, o algunas luces para poder entender la relación entre estos elementos.
Coordinator
Mar 19, 2013 at 9:54 AM
En la actualidad no deberías tener muchos problemas con cualquier programa que pueda exportar a dxf, muy antiguo debería ser para no ser capaz de exportar versiones compatibles con AutoCad2000 o posteriores, estamos hablando de una versión del AutoCad que tiene ya más de 12 años.

No se si te estoy interpretando mal pero con AutoCad2000 me refiero a que el formato del dxf pertenece a la revisión que se introdujo con la versión 2000 del AutoCad (el código de versión es AC1015), no que simplemente la librería sea capaz de importar archivos provenientes dicha versión.

Sobre el tema de los bloques, la documentación oficial sobre la estructura de los archivos dxf es, por decirlo de algún modo, pobre y a menudo confusa. A veces es mejor remitirse a la documentación de usuario del programa para entender como funcionan las distintas entidades puedes descargártela en formato pdf desde la página oficial de autodesk

Solo deberías preocuparte por las clases BLOCK e INSERT, la clase BLOCK_RECORD es interna y solo es útil para la sección TABLE del dxf donde se requiere el listado completo de los nombres de los bloques presentes en el documento.

Un bloque contiene la definición de una inserción, no es un elemento visual por lo que todas las entidades que definen el bloque no se dibujarán y esto incluye a las inserciones en el caso de bloques anidados. Como respuesta a tu pregunta, si, solamente los insert que están en la sección ENTITIES son dibujados; lo mismo le pasa a las líneas, círculos, arcos, … que pudiera contener. Esto es, solo las entidades que introduzcas en el documento mediante la función AddEntity() aparecerán como elementos visuales del dibujo.

Una inserción es una entidad de dibujo que apunta a un bloque donde se definen las entidades que la componen, pudiendo insertar tantas copias del mismo bloque como quieras, por lo cual si el bloque se modifica estas modificaciones se verán reflejadas en todas las inserciones del dibujo. Además todas las entidades del bloque se verán transformados por la posición, normal y rotación de la inserción.

Por último, las referencias circulares son ilegales, así que, si utilizando la librería encuentras la forma de crear un bloque que se referencie a sí mismo (algo que podrías) no lo intentes, te dará todo tipo de problemas al intentar cargar el archivo.

Daniel
Mar 19, 2013 at 11:18 AM
Edited Mar 19, 2013 at 11:20 AM
Gracias por la completa respuesta Daniel. Me confundía porque en la documentación de autodesk aparecía que no podría haber bloques anidados (nested), pero ahora me doy cuenta que lo que no puede pasar es que haya un block dentro de otro block, exactamente de esa manera. Pero al parecer el anidamiento está totalmente permitido a través de INSERT colocados dentro de los BLOCK. ¿Estoy en lo correcto cierto?

El sketchup 8, que es del año 2010, exporta esto en el header de sus dxf creados:
(ese programa en sus inicios era como el paint del 3d, pero hoy en día ha ganado bastante en potencia)

0
SECTION
2
HEADER
9
$ACADVER
1
AC1014
9

que es la versión del autocad R14.. (qué viejo).. Preguntaré qué versión de dxf exactamente exporta el EASE, que es una inmensa
suite de acústica... (como 4000 usd la licencia).

Ahora, entiendo perfecto que tu librería no se puede hacer cargo de cada programa, y ahora va esta pregunta que me podría ayudar bastante:

A mi por ahora me interesan muy pocas entidades, las cuales serían LINE, POLYLINE, INSERT Y BLOCK.

Tienen estas 4 grandes cambios de versión en versión de dxf ?


Una última pregunta: qué group code maneja la unidad de medida? es decir, si el dxf está en milimetros, metros, pies, pulgadas, etc ? ¿o eso puede variar de bloque a bloque, de insert a insert ?

Gracias por tu ayuda...
Coordinator
Mar 19, 2013 at 7:44 PM
Correcto, el anidamiento de bloques se realiza a través de una inserción. Ten en cuenta que la definición de un bloque solo acepta entidades, un bloque no es una entidad, una inserción si.

El Sketchup 8 permite exportar perfectamente dxf desde la versión 2000 a la 2010, además de versiones anteriores, la versión del dxf puedes seleccionarla en File->Export->3D Model...->Options. Sobre el otro programa, EASE, que comentas no lo se, pero casi podría asegurarte que también.

Sinceramente, la importación de dxf con versión AC1014 no la he probado, he echando un rápido vistazo a las especificaciones de esta, y tal vez podría hacerlo sin muchos problemas. Lo que si estoy seguro es que versiones AC1009 (AutoCad 12) y anteriores seguro que no. Pero insisto, en la actualidad, cualquier programa que exporte a dxf debe ser capaz de exportar, al menos, dxf compatibles con AutoCad 2000, y a parte, entre otras cosas, de las nuevas entidades que se han ido introduciendo, no hay diferencias de estructura entre la 2000 y la 2010.

Desde la versión 14 las entidades LINE, POLYLINE, INSERT y BLOCK no han cambiado realmente, se han introducido nuevos códigos, como es el caso de la compatibilidad con true color, pero en lo básico continúan igual.

Por último, respecto a tema de la unidades, de momento, todos los bloques son definidos como Unitless (sin unidad). El código de grupo que controla las unidades no esta implementado y se definen solo en el bloque. Cada inserción, a su vez, puede definir individualmente una escala, con lo que añadiendo a lo que escribí en el mensaje anterior, todas las entidades del bloque se verán transformados por la posición, normal y rotación, y la ESCALA de la inserción.

A pesar que las unidades del dibujo se definen siempre en milímetros, (es una variable de la sección HEADER la que lo controla), es el usuario quien decide si una unidad de dibujo es un milímetro, un centímetro, un metro … Esto solo se aplica a nuevos documentos, cuando importes uno, se debería leer correctamente las unidades en las que se definió el dibujo.

Con todo esto y a pesar que las unidades del documento estén en milímetros, al definirse los bloques como sin unidad, no se realizará ningún tipo de escalado cuando se dibujen. Todavía tengo que comprobar como influyen las distintas combinaciones entre las unidades del dibujo, los bloques y las imágenes. Para más adelante.

Espero que todo este lio no resulte muy confuso.

Daniel