📄 entity.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 + -