0025812: Replace dynamic loading mechanism of OCAF persistence with dynamic-link one
[occt.git] / src / TObjDRAW / TObjDRAW.cxx
1 // Created on: 2008-06-07
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2008-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <DDocStd.hxx>
18 #include <DDocStd_DrawDocument.hxx>
19 #include <Draw.hxx>
20 #include <Draw_PluginMacro.hxx>
21 #include <Message_MsgFile.hxx>
22 #include <Standard_Type.hxx>
23 #include <TCollection_ExtendedString.hxx>
24 #include <TColStd_HArray1OfReal.hxx>
25 #include <TDataStd_Name.hxx>
26 #include <TDF_Data.hxx>
27 #include <TDF_Tool.hxx>
28 #include <TDocStd_Document.hxx>
29 #include <TObj_Application.hxx>
30 #include <TObj_Model.hxx>
31 #include <TObj_Object.hxx>
32 #include <TObj_ObjectIterator.hxx>
33 #include <TObj_TModel.hxx>
34 #include <TObj_TNameContainer.hxx>
35 #include <TObjDRAW.hxx>
36
37 #include <BinTObjDrivers.hxx>
38 #include <XmlTObjDrivers.hxx>
39
40 #include <stdio.h>
41 // avoid warnings on 'extern "C"' functions returning C++ classes
42 #ifdef _MSC_VER
43 #pragma warning(4:4190)
44 #endif
45
46 //=======================================================================
47 // Section: General commands
48 //=======================================================================
49
50
51 //! simple model with redefined pure virtual method
52 class TObjDRAW_Model : public TObj_Model
53 {
54  public:
55   Standard_EXPORT TObjDRAW_Model()
56     : TObj_Model() {}
57   
58   virtual Standard_EXPORT Handle(TObj_Model) NewEmpty() Standard_OVERRIDE
59     {
60       return new TObjDRAW_Model();
61     }
62   
63  public:
64   //! CASCADE RTTI
65   DEFINE_STANDARD_RTTI_INLINE(TObjDRAW_Model,TObj_Model)
66
67 };
68 DEFINE_STANDARD_HANDLE (TObjDRAW_Model,TObj_Model)
69
70
71
72 //! simple object to check API and features of TObj_Object
73 class TObjDRAW_Object : public TObj_Object
74 {
75  protected:
76   //! enumeration for the ranks of label under Data section.
77   enum DataTag
78   {
79     DataTag_First = TObj_Object::DataTag_Last,
80     DataTag_IntVal,
81     DataTag_RealArr,
82     DataTag_Last = DataTag_First + 100 
83   };
84   
85   // enumeration for the ranks of label under Reference section.
86   enum RefTag
87   {
88     RefTag_First = TObj_Object::RefTag_Last,
89     RefTag_Other, //!< here we test only one refrence to other
90     RefTag_Last = RefTag_First + 100 
91   };
92
93   //! enumeration for the ranks of label under Children section.
94   enum ChildTag
95   {
96     ChildTag_First = TObj_Object::ChildTag_Last,
97     ChildTag_Child, //!< here we test only one child (or one branch of children)
98     ChildTag_Last = ChildTag_First + 100 
99   };
100   
101  public:
102   Standard_EXPORT TObjDRAW_Object(const TDF_Label& theLab)
103     : TObj_Object( theLab )  {}
104   
105   //! sets int value
106   Standard_EXPORT void SetInt( const Standard_Integer theVal )
107     { setInteger( theVal, DataTag_IntVal ); }
108   //! returns int value
109   Standard_EXPORT Standard_Integer GetInt() const
110     { return getInteger( DataTag_IntVal ); }
111   
112   //! sets array of real
113   Standard_EXPORT void SetRealArr( const Handle(TColStd_HArray1OfReal)& theHArr )
114     { setArray( theHArr, DataTag_RealArr ); }
115   //! returns array of real
116   Standard_EXPORT Handle(TColStd_HArray1OfReal) GetRealArr() const
117     { return getRealArray( 0, DataTag_RealArr ); }
118   
119   //! set reference to other object
120   Standard_EXPORT void SetRef( const Handle(TObj_Object)& theOther )
121     { setReference( theOther, RefTag_Other ); }
122   //! return reference
123   Standard_EXPORT Handle(TObj_Object) GetRef() const
124     { return getReference( RefTag_Other ); }
125   
126   //! add child object
127   Standard_EXPORT Handle(TObj_Object) AddChild()
128     {
129       TDF_Label aChL = getChildLabel( ChildTag_Child ).NewChild();
130       return new TObjDRAW_Object( aChL );
131     }
132   
133   protected:
134   // Persistence of TObj object
135   DECLARE_TOBJOCAF_PERSISTENCE(TObjDRAW_Object,TObj_Object)
136
137  public:
138   // Declaration of CASCADE RTTI
139  DEFINE_STANDARD_RTTI_INLINE(TObjDRAW_Object,TObj_Object)
140   
141 };
142
143 // Definition of HANDLE object using Standard_DefineHandle.hxx
144 DEFINE_STANDARD_HANDLE (TObjDRAW_Object,TObj_Object)
145
146
147 IMPLEMENT_TOBJOCAF_PERSISTENCE(TObjDRAW_Object)
148
149 //=======================================================================
150 //function : newModel
151 //purpose  :
152 //=======================================================================
153 static Standard_Integer newModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
154 {
155   if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc\n";return 1;}
156
157   Handle(TDocStd_Document) D;
158   Handle(DDocStd_DrawDocument) DD;
159
160   if (!DDocStd::GetDocument(argv[1],D,Standard_False)) {
161     Handle(TObjDRAW_Model) aModel = new TObjDRAW_Model();
162     aModel->Load(0);
163     D = aModel->GetDocument();
164     DD = new DDocStd_DrawDocument(D);
165     TDataStd_Name::Set(D->GetData()->Root(),argv[1]);
166     Draw::Set(argv[1],DD);
167     di << "document " << argv[1] << " created\n";
168   }
169   else di << argv[1] << " is already a document\n";
170
171   return 0;
172 }
173
174 static Handle(TObj_Model) getModelByName( const char* theName )
175 {
176   Handle(TObj_Model) aModel;
177   Handle(TDocStd_Document) D;
178   if (!DDocStd::GetDocument(theName,D)) return aModel;
179   
180   TDF_Label aLabel = D->Main();
181   Handle(TObj_TModel) aModelAttr;
182   if (!aLabel.IsNull() && aLabel.FindAttribute(TObj_TModel::GetID(), aModelAttr))
183     aModel = aModelAttr->Model();
184   return aModel;
185 }
186
187 //=======================================================================
188 //function : saveModel
189 //purpose  :
190 //=======================================================================
191 static Standard_Integer saveModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
192 {
193   if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc [fileName]\n";return 1;}
194   
195   Handle(TObj_Model) aModel = getModelByName(argv[1]);
196   if ( aModel.IsNull() ) return 1;
197   Standard_Boolean isSaved = Standard_False; 
198   if (argc > 2 )
199     isSaved = aModel->SaveAs( argv[2] );
200   else
201     isSaved = aModel->Save();
202   
203   if (!isSaved) {
204     di << "Error: Document not saved\n";
205     return 1;
206   }
207   return 0;
208 }
209
210 //=======================================================================
211 //function : loadModel
212 //purpose  :
213 //=======================================================================
214 static Standard_Integer loadModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
215 {
216   if (argc < 3) {di<<"Use "<< argv[0] << "nameDoc fileName\n";return 1;}
217   
218   Standard_Boolean isLoaded = Standard_False;
219   Handle(TObj_Model) aModel = getModelByName(argv[1]);
220   if ( aModel.IsNull() )
221   {
222     // create new
223     aModel = new TObjDRAW_Model();
224     isLoaded = aModel->Load( argv[2] );
225     if ( isLoaded )
226     {
227       Handle(TDocStd_Document) D = aModel->GetDocument();
228       Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(D);
229     
230       TDataStd_Name::Set(D->GetData()->Root(),argv[1]);
231       Draw::Set(argv[1],DD);
232     }
233   }
234   else
235     isLoaded = aModel->Load( argv[2] );
236   
237   
238   if (!isLoaded) {
239     di << "Error: Document not loaded\n";
240     return 1;
241   }
242   return 0;
243 }
244
245
246 //=======================================================================
247 //function : closeModel
248 //purpose  :
249 //=======================================================================
250 static Standard_Integer closeModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
251 {
252   if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc\n";return 1;}
253   
254   Handle(TObj_Model) aModel = getModelByName(argv[1]);
255   if ( aModel.IsNull() ) return 1;
256   aModel->Close();
257
258   return 0;
259 }
260
261 //=======================================================================
262 //function : addObj
263 //purpose  :
264 //=======================================================================
265 static Standard_Integer addObj (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
266 {
267   if (argc < 3) {di<<"Use "<< argv[0] << "DocName ObjName\n";return 1;}
268   Handle(TObj_Model) aModel = getModelByName(argv[1]);
269   if ( aModel.IsNull() ) return 1;
270   Handle(TObjDRAW_Object) tObj =
271     new TObjDRAW_Object( aModel->GetMainPartition()->NewLabel() );
272   if ( tObj.IsNull() )
273   {
274     di << "Error: Object not created\n";
275     return 1;
276   }
277   tObj->SetName( argv[2] );
278   
279   return 0;
280 }
281
282 static Handle(TObjDRAW_Object) getObjByName( const char* modelName, const char* objName )
283 {
284   Handle(TObjDRAW_Object) tObj;
285   Handle(TObj_Model) aModel = getModelByName(modelName);
286   if ( aModel.IsNull() )
287     return tObj;
288   Handle(TCollection_HExtendedString) aName = new TCollection_HExtendedString( objName );
289   Handle(TObj_TNameContainer) aDict;
290   tObj = Handle(TObjDRAW_Object)::DownCast( aModel->FindObject(aName, aDict) );
291   return tObj;
292 }
293
294 //=======================================================================
295 //function : setVal
296 //purpose  :
297 //=======================================================================
298 static Standard_Integer setVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
299 {
300   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 intVal | -r N r1 r2 ... rN\n";return 1;}
301   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
302   if ( tObj.IsNull() )
303   {
304     di << "Error: Object " << argv[2] << " not found\n";
305     return 1;
306   }
307   if ( !strcmp(argv[3],"-r") )
308   {
309     int Nb = Draw::Atoi(argv[4]);
310     Handle(TColStd_HArray1OfReal) rArr = new TColStd_HArray1OfReal(1,Nb);
311     for ( int i = 1; i <= Nb; i++ )
312       rArr->SetValue(i, Draw::Atof(argv[4+i]));
313     tObj->SetRealArr( rArr );
314   }
315   else
316     tObj->SetInt( Draw::Atoi(argv[3] ) ); 
317   
318   return 0;
319 }
320
321 //=======================================================================
322 //function : getVal
323 //purpose  :
324 //=======================================================================
325 static Standard_Integer getVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
326 {
327   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 -i | -r\n";return 1;}
328
329   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
330   if ( tObj.IsNull() )
331   {
332     di << "Error: Object " << argv[2] << " not found\n";
333     return 1;
334   }
335   if ( !strcmp(argv[3],"-i") )
336     di << tObj->GetInt();
337   else
338   {
339     Handle(TColStd_HArray1OfReal) rArr = tObj->GetRealArr();
340     if ( !rArr.IsNull() )
341       for ( int i = 1, n = rArr->Upper(); i <= n; i++ )
342       {
343         if ( i > 1 )
344           di << " ";
345         di << rArr->Value(i);
346       }
347   }
348
349   return 0;
350 }
351
352 //=======================================================================
353 //function : setRef
354 //purpose  :
355 //=======================================================================
356 static Standard_Integer setRef (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
357 {
358   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 ObjName2\n";return 1;}
359
360   Handle(TObjDRAW_Object) tObj1 = getObjByName( argv[1], argv[2] );
361   Handle(TObjDRAW_Object) tObj2 = getObjByName( argv[1], argv[3] );
362   if ( tObj1.IsNull() || tObj2.IsNull() )
363   {
364     di << "Error: Object " << argv[2] << " or object " << argv[3] << " not found\n";
365     return 1;
366   }
367   tObj1->SetRef( tObj2 );
368
369   return 0;
370 }
371
372 //=======================================================================
373 //function : getRef
374 //purpose  :
375 //=======================================================================
376 static Standard_Integer getRef (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
377 {
378   if (argc < 3) {di<<"Use "<< argv[0] << "DocName ObjName\n";return 1;}
379
380   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
381   if ( tObj.IsNull() )
382   {
383     di << "Error: Object " << argv[2] << " not found\n";
384     return 1;
385   }
386   Handle(TObj_Object) aRefObj = tObj->GetRef();
387   if ( aRefObj.IsNull() )
388     return 1;
389   else
390   {
391     TCollection_AsciiString aName;
392     aRefObj->GetName( aName );
393     di << aName.ToCString();
394   }
395   
396   return 0;
397 }
398
399 //=======================================================================
400 //function : addChild
401 //purpose  :
402 //=======================================================================
403 static Standard_Integer addChild (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
404 {
405   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName childObj\n";return 1;}
406
407   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
408   if ( tObj.IsNull() )
409   {
410     di << "Error: Object " << argv[2] << " not found\n";
411     return 1;
412   }
413   Handle(TObj_Object) chldObj = tObj->AddChild();
414   if ( chldObj.IsNull() )
415   {
416     di << "Error: No child object created\n";
417     return 1;
418   }
419   chldObj->SetName( new TCollection_HExtendedString( argv[3] ) );
420   
421   return 0;
422 }
423
424 //=======================================================================
425 //function : getChild
426 //purpose  :
427 //=======================================================================
428 static Standard_Integer getChild (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
429 {
430   if (argc < 3) {di<<"Use "<< argv[0] << "DocName ObjName\n";return 1;}
431
432   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
433   if ( tObj.IsNull() )
434   {
435     di << "Error: Object " << argv[2] << " not found\n";
436     return 1;
437   }
438   Handle(TObj_ObjectIterator) anItr = tObj->GetChildren();
439   int i = 0;
440   for ( ; anItr->More(); anItr->Next(), i++ )
441   {
442     Handle(TObj_Object) anObj = anItr->Value();
443     TCollection_AsciiString aName;
444     anObj->GetName( aName );
445     if ( i > 0 )
446       di << " ";
447     di << aName.ToCString();
448   }
449   
450   return 0;
451 }
452
453 //=======================================================================
454 //function : Init
455 //purpose  :
456 //=======================================================================
457
458 void TObjDRAW::Init(Draw_Interpretor& di)
459 {
460
461   static Standard_Boolean initactor = Standard_False;
462   if (initactor) return;  initactor = Standard_True;
463
464   // load TObjOcaf base data model messages
465   Message_MsgFile::Load( ::getenv( "CSF_TObjResources" ), "TObj.msg" );
466   
467   //=====================================
468   // General commands
469   //=====================================
470
471   Standard_CString g = "TObj general commands";
472
473   di.Add ("TObjNew","DocName \t: Create new TObj model with document named DocName",
474                    __FILE__, newModel, g);
475
476   di.Add ("TObjSave","DocName [Path] \t: Save Model with DocName",
477                    __FILE__, saveModel, g);
478
479   di.Add ("TObjLoad","DocName Path \t: Load model DocName from file Path",
480                    __FILE__, loadModel, g);
481
482   di.Add ("TObjClose","DocName\t: Close model DocName",
483                    __FILE__, closeModel, g);
484
485   di.Add ("TObjAddObj","DocName ObjName \t: Add object to model document",
486                    __FILE__, addObj, g);
487
488   di.Add ("TObjSetVal","DocName ObjName1 intVal | -r N r1 r2 ... rN \t: Set one integer or set of real values",
489                    __FILE__, setVal, g);
490
491   di.Add ("TObjGetVal","DocName ObjName1 -i | -r \t: Returns one integer or set of real values",
492                    __FILE__, getVal, g);
493
494   di.Add ("TObjSetRef","DocName ObjName1 ObjName2 \t: Set reference from object1 to object2",
495                    __FILE__, setRef, g);
496
497   di.Add ("TObjGetRef","DocName ObjName \t: Returns list of children objects",
498                    __FILE__, getRef, g);
499   
500   di.Add ("TObjAddChild","DocName ObjName chldName \t: Add child object to indicated object",
501                    __FILE__, addChild, g);
502   
503   di.Add ("TObjGetChildren","DocName ObjName \t: Returns list of children objects",
504                    __FILE__, getChild, g);
505   
506 }
507
508
509 //==============================================================================
510 // TObjDRAW::Factory
511
512 //==============================================================================
513 void TObjDRAW::Factory(Draw_Interpretor& theDI)
514 {
515   // Initialize TObj OCAF formats
516   Handle(TDocStd_Application) anApp = DDocStd::GetApplication();
517   BinTObjDrivers::DefineFormat(anApp);
518   XmlTObjDrivers::DefineFormat(anApp);
519
520   // define formats for TObj specific application
521   anApp = TObj_Application::GetInstance();
522   BinTObjDrivers::DefineFormat(anApp);
523   XmlTObjDrivers::DefineFormat(anApp);
524
525   TObjDRAW::Init(theDI);
526
527 #ifdef OCCT_DEBUG
528       theDI << "Draw Plugin : All TKTObjDRAW commands are loaded\n";
529 #endif
530 }
531
532 // Declare entry point PLUGINFACTORY
533 DPLUGIN(TObjDRAW)