1 // Copyright (C) 2010-2014 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay
21 #include "pqMEDReaderPanel.h"
22 #include "ui_MEDReaderPanel.h"
23 #include "VectBoolWidget.h"
25 #include "vtkProcessModule.h"
26 #include "vtkMultiBlockDataSet.h"
27 #include "vtkInformation.h"
28 #include "vtkIntArray.h"
29 #include "vtkSMDoubleVectorProperty.h"
30 #include "vtkSMIntVectorProperty.h"
31 #include "vtkSMStringVectorProperty.h"
32 #include "vtkSMProxy.h"
33 #include "vtkEventQtSlotConnect.h"
34 #include "vtkPVSILInformation.h"
36 #include "vtkMutableDirectedGraph.h"
37 #include "vtkAdjacentVertexIterator.h"
38 #include "vtkSMPropertyHelper.h"
39 #include "vtkStringArray.h"
40 #include "vtkDataSetAttributes.h"
41 #include "vtkMEDReader.h"
42 #include "vtkSMSourceProxy.h"
44 #include "pqTreeWidgetItemObject.h"
45 #include "pqSMAdaptor.h"
47 #include "pqPropertyManager.h"
48 #include "pqSILModel.h"
49 #include "pqProxySILModel.h"
50 #include "pqTreeViewSelectionHelper.h"
51 #include "pqTreeWidgetSelectionHelper.h"
53 #include <QHeaderView>
57 static const char ZE_SEP[]="@@][@@";
62 static const PixSingle &GetInstance();
63 QPixmap getPixFromStr(const std::string& st) const;
64 QPixmap getWholeMeshPix() const;
67 static const int NB_OF_DISCR=4;
68 static PixSingle *UNIQUE_PIX_SINGLE;
69 QPixmap _pixmaps[NB_OF_DISCR];
70 std::map<std::string,int> _ze_map;
74 PixSingle *PixSingle::UNIQUE_PIX_SINGLE=0;
76 const PixSingle &PixSingle::GetInstance()
78 if(!UNIQUE_PIX_SINGLE)
79 UNIQUE_PIX_SINGLE=new PixSingle;
80 return *UNIQUE_PIX_SINGLE;
83 PixSingle::PixSingle()
85 _pixmaps[0]=QPixmap(":/ParaViewResources/Icons/pqCellData16.png");
86 _pixmaps[1]=QPixmap(":/ParaViewResources/Icons/pqPointData16.png");
87 _pixmaps[2]=QPixmap(":/ParaViewResources/Icons/pqQuadratureData16.png");
88 _pixmaps[3]=QPixmap(":/ParaViewResources/Icons/pqElnoData16.png");
89 _ze_map[std::string("P0")]=0;
90 _ze_map[std::string("P1")]=1;
91 _ze_map[std::string("GAUSS")]=2;
92 _ze_map[std::string("GSSNE")]=3;
93 _whole_mesh=QPixmap(":/ParaViewResources/Icons/pqCellDataForWholeMesh16.png");
96 QPixmap PixSingle::getPixFromStr(const std::string& st) const
98 std::map<std::string,int>::const_iterator it(_ze_map.find(st));
100 return _pixmaps[(*it).second];
105 QPixmap PixSingle::getWholeMeshPix() const
110 class pqMEDReaderPanel::pqUI: public QObject, public Ui::MEDReaderPanel
113 pqUI(pqMEDReaderPanel *p):QObject(p)
115 this->VTKConnect = vtkSmartPointer<vtkEventQtSlotConnect>::New();
120 vtkSmartPointer<vtkEventQtSlotConnect> VTKConnect;
121 QMap<QTreeWidgetItem*, QString> TreeItemToPropMap;
124 pqMEDReaderPanel::pqMEDReaderPanel(pqProxy *object_proxy, QWidget *p):Superclass(object_proxy,p),_reload_req(false),_is_fields_status_changed(false),_optional_widget(0)
129 void pqMEDReaderPanel::initAll()
132 this->UI=new pqUI(this);
133 this->UI->setupUi(this);
134 this->UI->Fields->setHeaderHidden(true);
137 vtkSMProxy *reader(this->referenceProxy()->getProxy());
138 vtkPVSILInformation *info(vtkPVSILInformation::New());
139 reader->GatherInformation(info);
140 vtkGraph *g(info->GetSIL());
141 if(!g)//something wrong server side...
143 //vtkMutableDirectedGraph *g2(vtkMutableDirectedGraph::SafeDownCast(g));// agy: this line does not work in client/server mode ! but it works in standard mode ! Don't know why. ParaView bug ?
144 vtkMutableDirectedGraph *g2(static_cast<vtkMutableDirectedGraph *>(g));
146 vtkAbstractArray *verticesNames(g2->GetVertexData()->GetAbstractArray("Names",idNames));
147 vtkStringArray *verticesNames2(vtkStringArray::SafeDownCast(verticesNames));
150 for(int i=0;i<verticesNames2->GetNumberOfValues();i++)
152 vtkStdString &st(verticesNames2->GetValue(i));
153 if(st=="FieldsStatusTree")
160 std::cerr << "There is an internal error ! The tree on server side has not the expected look !" << std::endl;
161 vtkAdjacentVertexIterator *it0(vtkAdjacentVertexIterator::New());
162 g2->GetAdjacentVertices(id0,it0);
164 while(it0->HasNext())
166 vtkIdType idToolTipForTS(it0->Next());
167 QString toolTipName0(QString::fromStdString((const char *)verticesNames2->GetValue(idToolTipForTS)));
169 QList<QString> dts,its,tts;
171 vtkAdjacentVertexIterator *itForTS(vtkAdjacentVertexIterator::New());
172 g2->GetAdjacentVertices(idToolTipForTS,itForTS);
173 vtkIdType idForNbTS(itForTS->Next());
174 nbTS=QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS));
176 int nbTSInt(nbTS.toInt());
177 for(int ii=0;ii<nbTSInt;ii++)
179 dts.push_back(QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS+3*ii+1)));
180 its.push_back(QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS+3*ii+2)));
181 tts.push_back(QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS+3*ii+3)));
184 vtkIdType id1(it0->Next());
186 vtkSMProperty *SMProperty(this->proxy()->GetProperty("FieldsStatus"));
187 SMProperty->ResetToDefault();//this line is very important !
189 QString name0(QString::fromStdString((const char *)verticesNames2->GetValue(id1))); QList<QString> strs0; strs0.append(name0);
190 pqTreeWidgetItemObject *item0(new pqTreeWidgetItemObject(this->UI->Fields,strs0));
191 item0->setData(0,Qt::UserRole,name0);
192 item0->setData(0,Qt::ToolTipRole,toolTipName0);
194 QList<QVariant> modulesAct;
195 for(int i=0;i<nbTS.toInt();i++)
196 modulesAct.push_back(QVariant(true));
197 item0->setProperty("NbOfTS",nbTS);
198 item0->setProperty("DTS",QVariant(dts));
199 item0->setProperty("ITS",QVariant(its));
200 item0->setProperty("TTS",QVariant(tts));
201 item0->setProperty("ChosenTS",QVariant(modulesAct));
203 vtkAdjacentVertexIterator *it1(vtkAdjacentVertexIterator::New());//mesh
204 g2->GetAdjacentVertices(id1,it1);
205 while(it1->HasNext())
207 vtkIdType id2(it1->Next());
208 QString name1(QString::fromStdString((const char *)verticesNames2->GetValue(id2))); QList<QString> strs1; strs1.append(name1);
209 QString toolTipName1(name1);
210 pqTreeWidgetItemObject *item1(new pqTreeWidgetItemObject(item0,strs1));
211 item1->setData(0,Qt::UserRole,name1);
212 item1->setData(0,Qt::ToolTipRole,toolTipName1);
213 vtkAdjacentVertexIterator *it2(vtkAdjacentVertexIterator::New());//common support
214 g2->GetAdjacentVertices(id2,it2);
215 while(it2->HasNext())
217 vtkIdType id3(it2->Next());
218 QString name2(QString::fromStdString((const char *)verticesNames2->GetValue(id3))); QList<QString> strs2; strs2.append(name2);
219 pqTreeWidgetItemObject *item2(new pqTreeWidgetItemObject(item1,strs2));
220 item2->setData(0,Qt::UserRole,name2);
221 item2->setChecked(false);
222 vtkAdjacentVertexIterator *it3(vtkAdjacentVertexIterator::New());//fields !
223 g2->GetAdjacentVertices(id3,it3);
224 vtkIdType id3Arrs(it3->Next());
225 vtkAdjacentVertexIterator *it3Arrs(vtkAdjacentVertexIterator::New());//arrs in fields !
226 g2->GetAdjacentVertices(id3Arrs,it3Arrs);
227 while(it3Arrs->HasNext())
229 vtkIdType id4(it3Arrs->Next());
230 std::string name3CppFull((const char *)verticesNames2->GetValue(id4));
231 std::size_t pos(name3CppFull.find(ZE_SEP));
232 std::string name3Only(name3CppFull.substr(0,pos)); std::string spatialDiscr(name3CppFull.substr(pos+sizeof(ZE_SEP)-1));
233 QString name3(QString::fromStdString(name3Only)); QList<QString> strs3; strs3.append(name3);
234 QString toolTipName3(name3+QString(" (")+spatialDiscr.c_str()+QString(")"));
236 vtkAdjacentVertexIterator *it4(vtkAdjacentVertexIterator::New());// is it a special field ? A field mesh ?
237 g2->GetAdjacentVertices(id4,it4);
238 bool isSpecial(it4->HasNext());
241 pqTreeWidgetItemObject *item3(new pqTreeWidgetItemObject(item2,strs3));
242 _all_lev4.push_back(item3);
243 item3->setData(0,Qt::UserRole,name3);
244 item3->setChecked(false);
247 QFont font; font.setItalic(true); font.setUnderline(true);
248 item3->setData(0,Qt::FontRole,QVariant(font));
249 item3->setData(0,Qt::ToolTipRole,QString("Whole \"%1\" mesh").arg(name3));
250 item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getWholeMeshPix());
254 item3->setData(0,Qt::ToolTipRole,toolTipName3);
255 item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getPixFromStr(spatialDiscr));
257 _leaves.insert(std::pair<pqTreeWidgetItemObject *,int>(item3,ll));
258 std::ostringstream pdm; pdm << name0.toStdString() << "/" << name1.toStdString() << "/" << name2.toStdString() << "/" << name3CppFull;
259 (static_cast<vtkSMStringVectorProperty *>(SMProperty))->SetElement(2*ll,pdm.str().c_str());
260 char tmp2[2]; tmp2[0]=(kk==0?'1':'0'); tmp2[1]='\0';
261 std::string tmp(tmp2);
262 (static_cast<vtkSMStringVectorProperty *>(SMProperty))->SetElement(2*ll+1,tmp.c_str());
263 //SMProperty->ResetToDefault();
264 item2->setChecked(kk==0);
265 item3->setChecked(kk==0);
266 item3->setProperty("PosInStringVector",QVariant(ll));
267 connect(item3,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
270 connect(item2,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
271 vtkIdType id3Gts(it3->Next());
272 vtkAdjacentVertexIterator *it3Gts(vtkAdjacentVertexIterator::New());//geo types in fields !
273 g2->GetAdjacentVertices(id3Gts,it3Gts);
274 QString toolTipName2(name2);
275 while(it3Gts->HasNext())
277 vtkIdType idGt(it3Gts->Next());
278 std::string gtName((const char *)verticesNames2->GetValue(idGt));
279 toolTipName2=QString("%1\n- %2").arg(toolTipName2).arg(QString(gtName.c_str()));
281 item2->setData(0,Qt::ToolTipRole,toolTipName2);
292 this->UI->Fields->header()->setStretchLastSection(true);
293 this->UI->Fields->expandAll();
295 this->UI->stdMode->setChecked(true);
296 this->UI->VTKConnect->Connect(this->proxy(),vtkCommand::UpdateInformationEvent, this, SLOT(updateSIL()));
298 this->UI->Reload->setProperty("NbOfReloadDynProp",QVariant(1));
299 vtkSMProperty *SMProperty(this->proxy()->GetProperty("ReloadReq"));
300 connect(this->UI->Reload,SIGNAL(pressed()),this,SLOT(reloadFired()));
301 this->propertyManager()->registerLink(this->UI->Reload,"NbOfReloadDynProp",SIGNAL(pressed()),this->proxy(),SMProperty);
303 vtkSMProperty *SMProperty0(this->proxy()->GetProperty("GenerateVectors"));
304 this->propertyManager()->registerLink(this->UI->GenerateVects,"checked",SIGNAL(stateChanged(int)),this->proxy(),SMProperty0);
306 vtkSMProperty *SMProperty2(this->proxy()->GetProperty("TimeOrModal"));
307 SMProperty2->ResetToDefault();//this line is very important !
308 this->propertyManager()->registerLink(this->UI->modeMode,"checked",SIGNAL(toggled(bool)),this->proxy(),SMProperty2);
310 delete _optional_widget;
311 _optional_widget=new VectBoolWidget(this->UI->timeStepsInspector,getMaxNumberOfTS());
312 _optional_widget->hide();
313 this->UI->timeStepsInspector->setMinimumSize(QSize(0,0));
314 connect(this->UI->modeMode,SIGNAL(toggled(bool)),this,SLOT(vectOfBoolWidgetRequested(bool)));
315 vtkSMProperty *SMProperty3(this->proxy()->GetProperty("TimesFlagsStatus"));
316 SMProperty3->ResetToDefault();
317 const QVector<VectBoolItem *>& items(_optional_widget->getItems());
319 foreach(VectBoolItem *item,items)
321 this->propertyManager()->registerLink(item,"activated",SIGNAL(changed()),this->proxy(),SMProperty3,itt++);
325 pqMEDReaderPanel::~pqMEDReaderPanel()
327 delete _optional_widget;
330 void pqMEDReaderPanel::linkServerManagerProperties()
332 this->Superclass::linkServerManagerProperties();
335 void pqMEDReaderPanel::updateSIL()
340 this->UI->geometryGroupBox->hide();
342 foreach(QObject *child,children())
344 QLayout *layout(qobject_cast<QLayout *>(child));
352 void pqMEDReaderPanel::aLev3HasBeenFired(bool v)
354 pqTreeWidgetItemObject *zeItem(qobject_cast<pqTreeWidgetItemObject *>(sender()));
357 for(int i=0;i<zeItem->childCount();i++)
359 QTreeWidgetItem *elt(zeItem->child(i));
360 pqTreeWidgetItemObject *eltC(dynamic_cast<pqTreeWidgetItemObject *>(elt));
364 aLev4HasBeenFiredBy(eltC);
368 somethingChangedInFieldRepr();
371 void pqMEDReaderPanel::aLev4HasBeenFired()
373 pqTreeWidgetItemObject *zeItem(qobject_cast<pqTreeWidgetItemObject *>(sender()));
375 aLev4HasBeenFiredBy(zeItem);
377 somethingChangedInFieldRepr();
380 void pqMEDReaderPanel::aLev4HasBeenFiredBy(pqTreeWidgetItemObject *zeItem)
382 pqTreeWidgetItemObject *father(dynamic_cast<pqTreeWidgetItemObject *>(zeItem->QTreeWidgetItem::parent()));
383 QTreeWidgetItem *godFather(father->QTreeWidgetItem::parent()->parent());
386 if(zeItem->isChecked())
388 bool isActivatedTSChanged(false);
389 // This part garantees that all leaves having not the same father than zeItem are desactivated
390 foreach(pqTreeWidgetItemObject* elt,this->_all_lev4)
392 QTreeWidgetItem *testFath(elt->QTreeWidgetItem::parent());
397 disconnect(elt,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
398 elt->setChecked(false);
399 connect(elt,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
401 if(godFather!=testFath->parent()->parent())
402 isActivatedTSChanged=true;
405 // the user by clicking to a new entry has changed of TimeStepSeries -> notify it to thee time step selector widget
406 if(isActivatedTSChanged)
408 QStringList its,dts,tts;
409 getCurrentTS(its,dts,tts);
410 _optional_widget->setItems(its,dts,tts);
415 // if all are unchecked - check it again
416 bool allItemsAreUnChked(true);
417 foreach(pqTreeWidgetItemObject* elt,this->_all_lev4)
419 if(elt && elt->isChecked())
420 allItemsAreUnChked=false;
422 if(allItemsAreUnChked)
424 disconnect(zeItem,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
425 zeItem->setChecked(true);// OK zeItem was required to be unchecked but as it is the last one. Recheck it !
426 connect(zeItem,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
431 void pqMEDReaderPanel::putLev3InOrder()
433 std::vector<pqTreeWidgetItemObject *>::iterator it0(_all_lev4.begin()),it1;
434 while(it0!=_all_lev4.end())
436 QTreeWidgetItem *curFather((*it0)->QTreeWidgetItem::parent());
437 for(it1=it0+1;it1!=_all_lev4.end() && (*it1)->QTreeWidgetItem::parent()==curFather;it1++);
438 bool isAllFalse(true),isAllTrue(true);
439 for(std::vector<pqTreeWidgetItemObject *>::iterator it=it0;it!=it1;it++)
441 if((*it)->isChecked())
446 if(isAllFalse || isAllTrue)
448 pqTreeWidgetItemObject *father(dynamic_cast<pqTreeWidgetItemObject *>(curFather));
451 disconnect(father,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
452 father->setChecked(isAllTrue);
453 connect(father,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
460 void pqMEDReaderPanel::reloadFired()
464 this->UI->Reload->setProperty("NbOfReloadDynProp",v);
466 for(std::set<std::pair<pqTreeWidgetItemObject *,int> >::const_iterator it=_leaves.begin();it!=_leaves.end();it++)
467 ((*it).first)->disconnect(SIGNAL(checkedStateChanged(bool)));
469 vtkSMProperty *SMProperty(this->proxy()->GetProperty("FieldsStatus"));
470 for(std::set<std::pair<pqTreeWidgetItemObject *,int> >::const_iterator it=_leaves.begin();it!=_leaves.end();it++)
471 this->propertyManager()->unregisterLink((*it).first,"checked",SIGNAL(checkedStateChanged(bool)),this->proxy(),SMProperty,(*it).second);
472 this->propertyManager()->propertyChanged();
473 vtkSMProperty *SMProperty3(this->proxy()->GetProperty("TimeOrModal"));
474 this->propertyManager()->unregisterLink(this->UI->modeMode,"checked",SIGNAL(toggled(bool)),this->proxy(),SMProperty3);
477 void pqMEDReaderPanel::vectOfBoolWidgetRequested(bool isMode)
481 this->UI->timeStepsInspector->setMinimumSize(QSize(200,250));
482 _optional_widget->show();
483 QStringList its,dts,tts;
484 getCurrentTS(its,dts,tts);
485 _optional_widget->setItems(its,dts,tts);
489 _optional_widget->hide();
490 this->UI->timeStepsInspector->setMinimumSize(QSize(0,0));
494 void pqMEDReaderPanel::getCurrentTS(QStringList& its, QStringList& dts, QStringList& tts) const
497 for(std::vector<pqTreeWidgetItemObject *>::const_iterator it=_all_lev4.begin();it!=_all_lev4.end();it++)
499 if((*it)->property("checked").toInt())
501 QTreeWidgetItem *obj((*it)->QTreeWidgetItem::parent()->QTreeWidgetItem::parent()->QTreeWidgetItem::parent());
502 pqTreeWidgetItemObject *objC(dynamic_cast<pqTreeWidgetItemObject *>(obj));
503 its=objC->property("ITS").toStringList();
504 dts=objC->property("DTS").toStringList();
505 tts=objC->property("TTS").toStringList();
509 std::cerr << "pqMEDReaderPanel::getCurrentTS : internal error ! Something is going wrong !" << std::endl;
512 int pqMEDReaderPanel::getMaxNumberOfTS() const
515 for(std::vector<pqTreeWidgetItemObject *>::const_iterator it=_all_lev4.begin();it!=_all_lev4.end();it++)
517 QTreeWidgetItem *obj((*it)->QTreeWidgetItem::parent()->QTreeWidgetItem::parent()->QTreeWidgetItem::parent());
518 pqTreeWidgetItemObject *objC(dynamic_cast<pqTreeWidgetItemObject *>(obj));
519 ret=std::max(ret,objC->property("NbOfTS").toInt());
524 void pqMEDReaderPanel::updateInformationAndDomains()
526 pqNamedObjectPanel::updateInformationAndDomains();
527 if(_is_fields_status_changed)
529 vtkSMProxy *proxy(this->proxy());
530 vtkSMProperty *SMProperty(proxy->GetProperty("FieldsStatus"));
531 SMProperty->Modified();// agy : THE LINE FOR 7.5.1 !
532 _is_fields_status_changed=false;
537 * This slot is called by this->UI->Fields when one/several leaves have been modified.
539 void pqMEDReaderPanel::somethingChangedInFieldRepr()
542 vtkSMProxy *proxy(this->proxy());
543 vtkSMProperty *SMProperty(proxy->GetProperty("FieldsStatus"));
544 vtkSMStringVectorProperty *sm(dynamic_cast<vtkSMStringVectorProperty *>(SMProperty));
545 unsigned int nb(sm->GetNumberOfElements());
546 std::vector<std::string> sts(nb);
547 for(unsigned int i=0;i<nb;i++)
548 sts[i]=sm->GetElement(i);
550 pqExodusIIVariableSelectionWidget *sc(this->UI->Fields);
551 for(int i0=0;i0<sc->topLevelItemCount();i0++)
553 QTreeWidgetItem *lev0(sc->topLevelItem(i0));//TS
554 for(int i1=0;i1<lev0->childCount();i1++)
556 QTreeWidgetItem *lev1(lev0->child(i1));//Mesh
557 for(int i2=0;i2<lev1->childCount();i2++)
559 QTreeWidgetItem *lev2(lev1->child(i2));//Comp
560 for(int i3=0;i3<lev2->childCount();i3++)
562 QTreeWidgetItem *lev3(lev2->child(i3));
563 pqTreeWidgetItemObject *scc(dynamic_cast<pqTreeWidgetItemObject *>(lev3));
564 int ll(scc->property("PosInStringVector").toInt());
565 int v(scc->isChecked());
566 std::ostringstream oss; oss << v;
567 sts[2*ll+1]=oss.str();
573 const char **args=new const char *[nb];
574 for(unsigned int i=0;i<nb;i++)
576 args[i]=sts[i].c_str();
578 {//agy : let's go to put info in property FieldsStatus
579 int iup(sm->GetImmediateUpdate());
580 //sm->SetNumberOfElements(0);
581 sm->SetElements(args,nb);
582 proxy->UpdateVTKObjects(); // push properties states abroad
583 sm->SetImmediateUpdate(iup);
587 ((vtkSMSourceProxy *)proxy)->UpdatePipelineInformation();//performs an update of all properties of proxy and proxy itself
588 // here wonderful proxy is declared modified right after FieldsStatus and FieldsTreeInfo -> IMPORTANT : The updated MTime of proxy will be the ref
589 // to detect modified properties.
590 _is_fields_status_changed=true;