ON_BOOL32 ON_InstanceDefinition::Write( ON_BinaryArchive& binary_archive ) const { bool rc = binary_archive.Write3dmChunkVersion(1,5); // version 1.0 fields if ( rc ) rc = binary_archive.WriteUuid( m_uuid ); if ( rc ) { if ( binary_archive.Archive3dmVersion() >= 4 && ON_InstanceDefinition::linked_def == m_idef_update_type ) { // linked instance definition geometry is never in the file ON_SimpleArray<ON_UUID> empty_uuid_list; rc = binary_archive.WriteArray( empty_uuid_list ); } else { rc = binary_archive.WriteArray( m_object_uuid ); } } if ( rc ) rc = binary_archive.WriteString( m_name ); if ( rc ) rc = binary_archive.WriteString( m_description ); if ( rc ) rc = binary_archive.WriteString( m_url ); if ( rc ) rc = binary_archive.WriteString( m_url_tag ); if ( rc ) rc = binary_archive.WriteBoundingBox( m_bbox ); // m_idef_update_type was an unsigned int and got changed to an enum. Read and write // as an unsigned int to support backwards compatibility if ( rc ) rc = binary_archive.WriteInt( (unsigned int)m_idef_update_type ); if ( rc ) rc = binary_archive.WriteString( m_source_archive ); // version 1.1 fields if (rc) rc = m_source_archive_checksum.Write( binary_archive ); // version 1.2 fields if (rc) rc = binary_archive.WriteInt( m_us.m_unit_system ); // version 1.3 fields - added 6 March 2006 if (rc) rc = binary_archive.WriteDouble( m_us.m_custom_unit_scale ); if ( rc ) rc = binary_archive.WriteBool( m_source_bRelativePath ); // version 1.4 fields if (rc) rc = m_us.Write(binary_archive); // version 1.5 fields if (rc) rc = binary_archive.WriteInt(m_idef_update_depth); return rc; }
unsigned int Dump3dmChunk( ON_BinaryArchive& file, ON_TextLog& dump, int recursion_depth ) { BOOL bShortChunk = FALSE; const size_t offset0 = file.CurrentPosition(); unsigned int typecode = 0; int value; BOOL rc = file.BeginRead3dmChunk( &typecode, &value ); if (!rc) { ErrorReport(offset0,"BeginRead3dmChunk() failed.",dump); } else { if ( !typecode ) { ErrorReport(offset0,"BeginRead3dmChunk() returned typecode = 0.",dump); file.EndRead3dmChunk(); return 0; } else { if ( 0 == recursion_depth ) { dump.Print("\n"); } bShortChunk = (0 != (typecode & TCODE_SHORT)); if ( bShortChunk ) { dump.Print("%6d: %08X %s: value = %d (%08X)\n", offset0, typecode, TypeCodeString(typecode), value, value ); } else { // long chunk value = length of chunk data if ( value < 0 ) { ErrorReport(offset0,"BeginRead3dmChunk() returned length < 0.",dump); file.EndRead3dmChunk(); return 0; } dump.Print("%6d: %08X %s: length = %d bytes\n", offset0, typecode, TypeCodeString(typecode), value ); } int major_userdata_version = -1; int minor_userdata_version = -1; switch( typecode ) { case TCODE_PROPERTIES_TABLE: case TCODE_SETTINGS_TABLE: case TCODE_BITMAP_TABLE: case TCODE_MATERIAL_TABLE: case TCODE_LAYER_TABLE: case TCODE_GROUP_TABLE: case TCODE_LIGHT_TABLE: case TCODE_FONT_TABLE: case TCODE_DIMSTYLE_TABLE: case TCODE_HATCHPATTERN_TABLE: case TCODE_LINETYPE_TABLE: case TCODE_TEXTURE_MAPPING_TABLE: case TCODE_HISTORYRECORD_TABLE: case TCODE_USER_TABLE: case TCODE_INSTANCE_DEFINITION_TABLE: case TCODE_OBJECT_TABLE: // start of a table { dump.PushIndent(); unsigned int record_typecode = 0; for (;;) { record_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !record_typecode ) { break; } if ( TCODE_ENDOFTABLE == record_typecode ) { break; } } dump.PopIndent(); } break; case TCODE_BITMAP_RECORD: { dump.PushIndent(); unsigned int bitmap_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = bitmap_chunk_typecode; dump.PopIndent(); } break; case TCODE_MATERIAL_RECORD: { dump.PushIndent(); unsigned int material_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = material_chunk_typecode; dump.PopIndent(); } break; case TCODE_LAYER_RECORD: { dump.PushIndent(); unsigned int layer_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = layer_chunk_typecode; dump.PopIndent(); } break; case TCODE_GROUP_RECORD: { dump.PushIndent(); unsigned int group_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = group_chunk_typecode; dump.PopIndent(); } break; case TCODE_FONT_RECORD: { dump.PushIndent(); unsigned int font_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = font_chunk_typecode; dump.PopIndent(); } break; case TCODE_DIMSTYLE_RECORD: { dump.PushIndent(); unsigned int dimstyle_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = dimstyle_chunk_typecode; dump.PopIndent(); } break; case TCODE_LIGHT_RECORD: { dump.PushIndent(); unsigned int light_chunk_typecode = 0; for (;;) { light_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !light_chunk_typecode ) { break; } if ( TCODE_LIGHT_RECORD_END == light_chunk_typecode ) { break; } switch( light_chunk_typecode ) { //case TCODE_OBJECT_RECORD_TYPE: case TCODE_LIGHT_RECORD_ATTRIBUTES: case TCODE_OPENNURBS_CLASS: break; default: { ErrorReport(offset0,"Rogue chunk in light record.",dump); } } } dump.PopIndent(); } break; break; //case TCODE_LIGHT_RECORD_ATTRIBUTES: // { // dump.PushIndent(); // unsigned int light_attributes_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); // dump.PopIndent(); // } // break; case TCODE_TEXTURE_MAPPING_RECORD: { dump.PushIndent(); unsigned int mapping_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = mapping_chunk_typecode; dump.PopIndent(); } break; case TCODE_HISTORYRECORD_RECORD: { dump.PushIndent(); unsigned int history_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = history_chunk_typecode; dump.PopIndent(); } break; case TCODE_HATCHPATTERN_RECORD: { dump.PushIndent(); unsigned int hatch_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !typecode ) typecode = hatch_chunk_typecode; dump.PopIndent(); } break; case TCODE_OBJECT_RECORD: { dump.PushIndent(); unsigned int object_chunk_typecode = 0; for (;;) { object_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !object_chunk_typecode ) { break; } if ( TCODE_OBJECT_RECORD_END == object_chunk_typecode ) { break; } switch( object_chunk_typecode ) { case TCODE_OBJECT_RECORD_TYPE: case TCODE_OBJECT_RECORD_ATTRIBUTES: case TCODE_OPENNURBS_CLASS: break; default: { ErrorReport(offset0,"Rogue chunk in object record.",dump); } } } dump.PopIndent(); } break; case TCODE_OPENNURBS_CLASS: { dump.PushIndent(); unsigned int opennurbs_object_chunk_typecode = 0; for (;;) { opennurbs_object_chunk_typecode = Dump3dmChunk( file, dump, recursion_depth+1 ); if ( !opennurbs_object_chunk_typecode ) { break; } if ( TCODE_OPENNURBS_CLASS_END == opennurbs_object_chunk_typecode ) { break; } switch( opennurbs_object_chunk_typecode ) { case TCODE_OPENNURBS_CLASS_UUID: break; case TCODE_OPENNURBS_CLASS_DATA: break; case TCODE_OPENNURBS_CLASS_USERDATA: break; default: { ErrorReport(offset0,"Rogue chunk in OpenNURBS class record.",dump); } } } dump.PopIndent(); } break; case TCODE_OPENNURBS_CLASS_USERDATA: { if ( !file.Read3dmChunkVersion(&major_userdata_version, &minor_userdata_version ) ) { ErrorReport(offset0,"Read3dmChunkVersion() failed to read TCODE_OPENNURBS_CLASS_USERDATA chunk version.",dump); } else { dump.PushIndent(); dump.Print("UserData chunk version: %d.%d\n", major_userdata_version, minor_userdata_version ); if ( 1 == major_userdata_version || 2 == major_userdata_version ) { const size_t userdata_header_offset = file.CurrentPosition(); switch ( major_userdata_version ) { case 1: { // version 1 user data header information was not wrapped // in a chunk. if ( Read3dmUserDataHeader( userdata_header_offset, file, dump ) ) { // a TCODE_ANONYMOUS_CHUNK contains user data goo int anon_typecode = Dump3dmChunk(file, dump, recursion_depth+1 ); if ( TCODE_ANONYMOUS_CHUNK != anon_typecode ) { ErrorReport( offset0,"Userdata Expected a TCODE_ANONYMOUS_CHUNK chunk.",dump); } } } break; case 2: { // version 2 user data header information is wrapped // in a TCODE_OPENNURBS_CLASS_USERDATA_HEADER chunk. unsigned int userdata_header_typecode = Dump3dmChunk(file, dump, recursion_depth+1 ); if ( TCODE_OPENNURBS_CLASS_USERDATA_HEADER != userdata_header_typecode ) { ErrorReport(userdata_header_offset,"Expected a TCODE_OPENNURBS_CLASS_USERDATA_HEADER chunk.",dump); } else { int anon_typecode = Dump3dmChunk(file, dump, recursion_depth+1 ); if ( TCODE_ANONYMOUS_CHUNK != anon_typecode ) { ErrorReport( offset0,"Userdata Expected a TCODE_ANONYMOUS_CHUNK chunk.",dump); } } } break; default: if ( major_userdata_version < 3 ) { } else { dump.Print("New user data format created after this diagnostic tool was written.\n"); } break; } } dump.PopIndent(); } } break; case TCODE_OPENNURBS_CLASS_UUID: case TCODE_USER_TABLE_UUID: { dump.PushIndent(); ON_UUID uuid = ON_nil_uuid; const ON_ClassId* pClassId = 0; if ( !file.ReadUuid( uuid ) ) { ErrorReport(offset0,"ReadUuid() failed.",dump); } else { if ( typecode == TCODE_OPENNURBS_CLASS_UUID ) { dump.Print("OpenNURBS class id = "); pClassId = ON_ClassId::ClassId(uuid); } else if ( typecode == TCODE_USER_TABLE_UUID ) { dump.Print("User table id = "); } else { dump.Print("UUID = "); } dump.Print( uuid ); if ( pClassId ) { const char* sClassName = pClassId->ClassName(); if ( sClassName ) { dump.Print(" (%s)",sClassName); } } dump.Print("\n"); } dump.PopIndent(); } break; case TCODE_OPENNURBS_CLASS_USERDATA_HEADER: { if ( !Read3dmUserDataHeader( offset0, file, dump ) ) { ErrorReport(offset0,"Unable to read userdata header.",dump); } } break; case TCODE_ENDOFFILE: case TCODE_ENDOFFILE_GOO: { dump.PushIndent(); if ( value < 4 ) { ErrorReport(offset0,"TCODE_ENDOFFILE chunk withlength < 4.",dump); } else { int sizeof_file = 0; file.ReadInt(&sizeof_file); dump.Print("current position = %d stored size = %d\n", file.CurrentPosition(), sizeof_file); } dump.PopIndent(); } break; } } const size_t offset1 = file.CurrentPosition(); if ( !file.EndRead3dmChunk() ) { ErrorReport(offset1,"EndRead3dmChunk() failed.",dump); rc = FALSE; } else if (!bShortChunk) { const size_t extra = value - (offset1-offset0-8); if ( extra < 0 ) { ErrorReport(offset0,"Read beyond end of chunk.",dump); } } } return typecode; }
ON_BOOL32 ON_3dmObjectAttributes::Write( ON_BinaryArchive& file ) const { if ( file.Archive3dmVersion() >= 5 ) { // added at opennurbs version 200712190 return WriteV5Helper(file); } bool rc = file.Write3dmChunkVersion(1,7); // version 1.0 fields if (rc) rc = file.WriteUuid(m_uuid); if (rc) rc = file.WriteInt(m_layer_index); if (rc) rc = file.WriteInt(m_material_index); if (rc) rc = file.WriteColor(m_color); if (rc) { // OBSOLETE if (rc) rc = file.WriteLineStyle(m_line_style); // 23 March 2005 Dale Lear short s; s = (short)m_object_decoration; if (rc) rc = file.WriteShort(s); s = 0; if (rc) rc = file.WriteShort(s); if (rc) rc = file.WriteDouble(0.0); if (rc) rc = file.WriteDouble(1.0); } if (rc) rc = file.WriteInt(m_wire_density); if (rc) rc = file.WriteChar(m_mode); if (rc) rc = file.WriteChar(m_color_source); if (rc) rc = file.WriteChar(m_linetype_source); if (rc) rc = file.WriteChar(m_material_source); if (rc) rc = file.WriteString(m_name); if (rc) rc = file.WriteString(m_url); // version 1.1 fields if (rc) rc = file.WriteArray(m_group); // version 1.2 fields if (rc) rc = file.WriteBool(m_bVisible); // version 1.3 fields if (rc) rc = file.WriteArray(m_dmref); // version 1.4 fields - 23 March 2005 Dale Lear if (rc) rc = file.WriteInt(m_object_decoration); if (rc) rc = file.WriteChar(m_plot_color_source); if (rc) rc = file.WriteColor(m_plot_color); if (rc) rc = file.WriteChar(m_plot_weight_source); if (rc) rc = file.WriteDouble(m_plot_weight_mm); // version 1.5 fields 11 April 2005 if (rc) rc = file.WriteInt(m_linetype_index); // version 1.6 fields 2 September 2005 if (rc) { unsigned char uc = 0; switch(m_space) { case ON::no_space: uc = 0; break; case ON::model_space: uc = 0; break; case ON::page_space: uc = 1; break; } rc = file.WriteChar(uc); } if (rc) { // 22 Sep 2006 - the way ON_3dmObjectAttiributes indicates // that an object is put on a particular page view changed // from being saved in the m_dmref[] list to using the // m_space and m_viewport_id settings. But the file format // cannot change at this point. So, the bAddPagespaceDMR // is here to save the page info in the old dmr format. int count = m_dmref.Count(); if ( count < 0 ) count = 0; bool bAddPagespaceDMR = ( ON::page_space == m_space && !ON_UuidIsNil(m_viewport_id) ); rc = file.WriteInt( bAddPagespaceDMR ? (count+1) : count ); if ( rc && bAddPagespaceDMR ) { rc = file.WriteUuid(m_viewport_id); if (rc) rc = file.WriteUuid(ON_ObsoletePageSpaceObjectId); } int i; for ( i = 0; i < count && rc; i++ ) { const ON_DisplayMaterialRef& dmr = m_dmref[i]; rc = file.WriteUuid(dmr.m_viewport_id); if (rc) rc = file.WriteUuid(dmr.m_display_material_id); } } // version 1.7 fields 6 June 2006 if (rc) rc = m_rendering_attributes.Write(file); return rc; }
ON_BOOL32 ON_InstanceDefinition::Read( ON_BinaryArchive& binary_archive ) { int major_version = 0; int minor_version = 0; m_us.m_custom_unit_scale = 0.0; m_us.m_custom_unit_name.Destroy(); m_us.m_unit_system = ON::no_unit_system; m_source_bRelativePath = false; m_source_archive.Destroy(); bool rc = binary_archive.Read3dmChunkVersion(&major_version,&minor_version); if ( rc ) { if ( major_version != 1 ) rc = false; // version 1.0 fields if ( rc ) rc = binary_archive.ReadUuid( m_uuid ); if ( rc ) rc = binary_archive.ReadArray( m_object_uuid ); if ( rc ) rc = binary_archive.ReadString( m_name ); if ( rc ) rc = binary_archive.ReadString( m_description ); if ( rc ) rc = binary_archive.ReadString( m_url ); if ( rc ) rc = binary_archive.ReadString( m_url_tag ); if ( rc ) rc = binary_archive.ReadBoundingBox( m_bbox ); // m_idef_update_type was an unsigned int and got changed to an enum. Read and write // as an unsigned int to support backwards compatibility unsigned int source = m_idef_update_type; if ( rc ) rc = binary_archive.ReadInt( &source ); if( rc) m_idef_update_type = ON_InstanceDefinition::IdefUpdateType(source); if ( rc ) rc = binary_archive.ReadString( m_source_archive ); // version 1.1 fields if ( minor_version >= 1 ) { if ( rc ) rc = m_source_archive_checksum.Read( binary_archive ); } // version 1.2 fields if ( minor_version >= 2 ) { int us = ON::no_unit_system; if ( rc ) rc = binary_archive.ReadInt( &us ); m_us.m_unit_system = ON::UnitSystem(us); if ( ON::custom_unit_system != m_us.m_unit_system && ON::no_unit_system != m_us.m_unit_system ) { m_us.m_custom_unit_scale = ON::UnitScale( m_us.m_unit_system, ON::meters ); } else { m_us.m_custom_unit_scale = 0.0; } if ( minor_version >= 3 ) { // version 1.3 fields - added 6 March 2006 //int us = ON::no_unit_system; if ( rc ) rc = binary_archive.ReadDouble( &m_us.m_custom_unit_scale ); if ( rc ) rc = binary_archive.ReadBool( &m_source_bRelativePath ); if ( rc && minor_version >= 4 ) { rc = m_us.Read(binary_archive); if (rc && minor_version >= 5 ) { rc = binary_archive.ReadInt(&m_idef_update_depth); } } } } } return rc; }
ON_BOOL32 ON_3dmObjectAttributes::Read( ON_BinaryArchive& file ) { Default(); if ( file.Archive3dmVersion() >= 5 && file.ArchiveOpenNURBSVersion() >= 200712190 ) { return ReadV5Helper(file); } int i; int major_version = 0; int minor_version = 0; bool rc = file.Read3dmChunkVersion(&major_version,&minor_version); if ( rc && major_version == 1 ) { if (rc) rc = file.ReadUuid(m_uuid); if (rc) rc = file.ReadInt(&m_layer_index); if (rc) rc = file.ReadInt(&m_material_index); if (rc) rc = file.ReadColor(m_color); while(rc) { // OBSOLETE if (rc) rc = file.ReadLineStyle(m_line_style); // 23 March 2005 Dale Lear // replaced with short s = 0; double x; rc = file.ReadShort(&s); if (!rc) break; if ( file.Archive3dmVersion() < 4 || file.ArchiveOpenNURBSVersion() < 200503170 ) { // ignore unused linestyle info in old files // This bit keeps the curve arrowheads from V3 showing up // in V4. m_object_decoration = ON::ObjectDecoration( (s & ON::both_arrowhead) ); } rc = file.ReadShort(&s); if (!rc) break; rc = file.ReadDouble(&x); if (!rc) break; rc = file.ReadDouble(&x); break; } if (rc) rc = file.ReadInt(&m_wire_density); if (rc) rc = file.ReadChar(&m_mode); if (rc) rc = file.ReadChar(&m_color_source); if (rc) m_color_source = (unsigned char)ON::ObjectColorSource(m_color_source); if (rc) rc = file.ReadChar(&m_linetype_source); if (rc) m_linetype_source = (unsigned char)ON::ObjectLinetypeSource(m_linetype_source); if (rc) rc = file.ReadChar(&m_material_source); if (rc) m_material_source = (unsigned char)ON::ObjectMaterialSource(m_material_source); if (rc) rc = file.ReadString(m_name); if (rc) rc = file.ReadString(m_url); m_bVisible = (Mode() != ON::hidden_object); if ( rc && minor_version >= 1 ) { rc = file.ReadArray( m_group ); if ( rc && minor_version >= 2 ) { rc = file.ReadBool(&m_bVisible); if ( rc && minor_version >= 3 ) { rc = file.ReadArray(m_dmref); if (rc && minor_version >= 4 ) { // 23 March 2005 Dale Lear // Added m_plot_color_source and m_plot_color i = 0; if (rc) rc = file.ReadInt(&i); if (rc) m_object_decoration = ON::ObjectDecoration(i); if (rc) rc = file.ReadChar(&m_plot_color_source); if (rc) m_plot_color_source = (unsigned char)ON::PlotColorSource(m_plot_color_source); if (rc) rc = file.ReadColor( m_plot_color ); if (rc) rc = file.ReadChar(&m_plot_weight_source); if (rc) m_plot_weight_source = (unsigned char)ON::PlotWeightSource(m_plot_weight_source); if (rc) rc = file.ReadDouble(&m_plot_weight_mm); if (rc && minor_version >= 5 ) { // version 1.5 fields 11 April 2005 if (rc) rc = file.ReadInt(&m_linetype_index); // version 1.6 fields 2 September 2005 if (rc && minor_version >= 6 ) { unsigned char uc = 0; rc = file.ReadChar(&uc); if (rc) { m_space = (1 == uc) ? ON::page_space : ON::model_space; m_dmref.Empty(); int i, count=0; rc = file.ReadInt(&count); if (rc && count > 0) { m_dmref.SetCapacity(count); for ( i = 0; i < count && rc; i++) { ON_DisplayMaterialRef& dmr = m_dmref.AppendNew(); rc = file.ReadUuid(dmr.m_viewport_id); if (rc) rc = file.ReadUuid(dmr.m_display_material_id); if ( rc ) { // Assigning an object to a page started out as // using dmrs. The way the runtime info is saved // has changed, but, at this point, I can't change // the way the information is saved in the file and // it doesn't matter. if ( 0 == ON_UuidCompare(&ON_ObsoletePageSpaceObjectId,&dmr.m_display_material_id) ) { m_viewport_id = dmr.m_viewport_id; m_dmref.Remove(); } } } if ( 0 == m_dmref.Count() ) m_dmref.Destroy(); } } if ( rc && minor_version >= 7 ) { // version 1.7 fields 6 June 2006 if (rc) rc = m_rendering_attributes.Read(file); } } } } } } } } else { rc = false; } return rc; }
bool ON_3dmObjectAttributes::WriteV5Helper( ON_BinaryArchive& file ) const { unsigned char c; // 29 Nov. 2009 S. Baer // Chunk version updated to 2.1 in order to support m_display_order bool rc = file.Write3dmChunkVersion(2,1); while(rc) { if (!rc) break; rc = file.WriteUuid(m_uuid); if (!rc) break; rc = file.WriteInt(m_layer_index); if (!rc) break; // write non-default settings - skip everything else if ( !m_name.IsEmpty() ) { c = 1; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteString(m_name); if (!rc) break; } if ( !m_url.IsEmpty() ) { c = 2; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteString(m_url); if (!rc) break; } if ( -1 != m_linetype_index ) { c = 3; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteInt(m_linetype_index); if (!rc) break; } if ( -1 != m_material_index ) { c = 4; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteInt(m_material_index); if (!rc) break; } if ( m_rendering_attributes.m_mappings.Count() > 0 || m_rendering_attributes.m_materials.Count() > 0 || true != m_rendering_attributes.m_bCastsShadows || true != m_rendering_attributes.m_bReceivesShadows ) { c = 5; rc = file.WriteChar(c); if (!rc) break; rc = m_rendering_attributes.Write(file); if (!rc) break; } if ( 0 != m_color ) { c = 6; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteColor(m_color); if (!rc) break; } if ( 0 != m_plot_color ) { c = 7; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteColor(m_plot_color); if (!rc) break; } if ( 0.0 != m_plot_weight_mm ) { c = 8; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteDouble(m_plot_weight_mm); if (!rc) break; } if ( ON::no_object_decoration != m_object_decoration ) { c = 9; rc = file.WriteChar(c); if (!rc) break; c = (unsigned char)m_object_decoration; rc = file.WriteChar(c); if (!rc) break; } if ( 1 != m_wire_density ) { c = 10; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteInt(m_wire_density); if (!rc) break; } if ( true != m_bVisible ) { c = 11; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteBool(m_bVisible); if (!rc) break; } if ( ON::normal_object != m_mode ) { c = 12; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteChar(m_mode); if (!rc) break; } if ( ON::color_from_layer != m_color_source ) { c = 13; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteChar(m_color_source); if (!rc) break; } if ( ON::plot_color_from_layer != m_plot_color_source ) { c = 14; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteChar(m_plot_color_source); if (!rc) break; } if ( ON::plot_weight_from_layer != m_plot_weight_source ) { c = 15; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteChar(m_plot_weight_source); if (!rc) break; } if ( ON::material_from_layer != m_material_source ) { c = 16; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteChar(m_material_source); if (!rc) break; } if ( ON::linetype_from_layer != m_linetype_source ) { c = 17; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteChar(m_linetype_source); if (!rc) break; } if ( m_group.Count() > 0 ) { c = 18; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteArray(m_group); if (!rc) break; } if ( ON::model_space != m_space ) { c = 19; rc = file.WriteChar(c); if (!rc) break; c = (unsigned char)m_space; rc = file.WriteChar(c); if (!rc) break; } if ( !ON_UuidIsNil(m_viewport_id) ) { c = 20; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteUuid(m_viewport_id); if (!rc) break; } if ( m_dmref.Count() > 0 ) { c = 21; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteArray(m_dmref); if (!rc) break; } // 29 Nov. 2009 - S. Baer // Only write m_display_order if it's value!=0 // m_display_order is written to version 2.1 files if ( 0 != m_display_order ) { c = 22; rc = file.WriteChar(c); if (!rc) break; rc = file.WriteInt(m_display_order); if (!rc) break; } // 0 indicates end of attributes; c = 0; rc = file.WriteChar(c); break; } return rc; }
ON_BOOL32 ON_InstanceDefinition::Read( ON_BinaryArchive& binary_archive ) { int major_version = 0; int minor_version = 0; m_idef_layer_style = 0; m_us.m_custom_unit_scale = 0.0; m_us.m_custom_unit_name.Destroy(); m_us.m_unit_system = ON::no_unit_system; m_source_bRelativePath = false; m_source_archive.Destroy(); bool rc = binary_archive.Read3dmChunkVersion(&major_version,&minor_version); if ( rc ) { if ( major_version != 1 ) rc = false; // version 1.0 fields if ( rc ) rc = binary_archive.ReadUuid( m_uuid ); if ( rc ) rc = binary_archive.ReadArray( m_object_uuid ); if ( rc ) rc = binary_archive.ReadString( m_name ); if ( rc ) rc = binary_archive.ReadString( m_description ); if ( rc ) rc = binary_archive.ReadString( m_url ); if ( rc ) rc = binary_archive.ReadString( m_url_tag ); if ( rc ) rc = binary_archive.ReadBoundingBox( m_bbox ); // m_idef_update_type was an unsigned int and got changed to an enum. Read and write // as an unsigned int to support backwards compatibility unsigned int source = m_idef_update_type; if ( rc ) rc = binary_archive.ReadInt( &source ); if( rc) m_idef_update_type = ON_InstanceDefinition::IdefUpdateType(source); if ( rc ) rc = binary_archive.ReadString( m_source_archive ); // version 1.1 fields if ( minor_version >= 1 ) { if ( rc ) rc = m_source_archive_checksum.Read( binary_archive ); } // version 1.2 fields if ( minor_version >= 2 ) { int us = ON::no_unit_system; if ( rc ) rc = binary_archive.ReadInt( &us ); m_us.m_unit_system = ON::UnitSystem(us); if ( ON::custom_unit_system != m_us.m_unit_system && ON::no_unit_system != m_us.m_unit_system ) { m_us.m_custom_unit_scale = ON::UnitScale( m_us.m_unit_system, ON::meters ); } else { m_us.m_custom_unit_scale = 0.0; } if ( minor_version >= 3 ) { // version 1.3 fields - added 6 March 2006 //int us = ON::no_unit_system; if ( rc ) rc = binary_archive.ReadDouble( &m_us.m_custom_unit_scale ); if ( rc ) rc = binary_archive.ReadBool( &m_source_bRelativePath ); if ( rc && minor_version >= 4 ) { rc = m_us.Read(binary_archive); if (rc && minor_version >= 5 ) { rc = binary_archive.ReadInt(&m_idef_update_depth); if ( rc && minor_version >= 6 ) { unsigned int i = 0; rc = binary_archive.ReadInt(&i); if ( i && i > 0 && i < 256 ) m_idef_layer_style = (unsigned char)i; } } } } } if ( ON_InstanceDefinition::embedded_def == m_idef_update_type ) { // 7 February 2012 // "embedded_def" is obsolete. if (m_source_archive.Length() > 0 ) m_idef_update_type = ON_InstanceDefinition::linked_and_embedded_def; else DestroySourceArchive(); // convert to static } if ( ON_InstanceDefinition::linked_def == m_idef_update_type ) { if ( m_idef_layer_style < 1 || m_idef_layer_style > 2 ) { // The goal of the next if/else clause is for Rhino users // to see what they saw when they created the file. if ( binary_archive.Archive3dmVersion() < 50 ) { // V4 linked blocks and early V5 linked blocks treated // layers and materials the way newer "active" idefs work, // so when I read an archive with version < 50, the // default will be 1 for "active". m_idef_layer_style = 1; } else { // The more recent V5 linked blocks treated layers and materials // the way "reference" style idefs work, so when I read an // archive with version >= 50 (meaning recent V5), the default // will be 2 for "reference". m_idef_layer_style = 2; } } } else { m_idef_layer_style= 0; } } return rc; }
bool ON_3dmObjectAttributes::ReadV5Helper( ON_BinaryArchive& file ) { unsigned char itemid, c; int major_version = 0; int minor_version = 0; bool rc = file.Read3dmChunkVersion(&major_version,&minor_version); if ( rc && 2 != major_version ) rc = false; itemid = 0xFF; while(rc) { if (!rc) break; rc = file.ReadUuid(m_uuid); if (!rc) break; rc = file.ReadInt(&m_layer_index); if (!rc) break; // read non-default settings - skip everything else rc = file.ReadChar(&itemid); if (!rc) break; if ( 0 == itemid ) break; if ( 1 == itemid ) { rc = file.ReadString(m_name); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 2 == itemid ) { rc = file.ReadString(m_url); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 3 == itemid ) { rc = file.ReadInt(&m_linetype_index); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 4 == itemid ) { rc = file.ReadInt(&m_material_index); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 5 == itemid ) { rc = m_rendering_attributes.Read(file); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 6 == itemid ) { rc = file.ReadColor(m_color); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 7 == itemid ) { rc = file.ReadColor(m_plot_color); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 8 == itemid ) { rc = file.ReadDouble(&m_plot_weight_mm); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 9 == itemid ) { rc = file.ReadChar(&c); if (!rc) break; m_object_decoration = ON::ObjectDecoration(c); rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 10 == itemid ) { rc = file.ReadInt(&m_wire_density); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 11 == itemid ) { rc = file.ReadBool(&m_bVisible); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 12 == itemid ) { rc = file.ReadChar(&m_mode); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 13 == itemid ) { rc = file.ReadChar(&m_color_source); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 14 == itemid ) { rc = file.ReadChar(&m_plot_color_source); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 15 == itemid ) { rc = file.ReadChar(&m_plot_weight_source); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 16 == itemid ) { rc = file.ReadChar(&m_material_source); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 17 == itemid ) { rc = file.ReadChar(&m_linetype_source); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 18 == itemid ) { rc = file.ReadArray(m_group); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 19 == itemid ) { rc = file.ReadChar(&c); if (!rc) break; m_space = ON::ActiveSpace(c); rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 20 == itemid ) { rc = file.ReadUuid(m_viewport_id); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( 21 == itemid ) { rc = file.ReadArray(m_dmref); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } // items 1 - 21 are in chunk version 2.0 files if ( minor_version <= 0 ) break; // 28 Nov. 2009 - S. Baer // Added m_display_order to version 2.1 files if ( 22 == itemid ) { rc = file.ReadInt(&m_display_order); if (!rc) break; rc = file.ReadChar(&itemid); if ( !rc || 0 == itemid ) break; } if ( minor_version <= 1 ) break; // Add new item reading above this code, and increment the "22" // in the following if statement to an appropriate value, and // update the comment. Be sure to test reading of old and // new files by old and new code, before checking in your // changes. // if ( itemid > 22 ) { // we are reading file written with code newer // than this code (minor_version > 1) itemid = 0; } break; } if ( rc && 0 != itemid ) { ON_ERROR("Bug in ON_3dmObjectAttributes::ReadV5Helper or WriteV5Helper"); } return rc; }
ON_BOOL32 ON_InstanceDefinition::Write( ON_BinaryArchive& binary_archive ) const { bool rc = binary_archive.Write3dmChunkVersion(1,6); // version 1.0 fields if ( rc ) rc = binary_archive.WriteUuid( m_uuid ); if ( rc ) { if ( binary_archive.Archive3dmVersion() >= 4 && ON_InstanceDefinition::linked_def == m_idef_update_type ) { // linked instance definition geometry is never in the file ON_SimpleArray<ON_UUID> empty_uuid_list; rc = binary_archive.WriteArray( empty_uuid_list ); } else { rc = binary_archive.WriteArray( m_object_uuid ); } } if ( rc ) rc = binary_archive.WriteString( m_name ); if ( rc ) rc = binary_archive.WriteString( m_description ); if ( rc ) rc = binary_archive.WriteString( m_url ); if ( rc ) rc = binary_archive.WriteString( m_url_tag ); if ( rc ) rc = binary_archive.WriteBoundingBox( m_bbox ); // m_idef_update_type was an unsigned int and got changed to an enum. Read and write // as an unsigned int to support backwards compatibility const unsigned int idef_update_type = (unsigned int)this->IdefUpdateType(); if ( rc ) rc = binary_archive.WriteInt( idef_update_type ); if ( rc ) { // 7 February 2012 // Purge source archive information from static_defs if ( ON_InstanceDefinition::static_def == idef_update_type ) { ON_wString empty_string; rc = binary_archive.WriteString( empty_string ); } else rc = binary_archive.WriteString( m_source_archive ); } // version 1.1 fields if (rc) { // 7 February 2012 // Purge source archive information from static_defs if ( ON_InstanceDefinition::static_def == idef_update_type ) ON_CheckSum::UnsetCheckSum.Write(binary_archive); else rc = m_source_archive_checksum.Write( binary_archive ); } // version 1.2 fields if (rc) rc = binary_archive.WriteInt( m_us.m_unit_system ); // version 1.3 fields - added 6 March 2006 if (rc) rc = binary_archive.WriteDouble( m_us.m_custom_unit_scale ); if ( rc ) { bool b = (ON_InstanceDefinition::static_def == idef_update_type) ? false : m_source_bRelativePath; rc = binary_archive.WriteBool( b ); } // version 1.4 fields if (rc) rc = m_us.Write(binary_archive); // version 1.5 fields if (rc) rc = binary_archive.WriteInt(m_idef_update_depth); // version 1.6 fields ( added 14 February 2012 ) if (rc) rc = binary_archive.WriteInt( m_idef_layer_style ); return rc; }
bool ON_Localizer::Write(ON_BinaryArchive& archive) const { bool rc = archive.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,0); if (!rc) return false; for(;;) { rc = archive.WriteInt(m_type); if ( !rc ) break; rc = archive.WritePoint(m_P); if ( !rc ) break; rc = archive.WriteVector(m_V); if ( !rc ) break; rc = archive.WriteInterval(m_d); if ( !rc ) break; rc = archive.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,0); if (!rc) break; rc = archive.WriteBool( m_nurbs_curve ? true : false ); if ( rc && m_nurbs_curve ) rc = m_nurbs_curve->Write(archive)?true:false; if ( !archive.EndWrite3dmChunk() ) rc = false; if (!rc) break; rc = archive.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,0); if (!rc) break; rc = archive.WriteBool( m_nurbs_surface ? true : false ); if ( rc && m_nurbs_surface ) rc = m_nurbs_surface->Write(archive)?true:false; if ( !archive.EndWrite3dmChunk() ) rc = false; if (!rc) break; break; } if ( !archive.EndWrite3dmChunk() ) rc = false; return rc; }
bool ON_Localizer::Read(ON_BinaryArchive& archive) { Destroy(); int major_version = 0; int minor_version = 0; bool rc = archive.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&major_version,&minor_version); if (!rc) return false; for(;;) { rc = (1 == major_version); if ( !rc ) break; int i = no_type; rc = archive.ReadInt(&i); if ( !rc ) break; switch(i) { case sphere_type: m_type = sphere_type; break; case plane_type: m_type = plane_type; break; case cylinder_type: m_type = cylinder_type; break; case curve_type: m_type = curve_type; break; case surface_type: m_type = surface_type; break; case distance_type: m_type = distance_type; break; } rc = archive.ReadPoint(m_P); if ( !rc ) break; rc = archive.ReadVector(m_V); if ( !rc ) break; rc = archive.ReadInterval(m_d); if ( !rc ) break; int mjv = 0, mnv = 0; rc = archive.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&mjv,&mnv); if (!rc) break; rc = (1 == mjv); bool bReadCurve = false; if (rc) rc = archive.ReadBool( &bReadCurve ); if ( rc && bReadCurve) { m_nurbs_curve = new ON_NurbsCurve(); rc = m_nurbs_curve->Read(archive)?true:false; } if ( !archive.EndRead3dmChunk() ) rc = false; if (!rc) break; rc = archive.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&mjv,&mnv); if (!rc) break; rc = (1 == mjv); bool bReadSurface = false; rc = archive.ReadBool( &bReadSurface ); if ( rc && bReadSurface ) { m_nurbs_surface = new ON_NurbsSurface(); rc = m_nurbs_surface->Read(archive)?true:false; } if ( !archive.EndRead3dmChunk() ) rc = false; if (!rc) break; break; } if ( !archive.EndRead3dmChunk() ) rc = false; return rc; }
ON_BOOL32 ON_Point::Write( ON_BinaryArchive& file ) const { ON_BOOL32 rc = file.Write3dmChunkVersion(1,0); if (rc) rc = file.WritePoint( point ); return rc; }
BOOL ON_Font::Read( ON_BinaryArchive& file // restore definition from binary archive ) { Defaults(); m_font_index = -1; int major_version = 0; int minor_version = 0; bool rc = file.Read3dmChunkVersion(&major_version,&minor_version); if ( rc && major_version == 1 ) { int i; for(;;) { rc = file.ReadInt( &m_font_index ); if (!rc) break; rc = file.ReadString( m_font_name ); if (!rc) break; { // 18 October 2002 Dale Lear: // Lowell, wchar_t has different sizes on different OSs. // When writing a wchar_t string, you should use one // of the WriteString functions. This function must continue // to use ReadShort(64,...) so old files will remain valid. unsigned short sh[64]; rc = file.ReadShort(64, sh); if (!rc) break; wchar_t facename[65]; for ( i = 0; i < 64; i++ ) { facename[i] = sh[i]; } facename[64] = 0; SetFontFaceName(facename); } if( minor_version >= 1 ) { rc = file.ReadInt( &i ); if (!rc) break; SetFontWeight(i); rc = file.ReadInt( &i); if (!rc) break; SetIsItalic(i?true:false); rc = file.ReadDouble( &m_linefeed_ratio ); if (!rc) break; if ( minor_version >= 2 ) { rc = file.ReadUuid( m_font_id ); if (!rc) break; } } break; } } else { ON_ERROR("ON_Font::Read - get newer version of opennurbs"); rc = false; } return rc; }