Salome HOME
merge from branch BR_V5_DEV
[modules/kernel.git] / src / SALOMEDSImpl / SALOMEDSImpl_IParameters.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 #include "SALOMEDSImpl_IParameters.hxx"
23 #include <utilities.h>
24
25 #include "SALOMEDSImpl_SObject.hxx"
26 #include "SALOMEDSImpl_ChildIterator.hxx"
27
28 using namespace std;
29
30 #define _AP_LISTS_LIST_ "AP_LISTS_LIST"
31 #define _AP_ENTRIES_LIST_ "AP_ENTRIES_LIST"
32 #define _AP_PROPERTIES_LIST_ "AP_PROPERTIES_LIST"
33 #define _AP_DUMP_PYTHON_ "AP_DUMP_PYTHON"
34
35 /*!
36   Constructor
37 */
38 SALOMEDSImpl_IParameters::SALOMEDSImpl_IParameters(SALOMEDSImpl_AttributeParameter* ap)
39 {
40   if(!ap) return;
41   _ap = ap;
42   SALOMEDSImpl_SObject so = _ap->GetSObject();
43   _study = so.GetStudy();
44 }
45
46 SALOMEDSImpl_IParameters::~SALOMEDSImpl_IParameters()
47 {
48   _compNames.clear();
49 }
50
51 int SALOMEDSImpl_IParameters::append(const string& listName, const string& value)
52 {
53   if(!_ap) return -1;
54   vector<string> v;
55   if(!_ap->IsSet(listName, PT_STRARRAY)) {
56     if(!_ap->IsSet(_AP_LISTS_LIST_, PT_STRARRAY)) _ap->SetStrArray(_AP_LISTS_LIST_, v);
57     if(listName != _AP_ENTRIES_LIST_ && 
58        listName != _AP_PROPERTIES_LIST_) {
59       append(_AP_LISTS_LIST_, listName);
60     }
61     _ap->SetStrArray(listName, v);
62   }
63   v = _ap->GetStrArray(listName);
64   v.push_back(value);
65   _ap->SetStrArray(listName, v);
66   return (v.size()-1);
67 }
68
69 int SALOMEDSImpl_IParameters::nbValues(const string& listName)
70 {
71   if(!_ap) return -1;
72   if(!_ap->IsSet(listName, PT_STRARRAY)) return 0;
73   vector<string> v = _ap->GetStrArray(listName);
74   return v.size();
75 }
76
77 vector<string> SALOMEDSImpl_IParameters::getValues(const string& listName)
78 {
79   vector<string> v;
80   if(!_ap) return v;
81   if(!_ap->IsSet(listName, PT_STRARRAY)) return v;
82   return _ap->GetStrArray(listName);
83 }
84
85
86 string SALOMEDSImpl_IParameters::getValue(const string& listName, int index)
87 {
88   if(!_ap) return "";
89   if(!_ap->IsSet(listName, PT_STRARRAY)) return "";
90   vector<string> v = _ap->GetStrArray(listName);
91   if(index >= v.size()) return ""; 
92   return v[index];
93 }
94
95 vector<string> SALOMEDSImpl_IParameters::getLists()
96 {
97   vector<string> v;
98   if(!_ap->IsSet(_AP_LISTS_LIST_, PT_STRARRAY)) return v;
99   return _ap->GetStrArray(_AP_LISTS_LIST_);
100 }
101
102 void SALOMEDSImpl_IParameters::setParameter(const string& entry, const string& parameterName, const string& value)
103 {
104   if(!_ap) return;
105   vector<string> v;
106   if(!_ap->IsSet(entry, PT_STRARRAY)) {
107     append(_AP_ENTRIES_LIST_, entry); //Add the entry to the internal list of entries
108     _ap->SetStrArray(entry, v);
109   }
110   v = _ap->GetStrArray(entry);
111   v.push_back(parameterName);
112   v.push_back(value);
113   _ap->SetStrArray(entry, v);
114 }
115
116
117 string SALOMEDSImpl_IParameters::getParameter(const string& entry, const string& parameterName)
118 {
119   if(!_ap) return "";
120   if(!_ap->IsSet(entry, PT_STRARRAY)) return "";
121   vector<string> v = _ap->GetStrArray(entry);
122   int length = v.size();
123   for(int i = 0; i<length; i+=1) {
124     if(v[i] == parameterName) return v[i+1];
125   }
126   return "";
127 }
128
129
130 vector<string> SALOMEDSImpl_IParameters::getAllParameterNames(const string& entry)
131 {
132   vector<string> v, names;
133   if(!_ap) return v; 
134   if(!_ap->IsSet(entry, PT_STRARRAY)) return v;
135   v = _ap->GetStrArray(entry);
136   int length = v.size();
137   for(int i = 0; i<length; i+=2) {
138     names.push_back(v[i]);
139   }
140   return names;
141 }
142
143 vector<string> SALOMEDSImpl_IParameters::getAllParameterValues(const string& entry)
144 {
145   vector<string> v, values;
146   if(!_ap) return v; 
147   if(!_ap->IsSet(entry, PT_STRARRAY)) return v;
148   v = _ap->GetStrArray(entry);
149   int length = v.size();
150   for(int i = 1; i<length; i+=2) {
151     values.push_back(v[i]);
152   }
153   return values; 
154 }
155
156 int SALOMEDSImpl_IParameters::getNbParameters(const string& entry)
157 {
158   if(!_ap) return -1;
159   if(!_ap->IsSet(entry, PT_STRARRAY)) return -1;
160   return  _ap->GetStrArray(entry).size()/2;
161 }
162
163 vector<string> SALOMEDSImpl_IParameters::getEntries()
164 {
165   vector<string> v;
166   if(!_ap) return v;
167   if(!_ap->IsSet(_AP_ENTRIES_LIST_, PT_STRARRAY)) return v;
168   return _ap->GetStrArray(_AP_ENTRIES_LIST_);
169 }
170
171 void SALOMEDSImpl_IParameters::setProperty(const string& name, const std::string& value)
172 {
173   if(!_ap) return;
174   if(!_ap->IsSet(name, PT_STRING)) {
175     append(_AP_PROPERTIES_LIST_, name); //Add the property to the internal list of properties
176   }
177   _ap->SetString(name, value);
178 }
179
180 string SALOMEDSImpl_IParameters::getProperty(const string& name)
181 {
182   if(!_ap) return "";
183   if(!_ap->IsSet(name, PT_STRING)) return "";
184   return _ap->GetString(name);
185 }
186
187 vector<string> SALOMEDSImpl_IParameters::getProperties()
188 {
189   vector<string> v;
190   if(!_ap) return v;
191   if(!_ap->IsSet(_AP_PROPERTIES_LIST_, PT_STRARRAY)) return v;
192   return _ap->GetStrArray(_AP_PROPERTIES_LIST_);
193 }
194
195 string SALOMEDSImpl_IParameters::decodeEntry(const string& entry)
196 {
197   if(!_study) return entry;
198   int pos = entry.rfind("_");
199   if(pos < 0 || pos >= entry.size()) return entry;
200
201   string compName(entry, 0, pos), compID, tail(entry, pos+1, entry.length()-1);
202   
203   if(_compNames.find(compName) == _compNames.end()) {
204     SALOMEDSImpl_SObject so = _study->FindComponent(compName);
205     if(!so) return entry;
206     compID = so.GetID();
207     _compNames[compName] = compID;
208   }
209   else compID = _compNames[compName];
210  
211   string newEntry(compID);
212   newEntry += (":"+tail);
213   
214   return newEntry;
215 }
216
217
218 bool SALOMEDSImpl_IParameters::isDumpPython(SALOMEDSImpl_Study* study, const string& theID)
219 {
220   string anID;
221   if(theID == "") anID = getDefaultVisualComponent();
222   else anID = theID;
223
224   SALOMEDSImpl_AttributeParameter* ap = study->GetCommonParameters((char*)anID.c_str(), 0);
225   if(!ap) return false;
226   if(!ap->IsSet(_AP_DUMP_PYTHON_, PT_BOOLEAN)) return false;
227   return (bool)ap->GetBool(_AP_DUMP_PYTHON_);
228 }
229
230
231 int SALOMEDSImpl_IParameters::getLastSavePoint(SALOMEDSImpl_Study* study, const string& theID)
232 {
233   string anID;
234   if(theID == "") anID = getDefaultVisualComponent();
235   else anID = theID;
236
237
238   SALOMEDSImpl_SObject so = study->FindComponent(anID);
239   if(!so) return -1;
240
241   SALOMEDSImpl_StudyBuilder* builder = study->NewBuilder();
242   SALOMEDSImpl_ChildIterator anIter = study->NewChildIterator( so );
243   int tag = -1;
244   for(; anIter.More(); anIter.Next())
245   {
246     SALOMEDSImpl_SObject val( anIter.Value() );
247     DF_Attribute* genAttr;
248     if(builder->FindAttribute(val, genAttr, "AttributeParameter")) tag = val.Tag();
249   }
250
251   return tag;
252 }
253
254
255
256 string SALOMEDSImpl_IParameters::getStudyScript(SALOMEDSImpl_Study* study, int savePoint, const std::string& theID)
257 {
258   string anID;
259   if(theID == "") anID = getDefaultVisualComponent();
260   else anID = theID;
261
262   SALOMEDSImpl_AttributeParameter* ap = study->GetCommonParameters((char*)anID.c_str(), savePoint);
263   SALOMEDSImpl_IParameters ip(ap);
264
265   string dump("");
266
267   dump += "import iparameters\n";
268   dump += "ipar = iparameters.IParameters(salome.myStudy.GetCommonParameters(\""+anID+"\", 1))\n\n";
269   
270   
271   vector<string> v = ip.getProperties();
272   if(v.size() > 0) {
273     dump += "#Set up visual properties:\n";
274     for(int i = 0; i<v.size(); i++) {
275       string prp = ip.getProperty(v[i]);
276       dump += "ipar.setProperty(\""+v[i]+"\", \""+prp+"\")\n";
277     }
278   }
279
280   v = ip.getLists();
281   if(v.size() > 0) {
282     dump += "#Set up lists:\n";
283     for(int i = 0; i<v.size(); i++) {
284       vector<string> lst = ip.getValues(v[i]);
285       dump += "# fill list "+v[i]+"\n";
286       for(int j = 0; j < lst.size(); j++) {
287         printf("### %s \nFind : %i\n",lst[j].c_str(), lst[j].find('\"'));
288         if (lst[j].find('\"') == -1)
289           dump += "ipar.append(\""+v[i]+"\", \""+lst[j]+"\")\n";
290         else
291           dump += "ipar.append(\""+v[i]+"\", \"\"\""+lst[j]+"\"\"\")\n";
292       }
293     }
294   }
295
296   return dump;
297 }
298
299 string SALOMEDSImpl_IParameters::getDefaultScript(SALOMEDSImpl_Study* study, 
300                                                   const string& moduleName, 
301                                                   const string& shift, 
302                                                   const string& theID)
303 {
304   string anID;
305   if(theID == "") anID = getDefaultVisualComponent();
306   else anID = theID;
307
308   string dump("");
309
310   int savePoint = SALOMEDSImpl_IParameters::getLastSavePoint(study, anID);
311   if(savePoint < 0) return dump;
312   SALOMEDSImpl_IParameters ip = SALOMEDSImpl_IParameters(study->GetCommonParameters(anID.c_str(), savePoint));
313   if(!isDumpPython(study)) return dump;
314
315   SALOMEDSImpl_AttributeParameter* ap = study->GetModuleParameters(anID.c_str(), moduleName.c_str(), savePoint);
316   ip = SALOMEDSImpl_IParameters(ap);
317
318
319   dump += shift +"import iparameters\n";
320   dump += shift + "ipar = iparameters.IParameters(theStudy.GetModuleParameters(\""+anID+"\", \""+moduleName+"\", 1))\n\n";
321   
322   vector<string> v = ip.getProperties();
323   if(v.size() > 0) {
324     dump += shift +"#Set up visual properties:\n";
325     for(int i = 0; i<v.size(); i++) {
326       string prp = ip.getProperty(v[i]);
327       dump += shift +"ipar.setProperty(\""+v[i]+"\", \""+prp+"\")\n";
328     }
329   }
330
331   v = ip.getLists();
332   if(v.size() > 0) {
333     dump +=  shift +"#Set up lists:\n";
334     for(int i = 0; i<v.size(); i++) {
335       vector<string> lst = ip.getValues(v[i]);
336       dump += shift +"# fill list "+v[i]+"\n";
337       for(int j = 0; j < lst.size(); j++)
338         dump += shift +"ipar.append(\""+v[i]+"\", \""+lst[j]+"\")\n";
339     }
340   }
341
342   v = ip.getEntries();
343   if(v.size() > 0) {
344     dump += shift + "#Set up entries:\n";
345     for(int i = 0; i<v.size(); i++) {
346       vector<string> names = ip.getAllParameterNames(v[i]);
347       vector<string> values = ip.getAllParameterValues(v[i]);
348       string decodedEntry = ip.decodeEntry(v[i]);
349       SALOMEDSImpl_SObject so = study->FindObjectID(decodedEntry);
350       string so_name("");
351       if(so) so_name = so.GetName();
352       dump += shift + "# set up entry " + v[i] +" ("+so_name+")" + " parameters" + "\n";
353       for(int j = 0; j < names.size() && j < values.size(); j++)
354         dump += shift + "ipar.setParameter(\"" + v[i] + "\", \"" + names[j] + "\", \"" + values[j] + "\")\n";
355     }
356   }
357   
358   return dump;  
359 }
360
361
362 string SALOMEDSImpl_IParameters::getDefaultVisualComponent()
363 {
364   return "Interface Applicative";
365 }
366
367