⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawing.c

📁 AutoCAD DWG-file viewer
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************/
/*			COPYRIGHT NOTICE			*/
/*			----------------			*/
/*  All software in this listing remain the strict copyright	*/
/*  of Ilija Kovacevic and cannot be copied or used in any way	*/
/*  except by written permission of Ilija Kovacevic.		*/
/*								*/
/*	Copyright (c) 1992 Ilija Kovacevic			*/
/*	www.kov.com   email ilija@kov.com			*/
/****************************************************************/

#define DWGINLOC /* define globals to this module */
#include "dwgin.h"

PRIVATE boolean read_entity( void );

static AcadEntity *entities;
static AcadEntity *last_entity;

PUBLIC AcadDrawing *AcadDrawing__create( char *name )

{
char full_name[ 256 ];
AcadDrawing *drawing;

__drawing = drawing = ( AcadDrawing * )get_memory( sizeof( AcadDrawing ) );
strcpy( full_name,name );
/*set_extension( full_name,"dwg" );*/
drawing->name = get_memory( strlen( full_name )+1 );
strcpy( drawing->name,full_name );
drawing->header = NULL;
drawing->viewport = NULL;
drawing->line_type = NULL;
drawing->layer = NULL;
drawing->block = NULL;
drawing->font_style = NULL;
drawing->view = NULL;
drawing->ucs = NULL;
drawing->appid = NULL;
drawing->dim_style = NULL;
drawing->entities = NULL;
return( drawing );
}


PRIVATE void free_viewports( void )

{
int viewport;
for( viewport = 0; viewport < __drawing->header->viewports; ++viewport )
	{
	AcadViewPort__delete( __drawing->viewport[ viewport ] );
	}
if ( __drawing->viewport ) free( ( char * )__drawing->viewport );
}


PRIVATE void free_line_types( void )

{
int line_type;
for( line_type = 0; line_type < __drawing->header->line_types; ++line_type )
	{
	AcadLineType__delete( __drawing->line_type[ line_type ] );
	}
if ( __drawing->line_type ) free( ( char * )__drawing->line_type );
}


PRIVATE void free_layers( void )

{
int layer;
for( layer = 0; layer < __drawing->header->layers; ++layer )
	{
	AcadLayer__delete( __drawing->layer[ layer ] );
	}
if ( __drawing->layer ) free( ( char * )__drawing->layer );
}


PRIVATE void free_entities( AcadEntity *entities )

{
AcadEntity *scrap;

for ( ; entities; )
	{
	scrap = entities;
	entities = entities->next;
	switch( scrap->type )
		{
		case ACAD_LINE		:AcadLine__delete( ( AcadLine * )scrap );
					 break;
		case ACAD_ARC		:AcadArc__delete( ( AcadArc * )scrap );
					 break;
		case ACAD_CIRCLE	:AcadCircle__delete( ( AcadCircle * )scrap );
					 break;
		case ACAD_POINT		:AcadPoint__delete( ( AcadPoint * )scrap );
					 break;
		case ACAD_TRACE		:AcadTrace__delete( ( AcadTrace * )scrap );
					 break;
		case ACAD_LINE3D	:AcadLine3d__delete( ( AcadLine3d * )scrap );
					 break;
		case ACAD_FACE3D	:AcadFace3d__delete( ( AcadFace3d * )scrap );
					 break;
		case ACAD_ATTDEF	:AcadAttdef__delete( ( AcadAttdef * )scrap );
					 break;
		case ACAD_ATTRIB	:AcadAttrib__delete( ( AcadAttrib * )scrap );
					 break;
		case ACAD_TEXT		:AcadText__delete( ( AcadText * )scrap );
					 break;
		case ACAD_SOLID		:AcadSolid__delete( ( AcadSolid * )scrap );
					 break;
		case ACAD_DIMENSION	:AcadDimension__delete( ( AcadDimension * )scrap );
					 break;
		case ACAD_INSERT	:AcadInsert__delete( ( AcadInsert * )scrap );
					 break;
		case ACAD_INSERT_BASE	:AcadInsertBase__delete( ( AcadInsertBase * )scrap );
					 break;
		case ACAD_SHAPE		:AcadShape__delete( ( AcadShape * )scrap );
					 break;
		case ACAD_ENDBLK	:AcadEndBlk__delete( ( AcadEndBlk * )scrap );
					 break;
		case ACAD_VERTEX	:AcadVertex__delete( ( AcadVertex * )scrap );
					 break;
		case ACAD_PLINE		:AcadPline__delete( ( AcadPline * )scrap );
					 break;
		case ACAD_SEQEND	:AcadSeqend__delete( ( AcadSeqend * )scrap );
					 break;
		case ACAD_VPORT		:AcadVport__delete( ( AcadVport * )scrap );
					 break;
		default			:;
					 break;
		}
	}
}


