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

📄 entity.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 void AcadEntity__delete(  AcadEntity *me )

{
AcadExtendedEntity *scrap;

for( ; me->extended_entity; )
	{
	scrap = me->extended_entity;
	me->extended_entity = me->extended_entity->next;
	free( ( char * )scrap );
	}
}


PUBLIC void AcadEntity__dump_to_debug_file( AcadEntity *me )

{
if ( me->ucs ) dprintf( "\tUCS %lf,%lf,%lf\n",me->dir_x,me->dir_y,me->dir_z );
dprintf( "AcadEntity\n\tinfo %xH\n",me->info );
dprintf( "\tsize %xH\n",me->size );
dprintf( "\tlayer %xH\n",me->layer );
dprintf( "\tpflags %xH\n",me->pflags );
dprintf( "\tpaper space = %xH\n",me->paper_space );
}


PUBLIC void AcadEntity__read_elevation_etc( AcadEntity *me, boolean read_elevation, boolean read_thickness )

{
INT16 paper_space_flag;
UINT8 small_line_type;

me->extended_entity = NULL;
me->last_extended_entity = NULL;
me->paper_space = false;
me->ucs = false;
get_UINT8( &me->info );
get_INT16( &me->size );
get_INT16( &me->layer );
get_INT16( &me->pflags );

if ( reading_indirect ) return;

if ( __drawing->acad11 AND me->info&0x40 ) AcadEntity__read_extended_data( me );
me->color = 0;
me->line_type = 0;
if ( me->info&0x1 ) get_UINT8( &me->color );
else me->color = __drawing->layer[ me->layer ]->color;
if ( debugger ) dprintf( "\tColor %xH\n",me->color );
if ( me->info&0x2 ) 
	{
	if ( __drawing->acad11 ) get_INT16( &me->line_type );
	else
		{
		get_UINT8( &small_line_type );
		me->line_type = small_line_type;
		}
	if ( me->line_type&0x700 ) me->line_type = -1;  /* this is a BYBLOCK line type */
	}
me->elevation = me->thickness = 0.0;

if ( read_elevation )
	{
	if ( me->info&0x4 ) get_DOUBLE( &me->elevation );
	}
if ( read_thickness )
	{
	if ( me->info&0x8 ) get_DOUBLE( &me->thickness );
	}

	/* entity handles */
if ( ( __drawing->acad10 OR __drawing->acad11 ) AND me->info&0x20 ) 
	{
	if ( debugger ) dprintf( "\tHandle at %lxH\n",__drawing->file_position );
	get_UINT8( &me->handle_length );
	if ( debugger ) dprintf( "\tHandle length %xH\n",me->handle_length&0xff );
	me->handle_length &= 0xf;
	memcpy( me->handle,__drawing->file_pointer,me->handle_length );
	me->handle[ me->handle_length ] = NULL;
	__drawing->file_position += me->handle_length;
	__drawing->file_pointer += me->handle_length;
	AcadEntity__convert_handle_to_string( me->handle_name,me->handle );
	if ( debugger ) dprintf( "\tHandle >%s<\n",me->handle_name );
	}
else me->handle_length = 0;
if ( me->paper_space ) get_INT16( &paper_space_flag );
if ( debugger ) AcadExtendedEntity__dump_to_debug_file( me->extended_entity );
}


PUBLIC void AcadEntity__convert_handle_to_string( char *message,char *string )

{
boolean started = false;
for( ; *string; ++string )
	{
	int digit = ( ( *string )&0xf0 ) >> 4;
	if ( digit ) started = true;
	if ( started ) 
		{
		if ( digit > 9 ) *message++ = digit-10+'A';
		else *message++ = digit+'0';
		}
	digit = ( *string )&0xf;
	if ( digit ) started = true;
	if ( started ) 
		{
		if ( digit > 9 ) *message++ = digit-10+'A';
		else *message++ = digit+'0';
		}
	}
*message = NULL;
}


PUBLIC void AcadEntity__create( AcadEntity *me )

{
me->extended_entity = NULL;
me->last_extended_entity = NULL;
me->paper_space = false;
me->ucs = false;
get_UINT8( &me->info );
get_INT16( &me->size );
get_INT16( &me->layer );
get_INT16( &me->pflags );
}


PUBLIC void AcadEntity__dxfout( AcadEntity *me )

