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

📄 drawing.c

📁 AutoCAD DWG-file viewer
💻 C
📖 第 1 页 / 共 3 页
字号:



PUBLIC char *dimstyle_name( int index )

{
if ( index <= 0 ) return( "*UNNAMED" );
if ( index > __drawing->header->dimstyles ) return( "*UNNAMED" );
return( __drawing->dim_style[ index-1 ]->name );
}



PUBLIC char *this_block_full_name( int *flag )

{
*flag = __drawing->block[ current_block ]->flag;
return( __drawing->block[ current_block ]->full_name );
}



PUBLIC char *this_block_name( void )

{
return( __drawing->block[ current_block ]->name );
}


PUBLIC char *style_name( int index )

{
if ( index < 0 ) return( "STANDARD" );
if ( index >= __drawing->header->styles ) return( "STANDARD" );
return( __drawing->font_style[ index ]->name );
}


PRIVATE void dump_entities_to_debug_file( AcadEntity *entity )

{
for ( ; entity; entity = entity->next )
	{
	switch( entity->type )
		{
		case ACAD_LINE		:AcadLine__dump_to_debug_file( ( AcadLine * )entity );
					 break;
		case ACAD_ARC		:AcadArc__dump_to_debug_file( ( AcadArc * )entity );
					 break;
		case ACAD_CIRCLE	:AcadCircle__dump_to_debug_file( ( AcadCircle * )entity );
					 break;
		case ACAD_POINT		:AcadPoint__dump_to_debug_file( ( AcadPoint * )entity );
					 break;
		case ACAD_TRACE		:AcadTrace__dump_to_debug_file( ( AcadTrace * )entity );
					 break;
		case ACAD_LINE3D	:AcadLine3d__dump_to_debug_file( ( AcadLine3d * )entity );
					 break;
		case ACAD_FACE3D	:AcadFace3d__dump_to_debug_file( ( AcadFace3d * )entity );
					 break;
		case ACAD_ATTDEF	:AcadAttdef__dump_to_debug_file( ( AcadAttdef * )entity );
					 break;
		case ACAD_ATTRIB	:AcadAttrib__dump_to_debug_file( ( AcadAttrib * )entity );
					 break;
		case ACAD_TEXT		:AcadText__dump_to_debug_file( ( AcadText * )entity );
					 break;
		case ACAD_SOLID		:AcadSolid__dump_to_debug_file( ( AcadSolid * )entity );
					 break;
		case ACAD_DIMENSION	:AcadDimension__dump_to_debug_file( ( AcadDimension * )entity );
					 break;
		case ACAD_INSERT	:AcadInsert__dump_to_debug_file( ( AcadInsert * )entity );
					 break;
		case ACAD_INSERT_BASE	:AcadInsertBase__dump_to_debug_file( ( AcadInsertBase * )entity );
					 break;
		case ACAD_SHAPE		:AcadShape__dump_to_debug_file( ( AcadShape * )entity );
					 break;
		case ACAD_ENDBLK	:AcadEndBlk__dump_to_debug_file( ( AcadEndBlk * )entity );
					 break;
		case ACAD_VERTEX	:AcadVertex__dump_to_debug_file( ( AcadVertex * )entity );
					 break;
		case ACAD_PLINE		:AcadPline__dump_to_debug_file( ( AcadPline * )entity );
					 break;
		case ACAD_SEQEND	:AcadSeqend__dump_to_debug_file( ( AcadSeqend * )entity );
					 break;
		case ACAD_VPORT		:AcadVport__dump_to_debug_file( ( AcadVport * )entity );
					 break;
		default			:;
					 break;
		}
	}
}


PUBLIC void AcadDrawing__dump_to_debug_file( AcadDrawing *drawing )

