Table des matières

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'implémentation de l'export DXF.

Bibliothèque dime : Programme de test

#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 :

Bibliothèque Qt : rendre une QGraphicsScene en DXF

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 :

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.

import dxf to elmt

inkscape -E intermediate.eps infile.svg
pstoedit -dt -f dxf:-polyaslines intermediate.eps outfile.dxf
./convert_dxf_elmt.py

export dxf

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