{
char buffer[ 40 ];
int index = 0;
char *p;
UINT8 length;
int character_code;

dxf_string( 8,layer_name( me->layer ) );

if ( me->info&0x2 ) 
	{
	if ( me->line_type >= 0 ) dxf_string( 6,line_type_name( me->line_type ) );
	else dxf_string( 6,"BYBLOCK" );
	}
if ( me->info&0x1 ) dxf_INT16( 62,me->color );
if ( me->paper_space ) dxf_INT16( 67,1 );
if ( __drawing->header->flatland AND me->elevation ) dxf_DOUBLE( 38,me->elevation );
if ( fabs( me->thickness ) > 0.0000000001 ) dxf_DOUBLE( 39,me->thickness );
if ( me->info&0x20 ) /* output handle */
	{
	index = 0;
	p = me->handle;
	length = 1;
	for( ; length <= me->handle_length; ++length, ++p )
		{
		character_code = ( *p >> 4 )&0xf;
		if ( character_code EQ 0 AND length EQ 1 ) /* leading 0 so do not output */;
		else 
			{
			if ( character_code <= 9 ) buffer[ index++ ] = character_code+'0';
			else buffer[ index++ ] = character_code-10+'A';
			}
		character_code = ( *p )&0xf;
		if ( character_code <= 9 ) buffer[ index++ ] = character_code+'0';
		else buffer[ index++ ] = character_code-10+'A';
		}
	buffer[ index ] = NULL;
 	dxf_string( 5,buffer );
	}
}


PUBLIC void AcadEntity__dxfout_ucs( AcadEntity *me )

{
if ( me->ucs )
	{
	dxf_DOUBLE_16( 210,me->dir_x );
	dxf_DOUBLE_16( 220,me->dir_y );
	dxf_DOUBLE_16( 230,me->dir_z );
	}
}


PUBLIC void AcadEntity__get_ucs_directions( AcadEntity *me )

{
me->ucs = true;
get_DOUBLE( &me->dir_x );
get_DOUBLE( &me->dir_y );
get_DOUBLE( &me->dir_z );
}


PUBLIC void AcadEntity__put_ucs_directions( AcadEntity *me )

{
put_DOUBLE( me->dir_x );
put_DOUBLE( me->dir_y );
put_DOUBLE( me->dir_z );
}

PUBLIC void AcadEntity__write_elevation_etc( AcadEntity *me, boolean write_elevation, boolean write_thickness, int size )

{
/* set me->size from the size to output and the size of the calling entity */
me->size = size + 1 + sizeof( INT16 )*3;
if ( me->info&0x1 ) ++me->size;
if ( me->info&0x2 ) ++me->size;
if ( write_elevation AND ( me->info&0x4 ) ) me->size += sizeof( DOUBLE );
if ( write_thickness AND ( me->info&0x8 ) ) me->size += sizeof( DOUBLE );
if ( me->info&0x20 ) me->size += 1 + me->handle_length;

if ( debugger ) dprintf( "\twrite entity\n" );
if ( debugger ) dprintf( "\t\tinfo\n" );
put_UINT8( me->info );
if ( debugger ) dprintf( "\t\tsize\n" );
put_INT16( me->size );
if ( debugger ) dprintf( "\t\tlayer\n" );
put_INT16( me->layer );
if ( debugger ) dprintf( "\t\tpflags\n" );
put_INT16( me->pflags );
if ( me->info&0x1 ) 
	{
	if ( debugger ) dprintf( "\t\tcolor\n" );
	put_UINT8( me->color );
	}
if ( me->info&0x2 ) 
	{
	if ( debugger ) dprintf( "\t\tline type\n" );
	put_UINT8( ( UINT8 )me->line_type );
	}
if ( write_elevation AND ( me->info&0x4 ) ) 
	{
	if ( debugger ) dprintf( "\t\televation\n" );
	put_DOUBLE( me->elevation );
	}
if ( write_thickness AND ( me->info&0x8 ) ) 
	{
	if ( debugger ) dprintf( "\t\tthickness\n" );
	put_DOUBLE( me->thickness );
	}
if ( me->info&0x20 ) 	/* entity handles */
	{
	if ( debugger ) dprintf( "\t\thandle\n" );
	put_UINT8( me->handle_length );
	put_array( me->handle,me->handle_length );
	}
}


#include "extended.c"

⌨️ 快捷键说明

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