cgma
OCCAttribSet Class Reference

#include <OCCAttribSet.hpp>

List of all members.

Public Member Functions

 OCCAttribSet ()
 ~OCCAttribSet ()

Static Public Member Functions

static void FindShape (TopoDS_Shape &shape, TDF_Label &aLabel, CubitBoolean &found)
static int find_attribute (TDF_Label child, const CubitSimpleAttrib &csa)
static void append_attribute (const CubitSimpleAttrib &, TopoDS_Shape &shape)
static void remove_attribute (const CubitSimpleAttrib &)
static void remove_attribute (const CubitSimpleAttrib &, TopoDS_Shape &shape)
static void remove_attribute (TopoDS_Shape &shape)
static void get_attributes (TDF_Label &lab, DLIList< CubitSimpleAttrib > &list)
static CubitStatus get_attributes (TopoDS_Shape &shape, DLIList< CubitSimpleAttrib > &)
static CubitStatus get_attributes (const CubitString &name, TopoDS_Shape &shape, DLIList< CubitSimpleAttrib > &)
static int attribute_count ()

Detailed Description

Definition at line 22 of file OCCAttribSet.hpp.


Constructor & Destructor Documentation

Definition at line 27 of file OCCAttribSet.hpp.

{}; 

Definition at line 29 of file OCCAttribSet.hpp.

{ ; }

Member Function Documentation

void OCCAttribSet::append_attribute ( const CubitSimpleAttrib csa,
TopoDS_Shape &  shape 
) [static]

Definition at line 65 of file OCCAttribSet.cpp.

{
  if(shape.IsNull())
    return;

  //Add attributes on child of myLabel
  //1. add shape attribute, first check to make sure there's no shape attribute
  CubitBoolean found = CUBIT_FALSE;
  int result = 1;
  TDF_Label aLabel, lab;
  Handle_TDataStd_Name attr_name;
  CubitString type = csa.string_data_list()[0];
  TCollection_ExtendedString cstring( (Standard_CString)type.c_str() );

  FindShape(shape, aLabel, found);

  if(!found)
  { 
    aLabel = OCCQueryEngine::instance()->mainLabel.NewChild();
    Handle_TDataXtd_Shape attr_shape = TDataXtd_Shape::Set(aLabel, shape);
    //aLabel.AddAttribute(attr_shape);
    //test if the attribute has been attached
    assert(aLabel.IsAttribute(TDataXtd_Shape::GetID()));

    if(!OCCQueryEngine::instance()->OCCMap->IsBound(shape))
    {
      OCCQueryEngine::instance()->iTotalTBCreated++;
      int k = OCCQueryEngine::instance()->iTotalTBCreated;
      OCCQueryEngine::instance()->OCCMap->Bind(shape, k);
    }
 
    int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
    OCCQueryEngine::instance()->Shape_Label_Map->insert(labType(k, aLabel));
  }

  //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.
  else
  {
    TCollection_ExtendedString name_string;
    for (TDF_ChildIterator it(aLabel,CUBIT_FALSE); it.More(); it.Next()) 
    {
      lab = it.Value();
      result = find_attribute(lab, csa);
      if(result != 1)
        break;
    }
  }
  //if not exist,  create new child label
  Handle_TDataStd_ExtStringArray attr_string;
  const std::vector<CubitString>& strings = csa.string_data_list();
  int size = strings.size()-1;
 
  if (result == 1) 
  {
    lab = aLabel.NewChild();
    attr_name = TDataStd_Name::Set(lab, cstring);
    //lab.AddAttribute(attr_name);
    assert(lab.IsAttribute(TDataStd_Name::GetID()));
  }
     
  else if(result == 3)//nothing to do
    return;

  else if(result == 2) 
  //adding the name strings
  {
    lab.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_string);
    TCollection_ExtendedString name1, name2;
    std::vector<CubitString> new_names;
    int length = 0;
    for(int j = 1; j < (int)strings.size();j++)
    { 
      CubitString name_string = strings[j];
      TCollection_ExtendedString cstring(name_string.c_str(), Standard_True );
      bool dup = false;
      length = attr_string->Length() ;

      for(int i = 0; i < length; i++)
      {
        name1 = attr_string->Value(i);
        //it could be string[0] = "volume 1", string[1] = "volume_1";
    
        if(name1.IsEqual(cstring))
        {
          dup = true;
          break;
        }
      }
      if(!dup) 
        new_names.push_back(name_string);
    }
    if(new_names.size() > 0)
    {
      lab.ForgetAttribute(attr_string);
      Handle_TDataStd_ExtStringArray attr_string_new; 
      attr_string_new = TDataStd_ExtStringArray::Set(lab, 0, 
                                       length+new_names.size()-1); 
      for(int i = 0; i < attr_string_new->Length(); i++)
      {
        if (i < length)
          attr_string_new->SetValue(i, attr_string->Value(i));
        else
        {
          TCollection_ExtendedString cstring(new_names[i-length].c_str(), Standard_True );
          attr_string_new->SetValue(i, cstring);
        }
      }
    } 
    return;
  } 
  //3. add string attribute
  if(size > 0)
  {
    //set the length of String Array .
    attr_string = TDataStd_ExtStringArray::Set(lab, 0, size-1);
  }
  for(int i = 1; i < (int)strings.size(); i++)
  {
    TCollection_ExtendedString cstring(strings[i].c_str(), Standard_True );
    attr_string->SetValue(i-1, cstring) ;
  }
  
  if (size > 0)
  {
    //lab.AddAttribute(attr_string);
    assert(lab.IsAttribute(TDataStd_ExtStringArray::GetID()));
  }
  //4. add double attribute
  const std::vector<double>& doubles = csa.double_data_list();
  Handle_TDataStd_RealArray attr_double;
  size = doubles.size();
  if(size > 0)
  {
    //set the length of double array .
    attr_double = TDataStd_RealArray::Set(lab,0, size-1);
  } 
  for(int i = 0; i < size; i++)
    attr_double->SetValue(i, doubles[i]);

  if(size > 0)
  {
    //lab.AddAttribute(attr_double);
    assert(lab.IsAttribute(TDataStd_RealArray::GetID()));
  }  
  //5. add int attribute
  const std::vector<int>& ints = csa.int_data_list();
  Handle_TDataStd_IntegerArray attr_int;
  size = ints.size();
  if(size > 0)
  {
    //set the length of int array be 11, can be extended.
    attr_int = TDataStd_IntegerArray::Set(lab, 0, size-1);
  }
  for(int i = 0; i < size; i++)
    attr_int->SetValue(i, ints[i]);

  if(size > 0)
  {
    //lab.AddAttribute(attr_int);
    assert(lab.IsAttribute(TDataStd_IntegerArray::GetID()));
  }
}

