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