PRIVATE void free_blocks( void )

{
for( current_block = 0; current_block < __drawing->header->blocks; ++current_block )
	{
	free_entities( __drawing->block[ current_block ]->entities );
	AcadBlock__delete( __drawing->block[ current_block ] );
	}
if ( __drawing->block ) free( ( char * )__drawing->block );
}


PRIVATE void free_font_styles( void )

{
int font_style;
for( font_style = 0; font_style < __drawing->header->styles; ++font_style )
	{
	AcadFontStyle__delete( __drawing->font_style[ font_style ] );
	}
if ( __drawing->font_style ) free( ( char * )__drawing->font_style );
}


PRIVATE void free_views( void )

{
int view;
for( view = 0; view < __drawing->header->views; ++view )
	{
	AcadView__delete( __drawing->view[ view ] );
	}
if ( __drawing->view ) free( ( char * )__drawing->view );
}


PRIVATE void free_ucss( void )

{
int ucs;
for( ucs = 0; ucs < __drawing->header->ucss; ++ucs )
	{
	AcadUcs__delete( __drawing->ucs[ ucs ] );
	}
if ( __drawing->ucs ) free( ( char * )__drawing->ucs );
}


PRIVATE void free_appids( void )

{
int appid;
for( appid = 0; appid < __drawing->header->applications; ++appid )
	{
	AcadAppID__delete( __drawing->appid[ appid ] );
	}
if ( __drawing->appid ) free( ( char * )__drawing->appid );
}


PRIVATE void free_dim_styles( void )

{
int dim_style;
for( dim_style = 0; dim_style < __drawing->header->dimstyles; ++dim_style )
	{
	AcadDimStyle__delete( __drawing->dim_style[ dim_style ] );
	}
if ( __drawing->dim_style ) free( ( char * )__drawing->dim_style );
}


PUBLIC void AcadDrawing__delete( AcadDrawing *drawing )

{
if ( drawing->name ) free( drawing->name );
if ( drawing->header ) free( ( char * )drawing->header );
if ( drawing->viewport ) free_viewports();
if ( drawing->line_type ) free_line_types();
if ( drawing->layer ) free_layers();
if ( drawing->block ) free_blocks();
if ( drawing->font_style ) free_font_styles();
if ( drawing->view ) free_views();
if ( drawing->ucs ) free_ucss();
if ( drawing->appid ) free_appids();
if ( drawing->dim_style ) free_dim_styles();
if ( drawing->entities ) free_entities( drawing->entities );
if ( drawing ) free( ( char * )drawing );
}


PRIVATE void read_header( void )

{
__drawing->header = AcadHeader__create();
AcadHeader__read( __drawing->header );
if ( debugger ) AcadHeader__dump_to_debug_file( __drawing->header );
}


PRIVATE void read_viewports( void )

