Author: janehu Date: 2008-07-31 13:16:18 -0500 (Thu, 31 Jul 2008) New Revision: 2033 Added: cgm/trunk/geom/OCC/OCCShapeAttributeSet.cpp cgm/trunk/geom/OCC/OCCShapeAttributeSet.hpp Modified: cgm/trunk/geom/OCC/Makefile.am cgm/trunk/geom/OCC/OCCAttrib.hpp cgm/trunk/geom/OCC/OCCAttribSet.cpp cgm/trunk/geom/OCC/OCCAttribSet.hpp cgm/trunk/geom/OCC/OCCBody.cpp cgm/trunk/geom/OCC/OCCBody.hpp cgm/trunk/geom/OCC/OCCCurve.cpp cgm/trunk/geom/OCC/OCCCurve.hpp cgm/trunk/geom/OCC/OCCLoop.cpp cgm/trunk/geom/OCC/OCCLump.cpp cgm/trunk/geom/OCC/OCCLump.hpp cgm/trunk/geom/OCC/OCCModifyEngine.hpp cgm/trunk/geom/OCC/OCCPoint.cpp cgm/trunk/geom/OCC/OCCPoint.hpp cgm/trunk/geom/OCC/OCCQueryEngine.cpp cgm/trunk/geom/OCC/OCCQueryEngine.hpp cgm/trunk/geom/OCC/OCCSurface.cpp Log: Added read-write attribute functionality. Modified: cgm/trunk/geom/OCC/Makefile.am =================================================================== --- cgm/trunk/geom/OCC/Makefile.am 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/Makefile.am 2008-07-31 18:16:18 UTC (rev 2033) @@ -20,7 +20,7 @@ # The non-template sources libcubit_OCC_la_SOURCES = \ - OCCAttrib.cpp \ + OCCShapeAttributeSet.cpp \ OCCAttribSet.cpp \ OCCBody.cpp \ OCCCoEdge.cpp \ @@ -39,7 +39,7 @@ # Headers to be installed. If any file in this list should # not be installed, move it to the _SOURCES list above. libcubit_OCC_la_include_HEADERS = \ - OCCAttrib.hpp \ + OCCShapeAttributeSet.hpp \ OCCAttribSet.hpp \ OCCBody.hpp \ OCCCoEdge.hpp \ Modified: cgm/trunk/geom/OCC/OCCAttrib.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCAttrib.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCAttrib.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -1,5 +1,5 @@ -#ifndef FACET_ATTRIB_HPP -#define FACET_ATTRIB_HPP +#ifndef OCC_ATTRIB_HPP +#define OCC_ATTRIB_HPP #include "CubitDefines.h" #include "CubitString.hpp" Modified: cgm/trunk/geom/OCC/OCCAttribSet.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCAttribSet.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCAttribSet.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -11,7 +11,8 @@ //------------------------------------------------------------------------- #include "OCCAttribSet.hpp" -#include "OCCAttrib.hpp" +//#include "OCCAttrib.hpp" +#include "OCCQueryEngine.hpp" #include "CubitSimpleAttrib.hpp" #include "CubitFileIOWrapper.hpp" #include "Handle_TDataStd_Shape.hxx" @@ -28,293 +29,420 @@ #include "TopoDS_Shape.hxx" #include "TDF_ChildIterator.hxx" -void OCCAttribSet::append_attribute( CubitSimpleAttrib* csa, TopoDS_Shape& shape ) +void OCCAttribSet::FindShape(TopoDS_Shape& shape, + TDF_Label& aLabel, + CubitBoolean& found) { - OCCAttrib* new_attrib = new OCCAttrib(csa); - new_attrib->listNext = listHead; - listHead = new_attrib; - - TDF_Label child; - //Add attributes on child of myLabel - //1. add shape attribute, first check to make sure there's no shape attribute - CubitBoolean found = CUBIT_FALSE; - for (TDF_ChildIterator it1(myLabel, CUBIT_FALSE); it1.More(); it1.Next()) + for (TDF_ChildIterator it1(OCCQueryEngine::instance()->mainLabel, CUBIT_FALSE); + it1.More(); it1.Next()) { - //find the same type attribute first - child = it1.Value(); + //find the same shape attribute first + aLabel = it1.Value(); Handle_TDataStd_Shape attr_shape; TopoDS_Shape old_shape; - if(TDataStd_Shape::Find(child, attr_shape)) - old_shape = attr_shape->Get(child); - if(old_shape.IsEqual(shape)) + if(aLabel.FindAttribute(TDataStd_Shape::GetID(), attr_shape)) + old_shape = attr_shape->Get(aLabel); + if(old_shape.IsSame(shape)) { found = CUBIT_TRUE; break; } } +} +void OCCAttribSet::append_attribute( CubitSimpleAttrib* csa, TopoDS_Shape& shape ) +{ + //Add attributes on child of myLabel + //1. add shape attribute, first check to make sure there's no shape attribute + CubitBoolean found = CUBIT_FALSE; + TDF_Label aLabel; + + FindShape(shape, aLabel, found); + if(!found) { - child = myLabel.NewChild(); - Handle_TDataStd_Shape attr_shape = TDataStd_Shape::Set(child, shape); - child.AddAttribute(attr_shape); + aLabel = OCCQueryEngine::instance()->mainLabel.NewChild(); + Handle_TDataStd_Shape attr_shape = TDataStd_Shape::Set(aLabel, shape); + //myLabel.AddAttribute(attr_shape); + //test if the attribute has been attached + assert(aLabel.IsAttribute(TDataStd_Shape::GetID())); } - //2. add type attribute , belowing attributes are added on child lable of child - //First create new child label - TDF_Label lab = child.NewChild(); - - //Then add child labels - CubitString type = csa->character_type(); - if(type.length() > 0) + //2. add type attribute , below attributes are added on child lable of myLabel + //First check if the attributes are already exist, if so, create new data. + TDF_Label lab; + Handle_TDataStd_Name attr_name; + TCollection_ExtendedString name_string; + CubitString type = csa->character_type(); + TCollection_ExtendedString cstring( (Standard_CString)type.c_str() ); + found = CUBIT_FALSE; + for (TDF_ChildIterator it(aLabel,CUBIT_FALSE); it.More(); it.Next()) { - TCollection_ExtendedString cstring( (Standard_CString)type.c_str() ); - Handle_TDataStd_Name attr_name = TDataStd_Name::Set(lab, cstring); - lab.AddAttribute(attr_name); + lab = it.Value(); + found = find_attribute(lab, csa); + if(!found) + { + //check if the type attribute is the same, disable it + TCollection_ExtendedString old_string; + if(lab.FindAttribute(TDataStd_Name::GetID(), attr_name)) + { + old_string = attr_name->Get(); + + if(old_string == cstring) + lab.ForgetAllAttributes(); + } + } + if(found) + break; } + //if not exist, create new child label + if (!found) + { + lab = aLabel.NewChild(); + attr_name = TDataStd_Name::Set(lab, cstring); + assert(lab.IsAttribute(TDataStd_Name::GetID())); + } + + else//nothing to do + return; + //3. add string attribute DLIList<CubitString*>* strings = csa->string_data_list(); - TDF_Label lab_child = lab.NewChild(); Handle_TDataStd_ExtStringArray attr_string; - if(strings && strings->size() > 0) + int size = strings->size()-1; + if(strings && size > 0) { - //set the length of String Array be 11, can be extended. - attr_string = TDataStd_ExtStringArray::Set(lab_child, 0, 10); + //set the length of String Array . + attr_string = TDataStd_ExtStringArray::Set(lab, 0, size-1); } - - for(int i = 0; strings && i < strings->size(); i++) + strings->reset(); + strings->step(); //type string filters out + for(int i = 0; strings && i < size; i++) { TCollection_ExtendedString cstring((Standard_CString)strings->get_and_step()->c_str() ); attr_string->SetValue(i, cstring) ; } - if(strings && strings->size() > 0) - lab_child.AddAttribute(attr_string); + + if (strings && size > 0) + assert(lab.IsAttribute(TDataStd_ExtStringArray::GetID())); //4. add double attribute DLIList<double*>* doubles = csa->double_data_list(); Handle_TDataStd_RealArray attr_double; - if(doubles && doubles->size() > 0) + size = doubles->size(); + if(doubles && size > 0) { - //set the length of double array be 11, can be extended. - attr_double = TDataStd_RealArray::Set(lab_child,0, 10); + //set the length of double array . + attr_double = TDataStd_RealArray::Set(lab,0, size-1); } - - for(int i = 0; doubles && i < doubles->size(); i++) + doubles->reset(); + for(int i = 0; doubles && i < size; i++) attr_double->SetValue(i, *(doubles->get_and_step())); - if(doubles && doubles->size() > 0) - lab_child.AddAttribute(attr_double); + if(doubles && size > 0) + assert(lab.IsAttribute(TDataStd_RealArray::GetID())); //5. add int attribute DLIList<int*>* ints = csa->int_data_list(); Handle_TDataStd_IntegerArray attr_int; - if(ints && ints->size() > 0) + size = ints->size(); + if(ints && size > 0) { //set the length of int array be 11, can be extended. - attr_int = TDataStd_IntegerArray::Set(lab_child, 0, 10); + attr_int = TDataStd_IntegerArray::Set(lab, 0, size-1); } - - for(int i = 0; ints && i < ints->size(); i++) + ints->reset(); + for(int i = 0; ints && i < size; i++) attr_int->SetValue(i, *(ints->get_and_step())); - if(ints && ints->size() > 0) - lab_child.AddAttribute(attr_int); + if(ints && size > 0) + assert(lab.IsAttribute(TDataStd_IntegerArray::GetID())); } -void OCCAttribSet::remove_attribute( CubitSimpleAttrib* csa) +CubitBoolean OCCAttribSet::find_attribute(TDF_Label child, + CubitSimpleAttrib* csa) { - if( !listHead ) - return; - - OCCAttrib* attrib = 0; - if ( listHead->equals(csa) ) - { - attrib = listHead; - listHead = listHead->listNext; - delete attrib; - return; - } - - for ( OCCAttrib* prev = listHead; prev->listNext; prev = prev->listNext ) - { - if( prev->listNext->equals(csa) ) - { - attrib = prev->listNext; - prev->listNext = attrib->listNext; - delete attrib; - return; - } - } - - //forget csa attribute from the document DLIList<int*>* ints = csa->int_data_list(); CubitString type = csa->character_type(); TCollection_ExtendedString cstring( (Standard_CString)type.c_str() ); + DLIList<double*>* doubles = csa->double_data_list(); + DLIList<CubitString*>* strings = csa->string_data_list(); - if(type.length() == 0) - return; - - DLIList<double*>* doubles = csa->double_data_list(); - DLIList<CubitString*>* strings = csa->string_data_list(); - for (TDF_ChildIterator it1(myLabel, CUBIT_TRUE); it1.More(); it1.Next()) + //find the same type attribute first + Handle_TDataStd_Name attr_name; + TCollection_ExtendedString old_string; + if(child.FindAttribute(TDataStd_Name::GetID(), attr_name)) { - //find the same type attribute first - TDF_Label child = it1.Value(); + old_string = attr_name->Get(); - Handle_TDataStd_Name attr_name; - TCollection_ExtendedString old_string; - if(child.FindAttribute(TDataStd_Name::GetID(), attr_name)) - old_string = attr_name->Get(); + if(old_string != cstring) + return CUBIT_FALSE; + } - if(old_string != cstring) - continue; - - //continue to compare the rest attributes. - CubitBoolean is_same = CUBIT_TRUE; - for(TDF_ChildIterator it2(child,CUBIT_FALSE); it2.More(); it2.Next()) + else + return CUBIT_FALSE; + + //continue to compare the rest attributes. + CubitBoolean is_same = CUBIT_TRUE; + if(ints->size() > 0 ) + { + Handle_TDataStd_IntegerArray attr_ints; + if(child.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints) && + attr_ints->Length() == ints->size()) { - is_same = CUBIT_TRUE; - TDF_Label g_child = it2.Value(); - if(ints->size() > 0 ) - { - Handle_TDataStd_IntegerArray attr_ints; - if(g_child.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints) && - attr_ints->Length() == ints->size()) + for(int i = 0; i < ints->size(); i++) + if(attr_ints->Value(i) != *ints->get_and_step()) { - for(int i = 0; i < ints->size(); i++) - if(attr_ints->Value(i) != *ints->get_and_step()) - { - is_same = CUBIT_FALSE; - break; - } + is_same = CUBIT_FALSE; + break; } - } - if(!is_same) - continue; - - if(doubles->size() > 0 ) - { - Handle_TDataStd_RealArray attr_doubles; - if(g_child.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles) && - attr_doubles->Length() == doubles->size()) + } + } + if(!is_same) + return is_same; + + if(doubles->size() > 0 ) + { + Handle_TDataStd_RealArray attr_doubles; + if(child.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles) && + attr_doubles->Length() == doubles->size()) + { + for(int i = 0; i < doubles->size(); i++) + if(attr_doubles->Value(i) != *doubles->get_and_step()) { - for(int i = 0; i < doubles->size(); i++) - if(attr_doubles->Value(i) != *doubles->get_and_step()) - { - is_same = CUBIT_FALSE; - break; - } + is_same = CUBIT_FALSE; + break; } - } + } + } - if(!is_same) - continue; + if(!is_same) + return is_same; - if(strings->size() > 0 ) + if(strings->size() > 0 ) + { + Handle_TDataStd_ExtStringArray attr_strings; + if(child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings) && + attr_strings->Length() == strings->size()-1) + { + strings->step();//filter out type string + for(int i = 0; i < strings->size()-1; i++) { - Handle_TDataStd_ExtStringArray attr_strings; - if(g_child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings) && - attr_strings->Length() == strings->size()) + CubitString astring = *strings->get_and_step(); + TCollection_ExtendedString string( (Standard_CString)astring.c_str() ); + if(attr_strings->Value(i) != string) { - for(int i = 0; i < strings->size(); i++) - { - CubitString astring = *strings->get_and_step(); - TCollection_ExtendedString string( (Standard_CString)astring.c_str() ); - if(attr_strings->Value(i) != string) - { - is_same = CUBIT_FALSE; - break; - } - } + is_same = CUBIT_FALSE; + break; } } - if(!is_same) - continue; - - child.ForgetAllAttributes( ); } } + return is_same ; } -void OCCAttribSet::remove_all_attributes() +void OCCAttribSet::remove_attribute( CubitSimpleAttrib* csa) { - while( listHead ) + CubitString type = csa->character_type(); + if(type.length() == 0) + return; + + TDF_Label myLabel; + for (TDF_ChildIterator it(OCCQueryEngine::instance()->mainLabel, CUBIT_FALSE); it.More(); it.Next()) { - OCCAttrib* dead = listHead; - listHead = dead->listNext; - delete dead; + //find the same type attribute first + myLabel = it.Value(); + + //forget csa attribute from the document + for (TDF_ChildIterator it1(myLabel, CUBIT_FALSE); it1.More(); it1.Next()) + { + //find the same type attribute first + TDF_Label child = it1.Value(); + + CubitBoolean found = find_attribute(child, csa); + + if(found) + child.ForgetAllAttributes( ); + } } - myLabel.ForgetAllAttributes( ); } -CubitStatus OCCAttribSet::get_attributes( DLIList<CubitSimpleAttrib*>& list ) const +void OCCAttribSet::remove_attribute( CubitSimpleAttrib* csa, + TopoDS_Shape& shape) { - for( OCCAttrib* attrib = listHead; attrib; attrib = attrib->listNext ) - list.append( attrib->get_CSA() ); - return CUBIT_SUCCESS; + CubitBoolean found = CUBIT_FALSE; + TDF_Label myLabel; + + FindShape(shape, myLabel, found); + + if(!found) + return; + + for (TDF_ChildIterator it1(myLabel, CUBIT_FALSE); it1.More(); it1.Next()) + { + //find the same type attribute first + TDF_Label child = it1.Value(); + + if(!csa) + child.ForgetAllAttributes( ); + + else + { + CubitBoolean found = find_attribute(child, csa); + + if(found) + child.ForgetAllAttributes( ); + } + } } -CubitStatus OCCAttribSet::get_attributes( const CubitString& name, - DLIList<CubitSimpleAttrib*>& list ) const +void OCCAttribSet::get_attributes(TDF_Label &lab, + DLIList<CubitSimpleAttrib*>& list) { - for( OCCAttrib* attrib = listHead; attrib; attrib = attrib->listNext ) - if( attrib->name() == name ) - list.append( attrib->get_CSA() ); - return CUBIT_SUCCESS; + DLIList<CubitString*> strings; + CubitString* string; + DLIList<double> doubles; + DLIList<int> ints; + + Handle_TDataStd_Name attr_name; + TCollection_ExtendedString name_string; + Handle_TDataStd_ExtStringArray attr_string; + Handle_TDataStd_RealArray attr_doubles; + Handle_TDataStd_IntegerArray attr_ints; + + if(lab.FindAttribute(TDataStd_Name::GetID(), attr_name)) + { + name_string = attr_name->Get(); + int length = name_string.Length(); + char temp_type[length]; + for (int i = 1 ; i <= length; i++) + { + Standard_ExtCharacter c = name_string.Value(i); + temp_type[i-1] = ToCharacter(c); + } + CubitString temp_string(temp_type); + temp_string = temp_string.substr(0, length); + string = new CubitString(temp_string); + strings.append(string); + } + if(lab.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_string)) + { + int length = attr_string->Length(); + for (int i = 0 ; i < length; i++) + { + name_string = attr_string->Value(i); + int length2 = name_string.Length(); + char temp_string[length2]; + for(int j = 1; j <= length2; j ++) + { + Standard_ExtCharacter c = name_string.Value(j); + temp_string[j-1] = ToCharacter(c); + } + CubitString tmp_string(temp_string); + tmp_string = tmp_string.substr(0, length2); + string = new CubitString(tmp_string); + strings.append(string); + } + } + if(lab.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles)) + { + for(int i = 0; i < attr_doubles->Length(); i++) + { + double d = attr_doubles->Value(i); + doubles.append(d); + } + } + if(lab.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints)) + { + for(int i = 0; i < attr_ints->Length(); i++) + { + int j = attr_ints->Value(i); + ints.append(j); + } + } + CubitSimpleAttrib *tmp_attrib; + if(strings.size() > 0 || doubles.size() || ints.size()) + { + tmp_attrib = new CubitSimpleAttrib(&strings, &doubles, &ints); + list.append(tmp_attrib); + } + for(int i = 0; i < strings.size(); i++) + delete strings.get_and_step(); } -CubitStatus OCCAttribSet::save_attributes( FILE* file_ptr ) const +CubitStatus OCCAttribSet::get_attributes( TopoDS_Shape& shape, + DLIList<CubitSimpleAttrib*>& list) { - OCCAttrib *curr_attrib; - CubitStatus status = CUBIT_SUCCESS; - - //save # attribs - unsigned int size = attribute_count(); - NCubitFile::CIOWrapper wrapper( file_ptr ); - wrapper.Write( &size, 1 ); + CubitBoolean found = CUBIT_FALSE; + TDF_Label myLabel; - //save each attrib - for( curr_attrib = listHead; curr_attrib; curr_attrib = curr_attrib->listNext ) - if( !curr_attrib->save(file_ptr) ) - status = CUBIT_FAILURE; + FindShape(shape, myLabel, found); - return status; + if(!found) + return CUBIT_FAILURE; + + DLIList<CubitString*> strings; + CubitString* string; + DLIList<double> doubles; + DLIList<int> ints; + TDF_Label lab; + Handle_TDataStd_Name attr_name; + TCollection_ExtendedString name_string; + Handle_TDataStd_ExtStringArray attr_string; + Handle_TDataStd_RealArray attr_doubles; + Handle_TDataStd_IntegerArray attr_ints; + for (TDF_ChildIterator it(myLabel,CUBIT_FALSE); it.More(); it.Next()) + { + lab = it.Value(); + get_attributes(lab, list); + } + return CUBIT_SUCCESS; } - -CubitStatus OCCAttribSet::restore_attributes( FILE* file_ptr, unsigned endian ) + +CubitStatus OCCAttribSet::get_attributes( const CubitString& name, + TopoDS_Shape& shape, + DLIList<CubitSimpleAttrib*>& list ) { - OCCAttrib *curr_attrib; - - //Read # attribs - unsigned int size; - NCubitFile::CIOWrapper wrapper( endian, file_ptr ); - wrapper.Read( &size, 1 ); + CubitBoolean found = CUBIT_FALSE; + TDF_Label aLabel; - for (unsigned i = 0; i < size; i++) + FindShape(shape, aLabel, found); + + if(!found) + return CUBIT_FAILURE; + + Handle_TDataStd_Name attr_name; + TCollection_ExtendedString cstring( (Standard_CString)name.c_str() ); + TDF_Label lab; + for (TDF_ChildIterator it(aLabel,CUBIT_FALSE); it.More(); it.Next()) { - curr_attrib = OCCAttrib::restore( file_ptr, endian); - if (!curr_attrib) + lab = it.Value(); + + //check if the type attribute is the same, disable it + TCollection_ExtendedString old_string; + if(lab.FindAttribute(TDataStd_Name::GetID(), attr_name)) { - // file corrupt? don't try to read any more - return CUBIT_FAILURE; + old_string = attr_name->Get(); + + if(old_string == cstring) + { + get_attributes(lab, list); + break; + } } - - curr_attrib->listNext = listHead; - listHead = curr_attrib; } - + return CUBIT_SUCCESS; } -int OCCAttribSet::attribute_count() const +int OCCAttribSet::attribute_count() { int count = 0; - for( OCCAttrib* attrib = listHead; attrib; attrib = attrib->listNext ) - count++; + return count; } Modified: cgm/trunk/geom/OCC/OCCAttribSet.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCAttribSet.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCAttribSet.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -12,14 +12,12 @@ #ifndef FACET_BRIDGE_HPP #define FACET_BRIDGE_HPP +#include "config.h" #include <DLIList.hpp> #include "TDF_Label.hxx" -#include "TDF_TagSource.hxx" -#include "OCCQueryEngine.hpp" class CubitSimpleAttrib; -class OCCAttrib; class CubitString; class TopoDS_Shape; @@ -28,32 +26,35 @@ public: - OCCAttribSet() : listHead(0) - {myLabel = TDF_TagSource::NewChild(OCCQueryEngine::mainLabel);} + OCCAttribSet() {}; - ~OCCAttribSet() { remove_all_attributes(); } + ~OCCAttribSet() { ; } + static void FindShape(TopoDS_Shape& shape, + TDF_Label& aLabel, + CubitBoolean& found); - void append_attribute( CubitSimpleAttrib*, TopoDS_Shape& shape ); + static CubitBoolean find_attribute(TDF_Label child, + CubitSimpleAttrib* csa); + + static void append_attribute( CubitSimpleAttrib*, TopoDS_Shape& shape ); - void remove_attribute( CubitSimpleAttrib* ); + static void remove_attribute( CubitSimpleAttrib* ); - void remove_all_attributes(); + static void remove_attribute(CubitSimpleAttrib*, TopoDS_Shape& shape ); + + static void get_attributes(TDF_Label &lab, + DLIList<CubitSimpleAttrib*>& list); + + static CubitStatus get_attributes( TopoDS_Shape& shape, + DLIList<CubitSimpleAttrib*>& ) ; - CubitStatus get_attributes( DLIList<CubitSimpleAttrib*>& ) const; + static CubitStatus get_attributes( const CubitString& name, + TopoDS_Shape& shape, + DLIList<CubitSimpleAttrib*>& ) ; - CubitStatus get_attributes( const CubitString& name, - DLIList<CubitSimpleAttrib*>& ) const; + static int attribute_count() ; - CubitStatus save_attributes( FILE* file ) const; - - CubitStatus restore_attributes( FILE* file, unsigned int endian ); - - int attribute_count() const; - private: - - OCCAttrib* listHead; - TDF_Label myLabel; }; #endif Modified: cgm/trunk/geom/OCC/OCCBody.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCBody.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -127,27 +127,72 @@ } void OCCBody::append_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.append_attribute(csa, *myTopoDSShape); } +{ + if(IsSheetBody) + { + TopoDS_Face * face = mySheetSurface->get_TopoDS_Face(); + OCCAttribSet::append_attribute(csa, *face); + } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + OCCAttribSet::append_attribute(csa, *shell); + } + else + OCCAttribSet::append_attribute(csa, *myTopoDSShape); +} void OCCBody::remove_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.remove_attribute(csa); } +{ + if(IsSheetBody) + { + TopoDS_Face * face = mySheetSurface->get_TopoDS_Face(); + OCCAttribSet::remove_attribute(csa, *face); + } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + OCCAttribSet::remove_attribute(csa, *shell); + } + else + OCCAttribSet::remove_attribute(csa, *myTopoDSShape); +} + void OCCBody::remove_all_simple_attribute_virt() - { attribSet.remove_all_attributes(); } + { remove_simple_attribute_virt(NULL); } CubitStatus OCCBody::get_simple_attribute(DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes(csa_list); } +{ + if(IsSheetBody) + { + TopoDS_Face * face = mySheetSurface->get_TopoDS_Face(); + return OCCAttribSet::get_attributes(*face, csa_list); + } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + return OCCAttribSet::get_attributes(*shell, csa_list); + } + return OCCAttribSet::get_attributes(*myTopoDSShape,csa_list); +} CubitStatus OCCBody::get_simple_attribute( const CubitString& name, DLIList<CubitSimpleAttrib*>& csa_list ) - { return attribSet.get_attributes( name, csa_list ); } +{ + if(IsSheetBody) + { + TopoDS_Face * face = mySheetSurface->get_TopoDS_Face(); + return OCCAttribSet::get_attributes(name, *face, csa_list); + } + else if(myShell) + { + TopoDS_Shell* shell = myShell->get_TopoDS_Shell(); + return OCCAttribSet::get_attributes(name, *shell, csa_list); + } + return OCCAttribSet::get_attributes( name, *myTopoDSShape, csa_list ); +} -CubitStatus OCCBody::save_attribs( FILE *file_ptr ) - { return attribSet.save_attributes( file_ptr); } - -CubitStatus OCCBody::restore_attribs( FILE *file_ptr, unsigned int endian ) - { return attribSet.restore_attributes( file_ptr, endian ); } - CubitStatus OCCBody::get_transforms( CubitTransformMatrix &tfm ) { return CUBIT_SUCCESS; Modified: cgm/trunk/geom/OCC/OCCBody.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCBody.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCBody.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -159,12 +159,6 @@ CubitStatus reflect(double,double,double); //- reflect about an axis - CubitStatus save_attribs( FILE* file_ptr ); - // Write FactAttribs out to file - - CubitStatus restore_attribs( FILE* file_ptr, unsigned int endian ); - // Read FactAttribs from file - virtual void get_parents_virt( DLIList<TopologyBridge*>& parents ); virtual void get_children_virt( DLIList<TopologyBridge*>& children ); Modified: cgm/trunk/geom/OCC/OCCCurve.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCCurve.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCCurve.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -135,7 +135,7 @@ // Creation Date : 07/14/00 //------------------------------------------------------------------------- void OCCCurve::append_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.append_attribute(csa, *myTopoDSEdge); } + { OCCAttribSet::append_attribute(csa, *myTopoDSEdge); } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove a simple @@ -149,7 +149,7 @@ // Creation Date : 07/14/00 //------------------------------------------------------------------------- void OCCCurve::remove_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.remove_attribute(csa); } + { OCCAttribSet::remove_attribute(csa, *myTopoDSEdge); } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove all simple @@ -164,7 +164,7 @@ // Creation Date : 07/14/00 //------------------------------------------------------------------------- void OCCCurve::remove_all_simple_attribute_virt() - { attribSet.remove_all_attributes(); } + { OCCAttribSet::remove_attribute(NULL, *myTopoDSEdge); } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to get the @@ -179,21 +179,12 @@ //------------------------------------------------------------------------- CubitStatus OCCCurve::get_simple_attribute(DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes(csa_list); } + { return OCCAttribSet::get_attributes(*myTopoDSEdge, csa_list); } CubitStatus OCCCurve::get_simple_attribute( const CubitString& name, DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes( name, csa_list ); } + { return OCCAttribSet::get_attributes( name, *myTopoDSEdge, csa_list ); } - -CubitStatus OCCCurve::save_attribs( FILE *file_ptr ) - { return attribSet.save_attributes(file_ptr); } - -CubitStatus OCCCurve::restore_attribs( FILE *file_ptr, unsigned int endian ) - { return attribSet.restore_attributes(file_ptr, endian); } - - - //------------------------------------------------------------------------- // Purpose : Get geometry modeling engine: OCCQueryEngine // Modified: cgm/trunk/geom/OCC/OCCCurve.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCCurve.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCCurve.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -17,7 +17,7 @@ // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** - +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "CubitDefines.h" #include "Curve.hpp" Modified: cgm/trunk/geom/OCC/OCCLoop.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLoop.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCLoop.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -108,9 +108,6 @@ //------------------------------------------------------------------------- void OCCLoop::append_simple_attribute_virt(CubitSimpleAttrib* /*csattrib_ptr*/) { - //PRINT_ERROR("OCCLoop::append_simple_attribute_virt not defined\n"); - return; - } //------------------------------------------------------------------------- @@ -123,8 +120,6 @@ //------------------------------------------------------------------------- void OCCLoop::remove_simple_attribute_virt(CubitSimpleAttrib* /*csattrib_ptr*/) { - //PRINT_ERROR("OCCLoop::remove_simple_attribute_virt not defined\n"); - return; } //------------------------------------------------------------------------- @@ -138,8 +133,6 @@ //------------------------------------------------------------------------- void OCCLoop::remove_all_simple_attribute_virt() { - //PRINT_ERROR(" OCCLoop::remove_all_simple_attribute_virt not defined\n"); - return; } //------------------------------------------------------------------------- @@ -153,11 +146,9 @@ CubitStatus OCCLoop::get_simple_attribute(DLIList<CubitSimpleAttrib*>& /*cubit_simple_attrib_list*/) { - //PRINT_ERROR("OCCLoop::get_simple_attribute not defined\n"); - return CUBIT_FAILURE; } CubitStatus OCCLoop::get_simple_attribute(const CubitString&, - DLIList<CubitSimpleAttrib*>&) + DLIList<CubitSimpleAttrib*>&) { return CUBIT_FAILURE; } void OCCLoop::get_parents_virt( DLIList<TopologyBridge*>& parents ) Modified: cgm/trunk/geom/OCC/OCCLump.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCLump.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -124,7 +124,16 @@ // Creation Date : 11/21/96 //------------------------------------------------------------------------- void OCCLump::append_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.append_attribute(csa, *myTopoDSSolid); } +{ + TopoDS_Shape shape; + if(mySheetSurface) + shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); + else + shape =*myTopoDSSolid; + OCCAttribSet::append_attribute(csa, shape); +} //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove a simple @@ -138,7 +147,16 @@ // Creation Date : 03/18/97 //------------------------------------------------------------------------- void OCCLump::remove_simple_attribute_virt(CubitSimpleAttrib *csa ) - { attribSet.remove_attribute(csa); } +{ + TopoDS_Shape shape; + if(mySheetSurface) + shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); + else + shape =*myTopoDSSolid; + OCCAttribSet::remove_attribute(csa, shape); +} //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove all simple @@ -153,7 +171,16 @@ // Creation Date : 07/10/98 //------------------------------------------------------------------------- void OCCLump::remove_all_simple_attribute_virt() -{ attribSet.remove_all_attributes(); } +{ + TopoDS_Shape shape; + if(mySheetSurface) + shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); + else + shape =*myTopoDSSolid; + OCCAttribSet::remove_attribute(NULL, shape); +} //------------------------------------------------------------------------- // Purpose : The purpose of this function is to get the @@ -164,21 +191,31 @@ // //------------------------------------------------------------------------- CubitStatus OCCLump::get_simple_attribute(DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes( csa_list ); } +{ + TopoDS_Shape shape; + if(mySheetSurface) + shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); + else + shape =*myTopoDSSolid; + return OCCAttribSet::get_attributes(shape, csa_list ); +} CubitStatus OCCLump::get_simple_attribute( const CubitString& name, DLIList<CubitSimpleAttrib*>& csa_list ) - { return attribSet.get_attributes( name, csa_list ); } +{ + TopoDS_Shape shape; + if(mySheetSurface) + shape = *(mySheetSurface->get_TopoDS_Face()); + else if(myShell) + shape = *(myShell->get_TopoDS_Shell()); + else + shape =*myTopoDSSolid; + return OCCAttribSet::get_attributes( name, shape, csa_list ); +} -CubitStatus OCCLump::save_attribs( FILE *file_ptr ) - { return attribSet.save_attributes( file_ptr ); } -CubitStatus OCCLump::restore_attribs( FILE *file_ptr, unsigned int endian ) - { return attribSet.restore_attributes( file_ptr, endian ); } - - - - //------------------------------------------------------------------------- // Purpose : Get the bounding box of the object. // Modified: cgm/trunk/geom/OCC/OCCLump.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCLump.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCLump.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -15,6 +15,7 @@ // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "CubitDefines.h" Modified: cgm/trunk/geom/OCC/OCCModifyEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCModifyEngine.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCModifyEngine.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -28,6 +28,7 @@ class TopoDS_Edge; class TopoDS_Face; class CubitBox; +class BRepAlgoAPI_BooleanOperation; class OCCModifyEngine : public GeometryModifyEngine { Modified: cgm/trunk/geom/OCC/OCCPoint.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCPoint.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCPoint.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -22,7 +22,6 @@ #include "OCCCurve.hpp" #include "OCCQueryEngine.hpp" #include "CastTo.hpp" -#include "OCCAttribSet.hpp" #include "CubitSimpleAttrib.hpp" #include "BRep_Tool.hxx" #include "TopExp.hxx" @@ -105,7 +104,7 @@ // Creation Date : 07/16/00 //------------------------------------------------------------------------- void OCCPoint::append_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.append_attribute(csa, *myTopoDSVertex); } + { OCCAttribSet::append_attribute(csa, *myTopoDSVertex); } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove a simple @@ -119,7 +118,7 @@ // Creation Date : 07/16/00 //------------------------------------------------------------------------- void OCCPoint::remove_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.remove_attribute(csa); } + { OCCAttribSet::remove_attribute(csa, *myTopoDSVertex); } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to remove all simple @@ -134,7 +133,7 @@ // Creation Date : 07/16/00 //------------------------------------------------------------------------- void OCCPoint::remove_all_simple_attribute_virt() - { attribSet.remove_all_attributes(); } + { OCCAttribSet::remove_attribute(NULL, *myTopoDSVertex); } //------------------------------------------------------------------------- // Purpose : The purpose of this function is to get the @@ -149,22 +148,14 @@ //------------------------------------------------------------------------- CubitStatus OCCPoint::get_simple_attribute(DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes(csa_list); + { return OCCAttribSet::get_attributes(*myTopoDSVertex,csa_list); } CubitStatus OCCPoint::get_simple_attribute(const CubitString& name, DLIList<CubitSimpleAttrib*>& csa_list ) - { return attribSet.get_attributes( name, csa_list ); + { return OCCAttribSet::get_attributes( name, *myTopoDSVertex, csa_list ); } -CubitStatus OCCPoint::save_attribs( FILE *file_ptr ) - { return attribSet.save_attributes(file_ptr); - } - -CubitStatus OCCPoint::restore_attribs( FILE *file_ptr, unsigned int endian ) - { return attribSet.restore_attributes(file_ptr, endian); - } - //------------------------------------------------------------------------- // Purpose : Returns the coordinates of this Point. // Modified: cgm/trunk/geom/OCC/OCCPoint.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCPoint.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCPoint.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -17,7 +17,7 @@ // ********** BEGIN STANDARD INCLUDES ********** // ********** END STANDARD INCLUDES ********** - +#include "config.h" // ********** BEGIN CUBIT INCLUDES ********** #include "Point.hpp" #include <stdio.h> Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -14,6 +14,7 @@ // //------------------------------------------------------------------------- #include "config.h" +#include <Standard_Stream.hxx> #include "BRep_Tool.hxx" #include "gp_Pnt.hxx" #include "gp_Ax1.hxx" @@ -23,6 +24,7 @@ #include "BRepBuilderAPI.hxx" #include "BRepBuilderAPI_Transform.hxx" #include "BRepBuilderAPI_MakeSolid.hxx" +#include "OCCShapeAttributeSet.hpp" #include "BRepBuilderAPI_MakeShell.hxx" #include "BRepTools_WireExplorer.hxx" #include "TColgp_Array1OfPnt.hxx" @@ -95,6 +97,8 @@ #include <BndLib_AddSurface.hxx> #include <Precision.hxx> #include <BRepAdaptor_Surface.hxx> +#include <TDataStd_Shape.hxx> +#include <TDF_ChildIterator.hxx> #include "Standard_Boolean.hxx" //#include "TopOpeBRep_ShapeIntersector.hxx" @@ -153,6 +157,7 @@ TCollection_ExtendedString xString; MyDF = new TDocStd_Document(xString); mainLabel = MyDF->Main(); + EXPORT_ATTRIB = CUBIT_TRUE; } //================================================================================ @@ -1006,13 +1011,63 @@ B.Add(Co, *vertex); } - if(!BRepTools::Write(Co, const_cast<char*>(file_name))) + TDF_Label label; + if(EXPORT_ATTRIB) + label = mainLabel; + + if(!Write(Co, const_cast<char*>(file_name),label)) + //if(!BRepTools::Write(Co, const_cast<char*>(file_name))) return CUBIT_FAILURE; return CUBIT_SUCCESS; } +CubitBoolean OCCQueryEngine::Write(const TopoDS_Shape& Sh, + const Standard_CString File, + TDF_Label label) +{ + ofstream os; + os.open(File, ios::out); + if (!os.rdbuf()->is_open()) return Standard_False; + + CubitBoolean isGood = (os.good() && !os.eof()); + if(!isGood) + return isGood; + OCCShapeAttributeSet SS; + SS.Add(Sh); + + os << "DBRep_DrawableShape\n"; // for easy Draw read + SS.Write(os, label); + isGood = os.good(); + if(isGood ) + SS.Write(Sh,os); + os.flush(); + isGood = os.good(); + os.close(); + isGood = os.good() && isGood; + + return isGood; +} + + +CubitBoolean OCCQueryEngine::Read(TopoDS_Shape& Sh, + const Standard_CString File, + TDF_Label label) +{ + filebuf fic; + istream in(&fic); + // if (!fic.open(File,input)) return Standard_False; + if (!fic.open(File, ios::in)) return Standard_False; + + OCCShapeAttributeSet SS; + SS.Read(in, label); + int nbshapes = SS.NbShapes(); + if(!nbshapes) return CUBIT_FALSE; + SS.Read(Sh,in,nbshapes); + return CUBIT_TRUE; +} + CubitStatus OCCQueryEngine::import_temp_geom_file(FILE* file_ptr, const char* file_name, @@ -1049,7 +1104,7 @@ { TopoDS_Shape *aShape = new TopoDS_Shape; BRep_Builder aBuilder; - Standard_Boolean result = BRepTools::Read(*aShape, (char*) file_name, aBuilder); + Standard_Boolean result = Read(*aShape, (char*) file_name, mainLabel); if (result==0) return CUBIT_FAILURE; CubitBoolean prev_global_val = PRINT_RESULT; @@ -1241,7 +1296,7 @@ OCCCoFace * coface = NULL; int size = cofaces_old.size(); CubitSense sense ; - if( aShape.Orientation() == CUBIT_REVERSED ) + if( aShape.Orientation() == TopAbs_REVERSED ) sense = (topo_face.Orientation() == TopAbs_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD); else sense = (topo_face.Orientation() == TopAbs_FORWARD ? CUBIT_FORWARD : CUBIT_REVERSED); @@ -2573,6 +2628,19 @@ if (!OCCMap->IsBound(old_shape) || old_shape.IsEqual(new_shape)) return -1; + //update the attribute label tree + DLIList<CubitSimpleAttrib*> list; + OCCAttribSet::get_attributes(old_shape, list); + + for(int i = 0; i < list.size(); i ++) + { + CubitSimpleAttrib* s_attr = list.get_and_step(); + OCCAttribSet::remove_attribute(s_attr); + if(!new_shape.IsNull()) + OCCAttribSet::append_attribute(s_attr, new_shape); + } + + //update CGM-OCC map int k = OCCMap->Find(old_shape); assert (k > 0 && k <= iTotalTBCreated); Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -26,13 +26,14 @@ #endif // ********** END STANDARD INCLUDES ********** - +#include "TDF_Label.hxx" // ********** BEGIN CUBIT INCLUDES ********** #include "config.h" #include "CubitFileIOWrapper.hpp" #include "GeometryQueryEngine.hpp" #include "Handle_TDocStd_Document.hxx" #include <map> + // ********** END CUBIT INCLUDES ********** // ********** BEGIN FORWARD DECLARATIONS @@ -77,7 +78,6 @@ class OCCCurve; class OCCPoint; -class TDF_Label; class BRepBuilderAPI_Transform; class TopTools_DataMapOfShapeInteger; class BRepAlgoAPI_BooleanOperation; @@ -112,6 +112,8 @@ //- Singleton pattern //- Controlled access and creation of the sole instance of this class. + CubitBoolean EXPORT_ATTRIB; + int update_OCC_map(TopoDS_Shape old_shape, TopoDS_Shape new_shape); virtual ~OCCQueryEngine(); @@ -362,7 +364,7 @@ DLIList<OCCLoop*> *WireList; //standalone wire list DLIList<OCCCurve*> *CurveList ; Handle(TDocStd_Document) MyDF; - static TDF_Label mainLabel; + TDF_Label mainLabel; TopTools_DataMapOfShapeInteger* OCCMap; std::map<int, TopologyBridge*>* OccToCGM; static int iTotalTBCreated ; @@ -382,6 +384,14 @@ DLIList<OCCCurve*> &facet_curves, DLIList<OCCPoint*> &facet_points ); + CubitBoolean Write(const TopoDS_Shape& Sh, + const Standard_CString File, + TDF_Label label); + + CubitBoolean Read(TopoDS_Shape& Sh, + const Standard_CString File, + TDF_Label label); + static CubitBoolean PRINT_RESULT; static OCCQueryEngine* instance_; Added: cgm/trunk/geom/OCC/OCCShapeAttributeSet.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCShapeAttributeSet.cpp (rev 0) +++ cgm/trunk/geom/OCC/OCCShapeAttributeSet.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -0,0 +1,1784 @@ +// File: OCCShapeAttributeSet.cxx +// Created: Thur Jul 10 2008 +// Author: Jane Hu + +#include <Standard_Stream.hxx> +#include <BRepTools.hxx> +#include "OCCShapeAttributeSet.hpp" +#include "CubitSimpleAttrib.hpp" +#include "OCCAttribSet.hpp" +//#include <Poly.hxx> +#include <TopoDS.hxx> +#include <TColStd_Array1OfReal.hxx> +#include <TColStd_HArray1OfInteger.hxx> +#include <TColgp_Array1OfPnt2d.hxx> +#include <BRep_GCurve.hxx> +#include <Handle_BRep_CurveOnClosedSurface.hxx> +#include <Handle_BRep_CurveOnSurface.hxx> +#include <TopAbs_ShapeEnum.hxx> +//#include <BRep_TFace.hxx> +//#include <BRep_TEdge.hxx> +//#include <BRep_TVertex.hxx> +#include <Handle_BRep_GCurve.hxx> +#include <BRep_Tool.hxx> +#include <TDF_ChildIterator.hxx> +#include <Handle_TDataStd_Shape.hxx> +#include <TopTools_LocationSet.hxx> +#include <TopTools_IndexedMapOfShape.hxx> +#include <TopoDS_Iterator.hxx> +//#include <BRep_CurveRepresentation.hxx> +#include <Poly_Polygon3D.hxx> +//#include <BRep_Polygon3D.hxx> +//#include <BRep_PolygonOnSurface.hxx> +//#include <BRep_PolygonOnClosedSurface.hxx> +//#include <BRep_PolygonOnTriangulation.hxx> +//#include <BRep_PolygonOnClosedTriangulation.hxx> +#include <BRep_CurveOnSurface.hxx> +#include <BRep_CurveOnClosedSurface.hxx> +//#include <BRep_ListOfCurveRepresentation.hxx> +//#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx> +#include <BRep_PointOnCurve.hxx> +#include <BRep_PointOnCurveOnSurface.hxx> +#include <BRep_PointOnSurface.hxx> +//#include <BRep_ListIteratorOfListOfPointRepresentation.hxx> +#include <TDF_Label.hxx> +#include <TDataStd_Shape.hxx> +#include <Handle_TDataStd_Name.hxx> +#include <TDataStd_Name.hxx> +#include <Handle_TDataStd_ExtStringArray.hxx> +#include <TDataStd_ExtStringArray.hxx> +#include <TCollection_ExtendedString.hxx> +#include <Handle_TDataStd_IntegerArray.hxx> +#include <TDataStd_IntegerArray.hxx> +#include <Handle_TDataStd_RealArray.hxx> +#include <TDataStd_RealArray.hxx> +#include <Handle_BRep_TVertex.hxx> +#include <BRep_ListIteratorOfListOfPointRepresentation.hxx> +#include <BRep_TVertex.hxx> +#include <BRep_PointRepresentation.hxx> +#include <Handle_BRep_TEdge.hxx> +#include <BRep_ListIteratorOfListOfCurveRepresentation.hxx> +#include <Handle_BRep_TFace.hxx> +#include <BRep_TFace.hxx> +#include <BRep_TEdge.hxx> +#include <BRep_CurveRepresentation.hxx> + +#include <TopoDS_Vertex.hxx> + +//#include <TColgp_HArray1OfPnt.hxx> +//#include <TColgp_HArray1OfPnt2d.hxx> +#include <TColStd_HArray1OfReal.hxx> +#include <Poly_Triangulation.hxx> +#include <Poly_PolygonOnTriangulation.hxx> + + +#ifdef MacOS +#define strcasecmp(p,q) strcmp(p,q) +#elseif WNT +#define strcasecmp strcmp +#elseif AIX +#include <string.h> +#endif + +const char* dVersion = "CASCADE Topology V1, (c) Matra-Datavision"; +const char* dVersion2 = "CASCADE Topology V2, (c) Matra-Datavision"; + +//======================================================================= +//function : PrintShapeEnum +//purpose : +//======================================================================= + +static void PrintShapeEnum(const TopAbs_ShapeEnum T, + Standard_OStream& S, + Standard_Boolean C) +{ + switch(T) { + + case TopAbs_VERTEX : + if (C) S << "Ve"; else S << "VERTEX "; + break; + + case TopAbs_EDGE : + if (C) S << "Ed"; else S << "EDGE "; + break; + + case TopAbs_WIRE : + if (C) S << "Wi"; else S << "WIRE "; + break; + + case TopAbs_FACE : + if (C) S << "Fa"; else S << "FACE "; + break; + + case TopAbs_SHELL : + if (C) S << "Sh"; else S << "SHELL "; + break; + + case TopAbs_SOLID : + if (C) S << "So"; else S << "SOLID "; + break; + + case TopAbs_COMPSOLID : + if (C) S << "CS"; else S << "COMPSOLID"; + break; + + case TopAbs_COMPOUND : + if (C) S << "Co"; else S << "COMPOUND "; + break; + + case TopAbs_SHAPE : + if (C) S << "Sp"; else S << "SHAPE"; + break; + } +} + +//======================================================================= +//function : PrintRegularity +//purpose : +//======================================================================= + +static void PrintRegularity(const GeomAbs_Shape C, + Standard_OStream& OS) +{ + switch (C) { + + case GeomAbs_C0 : + OS << "C0"; + break; + + case GeomAbs_G1 : + OS << "G1"; + break; + + case GeomAbs_C1 : + OS << "C1"; + break; + + case GeomAbs_G2 : + OS << "G2"; + break; + + case GeomAbs_C2 : + OS << "C2"; + break; + + case GeomAbs_C3 : + OS << "C3"; + break; + + case GeomAbs_CN : + OS << "CN"; + break; + + } +} + +//======================================================================= +//function : PrintOrientation +//purpose : +//======================================================================= + +static void PrintOrientation(const TopAbs_Orientation O, + Standard_OStream& S, + Standard_Boolean C) +{ + switch(O) { + + case TopAbs_FORWARD : + if (C) S << "+"; else S << "FORWARD"; + break; + + case TopAbs_REVERSED : + if (C) S << "-"; else S << "REVERSED"; + break; + + case TopAbs_INTERNAL : + if (C) S << "i"; else S << "INTERNAL"; + break; + + case TopAbs_EXTERNAL : + if (C) S << "e"; else S << "EXTERNAL"; + break; + } +} + +//======================================================================= +//function : ReadShapeEnum +//purpose : +//======================================================================= + +static TopAbs_ShapeEnum ReadShapeEnum(Standard_IStream& IS) +{ + char buffer[255]; + IS >> buffer; + + switch (buffer[0]) { + + case 'V' : + return TopAbs_VERTEX; + + case 'E' : + return TopAbs_EDGE; + + case 'W' : + return TopAbs_WIRE; + + case 'F' : + return TopAbs_FACE; + + case 'S' : + if (buffer[1] == 'h') + return TopAbs_SHELL; + else + return TopAbs_SOLID; + + case 'C' : + if (buffer[1] == 'S') + return TopAbs_COMPSOLID; + else + return TopAbs_COMPOUND; + + } + return TopAbs_COMPOUND; +} + +//======================================================================= +//function : ReadRegularity +//purpose : +//======================================================================= + +static GeomAbs_Shape ReadRegularity(Standard_IStream& IS) +{ + char buffer[255]; + IS >> buffer; + switch (buffer[0]) { + + case 'C' : + switch (buffer[1]) { + + case '0' : + return GeomAbs_C0; + + case '1' : + return GeomAbs_C1; + + case '2' : + return GeomAbs_C2; + + case '3' : + return GeomAbs_C3; + + case 'N' : + return GeomAbs_CN; + } + break; + + case 'G' : + switch (buffer[1]) { + + case '1' : + return GeomAbs_G1; + + case '2' : + return GeomAbs_G2; + + } + break; + } + return GeomAbs_C0; +} + +//======================================================================= +//function : OCCShapeAttributeSet +//purpose : +//======================================================================= + +OCCShapeAttributeSet::OCCShapeAttributeSet() + :myFormatNb(1) +{ +} + +//======================================================================= +//function : OCCShapeAttributeSet +//purpose : +//======================================================================= + +OCCShapeAttributeSet::OCCShapeAttributeSet (const BRep_Builder& B) + :myBuilder(B) +{ +} +//======================================================================= +//function : Add +//purpose : +//======================================================================= + +Standard_Integer OCCShapeAttributeSet::Add(const TopoDS_Shape& S) +{ + if (S.IsNull()) return 0; + myLocations.Add(S.Location()); + TopoDS_Shape S2 = S; + S2.Location(TopLoc_Location()); + Standard_Integer index = myShapes.FindIndex(S2); + if (index == 0) { + AddGeometry(S2); + + for (TopoDS_Iterator its(S2,Standard_False,Standard_False); + its.More(); its.Next()) + Add(its.Value()); + index = myShapes.Add(S2); + } + + return index; +} + +//======================================================================= +//function : AddGeometry +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::AddGeometry(const TopoDS_Shape& S) +{ + // Add the geometry + + if (S.ShapeType() == TopAbs_VERTEX) { + + Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(S.TShape()); + BRep_ListIteratorOfListOfPointRepresentation itrp(TV->Points()); + + while (itrp.More()) { + const Handle(BRep_PointRepresentation)& PR = itrp.Value(); + + if (PR->IsPointOnCurve()) { + myCurves.Add(PR->Curve()); + } + + else if (PR->IsPointOnCurveOnSurface()) { + myCurves2d.Add(PR->PCurve()); + mySurfaces.Add(PR->Surface()); + } + + else if (PR->IsPointOnSurface()) { + mySurfaces.Add(PR->Surface()); + } + + myLocations.Add(PR->Location()); + itrp.Next(); + } + + } + else if (S.ShapeType() == TopAbs_EDGE) { + + // Add the curve geometry + Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape()); + BRep_ListIteratorOfListOfCurveRepresentation itrc(TE->Curves()); + + while (itrc.More()) { + const Handle(BRep_CurveRepresentation)& CR = itrc.Value(); + if (CR->IsCurve3D()) { + if (!CR->Curve3D().IsNull()) { + myCurves.Add(CR->Curve3D()); + myLocations.Add(CR->Location()); + } + } + else if (CR->IsCurveOnSurface()) { + mySurfaces.Add(CR->Surface()); + myCurves2d.Add(CR->PCurve()); + myLocations.Add(CR->Location()); + if (CR->IsCurveOnClosedSurface()) + myCurves2d.Add(CR->PCurve2()); + } + else if (CR->IsRegularity()) { + mySurfaces.Add(CR->Surface()); + myLocations.Add(CR->Location()); + mySurfaces.Add(CR->Surface2()); + myLocations.Add(CR->Location2()); + } + itrc.Next(); + } + } + + else if (S.ShapeType() == TopAbs_FACE) { + + // Add the surface geometry + Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape()); + if (!TF->Surface().IsNull()) mySurfaces.Add(TF->Surface()); + + myLocations.Add(TF->Location()); + } +} + +//======================================================================= +//function : ReadAttribute +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::ReadAttribute(TopoDS_Shape& S, + Standard_IStream& IS, + TDF_Label& l_attr) +{ + char buffer[255]; + DLIList<CubitString*> strings; + DLIList<double> doubles; + DLIList<int> ints; + do { + IS >> buffer; + int i = 0; + while(buffer[i] != '*') + i++; + strings.clean_out(); + char type[i]; + + i = 0; + while(buffer[i] != '*') + { + type[i] = buffer[i]; + i++; + } + CubitString string(type); + string = string.substr(0, i ); + CubitString* string_prt = new CubitString(string); + strings.append(string_prt); + + IS >> buffer; + //consider there's only one string in the stringdata field + i = 0; + while(buffer[i] != '*') + i++; + char* stringdata = NULL; + if(i > 0) + { + stringdata = new char[i]; + i = 0; + while(buffer[i] != '*') + { + stringdata[i] = buffer[i]; + i++; + } + CubitString string2(stringdata); + string2 = string2.substr(0, i ); + CubitString* string_prt2 = new CubitString(string2); + strings.append(string_prt2); + } + + IS.get(); //' ' + int ints_[10]; + double doubles_[10]; + doubles.clean_out(); + ints.clean_out(); + char s; + IS.get(s); //either '*' or 'number' + i = 0; + while (s != '\n') + { + while(s != '*') // integer attributes + { + IS.unget(); + IS >> ints_[i]; + i++; + IS.get(); //' ' + IS.get(s); //either '*' or 'number' + } + + if(i > 0) + { + for(int j = 0; j < i; j++) + ints.append( ints_[j] ); + } + i = 0; + IS.get(); //' ' + IS.get(s); //either '*' or 'number' + while(s != '*') // double attributes + { + IS.unget(); + IS >> doubles_[i]; + i++; + IS.get(); //' ' + IS.get(s); //either '*' or 'number' + } + + if(i > 0) + { + for(int j = 0; j < i; j++) + doubles.append(doubles_[j]); + } + IS.get(s); //'\n' + } + + CubitSimpleAttrib *tmp_attrib = new CubitSimpleAttrib(&strings, &doubles, &ints); + + for(int i = 0; i < strings.size(); i++) + delete strings.get_and_step(); + + OCCAttribSet::append_attribute(tmp_attrib, S); + delete tmp_attrib; + + IS >> buffer; + }while(buffer[0] != '*'); +} + +//======================================================================= +//function : WriteAttribute +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::WriteAttribute(const TopoDS_Shape& S, + Standard_OStream& OS, + TDF_Label& l_attr)const +{ + if(l_attr.IsNull()) + return; + + Standard_Boolean found = Standard_False; + TDF_Label myLabel; + for (TDF_ChildIterator it1(l_attr,Standard_False); it1.More(); it1.Next()) + { + //find the same shape attribute first + myLabel = it1.Value(); + + Handle_TDataStd_Shape attr_shape; + TopoDS_Shape exsiting_shape; + if(TDataStd_Shape::Find(myLabel, attr_shape)) + exsiting_shape = attr_shape->Get(myLabel); + + if(!exsiting_shape.IsNull()) + { + if(exsiting_shape.IsPartner(S)) + { + found = Standard_True; + break; + } + } + } + if(!found) + return; + + if(!myLabel.HasChild()) + return; + + for (TDF_ChildIterator it2(myLabel,Standard_False); it2.More(); it2.Next()) + { + TDF_Label child = it2.Value(); + //Write out all attributes + Handle_TDataStd_Name attr_name; + TCollection_ExtendedString name_string; + if(child.FindAttribute(TDataStd_Name::GetID(), attr_name)) + { + OS << "\n"; + OS << "NEW_SIMPLE_ATTRIB "; + name_string = attr_name->Get(); + name_string.Print(OS); + OS << "* " ; + } + else + continue; + + Handle_TDataStd_ExtStringArray attr_strings; + if(child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings)) + { + Standard_Integer i = attr_strings->Lower(); + TCollection_ExtendedString string; + int size = attr_strings->Upper(); + for(; i <= size; i++) + { + string = attr_strings->Value(i); + string.Print(OS); + if(i < size ) + OS << " "; + } + } + OS << "* " ; + + Handle_TDataStd_IntegerArray attr_ints; + + if(child.FindAttribute(TDataStd_IntegerArray::GetID(), attr_ints)) + { + for(Standard_Integer i = attr_ints->Lower(); i <= attr_ints->Upper(); i++) + OS << attr_ints->Value(i) << " "; + } + + OS << '*' << ' ' ; + + Handle_TDataStd_RealArray attr_doubles; + if(child.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles)) + { + Standard_Integer i = attr_doubles->Lower(); + for(;i <= attr_doubles->Upper(); i++) + OS << attr_doubles->Value(i) << " "; + } + OS << '*' ; + } + OS << "\n*"; +} + +//======================================================================= +//function : Write +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::Write(Standard_OStream& OS, + TDF_Label l_attr)const +{ + //on sauvegarde l'ancien LC_NUMERIC + + char *oldnum,*plocal ; + plocal = setlocale(LC_NUMERIC, NULL) ; + oldnum = new char[strlen(plocal)+1] ; + strcpy(oldnum,plocal); + + // on positionne LC_NUMERIC a "C" (point decimal) + setlocale(LC_NUMERIC, "C") ; + + int prec = OS.precision(15); + + // write the copyright + if (myFormatNb == 2) + OS << "\n" << dVersion2 << endl; + else + OS << "\n" << dVersion << endl; + + //----------------------------------------- + // write the locations + //----------------------------------------- + myLocations.Write(OS); + + //----------------------------------------- + // write the geometry + //----------------------------------------- + + WriteGeometry(OS); + + //----------------------------------------- + // write the shapes + //----------------------------------------- + Standard_Integer i, nbShapes = myShapes.Extent(); + + OS << "\nTShapes " << nbShapes << "\n"; + + + // subshapes are written first + for (i = 1; i <= nbShapes; i++) { + + const TopoDS_Shape& S = myShapes(i); + + // Type + PrintShapeEnum(S.ShapeType(),OS,Standard_True); + OS << "\n"; + + // Geometry + WriteGeometry(S,OS); + + // Attributes + WriteAttribute(S, OS, l_attr); + + // Flags + OS << "\n"; + OS << (S.Free() ? 1 : 0); + OS << (S.Modified() ? 1 : 0); + OS << (S.Checked() ? 1 : 0); + OS << (S.Orientable() ? 1 : 0); + OS << (S.Closed() ? 1 : 0); + OS << (S.Infinite() ? 1 : 0); + OS << (S.Convex() ? 1 : 0); + OS << "\n"; + + // sub-shapes + + Standard_Integer l = 0; + TopoDS_Iterator its(S,Standard_False,Standard_False); + while (its.More()) { + Write(its.Value(),OS); + l++; + if (l == 10) { + OS << "\n"; + l = 0; + } + its.Next(); + } + Write(TopoDS_Shape(),OS); // Null shape to end the list + OS << "\n"; + } + + OS << endl; + OS.precision(prec); + + // on remet le LC_NUMERIC a la precedente valeur + setlocale(LC_NUMERIC, oldnum) ; + delete[] oldnum; +} + +//======================================================================= +//function : Read +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::Read(Standard_IStream& IS, + TDF_Label& l_attr) +{ + // on sauvegarde l'ancien LC_NUMERIC + char *oldnum,*plocal ; + plocal = setlocale(LC_NUMERIC, NULL) ; + oldnum = new char[strlen(plocal)+1] ; + strcpy(oldnum,plocal); + + Clear(); + + // Check the version + char vers[101]; + do { + IS.getline(vers,100,'\n'); + // BUC60769 PTV 18.10.2000: remove possible '\r' at the end of the line + //Standard_Integer lv = strlen(vers); + //char *pm; + //if(pm = strchr(vers,'\r')) + // *pm ='\0'; + + for (Standard_Integer lv = (strlen(vers)- 1); lv > 1 && (vers[lv] == '\r' || vers[lv] == '\n') ;lv--) + vers[lv] = '\0'; + + } while ( ! IS.fail() && strcmp(vers,dVersion) && strcmp(vers,dVersion2) ); + if (IS.fail()) { + cout << "File was not written with this version of the topology"<<endl; + setlocale(LC_NUMERIC, oldnum) ; + delete[] oldnum; + return; + } + if (strcmp(vers,dVersion2) == 0) myFormatNb = 2; + else myFormatNb = 1; + + //----------------------------------------- + // read the locations + //----------------------------------------- + + myLocations.Read(IS); + + //----------------------------------------- + // read the geometry + //----------------------------------------- + + ReadGeometry(IS); + + //----------------------------------------- + // read the shapes + //----------------------------------------- + + char buffer[255]; + IS >> buffer; + if (strcmp(buffer,"TShapes")) { + cout << "Not a TShape table"<<endl; + setlocale(LC_NUMERIC, oldnum) ; + delete[] oldnum; + return; + } + + Standard_Integer i, nbShapes; + IS >> nbShapes; + + for (i = 1; i <= nbShapes; i++) { + + TopoDS_Shape S; + + //Read type and create empty shape. + TopAbs_ShapeEnum T = ReadShapeEnum(IS); + ReadGeometry(T,IS,S); + + // Read Attributes and Set the flags + IS >> buffer; + + while (buffer[0] == 'N') + { + ReadAttribute(S, IS,l_attr); + IS >> buffer; + } + + // sub-shapes + TopoDS_Shape SS; + do { + Read(SS,IS,nbShapes); + if (!SS.IsNull()) + myBuilder.Add(S,SS); + } while(!SS.IsNull()); + + S.Free (buffer[0] == '1'); + S.Modified (buffer[1] == '1'); + + if (myFormatNb == 2) + S.Checked (buffer[2] == '1'); + else + S.Checked (Standard_False); // force check at reading.. + + S.Orientable(buffer[3] == '1'); + S.Closed (buffer[4] == '1'); + S.Infinite (buffer[5] == '1'); + S.Convex (buffer[6] == '1'); + + // check + + if (myFormatNb == 1) + Check(T,S); + + myShapes.Add(S); + } + + setlocale(LC_NUMERIC, oldnum) ; + delete[] oldnum; +} + +//======================================================================= +//function : WriteGeometry +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::WriteGeometry(Standard_OStream& OS) const +{ + myCurves2d.Write(OS); + myCurves.Write(OS); + WritePolygon3D(OS); + WritePolygonOnTriangulation(OS); + mySurfaces.Write(OS); + WriteTriangulation(OS); +} + +//======================================================================= +//function : ReadGeometry +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::ReadGeometry(Standard_IStream& IS) +{ + myCurves2d.Read(IS); + myCurves.Read(IS); + ReadPolygon3D(IS); + ReadPolygonOnTriangulation(IS); + mySurfaces.Read(IS); + ReadTriangulation(IS); +} + +//======================================================================= +//function : WritePolygon3D +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::WritePolygon3D(Standard_OStream& OS, + const Standard_Boolean Compact)const +{ + Standard_Integer i, j, nbpol = myPolygons3D.Extent(); + if (Compact) + OS << "Polygon3D " << nbpol << endl; + else { + OS << " -------\n"; + OS <<"Dump of " << nbpol << " Polygon3Ds\n"; + OS << " -------\n"; + } + + Handle(Poly_Polygon3D) P; + for (i = 1; i <= nbpol; i++) { + P = Handle(Poly_Polygon3D)::DownCast(myPolygons3D(i)); + if (Compact) { + OS << P->NbNodes() << " "; + OS << ((P->HasParameters()) ? "1" : "0") << "\n"; + } + else { + OS << " "<< i << " : Polygon3D with " << P->NbNodes() << " Nodes\n"; + OS << ((P->HasParameters()) ? "with" : "without") << " parameters\n"; + } + + + // write the deflection + if (!Compact) OS << "Deflection : "; + OS << P->Deflection() << "\n"; + + // write the nodes + if (!Compact) OS << "\nNodes :\n"; + + Standard_Integer i1, nbNodes = P->NbNodes(); + const TColgp_Array1OfPnt& Nodes = P->Nodes(); + for (j = 1; j <= nbNodes; j++) { + if (!Compact) OS << setw(10) << j << " : "; + if (!Compact) OS << setw(17); + OS << Nodes(j).X() << " "; + if (!Compact) OS << setw(17); + OS << Nodes(j).Y() << " "; + if (!Compact) OS << setw(17); + OS << Nodes(j).Z(); + if (!Compact) OS << "\n"; + else OS << " "; + } + OS <<"\n"; + + if (P->HasParameters()) { + if (!Compact) OS << "\nParameters :\n"; + const TColStd_Array1OfReal& Param = P->Parameters(); + for ( i1 = 1; i1 <= nbNodes; i1++ ) { + OS << Param(i1) << " "; + } + OS <<"\n"; + } + } +} + +//======================================================================= +//function : WritePolygonOnTriangulation +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::WritePolygonOnTriangulation( + Standard_OStream& OS, + const Standard_Boolean Compact)const +{ + Standard_Integer i, j, nbpOntri = myNodes.Extent(); + if (Compact) + OS << "PolygonOnTriangulations " << nbpOntri << endl; + else { + OS << " -------\n"; + OS <<"Dump of " << nbpOntri << " PolygonOnTriangulations\n"; + OS << " -------\n"; + } + + Handle(Poly_PolygonOnTriangulation) Poly; + Handle(TColStd_HArray1OfReal) Param; + + for (i=1; i<=nbpOntri; i++) { + Poly = Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(i)); + const TColStd_Array1OfInteger& Nodes = Poly->Nodes(); + if (!Compact) { + OS << " "<< i << " : PolygonOnTriangulation with " << Nodes.Length() << " Nodes\n"; + } + else OS << Nodes.Length()<<" "; + if (!Compact) OS <<" "; + for (j=1; j <= Nodes.Length(); j++) OS << Nodes.Value(j) << " "; + OS << "\n"; + + // writing parameters: + Param = Poly->Parameters(); + if (Compact) OS <<"p "; + + // write the deflection + if (!Compact) OS << " Deflection : "; + OS <<Poly->Deflection() << " "; + if (!Compact) OS << "\n"; + + if (!Param.IsNull()) { + if (!Compact) { + OS << " "<< "Parameters :"; + } + else OS << "1 " ; + if (!Compact) OS <<" "; + for (j=1; j <= Param->Length(); j++) OS << Param->Value(j) << " "; + OS << "\n"; + } + else OS <<"0 \n"; + } + +} + +//======================================================================= +//function : WriteTriangulation +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::WriteTriangulation(Standard_OStream& OS, + const Standard_Boolean Compact)const +{ + Standard_Integer i, j, nbNodes, nbtri = myTriangulations.Extent(); + Standard_Integer nbTriangles = 0, n1, n2, n3; + if (Compact) + OS << "Triangulations " << nbtri << endl; + else { + OS << " -------\n"; + OS <<"Dump of " << nbtri << " Triangulations\n"; + OS << " -------\n"; + } + + Handle(Poly_Triangulation) T; + for (i = 1; i <= nbtri; i++) { + T = Handle(Poly_Triangulation)::DownCast(myTriangulations(i)); + if (Compact) { + OS << T->NbNodes() << " " << T->NbTriangles() << " "; + OS << ((T->HasUVNodes()) ? "1" : "0") << " "; + } + else { + OS << " "<< i << " : Triangulation with " << T->NbNodes() << " Nodes and " + << T->NbTriangles() <<" Triangles\n"; + OS << " "<<((T->HasUVNodes()) ? "with" : "without") << " UV nodes\n"; + } + + // write the deflection + + if (!Compact) OS << " Deflection : "; + OS <<T->Deflection() << "\n"; + + // write the 3d nodes + + if (!Compact) OS << "\n3D Nodes :\n"; + + nbNodes = T->NbNodes(); + const TColgp_Array1OfPnt& Nodes = T->Nodes(); + for (j = 1; j <= nbNodes; j++) { + if (!Compact) OS << setw(10) << j << " : "; + if (!Compact) OS << setw(17); + OS << Nodes(j).X() << " "; + if (!Compact) OS << setw(17); + OS << Nodes(j).Y() << " "; + if (!Compact) OS << setw(17); + OS << Nodes(j).Z(); + if (!Compact) OS << "\n"; + else OS << " "; + } + + if (T->HasUVNodes()) { + if (!Compact) OS << "\nUV Nodes :\n"; + const TColgp_Array1OfPnt2d& UVNodes = T->UVNodes(); + for (j = 1; j <= nbNodes; j++) { + if (!Compact) OS << setw(10) << j << " : "; + if (!Compact) OS << setw(17); + OS << UVNodes(j).X() << " "; + if (!Compact) OS << setw(17); + OS << UVNodes(j).Y(); + if (!Compact) OS << "\n"; + else OS << " "; + } + } + + if (!Compact) OS << "\nTriangles :\n"; + nbTriangles = T->NbTriangles(); + const Poly_Array1OfTriangle& Triangles = T->Triangles(); + for (j = 1; j <= nbTriangles; j++) { + if (!Compact) OS << setw(10) << j << " : "; + Triangles(j).Get(n1, n2, n3); + if (!Compact) OS << setw(10); + OS << n1 << " "; + if (!Compact) OS << setw(10); + OS << n2 << " "; + if (!Compact) OS << setw(10); + OS << n3; + if (!Compact) OS << "\n"; + else OS << " "; + } + OS << "\n"; + } + +} +//======================================================================= +//function : WriteGeometry +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::WriteGeometry(const TopoDS_Shape& S, + Standard_OStream& OS)const +{ + // Write the geometry + + if (S.ShapeType() == TopAbs_VERTEX) { + + // Write the point geometry + TopoDS_Vertex V = TopoDS::Vertex(S); + OS << BRep_Tool::Tolerance(V) << "\n"; + gp_Pnt p = BRep_Tool::Pnt(V); + OS<<p.X()<<" "<<p.Y()<<" "<<p.Z()<<"\n"; + + Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(S.TShape()); + BRep_ListIteratorOfListOfPointRepresentation itrp(TV->Points()); + + while (itrp.More()) { + const Handle(BRep_PointRepresentation)& PR = itrp.Value(); + + OS << PR->Parameter(); + if (PR->IsPointOnCurve()) { + OS << " 1 " << myCurves.Index(PR->Curve()); + } + + else if (PR->IsPointOnCurveOnSurface()) { + OS << " 2 " << myCurves2d.Index(PR->PCurve()); + OS << " " << mySurfaces.Index(PR->Surface()); + } + + else if (PR->IsPointOnSurface()) { + OS << " 3 " << PR->Parameter2() << " "; + OS << mySurfaces.Index(PR->Surface()); + } + + OS << " " << myLocations.Index(PR->Location()); + OS << "\n"; + + itrp.Next(); + } + + OS << "0 0\n"; // end representations + + } + + else if (S.ShapeType() == TopAbs_EDGE) { + + // Write the curve geometry + + Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape()); + + OS << " " << TE->Tolerance() << " "; + OS << ((TE->SameParameter()) ? 1 : 0) << " "; + OS << ((TE->SameRange()) ? 1 : 0) << " "; + OS << ((TE->Degenerated()) ? 1 : 0) << "\n"; + + Standard_Real first, last; + BRep_ListIteratorOfListOfCurveRepresentation itrc = TE->Curves(); + while (itrc.More()) { + const Handle(BRep_CurveRepresentation)& CR = itrc.Value(); + if (CR->IsCurve3D()) { + if (!CR->Curve3D().IsNull()) { + Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value()); + GC->Range(first, last); + OS << "1 "; // -1- Curve 3D + OS << " "<<myCurves.Index(CR->Curve3D()); + OS << " "<<myLocations.Index(CR->Location()); + OS << " "<<first<<" "<<last; + OS << "\n"; + } + } + else if (CR->IsCurveOnSurface()) { + Handle(BRep_GCurve) GC = Handle(BRep_GCurve)::DownCast(itrc.Value()); + GC->Range(first, last); + if (!CR->IsCurveOnClosedSurface()) + OS << "2 "; // -2- Curve on surf + else + OS << "3 "; // -3- Curve on closed surf + OS <<" "<<myCurves2d.Index(CR->PCurve()); + if (CR->IsCurveOnClosedSurface()) { + OS <<" " << myCurves2d.Index(CR->PCurve2()); + PrintRegularity(CR->Continuity(),OS); + } + OS << " " << mySurfaces.Index(CR->Surface()); + OS << " " << myLocations.Index(CR->Location()); + OS << " "<<first<<" "<<last; + OS << "\n"; + + // Write UV Points // for XML Persistence higher performance + if (myFormatNb == 2) + { + gp_Pnt2d Pf,Pl; + if (CR->IsCurveOnClosedSurface()) { + Handle(BRep_CurveOnClosedSurface) COCS = + Handle(BRep_CurveOnClosedSurface)::DownCast(CR); + COCS->UVPoints2(Pf,Pl); + } + else { + Handle(BRep_CurveOnSurface) COS = + Handle(BRep_CurveOnSurface)::DownCast(CR); + COS->UVPoints(Pf,Pl); + } + OS << Pf.X() << " " << Pf.Y() << " " << Pl.X() << " " << Pl.Y() << "\n"; + } + } + else if (CR->IsRegularity()) { + OS << "4 "; // -4- Regularity + PrintRegularity(CR->Continuity(),OS); + OS << " "<<mySurfaces.Index(CR->Surface()); + OS << " "<<myLocations.Index(CR->Location()); + OS << " "<<mySurfaces.Index(CR->Surface2()); + OS << " "<<myLocations.Index(CR->Location2()); + OS << "\n"; + } + itrc.Next(); + } + OS << "0\n"; // end of the list of representations + } + else if (S.ShapeType() == TopAbs_FACE) { + + Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape()); + const TopoDS_Face& F = TopoDS::Face(S); + + if (!(TF->Surface()).IsNull()) { + OS << ((BRep_Tool::NaturalRestriction(F)) ? 1 : 0); + OS << " "; + // Write the surface geometry + OS << " " <<TF->Tolerance(); + OS << " " <<mySurfaces.Index(TF->Surface()); + OS << " " <<myLocations.Index(TF->Location()); + OS << "\n"; + } + } + +} + + +//======================================================================= +//function : Write +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::Write(const TopoDS_Shape& S, + Standard_OStream& OS)const +{ + if (S.IsNull()) OS << "*"; + else { + PrintOrientation(S.Orientation(),OS,Standard_True); + OS << myShapes.Extent() - myShapes.FindIndex(S.Located(TopLoc_Location())) + 1; + OS << " " << myLocations.Index(S.Location()) << " "; + } +} + + +//======================================================================= +//function : ReadGeometry +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::ReadGeometry(const TopAbs_ShapeEnum T, + Standard_IStream& IS, + TopoDS_Shape& S) +{ + // Read the geometry + + Standard_Integer val,c,pc,pc2,s,s2,l,l2,t, pt, pt2; + Standard_Real tol,X,Y,Z,first,last,p1,p2; + Standard_Real PfX,PfY,PlX,PlY; + gp_Pnt2d aPf, aPl; + Standard_Boolean closed; +#ifndef DEB + GeomAbs_Shape reg = GeomAbs_C0; +#else + GeomAbs_Shape reg; +#endif + switch (T) { + + + //--------- + // vertex + //--------- + + case TopAbs_VERTEX : + { + TopoDS_Vertex& V = TopoDS::Vertex(S); + + // Read the point geometry + IS >> tol; + IS >> X >> Y >> Z; + myBuilder.MakeVertex(V,gp_Pnt(X,Y,Z),tol); + Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V.TShape()); + + BRep_ListOfPointRepresentation& lpr = TV->ChangePoints(); + TopLoc_Location L; + + do { + IS >> p1 >> val; + + Handle(BRep_PointRepresentation) PR; + switch (val) { + + case 1 : + { + IS >> c; + + if (myCurves.Curve(c).IsNull()) + break; + + Handle(BRep_PointOnCurve) POC = + new BRep_PointOnCurve(p1, + myCurves.Curve(c), + L); + PR = POC; + } + break; + + case 2 : + { + IS >> pc >> s; + + if (myCurves2d.Curve2d(pc).IsNull() || + mySurfaces.Surface(s).IsNull()) + break; + + Handle(BRep_PointOnCurveOnSurface) POC = + new BRep_PointOnCurveOnSurface(p1, + myCurves2d.Curve2d(pc), + mySurfaces.Surface(s), + L); + PR = POC; + } + break; + + case 3 : + { + IS >> p2 >> s; + + if (mySurfaces.Surface(s).IsNull()) + break; + + Handle(BRep_PointOnSurface) POC = + new BRep_PointOnSurface(p1,p2, + mySurfaces.Surface(s), + L); + PR = POC; + } + break; + } + + if (val > 0) { + IS >> l; + if (!PR.IsNull()) { + PR->Location(myLocations.Location(l)); + lpr.Append(PR); + } + } + } while (val > 0); + } + break; + + + //--------- + // edge + //--------- + + + case TopAbs_EDGE : + + // Create an edge + { + TopoDS_Edge& E = TopoDS::Edge(S); + + myBuilder.MakeEdge(E); + + // Read the curve geometry + IS >> tol; + IS >> val; + myBuilder.SameParameter(E,(val == 1)); + IS >> val; + myBuilder.SameRange(E,(val == 1)); + IS >> val; + myBuilder.Degenerated(E,(val == 1)); + + do { + IS >> val; + switch (val) { + + case 1 : // -1- Curve 3D + IS >> c >> l; + if (!myCurves.Curve(c).IsNull()) { + myBuilder.UpdateEdge(E,myCurves.Curve(c), + myLocations.Location(l),tol); + } + IS >> first >> last; + if (!myCurves.Curve(c).IsNull()) { + Standard_Boolean Only3d = Standard_True; + myBuilder.Range(E,first,last,Only3d); + } + break; + + + case 2 : // -2- Curve on surf + case 3 : // -3- Curve on closed surf + closed = (val == 3); + IS >> pc; + if (closed) { + IS >> pc2; + reg = ReadRegularity(IS); + } + + // surface, location + IS >> s >> l; + + // range + IS >> first >> last; + + // read UV Points // for XML Persistence higher performance + if (myFormatNb == 2) + { + IS >> PfX >> PfY >> PlX >> PlY; + aPf = gp_Pnt2d(PfX,PfY); + aPl = gp_Pnt2d(PlX,PlY); + } + + if (myCurves2d.Curve2d(pc).IsNull() || + (closed && myCurves2d.Curve2d(pc2).IsNull()) || + mySurfaces.Surface(s).IsNull()) + break; + + if (closed) { + if (myFormatNb == 2) + myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), + myCurves2d.Curve2d(pc2), + mySurfaces.Surface(s), + myLocations.Location(l),tol, + aPf, aPl); + else + myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), + myCurves2d.Curve2d(pc2), + mySurfaces.Surface(s), + myLocations.Location(l),tol); + + myBuilder.Continuity(E, + mySurfaces.Surface(s), + mySurfaces.Surface(s), + myLocations.Location(l), + myLocations.Location(l), + reg); + } + else + { + if (myFormatNb == 2) + myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), + mySurfaces.Surface(s), + myLocations.Location(l),tol, + aPf, aPl); + else + myBuilder.UpdateEdge(E,myCurves2d.Curve2d(pc), + mySurfaces.Surface(s), + myLocations.Location(l),tol); + } + myBuilder.Range(E, + mySurfaces.Surface(s), + myLocations.Location(l), + first,last); + break; + + case 4 : // -4- Regularity + reg = ReadRegularity(IS); + IS >> s >> l >> s2 >> l2; + if (mySurfaces.Surface(s).IsNull() || + mySurfaces.Surface(s2).IsNull()) + break; + myBuilder.Continuity(E, + mySurfaces.Surface(s), + mySurfaces.Surface(s2), + myLocations.Location(l), + myLocations.Location(l2), + reg); + break; + + case 5 : // -5- Polygon3D + IS >> c >> l; + myBuilder.UpdateEdge(E,Handle(Poly_Polygon3D)::DownCast(myPolygons3D(c)), myLocations.Location(l)); + break; + + case 6 : + case 7 : + closed = (val == 7); + IS >> pt; + if (closed) { + IS >> pt2; + } + IS >> t >> l; + if (closed) { + myBuilder.UpdateEdge + (E, Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)), + Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt2)), + Handle(Poly_Triangulation)::DownCast(myTriangulations(t)), + myLocations.Location(l)); + } + else { + myBuilder.UpdateEdge + (E,Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)), + Handle(Poly_Triangulation)::DownCast(myTriangulations(t)), + myLocations.Location(l)); + } + // range + + break; + + } + } while (val > 0); + } + break; + + + //--------- + // wire + //--------- + + case TopAbs_WIRE : + myBuilder.MakeWire(TopoDS::Wire(S)); + break; + + + //--------- + // face + //--------- + case TopAbs_FACE : + { + // create a face : + TopoDS_Face& F = TopoDS::Face(S); + myBuilder.MakeFace(F); + + IS >> val; // natural restriction + if (val == 0 || val == 1) { + IS >> tol >> s >> l; + if (!mySurfaces.Surface(s).IsNull()) { + myBuilder.UpdateFace(TopoDS::Face(S), + mySurfaces.Surface(s), + myLocations.Location(l),tol); + myBuilder.NaturalRestriction(TopoDS::Face(S),(val == 1)); + } + } + + // BUC60769 + char string[260]; + IS.getline ( string, 256, '\n' ); + IS.getline ( string, 256, '\n' ); + + if (string[0] == '2') { + // cas triangulation + s = atoi ( &string[2] ); + myBuilder.UpdateFace(TopoDS::Face(S), + Handle(Poly_Triangulation)::DownCast(myTriangulations(s))); + } +// else IS.seekg(pos); + } + break; + + + //--------- + // shell + //--------- + + case TopAbs_SHELL : + myBuilder.MakeShell(TopoDS::Shell(S)); + break; + + + //--------- + // solid + //--------- + + case TopAbs_SOLID : + myBuilder.MakeSolid(TopoDS::Solid(S)); + break; + + + //--------- + // compsolid + //--------- + + case TopAbs_COMPSOLID : + myBuilder.MakeCompSolid(TopoDS::CompSolid(S)); + break; + + + //--------- + // compound + //--------- + + case TopAbs_COMPOUND : + myBuilder.MakeCompound(TopoDS::Compound(S)); + break; + + default: + break; + } + +} + +//======================================================================= +//function : ReadPolygonOnTriangulation +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::ReadPolygonOnTriangulation(Standard_IStream& IS) +{ + char buffer[255]; + IS >> buffer; + if (strstr(buffer,"PolygonOnTriangulations") == NULL) return; + Standard_Integer i, j, val, nbpol = 0, nbnodes =0; + Standard_Integer hasparameters; + Standard_Real par; + Handle(TColStd_HArray1OfReal) Param; + Handle(Poly_PolygonOnTriangulation) Poly; + IS >> nbpol; + for (i=1; i<=nbpol; i++) { + IS >> nbnodes; + TColStd_Array1OfInteger Nodes(1, nbnodes); + for (j = 1; j <= nbnodes; j++) { + IS >> val; + Nodes(j) = val; + } + IS >> buffer; + Standard_Real def; + IS >> def; + IS >> hasparameters; + if (hasparameters) { + TColStd_Array1OfReal Param1(1, nbnodes); + for (j = 1; j <= nbnodes; j++) { + IS >> par; + Param1(j) = par; + } + Poly = new Poly_PolygonOnTriangulation(Nodes, Param1); + } + else Poly = new Poly_PolygonOnTriangulation(Nodes); + Poly->Deflection(def); + myNodes.Add(Poly); + } +} + +//======================================================================= +//function : ReadPolygon3D +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::ReadPolygon3D(Standard_IStream& IS) +{ + char buffer[255]; + // Standard_Integer i, j, p, val, nbpol, nbnodes, hasparameters; + Standard_Integer i, j, p, nbpol=0, nbnodes =0, hasparameters = Standard_False; Standard_Real d, x, y, z; + + IS >> buffer; + if (strstr(buffer,"Polygon3D") == NULL) return; + Handle(Poly_Polygon3D) P; + IS >> nbpol; + for (i=1; i<=nbpol; i++) { + IS >> nbnodes; + IS >> hasparameters; + TColgp_Array1OfPnt Nodes(1, nbnodes); + IS >> d; + for (j = 1; j <= nbnodes; j++) { + IS >> x >> y >> z; + Nodes(j).SetCoord(x,y,z); + } + if (hasparameters) { + TColStd_Array1OfReal Param(1,nbnodes); + for (p = 1; p <= nbnodes; p++) { + IS >> Param(p); + } + P = new Poly_Polygon3D(Nodes, Param); + } + else P = new Poly_Polygon3D(Nodes); + P->Deflection(d); + myPolygons3D.Add(P); + } +} + +//======================================================================= +//function : ReadTriangulation +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::ReadTriangulation(Standard_IStream& IS) +{ + char buffer[255]; + // Standard_Integer i, j, val, nbtri; + Standard_Integer i, j, nbtri =0; + Standard_Real d, x, y, z; + Standard_Integer nbNodes =0, nbTriangles=0; + Standard_Boolean hasUV= Standard_False; + + Handle(Poly_Triangulation) T; + + IS >> buffer; + if (strstr(buffer,"Triangulations") != NULL) { + IS >> nbtri; + for (i=1; i<=nbtri; i++) { + IS >> nbNodes >> nbTriangles >> hasUV; + IS >> d; + + TColgp_Array1OfPnt Nodes(1, nbNodes); + TColgp_Array1OfPnt2d UVNodes(1, nbNodes); + + for (j = 1; j <= nbNodes; j++) { + IS >> x >> y >> z; + Nodes(j).SetCoord(x,y,z); + } + + if (hasUV) { + for (j = 1; j <= nbNodes; j++) { + IS >> x >> y; + UVNodes(j).SetCoord(x,y); + } + } + + + // read the triangles + Standard_Integer n1,n2,n3; + Poly_Array1OfTriangle Triangles(1, nbTriangles); + for (j = 1; j <= nbTriangles; j++) { + IS >> n1 >> n2 >> n3; + Triangles(j).Set(n1,n2,n3); + } + + if (hasUV) T = new Poly_Triangulation(Nodes,UVNodes,Triangles); + else T = new Poly_Triangulation(Nodes,Triangles); + + T->Deflection(d); + + myTriangulations.Add(T); + } + } +} + +//======================================================================= +//function : Clear +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::Clear() +{ + mySurfaces.Clear(); + myCurves.Clear(); + myCurves2d.Clear(); + myPolygons3D.Clear(); + myPolygons2D.Clear(); + myNodes.Clear(); + myTriangulations.Clear(); + myShapes.Clear(); + myLocations.Clear(); +} + +//======================================================================= +//function : Read +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::Read(TopoDS_Shape& S, + Standard_IStream& IS, + const int nbshapes)const +{ + char buffer[255]; + IS >> buffer; + if (buffer[0] == '*') + S = TopoDS_Shape(); + else { + S = myShapes(nbshapes - atoi(buffer+1) + 1); + switch (buffer[0]) { + + case '+' : + S.Orientation(TopAbs_FORWARD); + break; + + case '-' : + S.Orientation(TopAbs_REVERSED); + break; + + case 'i' : + S.Orientation(TopAbs_INTERNAL); + break; + + case 'e' : + S.Orientation(TopAbs_EXTERNAL); + break; + } + + Standard_Integer l; + IS >> l; + S.Location(myLocations.Location(l)); + } +} + +//======================================================================= +//function : Check +//purpose : +//======================================================================= + +void OCCShapeAttributeSet::Check(const TopAbs_ShapeEnum T, + TopoDS_Shape& S) +{ + if (T == TopAbs_FACE) { + const TopoDS_Face& F = TopoDS::Face(S); + BRepTools::Update(F); + } +} + +//======================================================================= +//function : NbShapes +//purpose : +//======================================================================= + +int OCCShapeAttributeSet::NbShapes() const +{ + return myShapes.Extent(); +} + Added: cgm/trunk/geom/OCC/OCCShapeAttributeSet.hpp =================================================================== --- cgm/trunk/geom/OCC/OCCShapeAttributeSet.hpp (rev 0) +++ cgm/trunk/geom/OCC/OCCShapeAttributeSet.hpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -0,0 +1,179 @@ +// File: OCCShapeAttributeSet.hxx +// Created: Thur Jul 10 2008 +// Author: Jane Hu + +#ifndef _OCCShapeAttributeSet_HeaderFile +#define _OCCShapeAttributeSet_HeaderFile + +class TopoDS_Shape; +class TDF_Label; + +#ifndef _TopTools_LocationSet_HeaderFile +#include <TopTools_LocationSet.hxx> +#endif +#ifndef _BRep_Builder_HeaderFile +#include <BRep_Builder.hxx> +#endif +#ifndef _TopTools_IndexedMapOfShape_HeaderFile +#include <TopTools_IndexedMapOfShape.hxx> +#endif +#ifndef _GeomTools_SurfaceSet_HeaderFile +#include <GeomTools_SurfaceSet.hxx> +#endif +#ifndef _GeomTools_CurveSet_HeaderFile +#include <GeomTools_CurveSet.hxx> +#endif +#ifndef _GeomTools_Curve2dSet_HeaderFile +#include <GeomTools_Curve2dSet.hxx> +#endif +#ifndef _TColStd_IndexedMapOfTransient_HeaderFile +#include <TColStd_IndexedMapOfTransient.hxx> +#endif +#ifndef _TopAbs_ShapeEnum_HeaderFile +#include <TopAbs_ShapeEnum.hxx> +#endif +#ifndef _Standard_HeaderFile +#include <Standard.hxx> +#endif +#ifndef _Standard_Macro_HeaderFile +#include <Standard_Macro.hxx> +#endif + +//! Contains a Shape and all its subshapes, locations <br> +//! and geometries, and attributes. <br> +//! <br> +// It's re-write version of BRepTools_ShapeSet +class OCCShapeAttributeSet { + +public: + + void* operator new(size_t,void* anAddress) + { + return anAddress; + } + void* operator new(size_t size) + { + return Standard::Allocate(size); + } + void operator delete(void *anAddress) + { + if (anAddress) Standard::Free((Standard_Address&)anAddress); + } + // Methods PUBLIC + // + +//! Builds an empty ShapeAttributeSet. <br> +OCCShapeAttributeSet(); + +OCCShapeAttributeSet(const BRep_Builder& B); + +//! Stores the goemetry of <S>. <br> +void AddGeometry(const TopoDS_Shape& S) ; + +//! Writes the attributs of <S> on the stream <OS> in a <br> +//! format that can be read back by Read. <br> +void WriteAttribute(const TopoDS_Shape& S, + Standard_OStream& OS, + TDF_Label& l_attr)const; + +void ReadAttribute(TopoDS_Shape& S, + Standard_IStream& IS, + TDF_Label& l_attr); + +//! Stores <S> and its sub-shape. Returns the index of <S>. <br> +//! The method AddGeometry is called on each sub-shape. <br> +Standard_Integer Add(const TopoDS_Shape& S) ; + +void Write(Standard_OStream& OS, + TDF_Label l_attr)const; + +void Read(Standard_IStream& IS, TDF_Label& l_attr); + +void Read(TopoDS_Shape& S,Standard_IStream& IS, const int nbshapes)const; + +//! Writes the geometry of me on the stream <OS> in a <br> +//! format that can be read back by Read. <br> +void WriteGeometry(Standard_OStream& OS) const; + +void ReadGeometry(Standard_IStream& IS); + +//! Writes the geometry of <S> on the stream <OS> in a <br> +//! format that can be read back by Read. <br> +void WriteGeometry(const TopoDS_Shape& S,Standard_OStream& OS) const; + +void ReadGeometry(const TopAbs_ShapeEnum T, + Standard_IStream& IS, + TopoDS_Shape& S); + +//! Writes on <OS> the shape <S>. Writes the <br> +//! orientation, the index of the TShape and the index <br> +//! of the Location. <br> +void Write(const TopoDS_Shape& S, + Standard_OStream& OS) const; + +//! Writes the 3d polygons <br> +//! on the stream <OS> in a format that can <br> +//! be read back by Read. <br> +Standard_EXPORT void WritePolygon3D(Standard_OStream& OS,const Standard_Boolean Compact = Standard_True) const; + +void ReadPolygon3D(Standard_IStream& IS); + +//! Writes the polygons on triangulation <br> +//! on the stream <OS> in a format that can <br> +//! be read back by Read. <br> +Standard_EXPORT void WritePolygonOnTriangulation(Standard_OStream& OS,const Standard_Boolean Compact = Standard_True) const; + +void ReadPolygonOnTriangulation(Standard_IStream& IS); + +//! Writes the triangulation <br> +//! on the stream <OS> in a format that can <br> +//! be read back by Read. <br> +Standard_EXPORT void WriteTriangulation(Standard_OStream& OS,const Standard_Boolean Compact = Standard_True) const; + +void ReadTriangulation(Standard_IStream& IS); + +void Clear(); + +void Check(const TopAbs_ShapeEnum T,TopoDS_Shape& S); + +int NbShapes() const; + +protected: + // Methods PROTECTED + // + + + // Fields PROTECTED + // + + +private: + + // Methods PRIVATE + // + + + // Fields PRIVATE + // +BRep_Builder myBuilder; +TopTools_IndexedMapOfShape myShapes; +TopTools_LocationSet myLocations; +Standard_Integer myFormatNb; +GeomTools_SurfaceSet mySurfaces; +GeomTools_CurveSet myCurves; +GeomTools_Curve2dSet myCurves2d; +TColStd_IndexedMapOfTransient myPolygons2D; +TColStd_IndexedMapOfTransient myPolygons3D; +TColStd_IndexedMapOfTransient myTriangulations; +TColStd_IndexedMapOfTransient myNodes; +}; + + + + + +// other Inline functions and methods (like "C++: function call" methods) +// + + +#endif Modified: cgm/trunk/geom/OCC/OCCSurface.cpp =================================================================== --- cgm/trunk/geom/OCC/OCCSurface.cpp 2008-07-29 21:22:57 UTC (rev 2032) +++ cgm/trunk/geom/OCC/OCCSurface.cpp 2008-07-31 18:16:18 UTC (rev 2033) @@ -117,7 +117,7 @@ // //------------------------------------------------------------------------- void OCCSurface::append_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.append_attribute(csa, *myTopoDSFace); } + { OCCAttribSet::append_attribute(csa, *myTopoDSFace); } //------------------------------------------------------------------------- @@ -129,7 +129,7 @@ // //------------------------------------------------------------------------- void OCCSurface::remove_simple_attribute_virt(CubitSimpleAttrib *csa) - { attribSet.remove_attribute( csa ); } + { OCCAttribSet::remove_attribute( csa , *myTopoDSFace); } //------------------------------------------------------------------------- @@ -142,7 +142,7 @@ // //------------------------------------------------------------------------- void OCCSurface::remove_all_simple_attribute_virt() - { attribSet.remove_all_attributes(); } + { OCCAttribSet::remove_attribute(NULL, *myTopoDSFace); } //------------------------------------------------------------------------- @@ -155,21 +155,13 @@ //------------------------------------------------------------------------- CubitStatus OCCSurface::get_simple_attribute(DLIList<CubitSimpleAttrib*>& csa_list) - { return attribSet.get_attributes(csa_list); } + { return OCCAttribSet::get_attributes(*myTopoDSFace,csa_list); } CubitStatus OCCSurface::get_simple_attribute(const CubitString& name, DLIList<CubitSimpleAttrib*>& csa_list ) - { return attribSet.get_attributes( name, csa_list ); } + { return OCCAttribSet::get_attributes( name, *myTopoDSFace, csa_list ); } -CubitStatus OCCSurface::save_attribs( FILE *file_ptr ) - { return attribSet.save_attributes(file_ptr); } - -CubitStatus OCCSurface::restore_attribs( FILE *file_ptr, unsigned int endian ) - { return attribSet.restore_attributes( file_ptr, endian ); } - - - //------------------------------------------------------------------------- // Purpose : Get geometry modeling engine: OCCQueryEngine //
participants (1)
-
janehu@mcs.anl.gov