//--------------------------------------------------------- CSG_Shape * CSG_Shapes::Add_Shape(CSG_Table_Record *pCopy, TSG_ADD_Shape_Copy_Mode mCopy) { CSG_Shape *pShape = (CSG_Shape *)Add_Record(); if( pShape && pCopy ) { if( (mCopy == SHAPE_COPY || mCopy == SHAPE_COPY_ATTR) ) { ((CSG_Table_Record *)pShape)->Assign(pCopy); } if( (mCopy == SHAPE_COPY || mCopy == SHAPE_COPY_GEOM) && pCopy->Get_Table()->Get_ObjectType() == DATAOBJECT_TYPE_Shapes ) { pShape->Assign((CSG_Shape *)pCopy, false); } } return( pShape ); }
//--------------------------------------------------------- void CVIEW_Table_Control::On_Record_Add(wxCommandEvent &event) { Add_Record(); }
//--------------------------------------------------------- bool CSG_Table::Serialize(CSG_File &Stream, bool bSave) { SG_Char Separator = SG_T('\t'); int iField, nFields, iRecord, nRecords, FieldType; CSG_Table_Record *pRecord; CSG_String s, sLine; //----------------------------------------------------- if( bSave ) { Stream.Printf(SG_T("%d %d\n"), m_nFields, m_nRecords); for(iField=0; iField<m_nFields; iField++) { Stream.Printf(SG_T("%d \"%s\"\n"), Get_Field_Type(iField), Get_Field_Name(iField)); } for(iRecord=0; iRecord<m_nRecords; iRecord++) { for(iField=0; iField<m_nFields; iField++) { Stream.Printf(SG_T("%s%c"), Get_Record(iRecord)->asString(iField), iField < m_nFields - 1 ? Separator : '\n'); } } return( true ); } //----------------------------------------------------- else if( Stream.Read_Line(sLine) && SG_SSCANF(sLine, SG_T("%d %d"), &nFields, &nRecords) == 2 && nFields > 0 ) { Destroy(); for(iField=0; iField<nFields; iField++) { if( Stream.Read_Line(sLine) && SG_SSCANF(sLine, SG_T("%d"), &FieldType) == 1 ) { Add_Field(sLine.AfterFirst(SG_T('\"')).BeforeFirst(SG_T('\"')), (TSG_Data_Type)FieldType); } } for(iRecord=0; iRecord<nRecords; iRecord++) { if( Stream.Read_Line(sLine) ) { pRecord = Add_Record(); for(iField=0; iField<m_nFields; iField++) { pRecord->Set_Value(iField, sLine.BeforeFirst(Separator)); sLine = sLine.AfterFirst(Separator); } } } return( true ); } //----------------------------------------------------- return( false ); }
//--------------------------------------------------------- bool CSG_Table::_Load_Text(const CSG_String &File_Name, bool bHeadline, const SG_Char *Separator) { int i, iField; long fLength; CSG_String sLine, sField; CSG_File Stream; CSG_Table Table; //----------------------------------------------------- if( Stream.Open(File_Name, SG_FILE_R, false) == false ) { return( false ); } if( (fLength = Stream.Length()) <= 0 ) { return( false ); } if( !Stream.Read_Line(sLine) ) { return( false ); } //----------------------------------------------------- sLine += Separator; while( (i = sLine.Find(Separator)) >= 0 ) { sField.Clear(); if( bHeadline ) { sField = sLine.Left(i); if( sField[0] == SG_T('\"') && sField[(int)(sField.Length() - 1)] == SG_T('\"') ) // remove quota { sField = sField.AfterFirst('\"').BeforeLast('\"'); } } if( sField.Length() == 0 ) { sField.Printf(SG_T("F%02d"), Table.Get_Field_Count() + 1); } Table.Add_Field(sField, SG_DATATYPE_String); sLine.Remove(0, i + 1); } //----------------------------------------------------- TSG_Data_Type *Type = new TSG_Data_Type[Table.Get_Field_Count()]; for(iField=0; iField<Table.Get_Field_Count(); iField++) { Type[iField] = SG_DATATYPE_Int; } if( !bHeadline ) { Stream.Seek_Start(); } while( Stream.Read_Line(sLine) && sLine.Length() > 0 && SG_UI_Process_Set_Progress(Stream.Tell(), fLength) ) { CSG_Table_Record *pRecord = Table.Add_Record(); sLine += Separator; for(iField=0; iField<Table.Get_Field_Count(); iField++) { if( (i = sLine.Find(Separator)) >= 0 ) { sField = sLine.Left(i); if( sField[0] == SG_T('\"') && sField[(int)(sField.Length() - 1)] == SG_T('\"') ) // remove quota { sField = sField.AfterFirst('\"').BeforeLast('\"'); Type[iField] = SG_DATATYPE_String; } if( Type[iField] != SG_DATATYPE_String && sField.Length() > 0 ) { double Value; if( SG_SSCANF(sField, SG_T("%lf"), &Value) != 1 ) { Type[iField] = SG_DATATYPE_String; } else if( Type[iField] != SG_DATATYPE_Double && Value - (int)Value != 0.0 ) { Type[iField] = SG_DATATYPE_Double; } } pRecord->Set_Value(iField, sField); sLine.Remove(0, i + 1); } else { break; } } } //----------------------------------------------------- if( Table.Get_Count() > 0 ) { for(iField=0; iField<Table.Get_Field_Count(); iField++) { Add_Field(Table.Get_Field_Name(iField), Type[iField]); } for(int iRecord=0; iRecord<Table.Get_Count() && SG_UI_Process_Set_Progress(iRecord, Table.Get_Count()); iRecord++) { CSG_Table_Record *pRecord = Add_Record(); for(iField=0; iField<Get_Field_Count(); iField++) { if( *Table[iRecord].asString(iField) ) { switch( Get_Field_Type(iField) ) { default: pRecord->Set_Value(iField, Table[iRecord].asString(iField)); break; case SG_DATATYPE_Int: pRecord->Set_Value(iField, Table[iRecord].asInt (iField)); break; case SG_DATATYPE_Double: pRecord->Set_Value(iField, Table[iRecord].asDouble(iField)); break; } } else { pRecord->Set_NoData(iField); } } } } delete[](Type); SG_UI_Process_Set_Ready(); return( Get_Field_Count() > 0 ); }