Definition at line 557 of file OCCAttribSet.cpp.

{
  int count = 0;
  
  return count;
}
int OCCAttribSet::find_attribute ( TDF_Label  child,
const CubitSimpleAttrib csa 
) [static]

Definition at line 232 of file OCCAttribSet.cpp.

{
  const std::vector<int>& ints = csa.int_data_list();
  CubitString type = csa.character_type();
  Standard_Boolean isMultiByte = Standard_True;
  TCollection_ExtendedString cstring( type.c_str(), isMultiByte );
  const std::vector<double>& doubles = csa.double_data_list();
  const std::vector<CubitString>& strings = csa.string_data_list();

  //find the same type attribute first
  Handle_TDataStd_Name attr_name;
  TCollection_ExtendedString old_string;
  if(child.FindAttribute(TDataStd_Name::GetID(), attr_name))
  {
    old_string = attr_name->Get();
    Standard_Boolean isMultiByte = Standard_True;
    char const* string = "ENTITY_NAME";
    TCollection_ExtendedString string2( string, isMultiByte );
    if(old_string != cstring)
      return 1;

    else if(cstring.IsEqual(string2))
      return 2;  
  }

  else
    return 1;

  //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() == (int)ints.size())
    {
      for(int i = 0; i < (int)ints.size(); i++)
        if(attr_ints->Value(i) != ints[i])
        {
          is_same = CUBIT_FALSE;
          break;
        }
    }
  }
  if(!is_same)
    return 1;

  if(doubles.size() > 0 )
  {
    Handle_TDataStd_RealArray attr_doubles;
    if(child.FindAttribute(TDataStd_RealArray::GetID(), attr_doubles) &&
       attr_doubles->Length() == (int)doubles.size())
    {
      for(int i = 0; i < (int)doubles.size(); i++)
        if(attr_doubles->Value(i) != doubles[i])
        {
          is_same = CUBIT_FALSE;
          break;
        }
    }
  }

  if(!is_same)
    return 1;

  if(strings.size() > 0 )
  {
    Handle_TDataStd_ExtStringArray attr_strings;
    if(child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings) &&
       attr_strings->Length() == (int)strings.size()-1)
    {
      for(int i = 1; i < (int)strings.size(); i++)
      {
        CubitString astring = strings[i];
        TCollection_ExtendedString string( astring.c_str() , Standard_True);
        if(attr_strings->Value(i-1) != string)
        {
          is_same = CUBIT_FALSE;
          break;
        }
      }
    }
    if(!is_same)
      return 1;
  }
  return 3  ;
}
void OCCAttribSet::FindShape ( TopoDS_Shape &  shape,
TDF_Label &  aLabel,
CubitBoolean found 
) [static]

Definition at line 47 of file OCCAttribSet.cpp.

{
  found = CUBIT_FALSE;
  if(!OCCQueryEngine::instance()->OCCMap->IsBound(shape))
    return;

  int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
  std::map<int, TDF_Label>::iterator it = 
            OCCQueryEngine::instance()->Shape_Label_Map->find(k);
  if(it != OCCQueryEngine::instance()->Shape_Label_Map->end())
  {
    aLabel = (*it).second; 
    found = CUBIT_TRUE;
  }
}
void OCCAttribSet::get_attributes ( TDF_Label &  lab,
DLIList< CubitSimpleAttrib > &  list 
) [static]

