[cgma-dev] r1980 - cgm/trunk/geom/OCC

janehu at mcs.anl.gov janehu at mcs.anl.gov
Thu Jul 3 14:04:25 CDT 2008


Author: janehu
Date: 2008-07-03 14:04:25 -0500 (Thu, 03 Jul 2008)
New Revision: 1980

Modified:
   cgm/trunk/geom/OCC/OCCAttrib.cpp
   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/OCCCurve.cpp
   cgm/trunk/geom/OCC/OCCLump.cpp
   cgm/trunk/geom/OCC/OCCPoint.cpp
   cgm/trunk/geom/OCC/OCCQueryEngine.cpp
   cgm/trunk/geom/OCC/OCCQueryEngine.hpp
   cgm/trunk/geom/OCC/OCCSurface.cpp
Log:
Added simple attribute append and remove method on CGM side. It's stored in a document system with Labels and Attributes. Labels has a tree structure with one root label and multiple children labels of 3 layers deep. First layer storesshape attribute, any 0d-3d geometry could have attribute, if it has, its shape is stored in the first layer; second layer stores type attribute which is CubitSimpleAttrib's charactertype, each shape level label can have multiple children with character type as the attribute; Last level stores attributes of stringarray, doublearray and intarray. When going to opencascade read and write function, it recognize attribute through different TopoDS_Shapes.


Modified: cgm/trunk/geom/OCC/OCCAttrib.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCAttrib.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCAttrib.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -4,7 +4,7 @@
 #include "CubitFileIOWrapper.hpp"
 
   // Constructor - copy from CubitSimpleAttrib
-OCCAttrib::OCCAttrib( CubitSimpleAttrib* csa ) : listNext(0)
+OCCAttrib::OCCAttrib( CubitSimpleAttrib* csa) : listNext(0)
 {
   int i;
   

Modified: cgm/trunk/geom/OCC/OCCAttrib.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCAttrib.hpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCAttrib.hpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -3,6 +3,7 @@
 
 #include "CubitDefines.h"
 #include "CubitString.hpp"
+
 class CubitSimpleAttrib;
 class CubitString;
 
@@ -43,8 +44,8 @@
 private:
 
   OCCAttrib( int string_count, CubitString* strings,
-               int double_count, double* doubles,
-               int integer_count, int* integers );
+             int double_count, double* doubles,
+             int integer_count, int* integers);
 
 };
 

Modified: cgm/trunk/geom/OCC/OCCAttribSet.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCAttribSet.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCAttribSet.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -14,15 +14,117 @@
 #include "OCCAttrib.hpp"
 #include "CubitSimpleAttrib.hpp"
 #include "CubitFileIOWrapper.hpp"
+#include "Handle_TDataStd_Shape.hxx"
+#include "TCollection_ExtendedString.hxx"
+#include "Handle_TDataStd_Name.hxx"
+#include "Handle_TDataStd_ExtStringArray.hxx"
+#include "Handle_TDataStd_RealArray.hxx"
+#include "Handle_TDataStd_IntegerArray.hxx"
+#include "TDataStd_Name.hxx"
+#include "TDataStd_ExtStringArray.hxx"
+#include "TDataStd_RealArray.hxx"
+#include "TDataStd_IntegerArray.hxx"
+#include "TDataStd_Shape.hxx"
+#include "TopoDS_Shape.hxx"
+#include "TDF_ChildIterator.hxx"
 
-void OCCAttribSet::append_attribute( CubitSimpleAttrib* csa )
+void OCCAttribSet::append_attribute( CubitSimpleAttrib* csa, TopoDS_Shape& shape )
 {
   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())
+  {
+    //find the same type attribute first
+    child = 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)) 
+    {
+      found = CUBIT_TRUE;
+      break;
+    }
+  }
+
+  if(!found)
+  { 
+    child = myLabel.NewChild();
+    Handle_TDataStd_Shape attr_shape = TDataStd_Shape::Set(child, shape);
+    child.AddAttribute(attr_shape);
+  }
+
+  //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)
+  {
+    TCollection_ExtendedString cstring( (Standard_CString)type.c_str() );
+    Handle_TDataStd_Name attr_name = TDataStd_Name::Set(lab, cstring);
+    lab.AddAttribute(attr_name);
+  }
+
+  //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)
+  {
+    //set the length of String Array be 11, can be extended.
+    attr_string = TDataStd_ExtStringArray::Set(lab_child, 0, 10);
+  }
+
+  for(int i = 0; strings && i < strings->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);
+
+  //4. add double attribute
+  DLIList<double*>* doubles = csa->double_data_list();
+  Handle_TDataStd_RealArray attr_double;
+  if(doubles && doubles->size() > 0)
+  {
+    //set the length of double array be 11, can be extended.
+    attr_double = TDataStd_RealArray::Set(lab_child,0, 10);
+  } 
+
+  for(int i = 0; doubles && i < doubles->size(); i++)
+    attr_double->SetValue(i, *(doubles->get_and_step()));
+
+  if(doubles && doubles->size() > 0)
+    lab_child.AddAttribute(attr_double);
+    
+  //5. add int attribute
+  DLIList<int*>* ints = csa->int_data_list();
+  Handle_TDataStd_IntegerArray attr_int;
+  if(ints && ints->size() > 0)
+  {
+    //set the length of int array be 11, can be extended.
+    attr_int = TDataStd_IntegerArray::Set(lab_child, 0, 10);
+  }
+
+  for(int i = 0; ints && i < ints->size(); i++)
+    attr_int->SetValue(i, *(ints->get_and_step()));
+
+  if(ints && ints->size() > 0)
+    lab_child.AddAttribute(attr_int);
 }
 
