0014673: Provide true support for Unicode symbols
[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( TCollection_ExtendedString (argv[2], Standard_True) );
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   TCollection_ExtendedString aPath(argv[2], Standard_True);
219   if ( aModel.IsNull() )
220   {
221     // create new
222     aModel = new TObjDRAW_Model();
223     isLoaded = aModel->Load(aPath);
224     if ( isLoaded )
225     {
226       Handle(TDocStd_Document) D = aModel->GetDocument();
227       Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(D);
228     
229       TDataStd_Name::Set(D->GetData()->Root(),argv[1]);
230       Draw::Set(argv[1],DD);
231     }
232   }
233   else
234   {
235     isLoaded = aModel->Load(aPath);
236   }
237   
238   
239   if (!isLoaded) {
240     di << "Error: Document not loaded\n";
241     return 1;
242   }
243   return 0;
244 }
245
246
247 //=======================================================================
248 //function : closeModel
249 //purpose  :
250 //=======================================================================
251 static Standard_Integer closeModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
252 {
253   if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc\n";return 1;}
254   
255   Handle(TObj_Model) aModel = getModelByName(argv[1]);
256   if ( aModel.IsNull() ) return 1;
257   aModel->Close();
258
259   return 0;
260 }
261
262 //=======================================================================
263 //function : addObj
264 //purpose  :
265 //=======================================================================
266 static Standard_Integer addObj (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
267 {
268   if (argc < 3) {di<<"Use "<< argv[0] << "DocName ObjName\n";return 1;}
269   Handle(TObj_Model) aModel = getModelByName(argv[1]);
270   if ( aModel.IsNull() ) return 1;
271   Handle(TObjDRAW_Object) tObj =
272     new TObjDRAW_Object( aModel->GetMainPartition()->NewLabel() );
273   if ( tObj.IsNull() )
274   {
275     di << "Error: Object not created\n";
276     return 1;
277   }
278   tObj->SetName( argv[2] );
279   
280   return 0;
281 }
282
283 static Handle(TObjDRAW_Object) getObjByName( const char* modelName, const char* objName )
284 {
285   Handle(TObjDRAW_Object) tObj;
286   Handle(TObj_Model) aModel = getModelByName(modelName);
287   if ( aModel.IsNull() )
288     return tObj;
289   Handle(TCollection_HExtendedString) aName = new TCollection_HExtendedString( objName );
290   Handle(TObj_TNameContainer) aDict;
291   tObj = Handle(TObjDRAW_Object)::DownCast( aModel->FindObject(aName, aDict) );
292   return tObj;
293 }
294
295 //=======================================================================
296 //function : setVal
297 //purpose  :
298 //=======================================================================
299 static Standard_Integer setVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
300 {
301   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 intVal | -r N r1 r2 ... rN\n";return 1;}
302   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
303   if ( tObj.IsNull() )
304   {
305     di << "Error: Object " << argv[2] << " not found\n";
306     return 1;
307   }
308   if ( !strcmp(argv[3],"-r") )
309   {
310     int Nb = Draw::Atoi(argv[4]);
311     Handle(TColStd_HArray1OfReal) rArr = new TColStd_HArray1OfReal(1,Nb);
312     for ( int i = 1; i <= Nb; i++ )
313       rArr->SetValue(i, Draw::Atof(argv[4+i]));
314     tObj->SetRealArr( rArr );
315   }
316   else
317     tObj->SetInt( Draw::Atoi(argv[3] ) ); 
318   
319   return 0;
320 }
321
322 //=======================================================================
323 //function : getVal
324 //purpose  :
325 //=======================================================================
326 static Standard_Integer getVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
327 {
328   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 -i | -r\n";return 1;}
329
330   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
331   if ( tObj.IsNull() )
332   {
333     di << "Error: Object " << argv[2] << " not found\n";
334     return 1;
335   }
336   if ( !strcmp(argv[3],"-i") )
337     di << tObj->GetInt();
338   else
339   {
340     Handle(TColStd_HArray1OfReal) rArr = tObj->GetRealArr();
341     if ( !rArr.IsNull() )
342       for ( int i = 1, n = rArr->Upper(); i <= n; i++ )
343       {
344         if ( i > 1 )
345           di << " ";
346         di << rArr->Value(i);
347       }
348   }
349
350   return 0;
351 }
352
353 //=======================================================================
354 //function : setRef
355 //purpose  :
356 //=======================================================================
357 static Standard_Integer setRef (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
358 {
359   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 ObjName2\n";return 1;}
360
361   Handle(TObjDRAW_Object) tObj1 = getObjByName( argv[1], argv[2] );
362   Handle(TObjDRAW_Object) tObj2 = getObjByName( argv[1], argv[3] );
363   if ( tObj1.IsNull() || tObj2.IsNull() )
364   {
365     di << "Error: Object " << argv[2] << " or object " << argv[3] << " not found\n";
366     return 1;
367   }
368   tObj1->SetRef( tObj2 );
369
370   return 0;
371 }
372
373 //=======================================================================
374 //function : getRef
375 //purpose  :
376 //=======================================================================
377 static Standard_Integer getRef (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
378 {
379   if (argc < 3) {di<<"Use "<< argv[0] << "DocName ObjName\n";return 1;}
380
381   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
382   if ( tObj.IsNull() )
383   {
384     di << "Error: Object " << argv[2] << " not found\n";
385     return 1;
386   }
387   Handle(TObj_Object) aRefObj = tObj->GetRef();
388   if ( aRefObj.IsNull() )
389     return 1;
390   else
391   {
392     TCollection_AsciiString aName;
393     aRefObj->GetName( aName );
394     di << aName.ToCString();
395   }
396   
397   return 0;
398 }
399
400 //=======================================================================
401 //function : addChild
402 //purpose  :
403 //=======================================================================
404 static Standard_Integer addChild (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
405 {
406   if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName childObj\n";return 1;}
407
408   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
409   if ( tObj.IsNull() )
410   {
411     di << "Error: Object " << argv[2] << " not found\n";
412     return 1;
413   }
414   Handle(TObj_Object) chldObj = tObj->AddChild();
415   if ( chldObj.IsNull() )
416   {
417     di << "Error: No child object created\n";
418     return 1;
419   }
420   chldObj->SetName( new TCollection_HExtendedString( argv[3] ) );
421   
422   return 0;
423 }
424
425 //=======================================================================
426 //function : getChildren
427 //purpose  :
428 //=======================================================================
429 static Standard_Integer getChildren (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
430 {
431   if (argc < 3)
432   {
433     di << "Use " << argv[0] << "DocName ObjName [-all]\n";
434     di << "    -all: recurse to list children of all levels\n";
435     return 1;
436   }
437
438   Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
439   if ( tObj.IsNull() )
440   {
441     di << "Error: Object " << argv[2] << " not found\n";
442     return 1;
443   }
444
445   bool aGetSubs = (argc > 3 && ! strcasecmp (argv[3], "-all")); 
446   Handle(TObj_ObjectIterator) anItr = aGetSubs ?
447     new TObj_OcafObjectIterator(tObj->GetChildLabel(), NULL, Standard_True, Standard_True) :
448     tObj->GetChildren();
449
450   int i = 0;
451   for ( ; anItr->More(); anItr->Next(), i++ )
452   {
453     Handle(TObj_Object) anObj = anItr->Value();
454     TCollection_AsciiString aName;
455     anObj->GetName( aName );
456     if ( i > 0 )
457       di << " ";
458     di << aName.ToCString();
459   }
460   
461   return 0;
462 }
463
464 //=======================================================================
465 //function : hasModifications
466 //purpose  :
467 //=======================================================================
468 static Standard_Integer hasModifications(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
469 {
470   if (argc < 3) 
471   { 
472     di << "Use " << argv[0] << "DocName ObjName\n";
473     return 1; 
474   }
475
476   Handle(TObjDRAW_Object) tObj = getObjByName(argv[1], argv[2]);
477   if (tObj.IsNull())
478   {
479     di << "Error: Object " << argv[2] << " not found\n";
480     return 1;
481   }
482   di << "Status modifications : " << (tObj->HasModifications() ? 1 : 0) << "\n";
483   
484   return 0;
485 }
486 //=======================================================================
487 //function : Init
488 //purpose  :
489 //=======================================================================
490
491 void TObjDRAW::Init(Draw_Interpretor& di)
492 {
493   static Standard_Boolean initactor = Standard_False;
494   if (initactor)
495   {
496     return;
497   }
498   initactor = Standard_True;
499
500   //=====================================
501   // General commands
502   //=====================================
503
504   Standard_CString g = "TObj general commands";
505
506   di.Add ("TObjNew","DocName \t: Create new TObj model with document named DocName",
507                    __FILE__, newModel, g);
508
509   di.Add ("TObjSave","DocName [Path] \t: Save Model with DocName",
510                    __FILE__, saveModel, g);
511
512   di.Add ("TObjLoad","DocName Path \t: Load model DocName from file Path",
513                    __FILE__, loadModel, g);
514
515   di.Add ("TObjClose","DocName\t: Close model DocName",
516                    __FILE__, closeModel, g);
517
518   di.Add ("TObjAddObj","DocName ObjName \t: Add object to model document",
519                    __FILE__, addObj, g);
520
521   di.Add ("TObjSetVal","DocName ObjName1 intVal | -r N r1 r2 ... rN \t: Set one integer or set of real values",
522                    __FILE__, setVal, g);
523
524   di.Add ("TObjGetVal","DocName ObjName1 -i | -r \t: Returns one integer or set of real values",
525                    __FILE__, getVal, g);
526
527   di.Add ("TObjSetRef","DocName ObjName1 ObjName2 \t: Set reference from object1 to object2",
528                    __FILE__, setRef, g);
529
530   di.Add ("TObjGetRef","DocName ObjName \t: Returns list of children objects",
531                    __FILE__, getRef, g);
532   
533   di.Add ("TObjAddChild","DocName ObjName chldName \t: Add child object to indicated object",
534                    __FILE__, addChild, g);
535   
536   di.Add ("TObjGetChildren","DocName ObjName [-all]\t: Returns list of children objects (-all to recurse)",
537                    __FILE__, getChildren, g);
538   
539   di.Add("TObjHasModifications", "DocName ObjName \t: Returns status of modification of the object (if object has been modified 1, otherwise 0)", __FILE__, hasModifications, g);
540  
541 }
542
543
544 //==============================================================================
545 // TObjDRAW::Factory
546
547 //==============================================================================
548 void TObjDRAW::Factory(Draw_Interpretor& theDI)
549 {
550   // Initialize TObj OCAF formats
551   Handle(TDocStd_Application) anApp = TObj_Application::GetInstance();//DDocStd::GetApplication();
552   BinTObjDrivers::DefineFormat(anApp);
553   XmlTObjDrivers::DefineFormat(anApp);
554
555   // define formats for TObj specific application
556   BinTObjDrivers::DefineFormat(anApp);
557   XmlTObjDrivers::DefineFormat(anApp);
558
559   TObjDRAW::Init(theDI);
560
561 #ifdef OCCT_DEBUG
562       theDI << "Draw Plugin : All TKTObjDRAW commands are loaded\n";
563 #endif
564 }
565
566 // Declare entry point PLUGINFACTORY
567 DPLUGIN(TObjDRAW)