{
int viewport;
int line_type;
int layer;
int view;
int ucs;
int appid;
int font_style;
int dim_style;

AcadHeader__dump_to_debug_file( drawing->header );

for( viewport = 0; viewport < drawing->header->viewports; ++viewport )
	{
	AcadViewPort__dump_to_debug_file( drawing->viewport[ viewport ] );
	}

for( line_type = 0; line_type < drawing->header->line_types; ++line_type )
	{
	AcadLineType__dump_to_debug_file( drawing->line_type[ line_type ] );
	}

for( current_block = 0; current_block < drawing->header->blocks; ++current_block )
	{
	AcadBlock__dump_to_debug_file( drawing->block[ current_block ] );
	dump_entities_to_debug_file( drawing->block[ current_block ]->entities );
	}

for( layer = 0; layer < drawing->header->layers; ++layer )
	{
	AcadLayer__dump_to_debug_file( drawing->layer[ layer ] );
	}

for( font_style = 0; font_style < drawing->header->styles; ++font_style )
	{
	AcadFontStyle__dump_to_debug_file( drawing->font_style[ font_style ] );
	}

for( view = 0; view < drawing->header->views; ++view )
	{
	AcadView__dump_to_debug_file( drawing->view[ view ] );
	}

for( ucs = 0; ucs < drawing->header->ucss; ++ucs )
	{
	AcadUcs__dump_to_debug_file( drawing->ucs[ ucs ] );
	}

for( appid = 0; appid < drawing->header->applications; ++appid )
	{
	AcadAppID__dump_to_debug_file( drawing->appid[ appid ] );
	}

for( dim_style = 0; dim_style < drawing->header->dimstyles; ++dim_style )
	{
	AcadDimStyle__dump_to_debug_file( drawing->dim_style[ dim_style ] );
	}

dump_entities_to_debug_file( drawing->entities );
}


PUBLIC void AcadDrawing__dxfout( AcadDrawing *drawing, char *name )

{
dxfout( drawing,name );
}


PUBLIC void AcadDrawing__read( AcadDrawing *drawing )

{
if ( ( drawing->source_file = open( drawing->name,O_RDONLY | O_BINARY ) ) < 0 ) read_error( "Unable to open %s",drawing->name );
drawing->drawing_size = filelength( drawing->source_file );
if ( verbose ) printf( "Header" );
read_header();
lseek( drawing->source_file,0L,SEEK_SET ); 
read_in_file();
if ( verbose ) printf( "\r      \rViewports" );
read_viewports();
if ( verbose ) printf( "\r         \rLine types" );
read_line_types();
if ( verbose ) printf( "\r          \rLayers" );
read_layers();
if ( verbose ) printf( "\r      \rFont styles" );
read_font_styles();
if ( verbose ) printf( "\r           \rViews" );
read_views();
if ( verbose ) printf( "\r     \rUcss" );
read_ucss();
if ( drawing->acad11 )
	{
	read_appids();
	read_dim_styles();
	}
if ( verbose ) printf( "\r    \rBlocks" );
read_blocks();
if ( verbose ) printf( "\r      \rEntities" );
read_entities();
if ( verbose ) printf( "\r        \rBlock entities" );
read_block_entities();
if ( verbose ) printf( "\r              \n" );
close( drawing->source_file );
}


PRIVATE void write_entities( AcadEntity *entity )

{
static INT32 seqend_parent;

for ( ; entity; entity = entity->next )
	{
	switch( entity->type )
		{
		case ACAD_LINE		:AcadLine__write( ( AcadLine * )entity );
					 break;
		case ACAD_ARC		:AcadArc__write( ( AcadArc * )entity );
					 break;
		case ACAD_CIRCLE	:AcadCircle__write( ( AcadCircle * )entity );
					 break;
		case ACAD_POINT		:AcadPoint__write( ( AcadPoint * )entity );
					 break;
		case ACAD_SOLID		:AcadSolid__write( ( AcadSolid * )entity );
					 break;
		case ACAD_VERTEX	:AcadVertex__write( ( AcadVertex * )entity );
					 break;
		case ACAD_PLINE		:seqend_parent = __drawing->file_position;
		                         AcadPline__write( ( AcadPline * )entity );
					 break;
		case ACAD_SEQEND	:AcadSeqend__write( ( AcadSeqend * )entity, seqend_parent );
					 break;
		case ACAD_TRACE		:AcadTrace__write( ( AcadTrace * )entity );
					 break;
		case ACAD_LINE3D	:AcadLine3d__write( ( AcadLine3d * )entity );
					 break;
		case ACAD_FACE3D	:AcadFace3d__write( ( AcadFace3d * )entity );
					 break;
		case ACAD_INSERT_BASE	:AcadInsertBase__write( ( AcadInsertBase * )entity );
					 break;
		case ACAD_ENDBLK	:AcadEndBlk__write( ( AcadEndBlk * )entity );
					 break;
		case ACAD_INSERT	:AcadInsert__write( ( AcadInsert * )entity );
					 break;
		case ACAD_ATTDEF	:AcadAttdef__write( ( AcadAttdef * )entity );
					 break;
		case ACAD_ATTRIB	:seqend_parent = __drawing->file_position;
					 AcadAttrib__write( ( AcadAttrib * )entity );
					 break;
		case ACAD_TEXT		:AcadText__write( ( AcadText * )entity );
					 break;
		case ACAD_DIMENSION	:AcadDimension__write( ( AcadDimension * )entity );
					 break;
		case ACAD_SHAPE		:AcadShape__write( ( AcadShape * )entity );
					 break;
		case ACAD_VPORT		:AcadVport__write( ( AcadVport * )entity );
					 break;
		default			:;
					 break;
		}
	}
}