-void OCCAttribSet::remove_attribute( CubitSimpleAttrib* csa )
+void OCCAttribSet::remove_attribute( CubitSimpleAttrib* csa)
 {
   if( !listHead )
     return;
@@ -46,6 +148,95 @@
       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() );
+
+  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
+    TDF_Label child = it1.Value();
+
+    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) 
+      continue; 
+  
+    //continue to compare the rest attributes.
+    CubitBoolean is_same = CUBIT_TRUE;
+    for(TDF_ChildIterator it2(child,CUBIT_FALSE); it2.More(); it2.Next())
+    {
+      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())   
+            {
+              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())
+        {
+          for(int i = 0; i < doubles->size(); i++)
+            if(attr_doubles->Value(i) != *doubles->get_and_step())
+            {
+              is_same = CUBIT_FALSE;
+              break;
+            }
+        }
+      }
+
+      if(!is_same)
+        continue;
+
+      if(strings->size() > 0 )
+      {
+        Handle_TDataStd_ExtStringArray attr_strings;
+        if(g_child.FindAttribute(TDataStd_ExtStringArray::GetID(), attr_strings) &&
+           attr_strings->Length() == strings->size())
+        {
+          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;
+            }
+          }
+        }
+      }
+      if(!is_same)
+        continue;
+
+      child.ForgetAllAttributes( );
+    }
+  }
 }
 
 void OCCAttribSet::remove_all_attributes()
@@ -56,6 +247,7 @@
     listHead = dead->listNext;
     delete dead;
   }
+  myLabel.ForgetAllAttributes( );
 }
 
 CubitStatus OCCAttribSet::get_attributes( DLIList<CubitSimpleAttrib*>& list ) const

Modified: cgm/trunk/geom/OCC/OCCAttribSet.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCAttribSet.hpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCAttribSet.hpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -14,21 +14,26 @@
 #define FACET_BRIDGE_HPP
 
 #include <DLIList.hpp>
+#include "TDF_Label.hxx"
+#include "TDF_TagSource.hxx"
+#include "OCCQueryEngine.hpp"
 
 class CubitSimpleAttrib;
 class OCCAttrib;
 class CubitString;
+class TopoDS_Shape;
 
 class OCCAttribSet 
 {
 
   public:
   
-    OCCAttribSet() : listHead(0) {}
+    OCCAttribSet() : listHead(0) 
+    {myLabel = TDF_TagSource::NewChild(OCCQueryEngine::mainLabel);}
     
     ~OCCAttribSet() { remove_all_attributes(); }
     
-    void append_attribute( CubitSimpleAttrib* );
+    void append_attribute( CubitSimpleAttrib*, TopoDS_Shape& shape );
     
     void remove_attribute( CubitSimpleAttrib* );
     
@@ -48,6 +53,7 @@
   private:
   
     OCCAttrib* listHead;
+    TDF_Label   myLabel;
 };
 
 #endif

Modified: cgm/trunk/geom/OCC/OCCBody.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCBody.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCBody.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -127,7 +127,7 @@
 }
 
 void OCCBody::append_simple_attribute_virt(CubitSimpleAttrib *csa)
-  { attribSet.append_attribute(csa); }
+  { attribSet.append_attribute(csa, *myTopoDSShape); }
   
 void OCCBody::remove_simple_attribute_virt(CubitSimpleAttrib *csa)
   { attribSet.remove_attribute(csa); }

Modified: cgm/trunk/geom/OCC/OCCCurve.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCCurve.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCCurve.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -135,7 +135,7 @@
 // Creation Date : 07/14/00
 //-------------------------------------------------------------------------
 void OCCCurve::append_simple_attribute_virt(CubitSimpleAttrib *csa)
-  { attribSet.append_attribute(csa); }
+  { attribSet.append_attribute(csa, *myTopoDSEdge); }
 
 //-------------------------------------------------------------------------
 // Purpose       : The purpose of this function is to remove a simple 

Modified: cgm/trunk/geom/OCC/OCCLump.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCLump.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCLump.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -124,7 +124,7 @@
 // Creation Date : 11/21/96
 //-------------------------------------------------------------------------
 void OCCLump::append_simple_attribute_virt(CubitSimpleAttrib *csa)
