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

📄 block.c

📁 AutoCAD DWG-file viewer
💻 C
字号:
/****************************************************************/
/*			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			*/
/****************************************************************/

#include "dwgin.h"

PUBLIC AcadBlock *AcadBlock__create( void )

{
AcadBlock *me;

me = ( AcadBlock * )get_memory( sizeof( AcadBlock ) );
me->name = NULL;
me->full_name = NULL;
return( me );
}


PUBLIC void AcadBlock__delete( AcadBlock *me )

{
if ( me->name ) free( me->name );
if ( me->full_name ) free( me->full_name );
free( ( char * )me );
}


PUBLIC void AcadBlock__read( AcadBlock *me ,int index )

{
char unknown3[ 7 ];
UINT8 unknown = 0;
char temp_name[ 0x20 ];

me->index = index;
if ( debugger ) dprintf( "\nBLOCK NAME ------------------------------------------------\n" );
get_UINT8( &me->flag );
get_array( &temp_name,sizeof( temp_name ) );
me->name = get_memory( strlen( temp_name )+1 );
strcpy( me->name,temp_name );
get_INT32( &me->reserved ); 
if ( __drawing->acad11 ) get_array( &unknown3,sizeof( unknown3 ) );
if ( __drawing->header->block_name_size > sizeof( me->flag ) + sizeof( temp_name ) + sizeof( me->reserved ) ) get_UINT8( &unknown );
if ( __drawing->acad11 ) me->offset = (( me->reserved >> 16 )&0xffff) + ( ( INT32 )( unknown3[ 0 ]&0xff ) << 16 );
#ifdef DOS
else me->offset = me->reserved & 0xffffffL; 
#else
else me->offset = me->reserved & 0xffffff; 
#endif
if ( __drawing->acad11 AND me->flag & 0x4 ) me->external = true;
else me->external = false;
if ( me->flag & 0x80 ) me->deleted = 1;
else me->deleted = 0;
if ( me->flag & 0x40 ) me->referenced = 1;
else me->referenced = 0;
if ( me->flag & 0x20 ) me->resolved = 1;
else me->resolved = 0;
if ( me->flag & 0x10 ) me->dependant = 1;
else me->dependant = 0;
if ( __drawing->acad11 AND me->flag & 0x4 ) me->xref = 1;
else me->xref = 0;
if ( me->flag & 0x2 ) me->attributes = 1;
else me->attributes = 0;
if ( me->flag & 0x1 ) me->anonymous = 1;
else me->anonymous = 0;
if ( me->anonymous )
	{
	me->full_name = get_memory( strlen( me->name )+1 + 6 ); /* 6 is max length of index */
	sprintf( me->full_name,"%s%d",me->name,me->index );
	}
else
	{
	me->full_name = get_memory( strlen( me->name )+1 );
	strcpy( me->full_name,me->name );
	}
me->entities = NULL;
}


PUBLIC void AcadBlock__dump_to_debug_file( AcadBlock *me )

{
dprintf( "BLOCK NAME\n" );
dprintf( "\tindex %d",me->index );
dprintf( "\tname [%s]",me->name );
dprintf( "\tfull name [%s]",me->full_name );
if ( me->deleted ) dprintf( " deleted" );  
if ( me->anonymous ) dprintf( " also known as [%s]",me->full_name );  
if ( me->deleted ) dprintf( " deleted" );
if ( me->referenced ) dprintf( " referenced" );
if ( me->resolved ) dprintf( " resolved" );
if ( me->dependant ) dprintf( " dependant" );
if ( me->xref ) dprintf( " xref" );
if ( me->attributes ) dprintf( " attributes" );
if ( me->anonymous ) dprintf( " anonymous" );
dprintf( "\n" );
dprintf( "offset %lx\n",me->offset );
}


boolean AcadBlock__contains_attributes( AcadBlock *me )

{
if ( me->flag & 0x2 ) return( true );
else return( false );
}


PUBLIC void AcadBlock__write( AcadBlock *me )

{
char *temp_name;

put_UINT8( me->flag );
temp_name = get_memory( 0x20 );
strcpy( temp_name,me->name );
put_array( temp_name,0x20 );
free( temp_name );
put_INT32( me->reserved ); 
}


void set_block_names_offset( INT32 blocks_start,INT32 block_names_start,int current_block )

{
INT32 offset;
INT32 position;

position = block_names_start + 0x21 + current_block * 0x25;
offset = __drawing->file_position - blocks_start;
#ifdef BIG_ENDIAN
INT32_reverse( &offset );
#endif
lseek( __drawing->output_file,position,SEEK_SET ); 
write( __drawing->output_file,( char * )&offset,sizeof( offset ) ); 
lseek( __drawing->output_file,__drawing->file_position,SEEK_SET ); 
}

⌨️ 快捷键说明

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