DXF import
- From: Angus Ainslie <angusa deltatee com>
- To: dia-list gnome org
- Subject: DXF import
- Date: Mon, 09 Sep 2002 17:15:38 -0600
Hi,
Here's a patch to improve dxf import from visio 2002. I doesn't do such a
great job but that mostly because visio outputs garbage dxf.
Angus
Common subdirectories: dia/plug-ins/dxf/CVS and dia-0.90/plug-ins/dxf/CVS
diff -x Makefile -x .* -x dxf-ex* -x dxf.c -wdNu dia/plug-ins/dxf/Makefile.am
dia-0.90/plug-ins/dxf/Makefile.am
--- dia/plug-ins/dxf/Makefile.am Mon Sep 9 06:36:46 2002
+++ dia-0.90/plug-ins/dxf/Makefile.am Wed Dec 31 17:00:00 1969
@@ -1,13 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-pkglib_LTLIBRARIES = libdxf_filter.la
-
-libdxf_filter_la_SOURCES = \
- dxf.c \
- dxf-export.c \
- dxf-import.c
-
-libdxf_filter_la_LDFLAGS = -export-dynamic -module -avoid-version
-
-INCLUDES = -I$(top_srcdir)/intl -I$(srcdir)/../../lib $(GTK_CFLAGS) \
- $(GNOME_CFLAGS) $(PANGOFT2_CFLAGS) $(XML_CFLAGS) $(UNICODE_CFLAGS)
diff -x Makefile -x .* -x dxf-ex* -x dxf.c -wdNu dia/plug-ins/dxf/autocad_pal.h
dia-0.90/plug-ins/dxf/autocad_pal.h
--- dia/plug-ins/dxf/autocad_pal.h Wed Dec 31 17:00:00 1969
+++ dia-0.90/plug-ins/dxf/autocad_pal.h Fri Jul 5 10:24:40 2002
@@ -0,0 +1,265 @@
+typedef struct
+{
+ unsigned char r, g, b;
+} RGB_t;
+
+static RGB_t acad_pal[256] =
+{
+ { 0x00, 0x00, 0x00 }, //0
+ { 0xFF, 0x00, 0x00 },
+ { 0xFF, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0x00 },
+ { 0x00, 0xFF, 0xFF },
+ { 0x00, 0x00, 0xFF }, //5
+ { 0xFF, 0x00, 0xFF },
+ { 0xFF, 0xFF, 0xFF },
+ { 0x41, 0x41, 0x41 },
+ { 0x80, 0x80, 0x80 },
+ { 0xFF, 0x00, 0x00 }, //10
+ { 0xFF, 0xAA, 0xAA },
+ { 0xBD, 0x00, 0x00 },
+ { 0xBD, 0x7E, 0x7E },
+ { 0x81, 0x00, 0x00 },
+ { 0x81, 0x56, 0x56 }, //15
+ { 0x68, 0x00, 0x00 },
+ { 0x68, 0x45, 0x45 },
+ { 0x4F, 0x00, 0x00 },
+ { 0x4F, 0x35, 0x35 },
+ { 0xFF, 0x3F, 0x00 }, //20
+ { 0xFF, 0xBF, 0xAA },
+ { 0xBD, 0x2E, 0x00 },
+ { 0xBD, 0x8D, 0x7E },
+ { 0x81, 0x1F, 0x00 },
+ { 0x81, 0x60, 0x56 }, //25
+ { 0x68, 0x19, 0x00 },
+ { 0x68, 0x4E, 0x45 },
+ { 0x4F, 0x13, 0x00 },
+ { 0x4F, 0x3B, 0x35 },
+ { 0xFF, 0x7F, 0x00 }, //30
+ { 0xFF, 0xD4, 0xAA },
+ { 0xBD, 0x5E, 0x00 },
+ { 0xBD, 0x9D, 0x7E },
+ { 0x81, 0x40, 0x00 },
+ { 0x81, 0x6B, 0x56 }, //35
+ { 0x68, 0x34, 0x00 },
+ { 0x68, 0x56, 0x45 },
+ { 0x4F, 0x27, 0x00 },
+ { 0x4F, 0x42, 0x35 },
+ { 0xFF, 0xBF, 0x00 }, //40
+ { 0xFF, 0xEA, 0xAA },
+ { 0xBD, 0x8D, 0x00 },
+ { 0xBD, 0xAD, 0x7E },
+ { 0x81, 0x60, 0x00 },
+ { 0x81, 0x76, 0x56 }, //45
+ { 0x68, 0x4E, 0x00 },
+ { 0x68, 0x5F, 0x45 },
+ { 0x4F, 0x3B, 0x00 },
+ { 0x4F, 0x49, 0x35 },
+ { 0xFF, 0xFF, 0x00 }, //50
+ { 0xFF, 0xFF, 0xAA },
+ { 0xBD, 0xBD, 0x00 },
+ { 0xBD, 0xBD, 0x7E },
+ { 0x81, 0x81, 0x00 },
+ { 0x81, 0x81, 0x56 }, //55
+ { 0x68, 0x68, 0x00 },
+ { 0x68, 0x68, 0x45 },
+ { 0x4F, 0x4F, 0x00 },
+ { 0x4F, 0x4F, 0x35 },
+ { 0xBF, 0xFF, 0x00 }, //60
+ { 0xEA, 0xFF, 0xAA },
+ { 0x8D, 0xBD, 0x00 },
+ { 0xAD, 0xBD, 0x7E },
+ { 0x60, 0x81, 0x00 },
+ { 0x76, 0x81, 0x56 }, //65
+ { 0x4E, 0x68, 0x00 },
+ { 0x5F, 0x68, 0x45 },
+ { 0x3B, 0x4F, 0x00 },
+ { 0x49, 0x4F, 0x35 },
+ { 0x7F, 0xFF, 0x00 }, //70
+ { 0xD4, 0xFF, 0xAA },
+ { 0x5E, 0xBD, 0x00 },
+ { 0x9D, 0xBD, 0x7E },
+ { 0x40, 0x81, 0x00 },
+ { 0x6B, 0x81, 0x56 }, //75
+ { 0x34, 0x68, 0x00 },
+ { 0x56, 0x68, 0x45 },
+ { 0x27, 0x4F, 0x00 },
+ { 0x42, 0x4F, 0x35 },
+ { 0x3F, 0xFF, 0x00 }, //80
+ { 0xBF, 0xFF, 0xAA },
+ { 0x2E, 0xBD, 0x00 },
+ { 0x8D, 0xBD, 0x7E },
+ { 0x1F, 0x81, 0x00 },
+ { 0x60, 0x81, 0x56 }, //85
+ { 0x19, 0x68, 0x00 },
+ { 0x4E, 0x68, 0x45 },
+ { 0x13, 0x4F, 0x00 },
+ { 0x3B, 0x4F, 0x35 },
+ { 0x00, 0xFF, 0x00 }, //90
+ { 0xAA, 0xFF, 0xAA },
+ { 0x00, 0xBD, 0x00 },
+ { 0x7E, 0xBD, 0x7E },
+ { 0x00, 0x81, 0x00 },
+ { 0x56, 0x81, 0x56 }, //95
+ { 0x00, 0x68, 0x00 },
+ { 0x45, 0x68, 0x45 },
+ { 0x00, 0x4F, 0x00 },
+ { 0x35, 0x4F, 0x35 },
+ { 0x00, 0xFF, 0x3F }, //100
+ { 0xAA, 0xFF, 0xBF },
+ { 0x00, 0xBD, 0x2E },
+ { 0x7E, 0xBD, 0x8D },
+ { 0x00, 0x81, 0x1F },
+ { 0x56, 0x81, 0x60 }, //105
+ { 0x00, 0x68, 0x19 },
+ { 0x45, 0x68, 0x4E },
+ { 0x00, 0x4F, 0x13 },
+ { 0x35, 0x4F, 0x3B },
+ { 0x00, 0xFF, 0x7F }, //110
+ { 0xAA, 0xFF, 0xD4 },
+ { 0x00, 0xBD, 0x5E },
+ { 0x7E, 0xBD, 0x9D },
+ { 0x00, 0x81, 0x40 },
+ { 0x56, 0x81, 0x6B }, //115
+ { 0x00, 0x68, 0x34 },
+ { 0x45, 0x68, 0x56 },
+ { 0x00, 0x4F, 0x27 },
+ { 0x35, 0x4F, 0x42 },
+ { 0x00, 0xFF, 0xBF }, //120
+ { 0xAA, 0xFF, 0xEA },
+ { 0x00, 0xBD, 0x8D },
+ { 0x7E, 0xBD, 0xAD },
+ { 0x00, 0x81, 0x60 },
+ { 0x56, 0x81, 0x76 }, //125
+ { 0x00, 0x68, 0x4E },
+ { 0x45, 0x68, 0x5F },
+ { 0x00, 0x4F, 0x3B },
+ { 0x35, 0x4F, 0x49 },
+ { 0x00, 0xFF, 0xFF }, //130
+ { 0xAA, 0xFF, 0xFF },
+ { 0x00, 0xBD, 0xBD },
+ { 0x7E, 0xBD, 0xBD },
+ { 0x00, 0x81, 0x81 },
+ { 0x56, 0x81, 0x81 }, //135
+ { 0x00, 0x68, 0x68 },
+ { 0x45, 0x68, 0x68 },
+ { 0x00, 0x4F, 0x4F },
+ { 0x35, 0x4F, 0x4F },
+ { 0x00, 0xBF, 0xFF }, //140
+ { 0xAA, 0xEA, 0xFF },
+ { 0x00, 0x8D, 0xBD },
+ { 0x7E, 0xAD, 0xBD },
+ { 0x00, 0x60, 0x81 },
+ { 0x56, 0x76, 0x81 }, //145
+ { 0x00, 0x4E, 0x68 },
+ { 0x45, 0x5F, 0x68 },
+ { 0x00, 0x3B, 0x4F },
+ { 0x35, 0x49, 0x4F },
+ { 0x00, 0x7F, 0xFF }, //150
+ { 0xAA, 0xD4, 0xFF },
+ { 0x00, 0x5E, 0xBD },
+ { 0x7E, 0x9D, 0xBD },
+ { 0x00, 0x40, 0x81 },
+ { 0x56, 0x6B, 0x81 }, //155
+ { 0x00, 0x34, 0x68 },
+ { 0x45, 0x56, 0x68 },
+ { 0x00, 0x27, 0x4F },
+ { 0x35, 0x42, 0x4F },
+ { 0x00, 0x3F, 0xFF }, //160
+ { 0xAA, 0xBF, 0xFF },
+ { 0x00, 0x2E, 0xBD },
+ { 0x7E, 0x8D, 0xBD },
+ { 0x00, 0x1F, 0x81 },
+ { 0x56, 0x60, 0x81 }, //165
+ { 0x00, 0x19, 0x68 },
+ { 0x45, 0x4E, 0x68 },
+ { 0x00, 0x13, 0x4F },
+ { 0x35, 0x3B, 0x4F },
+ { 0x00, 0x00, 0xFF }, //170
+ { 0xAA, 0xAA, 0xFF },
+ { 0x00, 0x00, 0xBD },
+ { 0x7E, 0x7E, 0xBD },
+ { 0x00, 0x00, 0x81 },
+ { 0x56, 0x56, 0x81 }, //175
+ { 0x00, 0x00, 0x68 },
+ { 0x45, 0x45, 0x68 },
+ { 0x00, 0x00, 0x4F },
+ { 0x35, 0x35, 0x4F },
+ { 0x3F, 0x00, 0xFF }, //180
+ { 0xBF, 0xAA, 0xFF },
+ { 0x2E, 0x00, 0xBD },
+ { 0x8D, 0x7E, 0xBD },
+ { 0x1F, 0x00, 0x81 },
+ { 0x60, 0x56, 0x81 }, //185
+ { 0x19, 0x00, 0x68 },
+ { 0x4E, 0x45, 0x68 },
+ { 0x13, 0x00, 0x4F },
+ { 0x3B, 0x35, 0x4F },
+ { 0x7F, 0x00, 0xFF }, //190
+ { 0xD4, 0xAA, 0xFF },
+ { 0x5E, 0x00, 0xBD },
+ { 0x9D, 0x7E, 0xBD },
+ { 0x40, 0x00, 0x81 },
+ { 0x6B, 0x56, 0x81 }, //195
+ { 0x34, 0x00, 0x68 },
+ { 0x56, 0x45, 0x68 },
+ { 0x27, 0x00, 0x4F },
+ { 0x42, 0x35, 0x4F },
+ { 0xBF, 0x00, 0xFF }, //200
+ { 0xEA, 0xAA, 0xFF },
+ { 0x8D, 0x00, 0xBD },
+ { 0xAD, 0x7E, 0xBD },
+ { 0x60, 0x00, 0x81 },
+ { 0x76, 0x56, 0x81 }, //205
+ { 0x4E, 0x00, 0x68 },
+ { 0x5F, 0x45, 0x68 },
+ { 0x3B, 0x00, 0x4F },
+ { 0x49, 0x35, 0x4F },
+ { 0xFF, 0x00, 0xFF }, //210
+ { 0xFF, 0xAA, 0xFF },
+ { 0xBD, 0x00, 0xBD },
+ { 0xBD, 0x7E, 0xBD },
+ { 0x81, 0x00, 0x81 },
+ { 0x81, 0x56, 0x81 }, //215
+ { 0x68, 0x00, 0x68 },
+ { 0x68, 0x45, 0x68 },
+ { 0x4F, 0x00, 0x4F },
+ { 0x4F, 0x35, 0x4F },
+ { 0xFF, 0x00, 0xBF }, //220
+ { 0xFF, 0xAA, 0xEA },
+ { 0xBD, 0x00, 0x8D },
+ { 0xBD, 0x7E, 0xAD },
+ { 0x81, 0x00, 0x60 },
+ { 0x81, 0x56, 0x76 }, //225
+ { 0x68, 0x00, 0x4E },
+ { 0x68, 0x45, 0x5F },
+ { 0x4F, 0x00, 0x3B },
+ { 0x4F, 0x35, 0x49 },
+ { 0xFF, 0x00, 0x7F }, //230
+ { 0xFF, 0xAA, 0xD4 },
+ { 0xBD, 0x00, 0x5E },
+ { 0xBD, 0x7E, 0x9D },
+ { 0x81, 0x00, 0x40 },
+ { 0x81, 0x56, 0x6B }, //235
+ { 0x68, 0x00, 0x34 },
+ { 0x68, 0x45, 0x56 },
+ { 0x4F, 0x00, 0x27 },
+ { 0x4F, 0x35, 0x42 },
+ { 0xFF, 0x00, 0x3F }, //240
+ { 0xFF, 0xAA, 0xBF },
+ { 0xBD, 0x00, 0x2E },
+ { 0xBD, 0x7E, 0x8D },
+ { 0x81, 0x00, 0x1F },
+ { 0x81, 0x56, 0x60 }, //245
+ { 0x68, 0x00, 0x19 },
+ { 0x68, 0x45, 0x4E },
+ { 0x4F, 0x00, 0x13 },
+ { 0x4F, 0x35, 0x3B },
+ { 0x33, 0x33, 0x33 }, //250
+ { 0x50, 0x50, 0x50 },
+ { 0x69, 0x69, 0x69 },
+ { 0x82, 0x82, 0x82 },
+ { 0xBE, 0xBE, 0xBE },
+ { 0xFF, 0xFF, 0xFF } //255
+};
+
diff -x Makefile -x .* -x dxf-ex* -x dxf.c -wdNu dia/plug-ins/dxf/dxf-import.c
dia-0.90/plug-ins/dxf/dxf-import.c
--- dia/plug-ins/dxf/dxf-import.c Sun Jun 23 15:06:40 2002
+++ dia-0.90/plug-ins/dxf/dxf-import.c Mon Sep 9 17:01:47 2002
@@ -39,13 +39,29 @@
#include "object.h"
#include "properties.h"
#include "propinternals.h"
+#include "autocad_pal.h"
-static real coord_scale = 5.0;
-static real width_scale = 10.0;
+#include "../app/group.h"
+#include "../objects/standard/create.h"
+
+static real coord_scale = 1.0, measure_scale = 1.0;
+static real text_scale = 1.0;
+
+#define WIDTH_SCALE measure_scale
+#define DEFAULT_LINE_WIDTH 0.001
+
+Point extent_min, extent_max;
+Point limit_min, limit_max;
/* maximum line length */
#define DXF_LINE_LENGTH 256
+typedef struct layer_data_tag
+{
+ char layerName[256];
+ int acad_colour;
+} layer_data_type;
+
typedef struct _DxfData
{
char code[DXF_LINE_LENGTH];
@@ -54,24 +70,33 @@
gboolean import_dxf(const gchar *filename, DiagramData *dia, void* user_data);
gboolean read_dxf_codes(FILE *filedxf, DxfData *data);
-void read_entity_line_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
-void read_entity_circle_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
-void read_entity_ellipse_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
-void read_entity_arc_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
-void read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+Object *read_entity_line_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+Object *read_entity_circle_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+Object *read_entity_ellipse_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+Object *read_entity_arc_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+Object *read_entity_solid_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+Object *read_entity_polyline_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+void read_entity_scale_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+void read_entity_textsize_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+void read_entity_mesurement_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
void read_table_layer_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+void read_section_header_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+void read_section_classes_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
void read_section_tables_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
void read_section_entities_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
+void read_section_blocks_dxf(FILE *filedxf, DxfData *data, DiagramData *dia);
Layer *layer_find_by_name(char *layername, DiagramData *dia);
LineStyle get_dia_linestyle_dxf(char *dxflinestyle);
/* returns the layer with the given name */
/* TODO: merge this with other layer code? */
-Layer *layer_find_by_name(char *layername, DiagramData *dia) {
+Layer *layer_find_by_name(char *layername, DiagramData *dia)
+{
Layer *matching_layer, *layer;
int i;
- matching_layer = dia->active_layer;
+ matching_layer = NULL;
+
for (i=0; i<dia->layers->len; i++) {
layer = (Layer *)g_ptr_array_index(dia->layers, i);
if(strcmp(layer->name, layername) == 0) {
@@ -79,6 +104,13 @@
break;
}
}
+
+ if( matching_layer == NULL )
+ {
+ matching_layer = new_layer(g_strdup( layername ));
+ data_add_layer(dia, matching_layer);
+ }
+
return matching_layer;
}
@@ -105,8 +137,9 @@
{ "line_style", PROP_TYPE_LINESTYLE},
PROP_DESC_END};
+
/* reads a line entity from the dxf file and creates a line object in dia*/
-void read_entity_line_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
+Object *read_entity_line_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
int codedxf;
char *old_locale;
@@ -124,7 +157,7 @@
ColorProperty *cprop;
RealProperty *rprop;
- real line_width = 0.1;
+ real line_width = DEFAULT_LINE_WIDTH;
LineStyle style = LINESTYLE_SOLID;
Layer *layer = NULL;
@@ -132,7 +165,7 @@
do {
if(read_dxf_codes(filedxf, data) == FALSE){
setlocale(LC_NUMERIC, old_locale);
- return;
+ return( NULL );
}
codedxf = atoi(data->code);
switch(codedxf){
@@ -141,19 +174,20 @@
case 8: layer = layer_find_by_name(data->value, dia);
break;
case 10:
- start.x = atof(data->value) / coord_scale;
+ start.x = atof(data->value) * coord_scale * measure_scale;
break;
case 11:
- end.x = atof(data->value) / coord_scale;
+ end.x = atof(data->value) * coord_scale * measure_scale;
break;
case 20:
- start.y = (-1)*atof(data->value) / coord_scale;
+ start.y = (-1)*atof(data->value) * coord_scale * measure_scale;
break;
case 21:
- end.y = (-1)*atof(data->value) / coord_scale;
+ end.y = (-1)*atof(data->value) * coord_scale * measure_scale;
break;
case 39:
- line_width = atof(data->value) / width_scale;
+ line_width = atof(data->value) * WIDTH_SCALE;
+ /*printf( "line width %f\n", line_width ); */
break;
}
} while(codedxf != 0);
@@ -185,6 +219,368 @@
line_obj->ops->set_props(line_obj, props);
prop_list_free(props);
+
+ return( line_obj );
+}
+
+static PropDescription dxf_solid_prop_descs[] = {
+ { "line_colour", PROP_TYPE_COLOUR },
+ { "line_width", PROP_TYPE_REAL },
+ { "line_style", PROP_TYPE_LINESTYLE },
+ { "fill_colour", PROP_TYPE_COLOUR },
+ { "show_background", PROP_TYPE_BOOL },
+ PROP_DESC_END};
+
+/* reads a solid entity from the dxf file and creates a polygon object in dia*/
+Object *read_entity_solid_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
+ int codedxf;
+ char *old_locale;
+
+ /* polygon data */
+ Point p[4];
+
+ ObjectType *otype = object_get_type("Standard - Polygon");
+ Handle *h1, *h2;
+
+ Object *polygon_obj;
+ PolygonCreateData *pcd;
+
+ Color fill_colour = { 0.5, 0.5, 0.5 };
+
+ GPtrArray *props;
+ LinestyleProperty *lsprop;
+ ColorProperty *cprop, *fprop;
+ RealProperty *rprop;
+ BoolProperty *bprop;
+
+ real line_width = 0.001;
+ LineStyle style = LINESTYLE_SOLID;
+ Layer *layer = NULL;
+ unsigned char colour;
+
+/* printf( "Solid " ); */
+
+ old_locale = setlocale(LC_NUMERIC, "C");
+ do {
+ if(read_dxf_codes(filedxf, data) == FALSE){
+ setlocale(LC_NUMERIC, old_locale);
+ return( NULL );
+ }
+ codedxf = atoi(data->code);
+ switch(codedxf){
+ case 6:
+ style = get_dia_linestyle_dxf(data->value);
+ break;
+ case 8:
+ layer = layer_find_by_name(data->value, dia);
+ /*printf( "layer: %s ", data->value );*/
+ break;
+ case 10:
+ p[0].x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P0.x: %f ", p[0].x );*/
+ break;
+ case 11:
+ p[1].x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P1.x: %f ", p[1].x );*/
+ break;
+ case 12:
+ p[2].x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P2.x: %f ", p[2].x );*/
+ break;
+ case 13:
+ p[3].x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P3.x: %f ", p[3].x );*/
+ break;
+ case 20:
+ p[0].y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P0.y: %f ", p[0].y );*/
+ break;
+ case 21:
+ p[1].y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P1.y: %f ", p[1].y );*/
+ break;
+ case 22:
+ p[2].y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P2.y: %f ", p[2].y );*/
+ break;
+ case 23:
+ p[3].y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P3.y: %f\n", p[3].y );*/
+ break;
+ case 39:
+ line_width = atof(data->value) * WIDTH_SCALE;
+ /*printf( "width %f\n", line_width );*/
+ break;
+ case 62:
+ colour = atoi(data->value);
+ fill_colour.red = acad_pal[colour].r / 255.0;
+ fill_colour.green = acad_pal[colour].g / 255.0;
+ fill_colour.blue = acad_pal[colour].b / 255.0;
+/* printf( "acad colour %d %d %d\n", acad_pal[colour].r, acad_pal[colour].g, acad_pal[colour].b );
+ printf( "fill colour %f %f %f\n", fill_colour.red, fill_colour.green, fill_colour.blue );*/
+ break;
+ }
+ } while(codedxf != 0);
+ setlocale(LC_NUMERIC, old_locale);
+
+ pcd = g_new( PolygonCreateData, 1);
+
+ if( p[2].x != p[3].x && p[2].y != p[3].y )
+ pcd->num_points = 4;
+ else
+ pcd->num_points = 3;
+
+ pcd->points = g_new( Point, pcd->num_points );
+
+ memcpy( pcd->points, p, sizeof( Point ) * pcd->num_points );
+
+ polygon_obj = otype->ops->create( NULL, pcd, &h1, &h2 );
+
+ layer_add_object( layer, polygon_obj );
+
+ props = prop_list_from_descs( dxf_solid_prop_descs, pdtpp_true );
+ g_assert(props->len == 5);
+
+ cprop = g_ptr_array_index( props,0 );
+ cprop->color_data = fill_colour;
+
+ rprop = g_ptr_array_index( props,1 );
+ rprop->real_data = line_width;
+
+ lsprop = g_ptr_array_index( props,2 );
+ lsprop->style = style;
+ lsprop->dash = 1.0;
+
+ fprop = g_ptr_array_index( props, 3 );
+ fprop->color_data = fill_colour;
+
+ bprop = g_ptr_array_index( props, 4 );
+ bprop->bool_data = TRUE;
+
+ polygon_obj->ops->set_props( polygon_obj, props );
+
+ prop_list_free(props);
+
+ return( polygon_obj );
+}
+
+static PropDescription dxf_polyline_prop_descs[] = {
+ { "line_colour", PROP_TYPE_COLOUR },
+ { "line_width", PROP_TYPE_REAL },
+ { "line_style", PROP_TYPE_LINESTYLE },
+ PROP_DESC_END};
+
+int IsEqual( double a, double b )
+{
+ double epsilon = 0.001;
+
+ if( a == b )
+ return( 1 );
+
+ if(( a + epsilon ) > b && ( a - epsilon ) < b )
+ return( 1 );
+
+ return( 0 );
+}
+
+/* reads a polyline entity from the dxf file and creates a polyline object in dia*/
+Object *read_entity_polyline_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
+ int codedxf, i;
+ char *old_locale;
+
+ /* polygon data */
+ Point *p = NULL, start, end, center;
+
+ ObjectType *otype = object_get_type("Standard - PolyLine");
+ Handle *h1, *h2;
+
+ Object *polyline_obj;
+ PolylineCreateData *pcd;
+
+ Color line_colour = { 0.0, 0.0, 0.0 };
+
+ GPtrArray *props;
+ LinestyleProperty *lsprop;
+ ColorProperty *cprop;
+ RealProperty *rprop;
+
+ real line_width = DEFAULT_LINE_WIDTH;
+ real radius, start_angle;
+ LineStyle style = LINESTYLE_SOLID;
+ Layer *layer = NULL;
+ unsigned char colour, closed = 0;
+ int points = 0;
+
+ old_locale = setlocale(LC_NUMERIC, "C");
+ do {
+ if(read_dxf_codes(filedxf, data) == FALSE){
+ setlocale(LC_NUMERIC, old_locale);
+ return( NULL );
+ }
+ codedxf = atoi(data->code);
+ switch(codedxf){
+ case 0:
+ if( !strcmp( data->value, "VERTEX" ))
+ {
+ points++;
+
+ p = realloc( p, sizeof( Point ) * points );
+
+ /*printf( "Vertex %d\n", points );*/
+
+ }
+
+ case 6:
+ style = get_dia_linestyle_dxf(data->value);
+ break;
+ case 8:
+ layer = layer_find_by_name(data->value, dia);
+ /*printf( "layer: %s ", data->value );*/
+ break;
+ case 10:
+ if( points != 0 )
+ {
+ p[points-1].x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P[%d].x: %f ", points-1, p[points-1].x );*/
+ }
+ break;
+ case 20:
+ if( points != 0 )
+ {
+ p[points-1].y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*printf( "P[%d].y: %f\n", points-1, p[points-1].y );*/
+ }
+ break;
+ case 39:
+ line_width = atof(data->value) * WIDTH_SCALE;
+ /*printf( "width %f\n", line_width );*/
+ break;
+ case 42:
+ /* FIXME - the bulge code doesn't work */
+ p = realloc( p, sizeof( Point ) * ( points + 10 ));
+
+ start = p[points-2];
+ end = p[points-1];
+
+ radius = sqrt( pow( end.x - start.x, 2 ) + pow( end.y - start.y, 2 ))/2;
+
+ center.x = start.x + ( end.x - start.x )/2;
+ center.y = start.y + ( end.y - start.y )/2;
+
+ if( IsEqual( start.x, end.x ))
+ {
+ if( IsEqual( start.y, end.y ))
+ {
+ fprintf( stderr, "Bad vertex bulge\n" );
+ }
+ else if( start.y > center.y )
+ {
+ /*start_angle = 90.0;*/
+ start_angle = M_PI/2;
+ }
+ else
+ {
+ /*start_angle = 270.0;*/
+ start_angle = M_PI * 1.5;
+ }
+ }
+ else if( IsEqual( start.y, end.y ))
+ {
+ if( IsEqual( start.x, end.x ))
+ {
+ fprintf( stderr, "Bad vertex bulge\n" );
+ }
+ else if( start.x > center.x )
+ {
+ start_angle = 0.0;
+ }
+ else
+ {
+ start_angle = M_PI;
+ }
+ }
+ else
+ {
+ start_angle = atan( center.y - start.y /center.x - start.x );
+ }
+
+ /*printf( "start x %f end x %f center x %f\n", start.x, end.x, center.x );
+ printf( "start y %f end y %f center y %f\n", start.y, end.y, center.y );
+ printf( "bulge %s %f startx_angle %f\n", data->value, radius, start_angle );*/
+
+ for( i=(points-1); i<(points+9); i++ );
+ {
+ p[i].x = center.x + cos( start_angle ) * radius;
+ p[i].y = center.y + sin( start_angle ) * radius;
+ start_angle += M_PI/10.0;
+ /*printf( "i %d x %f y %f\n", i, p[i].x, p[i].y );*/
+ }
+ points += 10;
+
+ p[points-1] = end;
+ break;
+ case 62:
+ colour = atoi(data->value);
+ line_colour.red = acad_pal[colour].r / 255.0;
+ line_colour.green = acad_pal[colour].g / 255.0;
+ line_colour.blue = acad_pal[colour].b / 255.0;
+ break;
+ case 70:
+ closed = 1 & atoi( data->value );
+ /*printf( "closed %d %s", closed, data->value );*/
+ break;
+ }
+ } while( strcmp( data->value, "SEQEND" ));
+
+ setlocale(LC_NUMERIC, old_locale);
+
+ if( points == 0 )
+ {
+ printf( "No vertexes defined\n" );
+ return( NULL );
+ }
+
+ pcd = g_new( PolylineCreateData, 1);
+
+ if( closed )
+ {
+ ++points;
+ p = realloc( p, sizeof( Point ) * points );
+ p[points-1].x = p[0].x;
+ p[points-1].y = p[0].y;
+ }
+
+ pcd->num_points = points;
+ pcd->points = g_new( Point, pcd->num_points );
+
+ memcpy( pcd->points, p, sizeof( Point ) * pcd->num_points );
+
+ free( p );
+
+ polyline_obj = otype->ops->create( NULL, pcd, &h1, &h2 );
+
+ layer_add_object( layer, polyline_obj );
+
+ props = prop_list_from_descs( dxf_polyline_prop_descs, pdtpp_true );
+ g_assert( props->len == 3 );
+
+ cprop = g_ptr_array_index( props,0 );
+ cprop->color_data = line_colour;
+
+ rprop = g_ptr_array_index( props,1 );
+ rprop->real_data = line_width;
+
+ lsprop = g_ptr_array_index( props,2 );
+ lsprop->style = style;
+ lsprop->dash = 1.0;
+
+ polyline_obj->ops->set_props( polyline_obj, props );
+
+ prop_list_free(props);
+
+ return( polyline_obj );
}
static PropDescription dxf_ellipse_prop_descs[] = {
@@ -197,7 +593,8 @@
PROP_DESC_END};
/* reads a circle entity from the dxf file and creates a circle object in dia*/
-void read_entity_circle_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
+Object *read_entity_circle_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
int codedxf;
char *old_locale;
@@ -217,14 +614,14 @@
ColorProperty *cprop;
GPtrArray *props;
- real line_width = 0.1;
+ real line_width = DEFAULT_LINE_WIDTH;
Layer *layer = NULL;
old_locale = setlocale(LC_NUMERIC, "C");
do {
if(read_dxf_codes(filedxf, data) == FALSE){
setlocale(LC_NUMERIC, old_locale);
- return;
+ return( NULL );
}
codedxf = atoi(data->code);
switch(codedxf){
@@ -232,16 +629,16 @@
layer = layer_find_by_name(data->value, dia);
break;
case 10:
- center.x = atof(data->value) / coord_scale;
+ center.x = atof(data->value) * coord_scale * measure_scale;
break;
case 20:
- center.y = (-1)*atof(data->value) / coord_scale;
+ center.y = (-1)*atof(data->value) * coord_scale * measure_scale;
break;
case 39:
- line_width = atof(data->value) / width_scale;
+ line_width = atof(data->value) * WIDTH_SCALE;
break;
case 40:
- radius = atof(data->value) / coord_scale;
+ radius = atof(data->value) * coord_scale * measure_scale;
break;
}
@@ -272,6 +669,8 @@
ellipse_obj->ops->set_props(ellipse_obj, props);
prop_list_free(props);
+
+ return( ellipse_obj );
}
static PropDescription dxf_arc_prop_descs[] = {
@@ -283,7 +682,8 @@
PROP_DESC_END};
/* reads a circle entity from the dxf file and creates a circle object in dia*/
-void read_entity_arc_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
+Object *read_entity_arc_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
int codedxf;
char *old_locale;
@@ -303,14 +703,14 @@
RealProperty *rprop;
GPtrArray *props;
- real line_width = 0.1;
+ real line_width = DEFAULT_LINE_WIDTH;
Layer *layer = NULL;
old_locale = setlocale(LC_NUMERIC, "C");
do {
if(read_dxf_codes(filedxf, data) == FALSE){
setlocale(LC_NUMERIC,old_locale);
- return;
+ return( NULL );
}
codedxf = atoi(data->code);
switch(codedxf){
@@ -318,16 +718,16 @@
layer = layer_find_by_name(data->value, dia);
break;
case 10:
- center.x = atof(data->value) / coord_scale;
+ center.x = atof(data->value) * coord_scale * measure_scale;
break;
case 20:
- center.y = (-1)*atof(data->value) / coord_scale;
+ center.y = (-1)*atof(data->value) * coord_scale * measure_scale;
break;
case 39:
- line_width = atof(data->value) / width_scale;
+ line_width = atof(data->value) * WIDTH_SCALE;
break;
case 40:
- radius = atof(data->value) / coord_scale;
+ radius = atof(data->value) * coord_scale * measure_scale;
break;
case 50:
start_angle = atof(data->value)*M_PI/180.0;
@@ -373,10 +773,12 @@
arc_obj->ops->set_props(arc_obj, props);
prop_list_free(props);
+
+ return( arc_obj );
}
/* reads an ellipse entity from the dxf file and creates an ellipse object in dia*/
-void read_entity_ellipse_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
+Object *read_entity_ellipse_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
int codedxf;
char *old_locale;
@@ -396,14 +798,14 @@
ColorProperty *cprop;
GPtrArray *props;
- real line_width = 0.1;
+ real line_width = DEFAULT_LINE_WIDTH;
Layer *layer = NULL;
old_locale = setlocale(LC_NUMERIC, "C");
do {
if(read_dxf_codes(filedxf, data) == FALSE){
setlocale(LC_NUMERIC, old_locale);
- return;
+ return( NULL );
}
codedxf = atoi(data->code);
switch(codedxf){
@@ -411,16 +813,16 @@
layer = layer_find_by_name(data->value, dia);
break;
case 10:
- center.x = atof(data->value) / coord_scale;
+ center.x = atof(data->value) * coord_scale * measure_scale;
break;
case 11:
- ratio_width_height = atof(data->value) / coord_scale;
+ ratio_width_height = atof(data->value) * coord_scale * measure_scale;
break;
case 20:
- center.y = (-1)*atof(data->value) / coord_scale;
+ center.y = (-1)*atof(data->value) * coord_scale * measure_scale;
break;
case 39:
- line_width = atof(data->value) / width_scale;
+ line_width = atof(data->value) * WIDTH_SCALE;
break;
case 40:
width = atof(data->value) * 2; /* XXX what scale */
@@ -453,22 +855,25 @@
ellipse_obj->ops->set_props(ellipse_obj, props);
prop_list_free(props);
+
+ return( ellipse_obj );
}
static PropDescription dxf_text_prop_descs[] = {
{ "text", PROP_TYPE_TEXT },
PROP_DESC_END};
-void read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+Object *read_entity_text_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
{
- int codedxf;
+ int codedxf, colour;
char *old_locale;
/* text data */
Point location;
- real height = 10.0;
+ real height = text_scale * coord_scale * measure_scale;
+ real y_offset = 0;
Alignment textalignment = ALIGN_LEFT;
- char *textvalue = NULL;
+ char *textvalue = NULL, *textp;
ObjectType *otype = object_get_type("Standard - Text");
Handle *h1, *h2;
@@ -485,36 +890,106 @@
do {
if (read_dxf_codes(filedxf, data) == FALSE) {
setlocale(LC_NUMERIC,old_locale);
- return;
+ return( NULL );
}
codedxf = atoi(data->code);
switch (codedxf) {
- case 1: textvalue = g_strdup(data->value);
+ case 1:
+ textvalue = g_strdup(data->value);
+ textp = textvalue;
+ /* FIXME - poor tab to space converter */
+ do
+ {
+ if( textp[0] == '^' && textp[1] == 'I' )
+ {
+ textp[0] = ' ';
+ textp[1] = ' ';
+ textp++;
+ }
+
+ }
+ while( *(++textp) != '\0' );
+
+ /*printf( "Found text: %s\n", textvalue );*/
break;
case 8: layer = layer_find_by_name(data->value, dia);
break;
case 10:
- location.x = atof(data->value) / coord_scale;
+ location.x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "Found text location x: %f\n", location.x );*/
+ break;
+ case 11:
+ location.x = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "Found text location x: %f\n", location.x );*/
break;
case 20:
- location.y = (-1)*atof(data->value) / coord_scale;
+ location.y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*printf( "Found text location y: %f\n", location.y );*/
+ break;
+ case 21:
+ location.y = (-1)*atof(data->value) * coord_scale * measure_scale;
+ /*location.y = (-1)*atof(data->value) / text_scale;*/
+ printf( "Found text location y: %f\n", location.y );
break;
case 40:
- height = atof(data->value) / coord_scale;
+ height = atof(data->value) * coord_scale * measure_scale;
+ /*printf( "text height %f\n", height );*/
+ break;
+ case 62:
+ colour = atoi(data->value);
+ text_colour.red = acad_pal[colour].r / 255.0;
+ text_colour.green = acad_pal[colour].g / 255.0;
+ text_colour.blue = acad_pal[colour].b / 255.0;
break;
case 72:
- switch(atoi(data->value)){
- case 0: textalignment = ALIGN_LEFT;
+ switch(atoi(data->value))
+ {
+ case 0:
+ textalignment = ALIGN_LEFT;
break;
- case 1: textalignment = ALIGN_CENTER;
+ case 1:
+ textalignment = ALIGN_CENTER;
break;
- case 2: textalignment = ALIGN_RIGHT;
+ case 2:
+ textalignment = ALIGN_RIGHT;
+ break;
+ case 3:
+ // FIXME - it's not clear what these are
+ break;
+ case 4:
+ // FIXME - it's not clear what these are
+ break;
+ case 5:
+ // FIXME - it's not clear what these are
+ break;
+ }
+ break;
+ case 73:
+ switch(atoi(data->value))
+ {
+ case 0:
+ case 1:
+ // FIXME - not really the same vertical alignment
+ // 0 = baseline
+ // 1 = bottom
+ y_offset = 0;
+ break;
+ case 2:
+ // 2 = middle
+ y_offset = 0.5;
+ break;
+ case 3:
+ // 3 = top
+ y_offset = 1;
break;
}
+ break;
}
} while(codedxf != 0);
setlocale(LC_NUMERIC,old_locale);
+ location.y += y_offset * height;
+
text_obj = otype->ops->create(&location, otype->default_user_data,
&h1, &h2);
layer_add_object(layer, text_obj);
@@ -527,17 +1002,19 @@
tprop->attr.alignment = textalignment;
tprop->attr.position.x = location.x;
tprop->attr.position.y = location.y;
- tprop->attr.font = dia_font_new_from_style(DIA_FONT_MONOSPACE,height);
+ tprop->attr.font = font_getfont(_("Courier"));
tprop->attr.height = height;
+ tprop->attr.color = text_colour;
text_obj->ops->set_props(text_obj, props);
prop_list_free(props);
+
+ return( text_obj );
}
/* reads the layer table from the dxf file and creates the layers */
void read_table_layer_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
int codedxf;
- Layer *layer;
do {
if(read_dxf_codes(filedxf, data) == FALSE){
@@ -546,13 +1023,129 @@
else {
codedxf = atoi(data->code);
if(codedxf == 2){
- layer = new_layer(g_strdup(data->value));
- data_add_layer(dia, layer);
+ layer_find_by_name( data->value, dia );
}
}
} while ((codedxf != 0) || (strcmp(data->value, "ENDTAB") != 0));
}
+/* reads a scale entity from the dxf file */
+void read_entity_scale_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
+ int codedxf;
+
+ if(read_dxf_codes(filedxf, data) == FALSE)
+ return;
+
+ codedxf = atoi(data->code);
+
+ switch(codedxf)
+ {
+ case 40:
+ coord_scale = atof(data->value);
+ printf( "Scale: %f\n", coord_scale );
+ break;
+
+ default:
+ break;
+ }
+
+}
+
+/* reads a scale entity from the dxf file */
+void read_entity_measurement_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
+ int codedxf;
+
+ if(read_dxf_codes(filedxf, data) == FALSE)
+ return;
+
+ codedxf = atoi(data->code);
+
+ switch(codedxf)
+ {
+ case 70:
+ // value 0 = English, 1 = Metric
+ if( atoi( data->value ) == 0 )
+ measure_scale = 2.54;
+ else
+ measure_scale = 1.0;
+ /*printf( "Measure Scale: %f\n", measure_scale );*/
+ break;
+
+ default:
+ break;
+ }
+
+}
+
+/* reads a textsize entity from the dxf file */
+void read_entity_textsize_dxf(FILE *filedxf, DxfData *data, DiagramData *dia){
+ int codedxf;
+
+ if(read_dxf_codes(filedxf, data) == FALSE)
+ return;
+
+ codedxf = atoi(data->code);
+
+ switch(codedxf)
+ {
+ case 40:
+ text_scale = atof(data->value);
+ /*printf( "Text Size: %f\n", text_scale );*/
+ break;
+ default:
+ break;
+ }
+
+}
+
+/* reads the headers section of the dxf file */
+void read_section_header_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) {
+ int codedxf;
+
+ if(read_dxf_codes(filedxf, data) == FALSE){
+ return;
+ }
+ do {
+ codedxf = atoi(data->code);
+ if((codedxf == 9) && (strcmp(data->value, "$DIMSCALE") == 0)) {
+ read_entity_scale_dxf(filedxf, data, dia);
+ } else if((codedxf == 9) && (strcmp(data->value, "$TEXTSIZE") == 0)) {
+ read_entity_textsize_dxf(filedxf, data, dia);
+ } else if((codedxf == 9) && (strcmp(data->value, "$MEASUREMENT") == 0)) {
+ read_entity_measurement_dxf(filedxf, data, dia);
+ } else {
+ if(read_dxf_codes(filedxf, data) == FALSE){
+ return;
+ }
+
+ }
+ } while ((codedxf != 0) || (strcmp(data->value, "ENDSEC") != 0));
+}
+
+/* reads the classes section of the dxf file */
+void read_section_classes_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) {
+ int codedxf;
+
+ if(read_dxf_codes(filedxf, data) == FALSE){
+ return;
+ }
+ do {
+ codedxf = atoi(data->code);
+ if((codedxf == 9) && (strcmp(data->value, "$LTSCALE") == 0)) {
+ read_entity_scale_dxf(filedxf, data, dia);
+ } else if((codedxf == 9) && (strcmp(data->value, "$TEXTSIZE") == 0)) {
+ read_entity_textsize_dxf(filedxf, data, dia);
+ } else {
+ if(read_dxf_codes(filedxf, data) == FALSE){
+ return;
+ }
+
+ }
+ } while ((codedxf != 0) || (strcmp(data->value, "ENDSEC") != 0));
+}
+
/* reads the tables section of the dxf file */
void read_section_tables_dxf(FILE *filedxf, DxfData *data, DiagramData *dia) {
int codedxf;
@@ -584,6 +1177,12 @@
do {
if((codedxf == 0) && (strcmp(data->value, "LINE") == 0)) {
read_entity_line_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "VERTEX") == 0)) {
+ read_entity_line_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "SOLID") == 0)) {
+ read_entity_solid_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "POLYLINE") == 0)) {
+ read_entity_polyline_dxf(filedxf, data, dia);
} else if((codedxf == 0) && (strcmp(data->value, "CIRCLE") == 0)) {
read_entity_circle_dxf(filedxf, data, dia);
} else if((codedxf == 0) && (strcmp(data->value, "ELLIPSE") == 0)) {
@@ -593,9 +1192,6 @@
} else if((codedxf == 0) && (strcmp(data->value, "ARC") == 0)) {
read_entity_arc_dxf(filedxf,data,dia);
} else {
- /* if (codedxf == 0) {
- g_warning("unknown DXF entity: %s",data->value);
- }*/
if(read_dxf_codes(filedxf, data) == FALSE) {
return;
}
@@ -604,6 +1200,93 @@
} while((codedxf != 0) || (strcmp(data->value, "ENDSEC") != 0));
}
+/* reads the blocks section of the dxf file */
+void read_section_blocks_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
+{
+ int codedxf, group_items = 0, group;
+ GList *group_list;
+ Object *obj = NULL;
+ Layer *group_layer = NULL;
+
+ if (read_dxf_codes(filedxf, data) == FALSE){
+ return;
+ }
+ codedxf = atoi(data->code);
+ do {
+ if((codedxf == 0) && (strcmp(data->value, "LINE") == 0)) {
+ read_entity_line_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "SOLID") == 0)) {
+ obj = read_entity_solid_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "VERTEX") == 0)) {
+ read_entity_line_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "POLYLINE") == 0)) {
+ obj = read_entity_polyline_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "CIRCLE") == 0)) {
+ read_entity_circle_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "ELLIPSE") == 0)) {
+ read_entity_ellipse_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "TEXT") == 0)) {
+ obj = read_entity_text_dxf(filedxf, data, dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "ARC") == 0)) {
+ read_entity_arc_dxf(filedxf,data,dia);
+ } else if((codedxf == 0) && (strcmp(data->value, "BLOCK") == 0)) {
+ printf( "Begin group\n" );
+
+ group = TRUE;
+ group_items = 0;
+ group_list = NULL;
+ group_layer = NULL;
+
+ do {
+ if(read_dxf_codes(filedxf, data) == FALSE)
+ return;
+
+ codedxf = atoi(data->code);
+
+ if( codedxf == 8 )
+ group_layer = layer_find_by_name( data->value, dia );
+
+ } while( codedxf != 0 );
+
+ } else if((codedxf == 0) && (strcmp(data->value, "ENDBLK") == 0)) {
+ printf( "End group %d\n", group_items );
+
+ if( group && group_items > 0 && group_list != NULL )
+ {
+ obj = group_create( group_list );
+ if( NULL == group_layer )
+ layer_add_object( dia->active_layer, obj );
+ else
+ layer_add_object( group_layer, obj );
+ }
+
+ group = FALSE;
+ group_items = 0;
+ group_list = NULL;
+ obj = NULL;
+
+ if(read_dxf_codes(filedxf, data) == FALSE)
+ return;
+
+ } else {
+ if(read_dxf_codes(filedxf, data) == FALSE) {
+ return;
+ }
+ }
+
+ if( group && obj != NULL )
+ {
+ group_items++;
+
+ group_list = g_list_prepend( group_list, obj );
+
+ obj = NULL;
+ }
+
+ codedxf = atoi(data->code);
+ } while((codedxf != 0) || (strcmp(data->value, "ENDSEC") != 0));
+}
+
/* imports the given dxf-file, returns TRUE if successful */
gboolean import_dxf(const gchar *filename, DiagramData *dia, void* user_data){
FILE *filedxf;
@@ -621,18 +1304,39 @@
do {
if(read_dxf_codes(filedxf, data) == FALSE) {
g_free(data);
+ printf( "read_dxf_codes failed\n" );
return FALSE;
}
else {
codedxf = atoi(data->code);
if(codedxf == 2) {
if(strcmp(data->value, "ENTITIES") == 0) {
+ /*printf( "reading section entities\n" );*/
read_section_entities_dxf(filedxf, data, dia);
}
+ else if(strcmp(data->value, "BLOCKS") == 0) {
+ /*printf( "reading section BLOCKS\n" );*/
+ read_section_blocks_dxf(filedxf, data, dia);
+ }
+ else if(strcmp(data->value, "CLASSES") == 0) {
+ /*printf( "reading section CLASSES\n" );*/
+ read_section_classes_dxf(filedxf, data, dia);
+ }
+ else if(strcmp(data->value, "HEADER") == 0) {
+ /*printf( "reading section HEADER\n" );*/
+ read_section_header_dxf(filedxf, data, dia);
+ }
else if(strcmp(data->value, "TABLES") == 0) {
+ /*printf( "reading section tables\n" );*/
read_section_tables_dxf(filedxf, data, dia);
}
+ else if(strcmp(data->value, "OBJECTS") == 0) {
+ /*printf( "reading section objects\n" );*/
+ read_section_entities_dxf(filedxf, data, dia);
}
+ }
+ else
+ printf( "Unknown dxf code %d\n", codedxf );
}
}while((codedxf != 0) || (strcmp(data->value, "EOF") != 0));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]