-  { attribSet.append_attribute(csa); }
+  { attribSet.append_attribute(csa, *myTopoDSSolid); }
 
 //-------------------------------------------------------------------------
 // Purpose       : The purpose of this function is to remove a simple 

Modified: cgm/trunk/geom/OCC/OCCPoint.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCPoint.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCPoint.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -105,7 +105,7 @@
 // Creation Date : 07/16/00
 //-------------------------------------------------------------------------
 void OCCPoint::append_simple_attribute_virt(CubitSimpleAttrib *csa)
-  { attribSet.append_attribute(csa); }
+  { attribSet.append_attribute(csa, *myTopoDSVertex); }
 
 //-------------------------------------------------------------------------
 // Purpose       : The purpose of this function is to remove a simple 

Modified: cgm/trunk/geom/OCC/OCCQueryEngine.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCQueryEngine.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCQueryEngine.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -102,10 +102,13 @@
 //#include "TopOpeBRepTool_ShapeTool.hxx"
 //#include "BRepPrimAPI_MakePrism.hxx"
 //#include "TopOpeBRep_Point2d.hxx"
+#include "TDF_Label.hxx"
 #include "TopTools_DataMapOfShapeInteger.hxx"
 #include "BRepExtrema_DistShapeShape.hxx"
 #include "BRepAlgoAPI_Section.hxx"
 #include "BRepBuilderAPI_MakeEdge.hxx"
+#include "TDocStd_Document.hxx"
+#include "TCollection_ExtendedString.hxx"
 #include "gp_Lin.hxx"
 using namespace NCubitFile;
 
@@ -147,6 +150,9 @@
   WireList = new DLIList<OCCLoop*>;
   SurfaceList = new DLIList<OCCSurface*>;
   CurveList = new DLIList<OCCCurve*>;
+  TCollection_ExtendedString xString;
+  MyDF = new TDocStd_Document(xString);
+  mainLabel = MyDF->Main();
 }
 
 //================================================================================
@@ -1351,7 +1357,7 @@
     OCCCoEdge * coedge = NULL;
     int size = coedges_old.size();
     CubitSense sense ;
-    if( aShape.Orientation() == CUBIT_REVERSED )
+    if( aShape.Orientation() == TopAbs_REVERSED )
       sense = (Ex.Orientation() == TopAbs_FORWARD ? CUBIT_REVERSED : CUBIT_FORWARD);
     else
       sense = (Ex.Orientation() == TopAbs_FORWARD ? CUBIT_FORWARD : CUBIT_REVERSED);

Modified: cgm/trunk/geom/OCC/OCCQueryEngine.hpp
===================================================================
--- cgm/trunk/geom/OCC/OCCQueryEngine.hpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCQueryEngine.hpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -31,7 +31,7 @@
 #include "config.h"
 #include "CubitFileIOWrapper.hpp"
 #include "GeometryQueryEngine.hpp"
-
+#include "Handle_TDocStd_Document.hxx"
 #include <map>
 // ********** END CUBIT INCLUDES              **********
 
@@ -77,6 +77,7 @@
 class OCCCurve;
 class OCCPoint;
  
+class TDF_Label;
 class BRepBuilderAPI_Transform;
 class TopTools_DataMapOfShapeInteger;
 class BRepAlgoAPI_BooleanOperation;
@@ -360,6 +361,8 @@
   DLIList<OCCSurface*> *SurfaceList ;
   DLIList<OCCLoop*> *WireList; //standalone wire list
   DLIList<OCCCurve*> *CurveList ;
+  Handle(TDocStd_Document) MyDF;
+  static TDF_Label mainLabel;
   TopTools_DataMapOfShapeInteger* OCCMap;
   std::map<int, TopologyBridge*>* OccToCGM;
   static int iTotalTBCreated ;
@@ -387,7 +390,6 @@
   static const int OCCQE_MAJOR_VERSION;
   static const int OCCQE_MINOR_VERSION;
   static const int OCCQE_SUBMINOR_VERSION;
-
 };
 
 // ********** BEGIN INLINE FUNCTIONS          **********

Modified: cgm/trunk/geom/OCC/OCCSurface.cpp
===================================================================
--- cgm/trunk/geom/OCC/OCCSurface.cpp	2008-07-03 18:46:43 UTC (rev 1979)
+++ cgm/trunk/geom/OCC/OCCSurface.cpp	2008-07-03 19:04:25 UTC (rev 1980)
@@ -117,7 +117,7 @@
 //
 //-------------------------------------------------------------------------
 void OCCSurface::append_simple_attribute_virt(CubitSimpleAttrib *csa)
-  { attribSet.append_attribute(csa); }
+  { attribSet.append_attribute(csa, *myTopoDSFace); }
 
 
 //-------------------------------------------------------------------------




More information about the cgma-dev mailing list