Back to index

salome-geom  6.5.0
GEOM_Object.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 #include <Standard_Stream.hxx>
00024 
00025 #include "utilities.h"
00026 
00027 #include <GEOM_Object.hxx>
00028 #include <GEOM_Engine.hxx>
00029 #include <GEOM_Solver.hxx>
00030 #include <TDF_Tool.hxx>
00031 #include <TDF_Data.hxx>
00032 #include <TDF_Reference.hxx>
00033 #include <TDF_LabelSequence.hxx>
00034 #include <TDocStd_Owner.hxx>
00035 #include <TDocStd_Document.hxx>
00036 #include <TDataStd_Integer.hxx>
00037 #include <TDataStd_Real.hxx>
00038 #include <TDataStd_ChildNodeIterator.hxx>
00039 #include <TDataStd_UAttribute.hxx>
00040 #include <TDataStd_Name.hxx>
00041 #include <TDataStd_Comment.hxx>
00042 #include <TDataStd_RealArray.hxx>
00043 #include <TDataStd_ByteArray.hxx>
00044 #include <TColStd_HArray1OfReal.hxx>
00045 #include <TCollection_AsciiString.hxx>
00046 #include <TCollection_ExtendedString.hxx>
00047 #include <TopTools_IndexedMapOfShape.hxx>
00048 #include <TopExp.hxx>
00049 
00050 #define FUNCTION_LABEL(theNb) (_label.FindChild(1).FindChild((theNb)))
00051 #define TYPE_LABEL       2
00052 #define FREE_LABEL       3
00053 #define TIC_LABEL        4
00054 #define COLOR_LABEL      5
00055 #define AUTO_COLOR_LABEL 6
00056 #define MARKER_LABEL     7
00057 
00058 #define MARKER_LABEL_TYPE 1
00059 #define MARKER_LABEL_SIZE 2
00060 #define MARKER_LABEL_ID   3
00061 
00062 //=======================================================================
00063 //function : GetObjectID
00064 //purpose  :
00065 //=======================================================================
00066 const Standard_GUID& GEOM_Object::GetObjectID()
00067 {
00068   static Standard_GUID anObjectID("FF1BBB01-5D14-4df2-980B-3A668264EA16");
00069   return anObjectID;
00070 }
00071 
00072 //=======================================================================
00073 //function : GetSubShapeID
00074 //purpose  :
00075 //=======================================================================
00076 const Standard_GUID& GEOM_Object::GetSubShapeID()
00077 {
00078   static Standard_GUID anObjectID("FF1BBB68-5D14-4df2-980B-3A668264EA16");
00079   return anObjectID;
00080 }
00081 
00082 //=============================================================================
00086 //=============================================================================
00087 Handle(GEOM_Object) GEOM_Object::GetObject(TDF_Label& theLabel)
00088 {
00089   if (!theLabel.IsAttribute(GetObjectID())) return NULL;
00090 
00091   TCollection_AsciiString anEntry;
00092   TDF_Tool::Entry(theLabel, anEntry);
00093 
00094   Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theLabel.Data());
00095   if(aDoc.IsNull()) return NULL;
00096 
00097   Handle(TDataStd_Integer) anID;
00098   if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return NULL;
00099 
00100 
00101   GEOM_Engine* anEngine=  GEOM_Engine::GetEngine();
00102   if(anEngine == NULL) return NULL;
00103   return anEngine->GetObject(anID->Get(), (char*) anEntry.ToCString());
00104 
00105 
00106 }
00107 
00108 //=============================================================================
00112 //=============================================================================
00113 Handle(GEOM_Object) GEOM_Object::GetReferencedObject(TDF_Label& theLabel)
00114 {
00115   Handle(TDF_Reference) aRef;
00116   if (!theLabel.FindAttribute(TDF_Reference::GetID(), aRef)) {
00117     return NULL;
00118   }
00119   
00120   if(aRef.IsNull() || aRef->Get().IsNull()) {
00121     return NULL;
00122   }
00123 
00124 
00125   // Get TreeNode of a referenced function
00126   Handle(TDataStd_TreeNode) aT, aFather;
00127   if (!TDataStd_TreeNode::Find(aRef->Get(), aT)) {
00128     return NULL;
00129   }
00130 
00131 
00132   // Get TreeNode of Object of the referenced function
00133   aFather = aT->Father();
00134   if (aFather.IsNull()) {
00135     return NULL;
00136   }
00137 
00138   // Get label of the referenced object
00139   TDF_Label aLabel = aFather->Label();
00140   
00141 
00142   return GEOM_Object::GetObject(aLabel);
00143 }
00144 
00145 //=============================================================================
00149 //=============================================================================
00150 GEOM_Object::GEOM_Object(TDF_Label& theEntry)
00151   : _label(theEntry), _ior(""), _docID(-1)
00152 {
00153   Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
00154   if(!aDoc.IsNull()) {
00155     Handle(TDataStd_Integer) anID;
00156     if(aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) _docID = anID->Get();
00157   }
00158 
00159   if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
00160     _root = TDataStd_TreeNode::Set(theEntry);
00161 }
00162 
00163 //=============================================================================
00167 //=============================================================================
00168 GEOM_Object::GEOM_Object(TDF_Label& theEntry, int theType)
00169 : _label(theEntry), _ior(""), _docID(-1)
00170 {
00171   Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
00172   if(!aDoc.IsNull()) {
00173     Handle(TDataStd_Integer) anID;
00174     if(aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) _docID = anID->Get();
00175   }
00176 
00177   theEntry.ForgetAllAttributes(Standard_True);
00178 
00179   if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
00180     _root = TDataStd_TreeNode::Set(theEntry);
00181 
00182   TDataStd_Integer::Set(theEntry.FindChild(TYPE_LABEL), theType);
00183 
00184   TDataStd_UAttribute::Set(theEntry, GetObjectID());
00185 }
00186 
00187 //=============================================================================
00191 //=============================================================================
00192 GEOM_Object::~GEOM_Object()
00193 {
00194   MESSAGE("GEOM_Object::~GEOM_Object()");
00195 }
00196 
00197 //=============================================================================
00201 //=============================================================================
00202 int GEOM_Object::GetType()
00203 {
00204   Handle(TDataStd_Integer) aType;
00205   if(!_label.FindChild(TYPE_LABEL).FindAttribute(TDataStd_Integer::GetID(), aType)) return -1;
00206 
00207   return aType->Get();
00208 }
00209 
00210 //=============================================================================
00214 //=============================================================================
00215 void GEOM_Object::SetType(int theType)
00216 {
00217   TDataStd_Integer::Set(_label.FindChild(TYPE_LABEL), theType);
00218 }
00219 
00220 
00221 //=============================================================================
00227 //=============================================================================
00228 int GEOM_Object::GetTic()
00229 {
00230   Handle(TDataStd_Integer) aTicAttr;
00231   if (!_label.FindChild(TIC_LABEL).FindAttribute(TDataStd_Integer::GetID(), aTicAttr))
00232     return 0;
00233 
00234   return aTicAttr->Get();
00235 }
00236 
00237 //=============================================================================
00245 //=============================================================================
00246 void GEOM_Object::SetTic(int theTic)
00247 {
00248   TDataStd_Integer::Set(_label.FindChild(TIC_LABEL), theTic);
00249 }
00250 
00251 //=============================================================================
00257 //=============================================================================
00258 void GEOM_Object::IncrementTic()
00259 {
00260   TDF_Label aTicLabel = _label.FindChild(TIC_LABEL);
00261 
00262   Standard_Integer aTic = 0;
00263   Handle(TDataStd_Integer) aTicAttr;
00264   if (aTicLabel.FindAttribute(TDataStd_Integer::GetID(), aTicAttr))
00265     aTic = aTicAttr->Get();
00266 
00267   TDataStd_Integer::Set(aTicLabel, aTic + 1);
00268 }
00269 
00270 
00271 //=============================================================================
00275 //=============================================================================
00276 int GEOM_Object::GetDocID()
00277 {
00278   return _docID;
00279 }
00280 
00281 
00282 //=============================================================================
00286 //=============================================================================
00287 TopoDS_Shape GEOM_Object::GetValue()
00288 {
00289   TopoDS_Shape aShape;
00290 
00291   Handle(GEOM_Function) aFunction = GetLastFunction();
00292 
00293   if (!aFunction.IsNull())
00294     aShape = aFunction->GetValue();
00295 
00296   return aShape;
00297 }
00298 
00299 //=============================================================================
00303 //=============================================================================
00304 void GEOM_Object::SetName(const char* theName)
00305 {
00306   TDataStd_Name::Set(_label, (char*)theName);
00307 }
00308 
00309 //=============================================================================
00313 //=============================================================================
00314 char* GEOM_Object::GetName()
00315 {
00316   Handle(TDataStd_Name) aNameAttr;
00317   if(!_label.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) return NULL;
00318 
00319   TCollection_AsciiString aName(aNameAttr->Get());
00320   // do not return pointer of local variable
00321   // return aName.ToCString();
00322   // the following code could lead to memory leak, so take care about recieved pointer
00323   return strdup(aName.ToCString());
00324 }
00325 
00326 //=============================================================================
00330 //=============================================================================
00331 void GEOM_Object::SetColor(const GEOM_Object::Color& theColor)
00332 {
00333   Handle(TDataStd_RealArray) anArray = new TDataStd_RealArray();
00334   anArray->Init( 1, 3 );
00335   anArray->SetValue( 1, theColor.R );
00336   anArray->SetValue( 2, theColor.G );
00337   anArray->SetValue( 3, theColor.B );
00338 
00339   Handle(TDataStd_RealArray) anAttr =
00340     TDataStd_RealArray::Set(_label.FindChild(COLOR_LABEL), anArray->Lower(), anArray->Upper());
00341   anAttr->ChangeArray(anArray->Array());
00342 }
00343 
00344 //=============================================================================
00348 //=============================================================================
00349 GEOM_Object::Color GEOM_Object::GetColor()
00350 {
00351   Handle(TDataStd_RealArray) anArray;
00352   bool isFound = _label.FindChild(COLOR_LABEL).FindAttribute(TDataStd_RealArray::GetID(), anArray);
00353 
00354   GEOM_Object::Color aColor;
00355   aColor.R = isFound ? anArray->Value( 1 ) : -1;
00356   aColor.G = isFound ? anArray->Value( 2 ) : -1;
00357   aColor.B = isFound ? anArray->Value( 3 ) : -1;
00358 
00359   return aColor;
00360 }
00361 
00362 //=============================================================================
00366 //=============================================================================
00367 void GEOM_Object::SetAutoColor(bool theAutoColor)
00368 {
00369   TDataStd_Integer::Set(_label.FindChild(AUTO_COLOR_LABEL), (int)theAutoColor);
00370 }
00371 
00372 //=============================================================================
00376 //=============================================================================
00377 bool GEOM_Object::GetAutoColor()
00378 {
00379   Handle(TDataStd_Integer) anAutoColor;
00380   if(!_label.FindChild(AUTO_COLOR_LABEL).FindAttribute(TDataStd_Integer::GetID(), anAutoColor)) return false;
00381 
00382   return bool(anAutoColor->Get());
00383 }
00384 
00385 //=============================================================================
00389 //=============================================================================
00390 void GEOM_Object::SetMarkerStd(const Aspect_TypeOfMarker theType, double theSize)
00391 {
00392   TDF_Label aMarkerLabel = _label.FindChild(MARKER_LABEL);
00393   TDataStd_Integer::Set(aMarkerLabel.FindChild(MARKER_LABEL_TYPE), (int)theType);
00394   TDataStd_Real::Set(aMarkerLabel.FindChild(MARKER_LABEL_SIZE), theSize);
00395 }
00396   
00397 //=============================================================================
00401 //=============================================================================
00402 void GEOM_Object::SetMarkerTexture(int theTextureId)
00403 {
00404   TDF_Label aMarkerLabel = _label.FindChild(MARKER_LABEL);
00405   TDataStd_Integer::Set(aMarkerLabel.FindChild(MARKER_LABEL_TYPE), (int)Aspect_TOM_USERDEFINED);
00406   TDataStd_Integer::Set(aMarkerLabel.FindChild(MARKER_LABEL_ID),   theTextureId);
00407 }
00408 
00409 //=============================================================================
00413 //=============================================================================
00414 Aspect_TypeOfMarker GEOM_Object::GetMarkerType()
00415 {
00416   Standard_Integer aType = -1;
00417   TDF_Label aMarkerLabel = _label.FindChild(MARKER_LABEL, Standard_False);
00418   if(!aMarkerLabel.IsNull()) {
00419     TDF_Label aTypeLabel = aMarkerLabel.FindChild(MARKER_LABEL_TYPE, Standard_False);
00420     Handle(TDataStd_Integer) aTypeAttr;
00421     if (!aTypeLabel.IsNull() && aTypeLabel.FindAttribute(TDataStd_Integer::GetID(), aTypeAttr))
00422       aType = aTypeAttr->Get();
00423   }
00424   return (Aspect_TypeOfMarker)aType;
00425 }
00426 
00427 //=============================================================================
00431 //=============================================================================
00432 double GEOM_Object::GetMarkerSize()
00433 {
00434   Standard_Real aSize = 0.;
00435   TDF_Label aMarkerLabel = _label.FindChild(MARKER_LABEL, Standard_False);
00436   if(!aMarkerLabel.IsNull()) {
00437     TDF_Label aSizeLabel = aMarkerLabel.FindChild(MARKER_LABEL_SIZE, Standard_False);
00438     Handle(TDataStd_Real) aSizeAttr;
00439     if (!aSizeLabel.IsNull() && aSizeLabel.FindAttribute(TDataStd_Real::GetID(), aSizeAttr))
00440       aSize = aSizeAttr->Get();
00441   }
00442   return aSize;
00443 }
00444 
00445 //=============================================================================
00449 //=============================================================================
00450 int GEOM_Object::GetMarkerTexture()
00451 {
00452   Standard_Integer anId = 0;
00453   if ( GetMarkerType() == Aspect_TOM_USERDEFINED) {
00454     TDF_Label aMarkerLabel = _label.FindChild(MARKER_LABEL, Standard_False);
00455     if(!aMarkerLabel.IsNull()) {
00456       TDF_Label aTypeLabel = aMarkerLabel.FindChild(MARKER_LABEL_ID, Standard_False);
00457       Handle(TDataStd_Integer) anIdAttr;
00458       if (!aTypeLabel.IsNull() && aTypeLabel.FindAttribute(TDataStd_Integer::GetID(), anIdAttr))
00459         anId = anIdAttr->Get();
00460     }
00461   }
00462   return anId;
00463 }
00464 
00465 //=============================================================================
00469 //=============================================================================
00470 void GEOM_Object::UnsetMarker()
00471 {
00472   SetMarkerStd((Aspect_TypeOfMarker)-1, 0.);
00473 }
00474 
00475 //=============================================================================
00479 //=============================================================================
00480 void GEOM_Object::SetAuxData(const char* theData)
00481 {
00482   TDataStd_Comment::Set(_label, (char*)theData);
00483 }
00484 
00485 //=============================================================================
00489 //=============================================================================
00490 TCollection_AsciiString GEOM_Object::GetAuxData()
00491 {
00492   TCollection_AsciiString aData;
00493 
00494   Handle(TDataStd_Comment) aCommentAttr;
00495   if (_label.FindAttribute(TDataStd_Comment::GetID(), aCommentAttr))
00496     aData = aCommentAttr->Get();
00497 
00498   return aData;
00499 }
00500 
00501 //=============================================================================
00505 //=============================================================================
00506 void GEOM_Object::SetParameters(const TCollection_AsciiString& theParameters)
00507 {
00508   if( _parameters.IsEmpty() )
00509     _parameters = theParameters;
00510   else {
00511     _parameters += "|";
00512     _parameters += theParameters;
00513   }
00514 }
00515 
00516 //=============================================================================
00520 //=============================================================================
00521 TCollection_AsciiString GEOM_Object::GetParameters() const
00522 {
00523   return _parameters;
00524 }
00525 
00526 
00527 //=============================================================================
00531 //=============================================================================
00532 bool GEOM_Object::IsMainShape()
00533 {
00534   Handle(GEOM_Function) aFunction = GetFunction(1);
00535   if(aFunction.IsNull() || aFunction->GetDriverGUID() != GetSubShapeID()) return true; // mkr : IPAL9921
00536   return false;
00537 }
00538 
00539 
00540 //=============================================================================
00544 //=============================================================================
00545 Handle(GEOM_Function) GEOM_Object::AddFunction(const Standard_GUID& theGUID, int theFunctionType)
00546 {
00547   Standard_Integer nb = GetNbFunctions();
00548   if(nb == 1 && theGUID == GetSubShapeID()) return NULL; //It's impossible to add a function to sub-shape
00549   nb++;
00550   TDF_Label aChild = FUNCTION_LABEL(nb);
00551 
00552   Handle(TDataStd_TreeNode) aNode = TDataStd_TreeNode::Set(aChild);
00553   _root->Append(aNode);
00554 
00555   Handle(GEOM_Function) aFunction = new GEOM_Function(aChild, theGUID, theFunctionType);
00556 
00557   return aFunction;
00558 
00559 }
00560 
00561 //=============================================================================
00565 //=============================================================================
00566 int GEOM_Object::GetNbFunctions()
00567 {
00568   Standard_Integer nb = 0;
00569   for(TDataStd_ChildNodeIterator CI(_root); CI.More(); CI.Next()) nb++;
00570   return nb;
00571 }
00572 
00573 //=============================================================================
00577 //=============================================================================
00578 Handle(GEOM_Function) GEOM_Object::GetFunction(int theFunctionNumber)
00579 {
00580   TDF_Label aChild = FUNCTION_LABEL(theFunctionNumber);
00581   return GEOM_Function::GetFunction(aChild);
00582 }
00583 
00584 //=============================================================================
00588 //=============================================================================
00589 Handle(GEOM_Function) GEOM_Object::GetLastFunction()
00590 {
00591   Standard_Integer nb = GetNbFunctions();
00592   if(nb) return GetFunction(nb);
00593 
00594   return NULL;
00595 }
00596 
00597 
00598 //=============================================================================
00602 //=============================================================================
00603 Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetAllDependency()
00604 {
00605   Handle(TColStd_HSequenceOfTransient) anArray;
00606   TDF_LabelSequence aSeq;
00607   Standard_Integer nb = GetNbFunctions();
00608   if(nb == 0) return anArray;
00609   for(Standard_Integer i=1; i<=nb; i++) {
00610     Handle(GEOM_Function) aFunction = GetFunction(i);
00611     if(aFunction.IsNull()) continue;
00612     aFunction->GetDependency(aSeq);
00613   }
00614 
00615   Standard_Integer aLength = aSeq.Length();
00616   if(aLength > 0) {
00617     anArray = new TColStd_HSequenceOfTransient;
00618     for(Standard_Integer j =1; j<=aLength; j++) {
00619       Handle(GEOM_Object) aRefObj = GetReferencedObject(aSeq(j));
00620       if(!aRefObj.IsNull()) anArray->Append(aRefObj);
00621     }
00622   }
00623 
00624   return anArray;
00625 }
00626 
00627 //=============================================================================
00631 //=============================================================================
00632 Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetLastDependency()
00633 {
00634   Handle(TColStd_HSequenceOfTransient) anArray;
00635   Handle(GEOM_Function) aFunction = GetLastFunction();
00636   if (aFunction.IsNull()) return anArray;
00637 
00638   TDF_LabelSequence aSeq;
00639   aFunction->GetDependency(aSeq);
00640   Standard_Integer aLength = aSeq.Length();
00641   if (aLength > 0) {
00642     anArray = new TColStd_HSequenceOfTransient;
00643     for (Standard_Integer i = 1; i <= aLength; i++)
00644       anArray->Append(GetReferencedObject(aSeq(i)));
00645   }
00646 
00647   return anArray;
00648 }
00649 
00650 //=============================================================================
00654 //=============================================================================
00655 TDF_Label GEOM_Object::GetFreeLabel()
00656 {
00657   return _label.FindChild(FREE_LABEL);
00658 }
00659 
00660 //=======================================================================
00661 //function :  GEOM_Object_Type_
00662 //purpose  :
00663 //=======================================================================
00664 Standard_EXPORT Handle_Standard_Type& GEOM_Object_Type_()
00665 {
00666 
00667   static Handle_Standard_Type aType1 = STANDARD_TYPE(MMgt_TShared);
00668   if ( aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared);
00669   static Handle_Standard_Type aType2 = STANDARD_TYPE(Standard_Transient);
00670   if ( aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient);
00671 
00672 
00673   static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,NULL};
00674   static Handle_Standard_Type _aType = new Standard_Type("GEOM_Object",
00675                                                          sizeof(GEOM_Object),
00676                                                          1,
00677                                                          (Standard_Address)_Ancestors,
00678                                                          (Standard_Address)NULL);
00679   return _aType;
00680 }
00681 
00682 //=======================================================================
00683 //function : DownCast
00684 //purpose  :
00685 //=======================================================================
00686 
00687 const Handle(GEOM_Object) Handle(GEOM_Object)::DownCast(const Handle(Standard_Transient)& AnObject)
00688 {
00689   Handle(GEOM_Object) _anOtherObject;
00690 
00691   if (!AnObject.IsNull()) {
00692      if (AnObject->IsKind(STANDARD_TYPE(GEOM_Object))) {
00693        _anOtherObject = Handle(GEOM_Object)((Handle(GEOM_Object)&)AnObject);
00694      }
00695   }
00696 
00697   return _anOtherObject ;
00698 }
00699 
00700