]> SALOME platform Git repositories - modules/shaper.git/blob - src/Model/Model_Document.cxx
Salome HOME
Connection of the feature to the document
[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 IMPLEMENT_STANDARD_HANDLE(Model_Document, MMgt_TShared)
11 IMPLEMENT_STANDARD_RTTIEXT(Model_Document, MMgt_TShared)
12
13 static const int UNDO_LIMIT = 10; // number of possible undo operations
14
15 static const int TAG_GENERAL = 1; // general properties tag
16 static const int TAG_OBJECTS = 2; // tag of the objects sub-tree (Root for Model_ObjectsMgr)
17 static const int TAG_HISTORY = 3; // tag of the history sub-tree (Root for Model_History)
18
19 using namespace std;
20
21 bool Model_Document::Load(const char* theFileName)
22 {
23   bool myIsError = Standard_False;
24   /*
25    TCollection_ExtendedString aPath ((const Standard_CString)theFileName);
26    PCDM_ReaderStatus aStatus = (PCDM_ReaderStatus) -1;
27    try
28    {
29    Handle(TDocStd_Document) aDoc = this;
30    aStatus = Model_Application::GetApplication()->Open(aPath, aDoc);
31    }
32    catch (Standard_Failure)
33    {}
34    myIsError = aStatus != PCDM_RS_OK;
35    if (myIsError)
36    {
37    switch (aStatus)
38    {
39    case PCDM_RS_UnknownDocument: cout<<"OCAFApp_Appl_RUnknownDocument"<<endl; break;
40    case PCDM_RS_AlreadyRetrieved: cout<<"OCAFApp_Appl_RAlreadyRetrieved"<<endl; break;
41    case PCDM_RS_AlreadyRetrievedAndModified: cout<<"OCAFApp_Appl_RAlreadyRetrievedAndModified"<<endl; break;
42    case PCDM_RS_NoDriver: cout<<"OCAFApp_Appl_RNoDriver"<<endl; break;
43    case PCDM_RS_UnknownFileDriver: cout<<"OCAFApp_Appl_RNoDriver"<<endl; break;
44    case PCDM_RS_OpenError: cout<<"OCAFApp_Appl_ROpenError"<<endl; break;
45    case PCDM_RS_NoVersion: cout<<"OCAFApp_Appl_RNoVersion"<<endl; break;
46    case PCDM_RS_NoModel: cout<<"OCAFApp_Appl_RNoModel"<<endl; break;
47    case PCDM_RS_NoDocument: cout<<"OCAFApp_Appl_RNoDocument"<<endl; break;
48    case PCDM_RS_FormatFailure: cout<<"OCAFApp_Appl_RFormatFailure"<<endl; break;
49    case PCDM_RS_TypeNotFoundInSchema: cout<<"OCAFApp_Appl_RTypeNotFound"<<endl; break;
50    case PCDM_RS_UnrecognizedFileFormat: cout<<"OCAFApp_Appl_RBadFileFormat"<<endl; break;
51    case PCDM_RS_MakeFailure: cout<<"OCAFApp_Appl_RMakeFailure"<<endl; break;
52    case PCDM_RS_PermissionDenied: cout<<"OCAFApp_Appl_RPermissionDenied"<<endl; break;
53    case PCDM_RS_DriverFailure: cout<<"OCAFApp_Appl_RDriverFailure"<<endl; break;
54    default: cout<<"OCAFApp_Appl_RUnknownFail"<<endl; break;
55    }
56    }
57    SetUndoLimit(UNDO_LIMIT);
58    */
59   return !myIsError;
60 }
61
62 bool Model_Document::Save(const char* theFileName)
63 {
64   bool myIsError = true;
65   /*
66    TCollection_ExtendedString aPath ((const Standard_CString)theFileName);
67    PCDM_StoreStatus aStatus;
68    try {
69    Handle(TDocStd_Document) aDoc = this;
70    aStatus = Model_Application::GetApplication()->SaveAs (aDoc, aPath);
71    }
72    catch (Standard_Failure) {
73    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
74    cout<<"OCAFApp_Engine:save Error: "<<aFail->GetMessageString()<<endl;
75    return false;
76    }
77    myIsError = aStatus != PCDM_SS_OK;
78    if (myIsError)
79    {
80    switch (aStatus)
81    {
82    case PCDM_SS_DriverFailure:
83    cout<<"OCAFApp_Appl_SDriverFailure"<<endl;
84    break;
85    case PCDM_SS_WriteFailure:
86    cout<<"OCAFApp_Appl_SWriteFailure"<<endl;
87    break;
88    case PCDM_SS_Failure:
89    default:
90    cout<<"OCAFApp_Appl_SUnknownFailure"<<endl;
91    break;
92    }
93    }
94    myTransactionsAfterSave = 0;
95    Standard::Purge(); // Release free memory
96    */
97   return !myIsError;
98 }
99
100 void Model_Document::Close()
101 {
102   TDocStd_Document::Close();
103 }
104
105 void Model_Document::StartOperation()
106 {
107   TDocStd_Document::NewCommand();
108 }
109
110 void Model_Document::FinishOperation()
111 {
112   TDocStd_Document::CommitCommand();
113   myTransactionsAfterSave++;
114 }
115
116 void Model_Document::AbortOperation()
117 {
118   TDocStd_Document::AbortCommand();
119 }
120
121 bool Model_Document::IsOperation()
122 {
123   return TDocStd_Document::HasOpenCommand() == Standard_True ;
124 }
125
126 bool Model_Document::IsModified()
127 {
128   return myTransactionsAfterSave != 0;
129 }
130
131 bool Model_Document::CanUndo()
132 {
133   return TDocStd_Document::GetAvailableUndos() > 0;
134 }
135
136 void Model_Document::Undo()
137 {
138   TDocStd_Document::Undo();
139   myTransactionsAfterSave--;
140 }
141
142 bool Model_Document::CanRedo()
143 {
144   return TDocStd_Document::GetAvailableRedos() > 0;
145 }
146
147 void Model_Document::Redo()
148 {
149   TDocStd_Document::Redo();
150   myTransactionsAfterSave++;
151 }
152
153 void Model_Document::AddObject(
154   boost::shared_ptr<ModelAPI_Feature> theFeature, const int theGroupID)
155 {
156   boost::shared_ptr<Model_Feature> aModelFeature = 
157     boost::dynamic_pointer_cast<Model_Feature>(theFeature);
158   if (aModelFeature) {
159     TDF_Label aGroupLab = Main().FindChild(TAG_OBJECTS).FindChild(theGroupID + 1);
160     TDF_Label anObjLab = aGroupLab.NewChild();
161     aModelFeature->setLabel(anObjLab);
162   }
163 }
164
165 Model_Document::Model_Document(const TCollection_ExtendedString& theStorageFormat)
166     : TDocStd_Document(theStorageFormat)
167 {
168   SetUndoLimit(UNDO_LIMIT);
169   myTransactionsAfterSave = 0;
170 }
171
172 Model_Document::~Model_Document()
173 {
174 }