Cette page regroupe des informations sur tout ce qui touche au format DXF dans QElectroTech. Pour le moment, cela se cantonne aux expérimentations en vue de l'implémentation de l'export DXF.
#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; }
Questions et remarques :
D'après la documentation Qt, pour ajouter la possibilité de faire un rendu DXF à l'instar du support SVG, il faut ajouter deux classes :
virtual QPaintEngine * paintEngine () const = 0
Avantage : très propre : les primitives utilisées pour les éléments sont dessinées exclusivement via QPainter, sans se soucier de la cible : écran (QGraphicsView), imprimante (physique/PDF/PS), image vectorielle (SVG/DXF), image bitmap (BMP/PNG/JPEG/…), … Inconvénient : assez compliqué car exhaustif. Il n'est toutefois pas exclu de n'implémenter que les primitives qui nous intéressent.
inkscape -E intermediate.eps infile.svg pstoedit -dt -f dxf:-polyaslines intermediate.eps outfile.dxf ./convert_dxf_elmt.py
Il est possible de convertir des exports de Qet format svg en dxf sois avec
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