1 // Created on: 2008-06-07
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2008-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
17 #include <DDocStd.hxx>
18 #include <DDocStd_DrawDocument.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>
38 #include <BinTObjDrivers.hxx>
39 #include <XmlTObjDrivers.hxx>
43 //=======================================================================
44 // Section: General commands
45 //=======================================================================
48 //! simple model with redefined pure virtual method
49 class TObjDRAW_Model : public TObj_Model
52 Standard_EXPORT TObjDRAW_Model()
55 virtual Standard_EXPORT Handle(TObj_Model) NewEmpty() Standard_OVERRIDE
57 return new TObjDRAW_Model();
62 DEFINE_STANDARD_RTTI_INLINE(TObjDRAW_Model,TObj_Model)
65 DEFINE_STANDARD_HANDLE (TObjDRAW_Model,TObj_Model)
69 //! simple object to check API and features of TObj_Object
70 class TObjDRAW_Object : public TObj_Object
73 //! enumeration for the ranks of label under Data section.
76 DataTag_First = TObj_Object::DataTag_Last,
79 DataTag_Last = DataTag_First + 100
82 // enumeration for the ranks of label under Reference section.
85 RefTag_First = TObj_Object::RefTag_Last,
86 RefTag_Other, //!< here we test only one refrence to other
87 RefTag_Last = RefTag_First + 100
90 //! enumeration for the ranks of label under Children section.
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
99 Standard_EXPORT TObjDRAW_Object(const TDF_Label& theLab)
100 : TObj_Object( theLab ) {}
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 ); }
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 ); }
116 //! set reference to other object
117 Standard_EXPORT void SetRef( const Handle(TObj_Object)& theOther )
118 { setReference( theOther, RefTag_Other ); }
120 Standard_EXPORT Handle(TObj_Object) GetRef() const
121 { return getReference( RefTag_Other ); }
124 Standard_EXPORT Handle(TObj_Object) AddChild()
126 TDF_Label aChL = getChildLabel( ChildTag_Child ).NewChild();
127 return new TObjDRAW_Object( aChL );
131 // Persistence of TObj object
132 DECLARE_TOBJOCAF_PERSISTENCE(TObjDRAW_Object,TObj_Object)
135 // Declaration of CASCADE RTTI
136 DEFINE_STANDARD_RTTI_INLINE(TObjDRAW_Object,TObj_Object)
140 // Definition of HANDLE object using Standard_DefineHandle.hxx
141 DEFINE_STANDARD_HANDLE (TObjDRAW_Object,TObj_Object)
144 IMPLEMENT_TOBJOCAF_PERSISTENCE(TObjDRAW_Object)
146 //=======================================================================
147 //function : newModel
149 //=======================================================================
150 static Standard_Integer newModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
152 if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc\n";return 1;}
154 Handle(TDocStd_Document) D;
155 Handle(DDocStd_DrawDocument) DD;
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
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";
167 else di << argv[1] << " is already a document\n";
172 static Handle(TObj_Model) getModelByName( const char* theName )
174 Handle(TObj_Model) aModel;
175 Handle(TDocStd_Document) D;
176 if (!DDocStd::GetDocument(theName,D)) return aModel;
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();
185 //=======================================================================
186 //function : saveModel
188 //=======================================================================
189 static Standard_Integer saveModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
191 if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc [fileName]\n";return 1;}
193 Handle(TObj_Model) aModel = getModelByName(argv[1]);
194 if ( aModel.IsNull() ) return 1;
195 Standard_Boolean isSaved = Standard_False;
197 isSaved = aModel->SaveAs( TCollection_ExtendedString (argv[2], Standard_True) );
199 isSaved = aModel->Save();
202 di << "Error: Document not saved\n";
208 //=======================================================================
209 //function : loadModel
211 //=======================================================================
212 static Standard_Integer loadModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
214 if (argc < 3) {di<<"Use "<< argv[0] << "nameDoc fileName\n";return 1;}
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() )
222 aModel = new TObjDRAW_Model();
223 isLoaded = aModel->Load(aPath);
226 Handle(TDocStd_Document) D = aModel->GetDocument();
227 Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(D);
229 TDataStd_Name::Set(D->GetData()->Root(),argv[1]);
230 Draw::Set(argv[1],DD);
235 isLoaded = aModel->Load(aPath);
240 di << "Error: Document not loaded\n";
247 //=======================================================================
248 //function : closeModel
250 //=======================================================================
251 static Standard_Integer closeModel (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
253 if (argc < 2) {di<<"Use "<< argv[0] << "nameDoc\n";return 1;}
255 Handle(TObj_Model) aModel = getModelByName(argv[1]);
256 if ( aModel.IsNull() ) return 1;
262 //=======================================================================
265 //=======================================================================
266 static Standard_Integer addObj (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
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() );
275 di << "Error: Object not created\n";
278 tObj->SetName( argv[2] );
283 static Handle(TObjDRAW_Object) getObjByName( const char* modelName, const char* objName )
285 Handle(TObjDRAW_Object) tObj;
286 Handle(TObj_Model) aModel = getModelByName(modelName);
287 if ( aModel.IsNull() )
289 Handle(TCollection_HExtendedString) aName = new TCollection_HExtendedString( objName );
290 Handle(TObj_TNameContainer) aDict;
291 tObj = Handle(TObjDRAW_Object)::DownCast( aModel->FindObject(aName, aDict) );
295 //=======================================================================
298 //=======================================================================
299 static Standard_Integer setVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
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] );
305 di << "Error: Object " << argv[2] << " not found\n";
308 if ( !strcmp(argv[3],"-r") )
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 );
317 tObj->SetInt( Draw::Atoi(argv[3] ) );
322 //=======================================================================
325 //=======================================================================
326 static Standard_Integer getVal (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
328 if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 -i | -r\n";return 1;}
330 Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
333 di << "Error: Object " << argv[2] << " not found\n";
336 if ( !strcmp(argv[3],"-i") )
337 di << tObj->GetInt();
340 Handle(TColStd_HArray1OfReal) rArr = tObj->GetRealArr();
341 if ( !rArr.IsNull() )
342 for ( int i = 1, n = rArr->Upper(); i <= n; i++ )
346 di << rArr->Value(i);
353 //=======================================================================
356 //=======================================================================
357 static Standard_Integer setRef (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
359 if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName1 ObjName2\n";return 1;}
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() )
365 di << "Error: Object " << argv[2] << " or object " << argv[3] << " not found\n";
368 tObj1->SetRef( tObj2 );
373 //=======================================================================
376 //=======================================================================
377 static Standard_Integer getRef (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
379 if (argc < 3) {di<<"Use "<< argv[0] << "DocName ObjName\n";return 1;}
381 Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
384 di << "Error: Object " << argv[2] << " not found\n";
387 Handle(TObj_Object) aRefObj = tObj->GetRef();
388 if ( aRefObj.IsNull() )
392 TCollection_AsciiString aName;
393 aRefObj->GetName( aName );
394 di << aName.ToCString();
400 //=======================================================================
401 //function : addChild
403 //=======================================================================
404 static Standard_Integer addChild (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
406 if (argc < 4) {di<<"Use "<< argv[0] << "DocName ObjName childObj\n";return 1;}
408 Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
411 di << "Error: Object " << argv[2] << " not found\n";
414 Handle(TObj_Object) chldObj = tObj->AddChild();
415 if ( chldObj.IsNull() )
417 di << "Error: No child object created\n";
420 chldObj->SetName( new TCollection_HExtendedString( argv[3] ) );
425 //=======================================================================
426 //function : getChildren
428 //=======================================================================
429 static Standard_Integer getChildren (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
433 di << "Use " << argv[0] << "DocName ObjName [-all]\n";
434 di << " -all: recurse to list children of all levels\n";
438 Handle(TObjDRAW_Object) tObj = getObjByName( argv[1], argv[2] );
441 di << "Error: Object " << argv[2] << " not found\n";
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) :
451 for ( ; anItr->More(); anItr->Next(), i++ )
453 Handle(TObj_Object) anObj = anItr->Value();
454 TCollection_AsciiString aName;
455 anObj->GetName( aName );
458 di << aName.ToCString();
464 //=======================================================================
465 //function : hasModifications
467 //=======================================================================
468 static Standard_Integer hasModifications(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
472 di << "Use " << argv[0] << "DocName ObjName\n";
476 Handle(TObjDRAW_Object) tObj = getObjByName(argv[1], argv[2]);
479 di << "Error: Object " << argv[2] << " not found\n";
482 di << "Status modifications : " << (tObj->HasModifications() ? 1 : 0) << "\n";
486 //=======================================================================
489 //=======================================================================
491 void TObjDRAW::Init(Draw_Interpretor& di)
493 static Standard_Boolean initactor = Standard_False;
498 initactor = Standard_True;
500 //=====================================
502 //=====================================
504 Standard_CString g = "TObj general commands";
506 di.Add ("TObjNew","DocName \t: Create new TObj model with document named DocName",
507 __FILE__, newModel, g);
509 di.Add ("TObjSave","DocName [Path] \t: Save Model with DocName",
510 __FILE__, saveModel, g);
512 di.Add ("TObjLoad","DocName Path \t: Load model DocName from file Path",
513 __FILE__, loadModel, g);
515 di.Add ("TObjClose","DocName\t: Close model DocName",
516 __FILE__, closeModel, g);
518 di.Add ("TObjAddObj","DocName ObjName \t: Add object to model document",
519 __FILE__, addObj, g);
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);
524 di.Add ("TObjGetVal","DocName ObjName1 -i | -r \t: Returns one integer or set of real values",
525 __FILE__, getVal, g);
527 di.Add ("TObjSetRef","DocName ObjName1 ObjName2 \t: Set reference from object1 to object2",
528 __FILE__, setRef, g);
530 di.Add ("TObjGetRef","DocName ObjName \t: Returns list of children objects",
531 __FILE__, getRef, g);
533 di.Add ("TObjAddChild","DocName ObjName chldName \t: Add child object to indicated object",
534 __FILE__, addChild, g);
536 di.Add ("TObjGetChildren","DocName ObjName [-all]\t: Returns list of children objects (-all to recurse)",
537 __FILE__, getChildren, g);
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);
544 //==============================================================================
547 //==============================================================================
548 void TObjDRAW::Factory(Draw_Interpretor& theDI)
550 // Initialize TObj OCAF formats
551 Handle(TDocStd_Application) anApp = TObj_Application::GetInstance();//DDocStd::GetApplication();
552 BinTObjDrivers::DefineFormat(anApp);
553 XmlTObjDrivers::DefineFormat(anApp);
555 // define formats for TObj specific application
556 BinTObjDrivers::DefineFormat(anApp);
557 XmlTObjDrivers::DefineFormat(anApp);
559 TObjDRAW::Init(theDI);
562 theDI << "Draw Plugin : All TKTObjDRAW commands are loaded\n";
566 // Declare entry point PLUGINFACTORY