Definition at line 429 of file OCCAttribSet.cpp.

{
  std::vector<CubitString> strings;
  CubitString string;
  std::vector<double> doubles;
  std::vector<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();
    std::vector<char> temp_type(length+1);
    for (int i = 1 ;  i <= length; i++)
    {
      Standard_ExtCharacter c = name_string.Value(i);
      temp_type[i-1] = ToCharacter(c);
    }
    temp_type[length] = '\0';
    string = CubitString(&temp_type[0]);
    strings.push_back(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();
      if (length2 == 0)
        continue;
      std::vector<char> temp_string(length2+1);
      for(int j = 1; j <= length2; j ++)
      {
        Standard_ExtCharacter c = name_string.Value(j);
        temp_string[j-1] = ToCharacter(c);
      }
      temp_string[length2] = '\0';
      const char *s = &temp_string[0];
      string = CubitString(s);
      strings.push_back(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.push_back(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.push_back(j);
    }
  }
  if(strings.size() > 0 || doubles.size() || ints.size())
  {
    list.append(CubitSimpleAttrib(&strings, &doubles, &ints));
  }
}
CubitStatus OCCAttribSet::get_attributes ( TopoDS_Shape &  shape,
DLIList< CubitSimpleAttrib > &  list 
) [static]

Definition at line 500 of file OCCAttribSet.cpp.

{
  CubitBoolean found = CUBIT_FALSE;
  TDF_Label myLabel;

  FindShape(shape, myLabel, found);

  if(!found)
    return CUBIT_FAILURE;

  TDF_Label lab;
  for (TDF_ChildIterator it(myLabel,CUBIT_FALSE); it.More(); it.Next())
  {
    lab = it.Value();
    get_attributes(lab, list);
  }     
  return CUBIT_SUCCESS;
}
CubitStatus OCCAttribSet::get_attributes ( const CubitString name,
TopoDS_Shape &  shape,
DLIList< CubitSimpleAttrib > &  list 
) [static]

Definition at line 520 of file OCCAttribSet.cpp.

{
  CubitBoolean found = CUBIT_FALSE;
  TDF_Label aLabel;

  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())
  {
    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))
    {
      old_string = attr_name->Get();

      if(old_string == cstring)
      {
        get_attributes(lab, list);
        break;
      }
    }
  }
 
  return CUBIT_SUCCESS;
}
void OCCAttribSet::remove_attribute ( const CubitSimpleAttrib csa) [static]

Definition at line 321 of file OCCAttribSet.cpp.

{
  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())
  {
    //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();

      int found = find_attribute(child, csa);

      if(found == 3)
        child.ForgetAllAttributes(false );
    }
  }
}
void OCCAttribSet::remove_attribute ( const CubitSimpleAttrib csa,
TopoDS_Shape &  shape 
) [static]

Definition at line 367 of file OCCAttribSet.cpp.

{
  CubitBoolean found = CUBIT_FALSE;
  TDF_Label myLabel;

  FindShape(shape, myLabel, found);

  if(!found)
    return;

  int num_children = 0;
  int num_found = 0;
  for (TDF_ChildIterator it1(myLabel, CUBIT_FALSE); it1.More(); it1.Next())
  {
    //find the same type attribute first
    TDF_Label child = it1.Value();
    if (child.NbAttributes() == 0)
      continue;

    num_children ++;

    if(csa.isEmpty())
    {
      //only name attributes can't be forget here.
      Handle_TDataStd_Name attr_name;
      if(child.FindAttribute(TDataStd_Name::GetID(), attr_name))
      {
        TCollection_ExtendedString old_string = attr_name->Get();
        char const* string1 = "ENTITY_NAME";
        Standard_Boolean isMultiByte = Standard_True;
        TCollection_ExtendedString cstring( string1, isMultiByte );
        if( old_string == cstring)
          continue;
      }
      child.ForgetAllAttributes(false );
      num_found ++;
    }

    else
    {
      int found = find_attribute(child, csa);

      if(found == 3)
      {
        child.ForgetAllAttributes(false );
        num_found ++;
      } 
    }
  }
/*
  if(num_children == num_found)
  {
    if(OCCQueryEngine::instance()->OCCMap->IsBound(shape))
    {
      int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
      OCCQueryEngine::instance()->Shape_Label_Map->erase(k);
    }
  }
*/
}
void OCCAttribSet::remove_attribute ( TopoDS_Shape &  shape) [static]

Definition at line 347 of file OCCAttribSet.cpp.

{
  CubitBoolean found = CUBIT_FALSE;
  TDF_Label myLabel;

  FindShape(shape, myLabel, found);

  if(!found)
    return;
 
  myLabel.ForgetAllAttributes(false);
/*
  if(OCCQueryEngine::instance()->OCCMap->IsBound(shape)) 
  {
    int k = OCCQueryEngine::instance()->OCCMap->Find(shape);
    OCCQueryEngine::instance()->Shape_Label_Map->erase(k);
  }
*/
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines