Salome HOME
e16ef594070c023138eecf2776c53eab762bd34f
[modules/geom.git] / src / GEOM_I / GEOM_BaseObject_i.cc
1 // Copyright (C) 2007-2015  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 #include "GEOM_BaseObject_i.hh"
24
25 #include "GEOMImpl_Types.hxx"
26 #include "GEOM_BaseDriver.hxx"
27
28 #include <utilities.h>
29 //#include <OpUtil.hxx>
30 //#include <Utils_ExceptHandlers.hxx>
31
32 #include <TCollection_AsciiString.hxx>
33 #include <TDF_Label.hxx>
34 #include <TDF_Tool.hxx>
35 #include <Standard_ErrorHandler.hxx>
36 #include <Standard_Failure.hxx>
37
38 #ifdef _DEBUG_
39 #include <typeinfo>
40 #endif
41
42 #ifdef WIN32
43 #pragma warning( disable:4786 )
44 #endif
45
46 //=============================================================================
47 /*!
48  *   constructor:
49  */
50 //=============================================================================
51
52 GEOM_BaseObject_i::GEOM_BaseObject_i (PortableServer::POA_ptr thePOA,
53                                       GEOM::GEOM_Gen_ptr      theEngine,
54                                       Handle(GEOM_BaseObject) theImpl)
55   : SALOME::GenericObj_i( thePOA ), _engine(theEngine), _impl(theImpl)
56 {
57 }
58
59 //=============================================================================
60 /*!
61  *  destructor
62  */
63 //=============================================================================
64
65 GEOM_BaseObject_i::~GEOM_BaseObject_i()
66 {
67   MESSAGE("GEOM_BaseObject_i::~GEOM_BaseObject_i");
68   GEOM_Engine::GetEngine()->RemoveObject(_impl);
69 }
70
71 //=============================================================================
72 /*!
73  *  GetEntry
74  */
75 //=============================================================================
76
77 char* GEOM_BaseObject_i::GetEntry()
78 {
79   const TDF_Label& aLabel = _impl->GetEntry();
80   TCollection_AsciiString anEntry;
81   TDF_Tool::Entry(aLabel, anEntry);
82   const char* anEntstr = anEntry.ToCString();
83   return CORBA::string_dup(anEntstr);
84 }
85
86 //=============================================================================
87 /*!
88  *  GetStudyID
89  */
90 //=============================================================================
91
92 CORBA::Long GEOM_BaseObject_i::GetStudyID()
93 {
94    return _impl->GetDocID();
95 }
96
97 //=============================================================================
98 /*!
99  *  GetType
100  */
101 //=============================================================================
102
103 CORBA::Long GEOM_BaseObject_i::GetType()
104 {
105   return _impl->GetType();
106 }
107
108 //=============================================================================
109 /*!
110  *  GetTick
111  */
112 //=============================================================================
113
114 CORBA::Long GEOM_BaseObject_i::GetTick()
115 {
116   return _impl->GetTic();
117 }
118
119 //=============================================================================
120 /*!
121  *  SetName
122  */
123 //=============================================================================
124 void GEOM_BaseObject_i::SetName(const char* theName)
125 {
126   _impl->SetName(theName);
127 }
128
129 //=============================================================================
130 /*!
131  *  GetName
132  */
133 //=============================================================================
134
135 char* GEOM_BaseObject_i::GetName()
136 {
137   TCollection_AsciiString aName = _impl->GetName();
138   return CORBA::string_dup( aName.ToCString() );
139 }
140
141 //=============================================================================
142 /*!
143  *  SetStudyEntry
144  */
145 //=============================================================================
146
147 void GEOM_BaseObject_i::SetStudyEntry(const char* theEntry)
148 {
149   _impl->SetAuxData(theEntry);
150 }
151
152 //=============================================================================
153 /*!
154  *  GetStudyEntry
155  */
156 //=============================================================================
157
158 char* GEOM_BaseObject_i::GetStudyEntry()
159 {
160   TCollection_AsciiString anEntry = _impl->GetAuxData();
161   return CORBA::string_dup(anEntry.ToCString());
162 }
163
164 //=============================================================================
165 /*!
166  *  GetDependency
167  */
168 //=============================================================================
169 GEOM::ListOfGBO* GEOM_BaseObject_i::GetDependency()
170 {
171   GEOM::ListOfGBO_var aList = new GEOM::ListOfGBO();
172   aList->length(0);
173
174   Handle(TColStd_HSequenceOfTransient) aSeq = _impl->GetAllDependency();
175   if (aSeq.IsNull()) return aList._retn();
176   int aLength = aSeq->Length();
177   if (aLength == 0) return aList._retn();
178
179   aList->length(aLength);
180
181   TCollection_AsciiString anEntry;
182
183   for (int i = 1; i<=aLength; i++) {
184     Handle(GEOM_BaseObject) anObj = Handle(GEOM_BaseObject)::DownCast(aSeq->Value(i));
185     if (anObj.IsNull()) continue;
186     TDF_Tool::Entry(anObj->GetEntry(), anEntry);
187     GEOM::GEOM_BaseObject_var obj = _engine->GetObject(anObj->GetDocID(), (char*) anEntry.ToCString());
188     aList[i-1] = obj;
189   }
190
191   return aList._retn();
192 }
193
194 //=============================================================================
195 /*!
196  * GetLastDependency
197  */
198 //=============================================================================
199 GEOM::ListOfGBO* GEOM_BaseObject_i::GetLastDependency()
200 {
201   GEOM::ListOfGBO_var aList = new GEOM::ListOfGBO();
202   aList->length(0);
203
204   Handle(TColStd_HSequenceOfTransient) aSeq = _impl->GetLastDependency();
205   if (aSeq.IsNull()) return aList._retn();
206   int aLength = aSeq->Length();
207   if (aLength == 0) return aList._retn();
208
209   aList->length(aLength);
210
211   TCollection_AsciiString anEntry;
212
213   for (int i = 1; i<=aLength; i++) {
214      Handle(GEOM_BaseObject) anObj = Handle(GEOM_BaseObject)::DownCast(aSeq->Value(i));
215      if (anObj.IsNull()) continue;
216      GEOM::GEOM_BaseObject_var obj = _engine->GetObject(anObj->GetDocID(),
217                                                         anObj->GetEntryString().ToCString());
218      aList[i-1] = GEOM::GEOM_BaseObject::_duplicate( obj );
219   }
220
221   return aList._retn();
222 }
223
224 //================================================================================
225 /*!
226  * \brief 
227  */
228 //================================================================================
229
230 bool GEOM_BaseObject_i::IsSame(GEOM::GEOM_BaseObject_ptr other)
231 {
232   if ( CORBA::is_nil( other ))
233     return false;
234
235   PortableServer::Servant aServant = myPOA->reference_to_servant( other );
236   GEOM_BaseObject_i * other_i = dynamic_cast<GEOM_BaseObject_i*>(aServant);
237   if ( !other_i )
238     return false;
239
240   return _impl->GetEntry() == other_i->_impl->GetEntry();
241 }
242
243 //================================================================================
244 /*!
245  * \brief 
246  */
247 //================================================================================
248
249 void GEOM_BaseObject_i::SetParameters(const char* theParameters)
250 {
251   _impl->SetParameters((char*)theParameters);
252 }
253
254 //================================================================================
255 /*!
256  * \brief 
257  */
258 //================================================================================
259
260 char* GEOM_BaseObject_i::GetParameters()
261 {
262   return CORBA::string_dup(_impl->GetParameters().ToCString());
263 }
264
265 //================================================================================
266 /*!
267  * \brief 
268  */
269 //================================================================================
270
271 GEOM::CreationInformationSeq* GEOM_BaseObject_i::GetCreationInformation()
272 {
273   GEOM::CreationInformationSeq_var info = new GEOM::CreationInformationSeq();
274
275   int nbFun = _impl->GetNbFunctions();
276   info->length( nbFun );
277   int nbI = 0;
278   for ( int i = 1; i <= nbFun; ++i )
279   {
280     Handle(GEOM_BaseDriver) driver =
281       Handle(GEOM_BaseDriver)::DownCast( _impl->GetCreationDriver( i ));
282     if ( !driver.IsNull() )
283     {
284       std::vector<GEOM_Param> params;
285       std::string             operationName;
286       try
287       {
288         OCC_CATCH_SIGNALS;
289         if ( driver->GetCreationInformation( operationName, params ))
290         {
291           info[nbI].operationName = operationName.c_str();
292           info[nbI].params.length( params.size() );
293           for ( size_t i = 0; i < params.size(); ++i )
294           {
295             info[nbI].params[i].name  = params[i].name.c_str();
296             info[nbI].params[i].value = params[i].value.c_str();
297           }
298           nbI++;
299         }
300 #ifdef _DEBUG_
301         if ( operationName.empty() )
302         {
303           cout << endl << endl << endl << "Warning: " << endl << "Dear developer!!!" << endl
304                << "  Consider implementing "
305                <<    typeid(*(driver.operator->())).name() << "::GetCreationInformation() " << endl
306                << "  for the case of operation which has created '" << GetName() << "' object" << endl
307                << "PLEEEEEEEASE" << endl
308                << "\tPLEEEEEEEASE" << endl
309                << "\t\tPLEEEEEEEASE" << endl
310                << "\t\t\tPLEEEEEEEASE" << endl
311                << "\t\t\t\tPLEEEEEEEASE" << endl;
312         }
313 #endif
314       }
315       catch(...)
316       {
317 #ifdef _DEBUG_
318         cout << "Ecxeption in GEOM_BaseObject_i::GetCreationInformation()" << endl;
319 #endif
320       }
321     }
322   }
323   info->length( nbI );
324
325   return info._retn();
326 }