/*****************************************************************************/
/* LibreDWG - free implementation of the DWG file format */
/* */
/* Copyright (C) 2009 Free Software Foundation, Inc. */
/* Copyright (C) 2010 Thien-Thi Nguyen */
/* Copyright (C) 2014 Oliver Dippel */
/* */
/* This library is free software, licensed under the terms of the GNU */
/* General Public License as published by the Free Software Foundation, */
/* either version 3 of the License, or (at your option) any later version. */
/* You should have received a copy of the GNU General Public License */
/* along with this program. If not, see . */
/*****************************************************************************/
/*
* testDXF.c: convert a DWG to DXF
* written by Oliver Dippel
*/
#include
#include
#include
#include
#include
#include
#include "../src/bits.h"
#include "suffix.c"
#define PI 3.14159265
#define toDeg(x) (x*180.0)/PI
int export_DXF(char *filename);
void output_DXF(Dwg_Data* dwg);
double model_xmin, model_ymin;
double page_width, page_height, scale;
int main (int argc, char *argv[]) {
REQUIRE_INPUT_FILE_ARG (argc);
return export_DXF(argv[1]);
}
int export_DXF (char *filename) {
int error;
Dwg_Data dwg;
error = dwg_read_file(filename, &dwg);
if (!error) {
output_DXF(&dwg);
}
dwg_free(&dwg);
return error ? 1 : 0;
}
void output_TEXT (Dwg_Object* obj) {
Dwg_Entity_TEXT* text;
text = obj->tio.entity->tio.TEXT;
if (text->text_value[0] == '&') return;
printf(" 0\nMTEXT\n 999\n#%d\n 10\n%f\n 20\n%f\n 40\n%f\n 1\n%s\n", obj->index, text->insertion_pt.x, text->insertion_pt.y + text->height, text->height, text->text_value);
}
void output_LINE (Dwg_Object* obj) {
Dwg_Entity_LINE* line;
line = obj->tio.entity->tio.LINE;
printf(" 0\nLINE\n 999\n#%d\n 10\n%f\n 20\n%f\n 11\n%f\n 21\n%f\n", obj->index, line->start.x, line->start.y, line->end.x, line->end.y);
}
void output_CIRCLE (Dwg_Object* obj) {
Dwg_Entity_CIRCLE* circle;
circle = obj->tio.entity->tio.CIRCLE;
printf(" 0\nCIRCLE\n 999\n#%d\n 10\n%f\n 20\n%f\n 40\n%f\n", obj->index, circle->center.x, circle->center.y, circle->radius);
}
void output_ARC (Dwg_Object* obj) {
Dwg_Entity_ARC* arc;
arc = obj->tio.entity->tio.ARC;
printf(" 0\nARC\n 999\n#%d\n 10\n%f\n 20\n%f\n 40\n%f\n 50\n%f\n 51\n%f\n", obj->index, arc->center.x, arc->center.y, arc->radius, toDeg(arc->start_angle), toDeg(arc->end_angle));
}
void output_INSERT (Dwg_Object* obj) {
Dwg_Entity_INSERT* insert;
insert = obj->tio.entity->tio.INSERT;
}
void output_object (Dwg_Object* obj) {
if (!obj) {
fprintf(stderr, "object is NULL\n");
return;
}
if (obj->type == DWG_TYPE_INSERT) {
output_INSERT(obj);
}
if (obj->type == DWG_TYPE_LINE) {
output_LINE(obj);
}
if (obj->type == DWG_TYPE_CIRCLE) {
output_CIRCLE(obj);
}
if (obj->type == DWG_TYPE_TEXT) {
output_TEXT(obj);
}
if (obj->type == DWG_TYPE_ARC) {
output_ARC(obj);
}
}
void output_BLOCK_HEADER(Dwg_Object_Ref* ref) {
Dwg_Object* obj;
Dwg_Object_BLOCK_HEADER* hdr;
if (!ref) {
fprintf(stderr, "Found null object reference. Could not output an DXF symbol for this BLOCK_HEADER\n");
return;
}
if (!ref->obj) {
fprintf(stderr, "Found null ref->obj\n");
return;
}
if (!ref->obj->tio.object) {
fprintf(stderr, "Found null ref->obj->tio.object\n");
return;
}
hdr = ref->obj->tio.object->tio.BLOCK_HEADER;
obj = get_first_owned_object(ref->obj, hdr);
while(obj) {
output_object(obj);
obj = get_next_owned_object(ref->obj, obj, hdr);
}
}
void output_DXF(Dwg_Data* dwg) {
unsigned int i;
Dwg_Object *obj;
model_xmin = dwg_model_x_min(dwg);
model_ymin = dwg_model_y_min(dwg);
double dx = (dwg_model_x_max(dwg) - dwg_model_x_min(dwg));
double dy = (dwg_model_y_max(dwg) - dwg_model_y_min(dwg));
double scale_x = dx / (dwg_page_x_max(dwg) - dwg_page_x_min(dwg));
double scale_y = dy / (dwg_page_y_max(dwg) - dwg_page_y_min(dwg));
page_width = dx;
page_height = dy;
printf("999\n");
printf("dxflib 2.2.0.0\n");
printf(" 0\n");
printf("SECTION\n");
printf(" 2\n");
printf("ENTITIES\n");
obj = &dwg->object[0];
if (obj->type != DWG_TYPE_BLOCK_CONTROL) {
fprintf(stderr, "ERROR: First object is not a BLOCK_CONTROL\n");
return;
}
Dwg_Object_BLOCK_CONTROL* block_control;
block_control = obj->tio.object->tio.BLOCK_CONTROL;
for (i=0; inum_entries; i++) {
output_BLOCK_HEADER(block_control->block_headers[i]);
}
output_BLOCK_HEADER(block_control->model_space);
output_BLOCK_HEADER(block_control->paper_space);
printf(" 0\n");
printf("ENDSEC\n");
}