====== 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 ===== #include #include #include #include #include #include #include #include #include #include /** 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; } 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 virtual QPaintEngine * paintEngine () const = 0 * 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]]