Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
es:doc:dxf [22/02/2012 05:17] – creado alcarretes:doc:dxf [20/11/2014 14:01] (actual) – editor externo 127.0.0.1
Línea 1: Línea 1:
 +====== Formato DXF: experimentos ======
  
 +Esta página agrupa información sobre todo lo que afecta al formato DXF en QElectroTech. Por el momento, se limita a los experimentos para la implementación de la exportación DXF.
 +
 +  * ¿Cómo leer un DXF bajo GNU/Linux? La más simple es utilizar QCad
 +  * ¿Qué biblioteca se utiliza para manejar este formato?
 +    * Aunque libqcad ya contenga seguramente una interface QGraphicsScene y un archivo DXF, el proyecto QET no quiere depender de esta biblioteca
 +    * 20/03/2011: bemol: la dxflib pronto será empaquetado por separado: http://ftp-master.debian.org/new/dxflib_2.2.0.0-1.html
 +    * la [[http://www.coin3d.org/lib/dime|libdime]], biblioteca C++ portable centrada en el DXF, parece más apropiado
 +    * GNU LibreDWG es una librería de software escrito en C para leer y escribir archivos en formato DWG, con el objetivo final de sustituir el grupo de bibliotecas Open Design Alliance. [[http://www.gnu.org/software/libredwg/]]
 +
 +===== Biblioteca dime: Programa de Prueba =====
 +<code c++>
 +#include <iostream>
 +
 +#include <dime/Model.h>
 +#include <dime/Layer.h>
 +#include <dime/Output.h>
 +#include <dime/sections/EntitiesSection.h>
 +#include <dime/sections/TablesSection.h>
 +#include <dime/tables/Table.h>
 +#include <dime/tables/TableEntry.h>
 +#include <dime/tables/LayerTable.h>
 +#include <dime/entities/Circle.h>
 +
 +/**
 + Ce programme de test genere un fichier test.dxf comportant un cercle sur un
 + calque.
 + Paquets necessaires : libdime, libdime-dev
 + Compile avec :
 + gcc testdxf0.cpp -o testdxf0 -lstdc++ -ldime
 +*/
 +
 +using namespace std;
 +namespace TestDXF {
 + void testColor(int);
 +}
 +
 +int main(int /*argc*/, char **/*argv*/) {
 +
 + const string dxf_file = "dxftest.dxf";
 +
 + cout << "generation d'un fichier DXF" << endl;
 + // modele
 + dimeModel dxf_model;
 + dxf_model.init();
 +
 + // section TABLES
 + dimeLayerTable *circle_layer_table_entry = new dimeLayerTable();
 + circle_layer_table_entry -> setLayerName("circle", NULL);
 + circle_layer_table_entry -> setColorNumber(125);
 +
 + dimeTable *layer_tables = new dimeTable(NULL);
 + layer_tables -> insertTableEntry(circle_layer_table_entry);
 +
 + dimeTablesSection *tables_section = new dimeTablesSection();
 + tables_section -> insertTable(layer_tables);
 + dxf_model.insertSection(tables_section);
 +
 + // cercle
 + dimeCircle *dxf_circle = new dimeCircle();
 + dxf_circle -> setCenter(dimeVec3f(0.0, 0.0, 0.0));
 + dxf_circle -> setRadius(1.0);
 + dxf_circle -> setThickness(0.1);
 +
 + const dimeLayer *circle_layer_ptr = dxf_model.addLayer("circle");
 + if (circle_layer_ptr != NULL) {
 + dxf_circle -> setLayer(circle_layer_ptr);
 + } else {
 + cout << "layer circle non cree" << endl;
 + }
 +
 + // section ENTITIES
 + dimeEntitiesSection *entities_section = new dimeEntitiesSection();
 + dxf_model.insertSection(entities_section);
 + entities_section -> insertEntity(dxf_circle);
 +
 + // objet dimeOutput pour l'export vers un fichier
 + dimeOutput dxf_output;
 + dxf_output.setFilename(dxf_file.c_str());
 +
 + // ecriture du fichier
 + dxf_model.write(&dxf_output);
 +
 + //TestDXF::testColor(125);
 +
 + return(0);
 +}
 +
 +void TestDXF::testColor(int test_color) {
 + dxfdouble r = 0.0, g = 0.0, b = 0.0;
 + dimeLayer::colorToRGB(test_color, r, g, b);
 + r *= 255, g *= 255, b *= 255;
 + cout << test_color << " => (" << (int)r << ", " <<  (int)g << ", " <<  (int)b << ")" << endl;
 +}
 +</code>
 +
 +Preguntas y comentarios:
 +  * Este formato parece usar color de 16 bits; la Biblioteca Dime proporciona una función estática dimeLayer::colorToRGB para pasar de un entero de 16 bits a 3 flotantes RVB ; la función TestDXF::testColor del programa anterior utiliza dimeLayer::colorToRGB para mostrar los valores RVB de un entero ¿Cómo obtener este conjunto desde los tres valores RVB?
 +  * La documentación de algunas clases de la Biblioteca Dime estipulan que nunca deben asignarse sobre la pila, lo que implica que elimina otras clases después de su uso => bien estudiar esta gestión de los objetos, el programa de arriba puede tener pérdidas de memoria.
 +  * Se asegurará de que libdime este empaquetado con Mandriva y Slackware. Esto es claramente una dependencia adicional de QET.
 +
 +===== Biblioteca Qt: hacer un QGraphicsScene en DXF =====
 +
 +De acuerdo con la documentación Qt, para añadir la capacidad de representar un grafico DXF como dar soporte a SVG, hay que añadir dos clases:
 +  * una clase derivada de QPaintDevice que será necesario aplicar al menos el método <code c++>virtual QPaintEngine * paintEngine () const = 0</code>
 +  * una clase derivada de QPaintEngine, que representará DXF a partir de primitivos:
 +    * drawEllipse
 +    * drawImage
 +    * drawLines
 +    * drawPath
 +    * drawPixmap
 +    * drawPoints
 +    * drawPolygon
 +    * drawRects
 +    * drawTextItem
 +    * drawTiledPixmap
 +
 +Ventaja: muy propio: las primitivas utilizadas para los elementos se dibujan exclusivamente mediante QPainter, sin preocuparse del objetivo: pantalla (QGraphicsView), impresora(físico/PDF/PS), imagen vectorial (SVG/DXF), imagen bitmap (BMP/PNG/JPEG/...), ...
 +Inconveniente: bastante complicado, lo más exhaustivo. No obstante no se excluye de aplicar a los primitivos que nos interesan
 +
 +====== Il est possible de convertir des exports de Qet format svg en dxf sois avec ======
 + 
 +    * autotrace
 +    * inkscape
 +
 +autotrace = le fichier est bien converti au format DXF mais le résultât n'est pas convaincant au vu des premiers essais 
 +
 +autotrace fichier Qet.png -output-file output.dxf
 +
 +inkscape s'en sort mieux et le resultat est presque exploitable 
 +
 +[[http://scorpio810.blogdns.net/generation-debian/qelectrotech/export%20dxf3_inkscape.png]]
 +[[http://scorpio810.blogdns.net/generation-debian/qelectrotech/export%20dxf4_inkscape.png]]
Imprimir/exportar