]> SALOME platform Git repositories - modules/shaper.git/blob - src/Model/Model_Document.cxx
Salome HOME
Remove Boost shared_ptr, use std instead
[modules/shaper.git] / src / Model / Model_Document.cxx
1 // File:        Model_Document.cxx
2 // Created:     28 Feb 2014
3 // Author:      Mikhail PONIKAROV
4
5 #include <Model_Document.h>
6 #include <Model_Feature.h>
7
8 #include <TDataStd_Integer.hxx>
9
10 static const int UNDO_LIMIT = 10; // number of possible undo operations
11
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)
15
16 using namespace std;
17
18 bool Model_Document::Load(const char* theFileName)
19 {
20   bool myIsError = Standard_False;
21   /*
22    TCollection_ExtendedString aPath ((const Standard_CString)theFileName);
23    PCDM_ReaderStatus aStatus = (PCDM_ReaderStatus) -1;
24    try
25    {
26    Handle(TDocStd_Document) aDoc = this;
27    aStatus = Model_Application::GetApplication()->Open(aPath, aDoc);
28    }
29    catch (Standard_Failure)
30    {}
31    myIsError = aStatus != PCDM_RS_OK;
32    if (myIsError)
33    {
34    switch (aStatus)
35    {
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;
52    }
53    }
54    SetUndoLimit(UNDO_LIMIT);
55    */
56   return !myIsError;
57 }
58
59 bool Model_Document::Save(const char* theFileName)
60 {
61   bool myIsError = true;
62   /*
63    TCollection_ExtendedString aPath ((const Standard_CString)theFileName);
64    PCDM_StoreStatus aStatus;
65    try {
66    Handle(TDocStd_Document) aDoc = this;
67    aStatus = Model_Application::GetApplication()->SaveAs (aDoc, aPath);
68    }
69    catch (Standard_Failure) {
70    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
71    cout<<"OCAFApp_Engine:save Error: "<<aFail->GetMessageString()<<endl;
72    return false;
73    }
74    myIsError = aStatus != PCDM_SS_OK;
75    if (myIsError)
76    {
77    switch (aStatus)
78    {
79    case PCDM_SS_DriverFailure:
80    cout<<"OCAFApp_Appl_SDriverFailure"<<endl;
81    break;
82    case PCDM_SS_WriteFailure:
83    cout<<"OCAFApp_Appl_SWriteFailure"<<endl;
84    break;
85    case PCDM_SS_Failure:
86    default:
87    cout<<"OCAFApp_Appl_SUnknownFailure"<<endl;
88    break;
89    }
90    }
91    myTransactionsAfterSave = 0;
92    Standard::Purge(); // Release free memory
93    */
94   return !myIsError;
95 }
96
97 void Model_Document::Close()
98 {
99   myDoc->Close();
100 }
101
102 void Model_Document::StartOperation()
103 {
104   myDoc->NewCommand();
105 }
106
107 void Model_Document::FinishOperation()
108 {
109   myDoc->CommitCommand();
110   myTransactionsAfterSave++;
111 }
112
113 void Model_Document::AbortOperation()
114 {
115   myDoc->AbortCommand();
116 }
117
118 bool Model_Document::IsOperation()
119 {
120   return myDoc->HasOpenCommand() == Standard_True ;
121 }
122
123 bool Model_Document::IsModified()
124 {
125   return myTransactionsAfterSave != 0;
126 }
127
128 bool Model_Document::CanUndo()
129 {
130   return myDoc->GetAvailableUndos() > 0;
131 }
132
133 void Model_Document::Undo()
134 {
135   myDoc->Undo();
136   myTransactionsAfterSave--;
137 }
138
139 bool Model_Document::CanRedo()
140 {
141   return myDoc->GetAvailableRedos() > 0;
142 }
143
144 void Model_Document::Redo()
145 {
146   myDoc->Redo();
147   myTransactionsAfterSave++;
148 }
149
150 void Model_Document::AddObject(
151   std::shared_ptr<ModelAPI_Feature> theFeature, const int theGroupID)
152 {
153   std::shared_ptr<Model_Feature> aModelFeature = 
154     std::dynamic_pointer_cast<Model_Feature>(theFeature);
155   if (aModelFeature) {
156     TDF_Label aGroupLab = myDoc->Main().FindChild(TAG_OBJECTS).FindChild(theGroupID + 1);
157     TDF_Label anObjLab = aGroupLab.NewChild();
158     aModelFeature->setLabel(anObjLab);
159   }
160 }
161
162 Model_Document::Model_Document()
163     : myDoc(new TDocStd_Document("BinOcaf")) // binary OCAF format
164 {
165   myDoc->SetUndoLimit(UNDO_LIMIT);
166   myTransactionsAfterSave = 0;
167 }
168
169 Model_Document::~Model_Document()
170 {
171 }