PRIVATE void write_layers( AcadDrawing *drawing )

{
int layer;

if ( debugger ) dprintf( "Layers %lxH\n",drawing->file_position );
for( layer = 0; layer < drawing->header->layers; ++layer )
	{
	AcadLayer__write( drawing->layer[ layer ] );
	}
}


PRIVATE void write_viewports( AcadDrawing *drawing )

{
int viewport;

if ( debugger ) dprintf( "Viewports %lxH\n",drawing->file_position );
for( viewport = 0; viewport < drawing->header->viewports; ++viewport )
	{
	AcadViewPort__write( drawing->viewport[ viewport ] );
	}
}


PRIVATE void write_views( AcadDrawing *drawing )

{
int view;

if ( debugger ) dprintf( "Views %lxH\n",drawing->file_position );
for( view = 1; view < drawing->header->views; ++view )
	{
	AcadView__write( drawing->view[ view ] );
	}
}


PRIVATE void write_line_types( AcadDrawing *drawing )

{
int line_type;

if ( debugger ) dprintf( "line types %lxH\n",drawing->file_position );
for( line_type = 0; line_type < drawing->header->line_types; ++line_type )
	{
	AcadLineType__write( drawing->line_type[ line_type ] );
	}
}


PRIVATE void write_ucss( AcadDrawing *drawing )

{
int ucs;

if ( debugger ) dprintf( "UCSs %lxH\n",drawing->file_position );
for( ucs = 0; ucs < drawing->header->ucss; ++ucs )
	{
	AcadUcs__write( drawing->ucs[ ucs ] );
	}
}


PRIVATE void write_block_entities( AcadDrawing *drawing, INT32 blocks_start, INT32 block_names_start )

{
for( current_block = 0; current_block < drawing->header->blocks; ++current_block )
	{
	set_block_names_offset( blocks_start,block_names_start,current_block );
	write_entities( drawing->block[ current_block ]->entities );
	}
}


PRIVATE void write_block_names( AcadDrawing *drawing )

{
int block;

for ( block = 0; block < drawing->header->blocks; ++block )
	{
	AcadBlock__write( drawing->block[ block ] );
	}

}


PRIVATE void write_font_styles( AcadDrawing *drawing )

{
int font_style;

if ( debugger ) dprintf( "font styles %lxH\n",drawing->file_position );
for( font_style = 0; font_style < drawing->header->styles; ++font_style )
	{
	AcadFontStyle__write( drawing->font_style[ font_style ] );
	}
}


PUBLIC void AcadDrawing__write( AcadDrawing *drawing, char *name )

{
char full_name[ 256 ];
INT32 layers_start;
INT32 font_styles_start;
INT32 line_types_start;
INT32 views_start;
INT32 ucss_start;
INT32 viewports_start;
INT32 block_names_start;
INT32 blocks_start;
INT32 indirect_start;
INT32 dwgmgr_start;

strcpy( full_name,name );
if ( drawing->name ) free( drawing->name );
drawing->name = get_memory( strlen( full_name )+1 );
strcpy( drawing->name,full_name );

__drawing = drawing;
drawing->file_position = 0;

if ( ( drawing->output_file = open( drawing->name,O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666 ) ) < 0 ) 
	{
	warn_perror( "cannot open [%s]",drawing->name );
	read_error( "Failed" );
	}
AcadHeader__set_default( drawing->header );
AcadHeader__write( drawing->header );

write_entities( drawing->entities );

block_names_start = drawing->file_position;
write_block_names( drawing );

layers_start = drawing->file_position;
write_layers( drawing );

font_styles_start = drawing->file_position;
write_font_styles( drawing );

line_types_start = drawing->file_position;
write_line_types( drawing );

views_start = drawing->file_position;
write_views( drawing );

ucss_start = drawing->file_position;
write_ucss( drawing );

viewports_start = drawing->file_position;
write_viewports( drawing );

dwgmgr_start = drawing->file_position;
blocks_start = drawing->file_position;
write_block_entities( drawing,blocks_start,block_names_start );

indirect_start = drawing->file_position;

if ( debugger ) dprintf( "File end %lxH\n",drawing->file_position );

set_header_pointers( layers_start,font_styles_start,line_types_start,
		     views_start,ucss_start,viewports_start,blocks_start,
		     indirect_start,block_names_start,dwgmgr_start );

close( drawing->output_file );
}

⌨️ 快捷键说明

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