Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
doc:dxf [21/01/2009 04:27] – xavier | doc:dxf [20/11/2014 14:02] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ~~NOCACHE~~ | ||
+ | ====== Format DXF : expérimentations ====== | ||
+ | |||
+ | 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' | ||
+ | |||
+ | * Comment lire un DXF sous GNU/Linux ? Le plus simple est d' | ||
+ | * Quelle bibliothèque sera utilisée pour manipuler ce format ? | ||
+ | * Bien que la libqcad contienne sans doute déjà de quoi interfacer une QGraphicsScene et un fichier DXF, le projet QET ne souhaite pas dépendre de cette bibliothèque | ||
+ | * 20/03/2011 : bemol : la dxflib va bientôt être packagée à part : http:// | ||
+ | * la [[http:// | ||
+ | * GNU LibreDWG est une librairie logicielle écrite en C pour la lecture et l' | ||
+ | ===== Bibliothèque dime : Programme de test ===== | ||
+ | <code c++> | ||
+ | #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 = " | ||
+ | |||
+ | cout << " | ||
+ | // modele | ||
+ | dimeModel dxf_model; | ||
+ | dxf_model.init(); | ||
+ | |||
+ | // section TABLES | ||
+ | dimeLayerTable *circle_layer_table_entry = new dimeLayerTable(); | ||
+ | circle_layer_table_entry -> setLayerName(" | ||
+ | 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, | ||
+ | dxf_circle -> setRadius(1.0); | ||
+ | dxf_circle -> setThickness(0.1); | ||
+ | |||
+ | const dimeLayer *circle_layer_ptr = dxf_model.addLayer(" | ||
+ | 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' | ||
+ | dimeOutput dxf_output; | ||
+ | dxf_output.setFilename(dxf_file.c_str()); | ||
+ | |||
+ | // ecriture du fichier | ||
+ | dxf_model.write(& | ||
+ | |||
+ | // | ||
+ | |||
+ | return(0); | ||
+ | } | ||
+ | |||
+ | void TestDXF:: | ||
+ | dxfdouble r = 0.0, g = 0.0, b = 0.0; | ||
+ | dimeLayer:: | ||
+ | r *= 255, g *= 255, b *= 255; | ||
+ | cout << test_color << " => (" << (int)r << ", " << | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Questions et remarques : | ||
+ | * Ce format semble utiliser des couleurs sur 16 bits ; la bibliothèque Dime fournit une fonction statique dimeLayer:: | ||
+ | * La documentation de certaines classes de la bibliothèque Dime stipule qu' | ||
+ | * Il faudra s' | ||
+ | |||
+ | ===== Bibliothèque Qt : rendre une QGraphicsScene en DXF ===== | ||
+ | |||
+ | D' | ||
+ | * une classe dérivant de QPaintDevice dont il faudra implémenter au moins la méthode <code c++> | ||
+ | * une classe dérivant de QPaintEngine, | ||
+ | * drawEllipse | ||
+ | * drawImage | ||
+ | * drawLines | ||
+ | * drawPath | ||
+ | * drawPixmap | ||
+ | * drawPoints | ||
+ | * drawPolygon | ||
+ | * drawRects | ||
+ | * drawTextItem | ||
+ | * drawTiledPixmap | ||
+ | |||
+ | 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), | ||
+ | Inconvénient : assez compliqué car exhaustif. Il n'est toutefois pas exclu de n' | ||
+ | |||
+ | ====import dxf to elmt==== | ||
+ | |||
+ | < | ||
+ | inkscape -E intermediate.eps infile.svg | ||
+ | pstoedit -dt -f dxf: | ||
+ | ./ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====export dxf ==== | ||
+ | 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 | ||
+ | |||
+ | |||
+ | |||
+ | {{: |