1 // File: Model_Document.cxx
2 // Created: 28 Feb 2014
3 // Author: Mikhail PONIKAROV
5 #include <Model_Document.h>
6 #include <Model_Feature.h>
8 #include <TDataStd_Integer.hxx>
10 static const int UNDO_LIMIT = 10; // number of possible undo operations
12 static const int TAG_GENERAL = 1; // general properties tag
13 static const int TAG_OBJECTS = 2; // tag of the objects sub-tree (Root for Model_ObjectsMgr)
14 static const int TAG_HISTORY = 3; // tag of the history sub-tree (Root for Model_History)
18 bool Model_Document::Load(const char* theFileName)
20 bool myIsError = Standard_False;
22 TCollection_ExtendedString aPath ((const Standard_CString)theFileName);
23 PCDM_ReaderStatus aStatus = (PCDM_ReaderStatus) -1;
26 Handle(TDocStd_Document) aDoc = this;
27 aStatus = Model_Application::GetApplication()->Open(aPath, aDoc);
29 catch (Standard_Failure)
31 myIsError = aStatus != PCDM_RS_OK;
36 case PCDM_RS_UnknownDocument: cout<<"OCAFApp_Appl_RUnknownDocument"<<endl; break;
37 case PCDM_RS_AlreadyRetrieved: cout<<"OCAFApp_Appl_RAlreadyRetrieved"<<endl; break;
38 case PCDM_RS_AlreadyRetrievedAndModified: cout<<"OCAFApp_Appl_RAlreadyRetrievedAndModified"<<endl; break;
39 case PCDM_RS_NoDriver: cout<<"OCAFApp_Appl_RNoDriver"<<endl; break;
40 case PCDM_RS_UnknownFileDriver: cout<<"OCAFApp_Appl_RNoDriver"<<endl; break;
41 case PCDM_RS_OpenError: cout<<"OCAFApp_Appl_ROpenError"<<endl; break;
42 case PCDM_RS_NoVersion: cout<<"OCAFApp_Appl_RNoVersion"<<endl; break;
43 case PCDM_RS_NoModel: cout<<"OCAFApp_Appl_RNoModel"<<endl; break;
44 case PCDM_RS_NoDocument: cout<<"OCAFApp_Appl_RNoDocument"<<endl; break;
45 case PCDM_RS_FormatFailure: cout<<"OCAFApp_Appl_RFormatFailure"<<endl; break;
46 case PCDM_RS_TypeNotFoundInSchema: cout<<"OCAFApp_Appl_RTypeNotFound"<<endl; break;
47 case PCDM_RS_UnrecognizedFileFormat: cout<<"OCAFApp_Appl_RBadFileFormat"<<endl; break;
48 case PCDM_RS_MakeFailure: cout<<"OCAFApp_Appl_RMakeFailure"<<endl; break;
49 case PCDM_RS_PermissionDenied: cout<<"OCAFApp_Appl_RPermissionDenied"<<endl; break;
50 case PCDM_RS_DriverFailure: cout<<"OCAFApp_Appl_RDriverFailure"<<endl; break;
51 default: cout<<"OCAFApp_Appl_RUnknownFail"<<endl; break;
54 SetUndoLimit(UNDO_LIMIT);
59 bool Model_Document::Save(const char* theFileName)
61 bool myIsError = true;
63 TCollection_ExtendedString aPath ((const Standard_CString)theFileName);
64 PCDM_StoreStatus aStatus;
66 Handle(TDocStd_Document) aDoc = this;
67 aStatus = Model_Application::GetApplication()->SaveAs (aDoc, aPath);
69 catch (Standard_Failure) {
70 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
71 cout<<"OCAFApp_Engine:save Error: "<<aFail->GetMessageString()<<endl;
74 myIsError = aStatus != PCDM_SS_OK;
79 case PCDM_SS_DriverFailure:
80 cout<<"OCAFApp_Appl_SDriverFailure"<<endl;
82 case PCDM_SS_WriteFailure:
83 cout<<"OCAFApp_Appl_SWriteFailure"<<endl;
87 cout<<"OCAFApp_Appl_SUnknownFailure"<<endl;
91 myTransactionsAfterSave = 0;
92 Standard::Purge(); // Release free memory
97 void Model_Document::Close()
102 void Model_Document::StartOperation()
107 void Model_Document::FinishOperation()
109 myDoc->CommitCommand();
110 myTransactionsAfterSave++;
113 void Model_Document::AbortOperation()
115 myDoc->AbortCommand();
118 bool Model_Document::IsOperation()
120 return myDoc->HasOpenCommand() == Standard_True ;
123 bool Model_Document::IsModified()
125 return myTransactionsAfterSave != 0;
128 bool Model_Document::CanUndo()
130 return myDoc->GetAvailableUndos() > 0;
133 void Model_Document::Undo()
136 myTransactionsAfterSave--;
139 bool Model_Document::CanRedo()
141 return myDoc->GetAvailableRedos() > 0;
144 void Model_Document::Redo()
147 myTransactionsAfterSave++;
150 void Model_Document::AddObject(
151 std::shared_ptr<ModelAPI_Feature> theFeature, const int theGroupID)
153 std::shared_ptr<Model_Feature> aModelFeature =
154 std::dynamic_pointer_cast<Model_Feature>(theFeature);
156 TDF_Label aGroupLab = myDoc->Main().FindChild(TAG_OBJECTS).FindChild(theGroupID + 1);
157 TDF_Label anObjLab = aGroupLab.NewChild();
158 aModelFeature->setLabel(anObjLab);
162 Model_Document::Model_Document()
163 : myDoc(new TDocStd_Document("BinOcaf")) // binary OCAF format
165 myDoc->SetUndoLimit(UNDO_LIMIT);
166 myTransactionsAfterSave = 0;
169 Model_Document::~Model_Document()