bool ON_3dmObjectAttributes::RemoveDisplayMaterialRef( ON_UUID viewport_id, ON_UUID display_material_id ) { bool rc = false; int i = m_dmref.Count(); if ( i > 0 ) { const bool bCheckViewportId = !ON_UuidIsNil(viewport_id); const bool bCheckMaterialId = !ON_UuidIsNil(display_material_id); if ( bCheckViewportId || bCheckMaterialId ) { while(i--) { if ( bCheckViewportId && m_dmref[i].m_viewport_id != viewport_id ) continue; if ( bCheckMaterialId && m_dmref[i].m_display_material_id != display_material_id ) continue; // remove this item rc = true; m_dmref.Remove(i); } } else { // 20 Sep 2006 Dale Lear - this was added so we can // remove all entries with non-nil viewport and nil // uuid. while(i--) { if ( !ON_UuidIsNil(m_dmref[i].m_viewport_id) && ON_UuidIsNil(m_dmref[i].m_display_material_id) ) { // remove this item rc = true; m_dmref.Remove(i); } } } } return rc; }
ON_BOOL32 ON_3dmObjectAttributes::IsValid( ON_TextLog* text_log ) const { if ( ON_UuidIsNil(m_uuid) ) { if ( text_log ) { text_log->Print("Object id is nil - this is not valid.\n"); } return false; } if ( !m_rendering_attributes.IsValid(text_log) ) { if ( text_log ) { text_log->Print("Object rendering attributes are not valid.\n"); } return false; } return true; }
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; }
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 || false != m_rendering_attributes.AdvancedTexturePreview() ) { 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; }
BOOL ON_Layer::Read( ON_BinaryArchive& file // restore definition from binary archive ) { int obsolete_value1 = 0; // see ON_Layer::Write int major_version=0; int minor_version=0; int mode = ON::normal_layer; Default(); BOOL rc = file.Read3dmChunkVersion(&major_version,&minor_version); if ( rc && major_version == 1 ) { // common to all 1.x formats if ( rc ) rc = file.ReadInt( &mode ); if ( rc ) { switch(mode) { case 0: // OBSOLETE ON::normal_layer m_bVisible = true; m_bLocked = false; break; case 1: // OBSOLETE ON::hidden_layer m_bVisible = false; m_bLocked = false; break; case 2: // OBSOLETE ON::locked_layer m_bVisible = true; m_bLocked = true; break; default: m_bVisible = true; m_bLocked = false; break; } } if ( rc ) rc = file.ReadInt( &m_layer_index ); if ( rc ) rc = file.ReadInt( &m_iges_level ); if ( rc ) rc = file.ReadInt( &m_material_index ); if ( rc ) rc = file.ReadInt( &obsolete_value1 ); if ( rc ) rc = file.ReadColor( m_color ); { // OBSOLETE line style was never used - read and discard the next 20 bytes short s; double x; if (rc) file.ReadShort(&s); if (rc) file.ReadShort(&s); if (rc) file.ReadDouble(&x); if (rc) file.ReadDouble(&x); } if ( rc ) rc = file.ReadString( m_name ); if ( rc && minor_version >= 1 ) { rc = file.ReadBool(&m_bVisible); if ( rc && minor_version >= 2 ) { rc = file.ReadInt( &m_linetype_index); if (rc && minor_version >= 3 ) { // 23 March 2005 Dale Lear rc = file.ReadColor( m_plot_color); if (rc) rc = file.ReadDouble( &m_plot_weight_mm); if (rc && minor_version >= 4 ) { rc = file.ReadBool(&m_bLocked); if (rc && minor_version >= 5 ) { rc = file.ReadUuid(m_layer_id); if ( rc && minor_version >= 6 && file.ArchiveOpenNURBSVersion() > 200505110 ) { // Some files saved with opennurbs version 200505110 // do not contain correctly written m_parent_layer_id // and m_bExpanded values. // It is ok to default these values. rc = file.ReadUuid(m_parent_layer_id); if (rc) rc = file.ReadBool(&m_bExpanded); } if ( rc && minor_version >= 7 ) { // 1.7 field - added 6 June 2006 rc = m_rendering_attributes.Read(file); if ( rc && minor_version >= 8 ) { // 1.8 field - added 19 Sep 2006 rc = file.ReadUuid(m_display_material_id); } } } } } } } if ( ON_UuidIsNil(m_layer_id) ) { // old files didn't have layer ids and we need unique ones. ON_CreateUuid(m_layer_id); } } else { ON_ERROR("ON_Layer::Read() encountered a layer written by future code."); rc = false; } return rc; }
void ON_ClassId::ConstructorHelper( const char* sClassName, const char* sBaseClassName, const char* sUUID // UUID in registry format from guidgen ) { // Do not initialize "m_class_id_version" or any fields // after it in this helper. See comments in the constructors // for more information. memset( m_sClassName, 0, sizeof(m_sClassName) ); memset( m_sBaseClassName, 0, sizeof(m_sBaseClassName) ); m_uuid = ON_UuidFromString(sUUID); if ( sClassName ) { strncpy( m_sClassName, sClassName, sizeof(m_sClassName)-1 ); } if ( sBaseClassName ) { strncpy( m_sBaseClassName, sBaseClassName, sizeof(m_sBaseClassName)-1 ); } m_pBaseClassId = ClassId( m_sBaseClassName ); if ( !m_sClassName[0] ) { ON_ERROR("ON_ClassId::ON_ClassId() - missing class name"); return; } const ON_ClassId* duplicate_class = ClassId( m_sClassName ); // The m_mark0 > 2 test prevents opennurbs and Rhino from // having two ON_Object derived classes that have the same // name. Plug-ins are free to use any name. if ( 0 != duplicate_class && m_mark0 > 2 ) { char s[7]; int ver; ON_WARNING("ON_ClassId::ON_ClassId() - class name already in use. Will append number to make it unique."); for ( ver = 1; ver < 10000 && 0 != duplicate_class; ver++ ) { IntToString(ver,s); s[6] = 0; strncpy( m_sClassName, sClassName, sizeof(m_sClassName)-1 ); strncat( m_sClassName, s, sizeof(m_sClassName)-1 ); duplicate_class = ClassId( m_sClassName ); } } if ( 0 != duplicate_class ) { // Do NOT permit core classes to have duplicate names. ON_ERROR("ON_ClassId::ON_ClassId() - class name already in use."); return; } if ( m_sClassName[0] != 'O' || m_sClassName[1] != 'N' || m_sClassName[2] != '_' || m_sClassName[3] != 'O' || m_sClassName[4] != 'b' || m_sClassName[5] != 'j' || m_sClassName[6] != 'e' || m_sClassName[7] != 'c' || m_sClassName[8] != 't' || m_sClassName[9] != 0 ) { if ( !m_sBaseClassName[0] ) { ON_ERROR("ON_ClassId::ON_ClassId() - missing baseclass name."); return; } } g_bDisableDemotion = true; if ( ClassId( m_uuid ) ) { g_bDisableDemotion = false; ON_ERROR("ON_ClassId::ON_ClassId() - class uuid already in use."); return; } g_bDisableDemotion = false; if ( ON_UuidIsNil( m_uuid ) ) { ON_ERROR("ON_ClassId::ON_ClassId() - class uuid is nill."); return; } // see if any derived classes need to be updated because their static // members got initialized first if ( m_sClassName[0] ) { for ( ON_ClassId* p = m_p0; p; p = p->m_pNext ) { if ( !p->m_pBaseClassId && p->m_sBaseClassName ) { if ( !strcmp( m_sClassName, p->m_sBaseClassName ) ) p->m_pBaseClassId = this; } } } // Append to the list of class ids if ( m_p0 && m_p1 ) { m_p1->m_pNext = this; m_p1 = this; } else { // first class id m_p0 = this; } m_p1 = this; m_p1->m_pNext = 0; }
void ON_InstanceDefinition::UpdateLinkedIdefReferenceFileLayerSettings( unsigned int layer_count, ON_Layer** layer_settings ) { ON__IDefLayerSettingsUserData* ud; if ( layer_count <= 0 || 0 == layer_settings ) { // delete linked idef layer settings ud = ON__IDefLayerSettingsUserData::FindOrCreate(*this,false); if ( 0 != ud ) delete ud; return; } // Create an index_map[] into the layer_settings[] array that is sorted // by layer_settings[]->m_layer_id ON_Workspace ws; int* index_map = (int*)ws.GetMemory(layer_count*sizeof(index_map[0])); ON_Sort(ON::quick_sort,index_map,layer_settings,layer_count,sizeof(layer_settings[0]),compareLayerPtrId); // Use index_map[] to get a unique list of layers with valid ids ON_UuidIndex* iddex = (ON_UuidIndex*)ws.GetMemory(layer_count*sizeof(iddex[0])); unsigned int iddex_count = 0; unsigned int i; ON_Layer* layer; for ( i = 0; i < layer_count; i++ ) { layer = layer_settings[index_map[i]]; if ( 0 == layer ) continue; layer->SaveSettings(0,false); // remove any saved settings on input layers if ( ON_UuidIsNil(layer->m_layer_id) ) continue; if ( iddex_count > 0 && iddex[iddex_count-1].m_id == layer->m_layer_id ) continue; iddex[iddex_count].m_i = index_map[i]; iddex[iddex_count].m_id = layer->m_layer_id; iddex_count++; } if ( iddex_count <= 0 ) { // delete settings UpdateLinkedIdefReferenceFileLayerSettings(0,0); return; } // Create or get user data where the saved layer settings // are stored. ud = ON__IDefLayerSettingsUserData::FindOrCreate(*this,true); if ( 0 == ud ) return; // Go through the saved settings that were previously // on this idef apply those settings to the layer_settings[] // list. Then delete the information from ud->m_layers[]. ON_UuidIndex idx; idx.m_i = 0; unsigned int settings; for ( i = 0; i < ud->m_layers.UnsignedCount(); i++ ) { if ( 0 == ud->m_layers[i] ) continue; layer = ud->m_layers[i]; ud->m_layers[i] = 0; for(;;) { settings = layer->SavedSettings(); if ( 0 == settings ) break; // no settings were modified idx.m_id = layer->m_layer_id; const ON_UuidIndex* idx0 = (const ON_UuidIndex*)bsearch(&idx,iddex,iddex_count,sizeof(iddex[0]),compareUuidIndexId); if ( 0 == idx0) break; // this layer is not in the current layer_settings[] list layer_settings[idx0->m_i]->SaveSettings(settings,false); // saves the layer settings found in linked file layer_settings[idx0->m_i]->Set(settings,*layer); // applies modifications found on idef break; } delete layer; } // Save a copy of this information on the user data // so it will persist in the file containing the idef. ud->m_layers.SetCount(0); ud->m_layers.Reserve(iddex_count); for ( i = 0; i < iddex_count; i++ ) { layer = new ON_Layer( *layer_settings[iddex[i].m_i] ); ud->m_layers.Append(layer); } }