{
int viewport;
INT32 new_file_position;

if ( !__drawing->header->viewports ) return;
file_seek( __drawing->header->viewports_start );	
__drawing->viewport = ( AcadViewPort ** )get_memory( __drawing->header->viewports*sizeof( AcadViewPort ) );
for( viewport = 0; viewport < __drawing->header->viewports; ++viewport )
	{
	new_file_position = __drawing->file_position + __drawing->header->viewports_size;
	__drawing->viewport[ viewport ] = AcadViewPort__create();
	AcadViewPort__read( __drawing->viewport[ viewport ] );
	if ( debugger ) AcadViewPort__dump_to_debug_file( __drawing->viewport[ viewport ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_line_types( void )

{
int line_type;
INT32 new_file_position;

if ( !__drawing->header->line_types ) return;
file_seek( __drawing->header->line_types_start );	
__drawing->line_type = ( AcadLineType ** )get_memory( __drawing->header->line_types*sizeof( AcadLineType ) );
for( line_type = 0; line_type < __drawing->header->line_types; ++line_type )
	{
	new_file_position = __drawing->file_position + __drawing->header->line_type_size;
	__drawing->line_type[ line_type ] = AcadLineType__create();
	AcadLineType__read( __drawing->line_type[ line_type ] );
	if ( debugger ) AcadLineType__dump_to_debug_file( __drawing->line_type[ line_type ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_blocks( void )

{
INT32 new_file_position;
char block_name_start[ 0x20 ];
int block;

if ( !__drawing->header->blocks ) return;
file_seek( __drawing->header->block_names_start );	
if ( __drawing->acad11 ) get_array( &block_name_start,sizeof( block_name_start ) );
__drawing->block = ( AcadBlock ** )get_memory( __drawing->header->blocks*sizeof( AcadBlock ) );
for( block = 0; block < __drawing->header->blocks; ++block )
	{
	new_file_position = __drawing->file_position + __drawing->header->block_name_size;
	__drawing->block[ block ] = AcadBlock__create();
	AcadBlock__read( __drawing->block[ block ],block );
	if ( debugger ) AcadBlock__dump_to_debug_file( __drawing->block[ block ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_layers( void )

{
int layer;
INT32 new_file_position;

if ( !__drawing->header->layers ) return;
file_seek( __drawing->header->layers_start );	
__drawing->layer = ( AcadLayer ** )get_memory( __drawing->header->layers*sizeof( AcadLayer ) );
for( layer = 0; layer < __drawing->header->layers; ++layer )
	{
	new_file_position = __drawing->file_position + __drawing->header->layer_size;
	__drawing->layer[ layer ] = AcadLayer__create();
	AcadLayer__read( __drawing->layer[ layer ] );
	if ( debugger ) AcadLayer__dump_to_debug_file( __drawing->layer[ layer ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_font_styles( void )

{
int font_style;
INT32 new_file_position;

if ( !__drawing->header->styles ) return;
file_seek( __drawing->header->font_styles_start );	
__drawing->font_style = ( AcadFontStyle ** )get_memory( __drawing->header->styles*sizeof( AcadFontStyle ) );
for( font_style = 0; font_style < __drawing->header->styles; ++font_style )
	{
	new_file_position = __drawing->file_position + __drawing->header->font_styles_size;
	__drawing->font_style[ font_style ] = AcadFontStyle__create();
	AcadFontStyle__read( __drawing->font_style[ font_style ] );
	if ( debugger ) AcadFontStyle__dump_to_debug_file( __drawing->font_style[ font_style ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_views( void )

{
int view;
INT32 new_file_position;

if ( !__drawing->header->views ) return;
file_seek( __drawing->header->views_start );	
__drawing->view = ( AcadView ** )get_memory( __drawing->header->views*sizeof( AcadView ) );
for( view = 0; view < __drawing->header->views; ++view )
	{
	new_file_position = __drawing->file_position + __drawing->header->view_size;
	__drawing->view[ view ] = AcadView__create();
	AcadView__read( __drawing->view[ view ] );
	if ( debugger ) AcadView__dump_to_debug_file( __drawing->view[ view ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_ucss( void )

{
int ucs;
INT32 new_file_position;

if ( !__drawing->header->ucss ) return;
file_seek( __drawing->header->ucss_start );	
__drawing->ucs = ( AcadUcs ** )get_memory( __drawing->header->ucss*sizeof( AcadUcs ) );
for( ucs = 0; ucs < __drawing->header->ucss; ++ucs )
	{
	new_file_position = __drawing->file_position + __drawing->header->ucss_size;
	__drawing->ucs[ ucs ] = AcadUcs__create();
	AcadUcs__read( __drawing->ucs[ ucs ] );
	if ( debugger ) AcadUcs__dump_to_debug_file( __drawing->ucs[ ucs ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_appids( void )

{
int appid;
INT32 new_file_position;

if ( !__drawing->header->applications ) return;
file_seek( __drawing->header->applications_start );	
__drawing->appid = ( AcadAppID ** )get_memory( __drawing->header->applications*sizeof( AcadAppID ) );
for( appid = 0; appid < __drawing->header->applications; ++appid )
	{
	new_file_position = __drawing->file_position + __drawing->header->applications_size;
	__drawing->appid[ appid ] = AcadAppID__create();
	AcadAppID__read( __drawing->appid[ appid ] );
	if ( debugger ) AcadAppID__dump_to_debug_file( __drawing->appid[ appid ] );
	file_seek( new_file_position );
	}
}


PRIVATE void read_dim_styles( void )

{
int dim_style;
INT32 new_file_position;

if ( !__drawing->header->dimstyles ) return;
file_seek( __drawing->header->dimstyles_start );	
__drawing->dim_style = ( AcadDimStyle ** )get_memory( __drawing->header->dimstyles*sizeof( AcadDimStyle ) );
for( dim_style = 0; dim_style < __drawing->header->dimstyles; ++dim_style )
	{
	new_file_position = __drawing->file_position + __drawing->header->dimstyles_size;
	__drawing->dim_style[ dim_style ] = AcadDimStyle__create();
	AcadDimStyle__read( __drawing->dim_style[ dim_style ] );
	if ( debugger ) AcadDimStyle__dump_to_debug_file( __drawing->dim_style[ dim_style ] );
	file_seek( new_file_position );
	}
}


PRIVATE void add_entity( AcadEntity *entity, UINT8 type )

{
if ( entities )
	{
	last_entity->next = entity;
	last_entity = last_entity->next;
	}
else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -