Increase Performance Postprocessing
This commit is contained in:
parent
c71c1b8679
commit
6078846fa2
|
@ -494,10 +494,6 @@ PyObject * ViewProviderFemMesh::getPyObject()
|
||||||
|
|
||||||
void ViewProviderFemMesh::setColorByNodeId(const std::map<long,App::Color> &NodeColorMap)
|
void ViewProviderFemMesh::setColorByNodeId(const std::map<long,App::Color> &NodeColorMap)
|
||||||
{
|
{
|
||||||
pcShapeMaterial->diffuseColor;
|
|
||||||
|
|
||||||
pcMatBinding->value = SoMaterialBinding::PER_VERTEX_INDEXED;
|
|
||||||
|
|
||||||
long startId = NodeColorMap.begin()->first;
|
long startId = NodeColorMap.begin()->first;
|
||||||
long endId = (--NodeColorMap.end())->first;
|
long endId = (--NodeColorMap.end())->first;
|
||||||
|
|
||||||
|
@ -505,60 +501,34 @@ void ViewProviderFemMesh::setColorByNodeId(const std::map<long,App::Color> &Node
|
||||||
for(std::map<long,App::Color>::const_iterator it=NodeColorMap.begin();it!=NodeColorMap.end();++it)
|
for(std::map<long,App::Color>::const_iterator it=NodeColorMap.begin();it!=NodeColorMap.end();++it)
|
||||||
colorVec[it->first-startId] = it->second;
|
colorVec[it->first-startId] = it->second;
|
||||||
|
|
||||||
// resizing and writing the color vector:
|
setColorByNodeIdHelper(colorVec);
|
||||||
pcShapeMaterial->diffuseColor.setNum(vNodeElementIdx.size());
|
|
||||||
SbColor* colors = pcShapeMaterial->diffuseColor.startEditing();
|
|
||||||
|
|
||||||
//int i=0;
|
|
||||||
//for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin()
|
|
||||||
// ;it!=vNodeElementIdx.end()
|
|
||||||
// ;++it,i++){
|
|
||||||
// const std::map<long,App::Color>::const_iterator pos = NodeColorMap.find(*it);
|
|
||||||
// if(pos == NodeColorMap.end())
|
|
||||||
// colors[i] = SbColor(0,1,0);
|
|
||||||
// else
|
|
||||||
// colors[i] = SbColor(pos->second.r,pos->second.g,pos->second.b);
|
|
||||||
//}
|
|
||||||
|
|
||||||
int i=0;
|
|
||||||
for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin()
|
|
||||||
;it!=vNodeElementIdx.end()
|
|
||||||
;++it,i++)
|
|
||||||
colors[i] = SbColor(colorVec[*it-1].r,colorVec[*it-1].g,colorVec[*it-1].b);
|
|
||||||
|
|
||||||
|
|
||||||
pcShapeMaterial->diffuseColor.finishEditing();
|
|
||||||
}
|
}
|
||||||
void ViewProviderFemMesh::setColorByNodeId(const std::vector<long> &NodeIds,const std::vector<App::Color> &NodeColors)
|
void ViewProviderFemMesh::setColorByNodeId(const std::vector<long> &NodeIds,const std::vector<App::Color> &NodeColors)
|
||||||
{
|
{
|
||||||
pcShapeMaterial->diffuseColor;
|
|
||||||
|
|
||||||
pcMatBinding->value = SoMaterialBinding::PER_VERTEX_INDEXED;
|
|
||||||
|
|
||||||
long startId = *(std::min_element(NodeIds.begin(), NodeIds.end()));
|
long startId = *(std::min_element(NodeIds.begin(), NodeIds.end()));
|
||||||
long endId = *(std::max_element(NodeIds.begin(), NodeIds.end()));
|
long endId = *(std::max_element(NodeIds.begin(), NodeIds.end()));
|
||||||
|
|
||||||
std::vector<App::Color> colorVec(endId-startId+2,App::Color(0,1,0));
|
std::vector<App::Color> colorVec(endId-startId+2,App::Color(0,1,0));
|
||||||
int i=0;
|
long i=0;
|
||||||
for(std::vector<long>::const_iterator it=NodeIds.begin();it!=NodeIds.end();++it,i++)
|
for(std::vector<long>::const_iterator it=NodeIds.begin();it!=NodeIds.end();++it,i++)
|
||||||
colorVec[*it-startId] = NodeColors[i];
|
colorVec[*it-startId] = NodeColors[i];
|
||||||
|
|
||||||
|
|
||||||
|
setColorByNodeIdHelper(colorVec);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewProviderFemMesh::setColorByNodeIdHelper(const std::vector<App::Color> &colorVec)
|
||||||
|
{
|
||||||
|
pcMatBinding->value = SoMaterialBinding::PER_VERTEX_INDEXED;
|
||||||
|
|
||||||
// resizing and writing the color vector:
|
// resizing and writing the color vector:
|
||||||
pcShapeMaterial->diffuseColor.setNum(vNodeElementIdx.size());
|
pcShapeMaterial->diffuseColor.setNum(vNodeElementIdx.size());
|
||||||
SbColor* colors = pcShapeMaterial->diffuseColor.startEditing();
|
SbColor* colors = pcShapeMaterial->diffuseColor.startEditing();
|
||||||
|
|
||||||
//int i=0;
|
long i=0;
|
||||||
//for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin()
|
|
||||||
// ;it!=vNodeElementIdx.end()
|
|
||||||
// ;++it,i++){
|
|
||||||
// const std::map<long,App::Color>::const_iterator pos = NodeColorMap.find(*it);
|
|
||||||
// if(pos == NodeColorMap.end())
|
|
||||||
// colors[i] = SbColor(0,1,0);
|
|
||||||
// else
|
|
||||||
// colors[i] = SbColor(pos->second.r,pos->second.g,pos->second.b);
|
|
||||||
//}
|
|
||||||
|
|
||||||
i=0;
|
|
||||||
for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin()
|
for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin()
|
||||||
;it!=vNodeElementIdx.end()
|
;it!=vNodeElementIdx.end()
|
||||||
;++it,i++)
|
;++it,i++)
|
||||||
|
@ -578,18 +548,38 @@ void ViewProviderFemMesh::resetColorByNodeId(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViewProviderFemMesh::setDisplacementByNodeId(const std::map<long,Base::Vector3d> &NodeDispMap)
|
void ViewProviderFemMesh::setDisplacementByNodeId(const std::map<long,Base::Vector3d> &NodeDispMap)
|
||||||
|
{
|
||||||
|
long startId = NodeDispMap.begin()->first;
|
||||||
|
long endId = (--NodeDispMap.end())->first;
|
||||||
|
|
||||||
|
std::vector<Base::Vector3d> vecVec(endId-startId+2,Base::Vector3d());
|
||||||
|
|
||||||
|
for(std::map<long,Base::Vector3d>::const_iterator it=NodeDispMap.begin();it!=NodeDispMap.end();++it)
|
||||||
|
vecVec[it->first-startId] = it->second;
|
||||||
|
|
||||||
|
setDisplacementByNodeIdHelper(vecVec,startId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewProviderFemMesh::setDisplacementByNodeId(const std::vector<long> &NodeIds,const std::vector<Base::Vector3d> &NodeDisps)
|
||||||
|
{
|
||||||
|
long startId = *(std::min_element(NodeIds.begin(), NodeIds.end()));
|
||||||
|
long endId = *(std::max_element(NodeIds.begin(), NodeIds.end()));
|
||||||
|
|
||||||
|
std::vector<Base::Vector3d> vecVec(endId-startId+2,Base::Vector3d());
|
||||||
|
|
||||||
|
long i=0;
|
||||||
|
for(std::vector<long>::const_iterator it=NodeIds.begin();it!=NodeIds.end();++it,i++)
|
||||||
|
vecVec[*it-startId] = NodeDisps[i];
|
||||||
|
|
||||||
|
setDisplacementByNodeIdHelper(vecVec,startId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ViewProviderFemMesh::setDisplacementByNodeIdHelper(const std::vector<Base::Vector3d>& DispVector,long startId)
|
||||||
{
|
{
|
||||||
DisplacementVector.resize(vNodeElementIdx.size());
|
DisplacementVector.resize(vNodeElementIdx.size());
|
||||||
int i=0;
|
int i=0;
|
||||||
for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin()
|
for(std::vector<unsigned long>::const_iterator it=vNodeElementIdx.begin();it!=vNodeElementIdx.end();++it,i++)
|
||||||
;it!=vNodeElementIdx.end()
|
DisplacementVector[i] = DispVector[*it-startId];
|
||||||
;++it,i++){
|
|
||||||
const std::map<long,Base::Vector3d>::const_iterator pos = NodeDispMap.find(*it);
|
|
||||||
if(pos == NodeDispMap.end())
|
|
||||||
DisplacementVector[i] = Base::Vector3d(0.0,0.0,0.0);
|
|
||||||
else
|
|
||||||
DisplacementVector[i] = pos->second;
|
|
||||||
}
|
|
||||||
animateNodes(1.0);
|
animateNodes(1.0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -602,6 +592,9 @@ void ViewProviderFemMesh::resetDisplacementByNodeId(void)
|
||||||
/// reaply the node displacement with a certain factor and do a redraw
|
/// reaply the node displacement with a certain factor and do a redraw
|
||||||
void ViewProviderFemMesh::animateNodes(double factor)
|
void ViewProviderFemMesh::animateNodes(double factor)
|
||||||
{
|
{
|
||||||
|
if(DisplacementVector.size() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
float x,y,z;
|
float x,y,z;
|
||||||
// set the point coordinates
|
// set the point coordinates
|
||||||
long sz = pcCoords->point.getNum();
|
long sz = pcCoords->point.getNum();
|
||||||
|
|
|
@ -111,6 +111,7 @@ public:
|
||||||
void resetColorByNodeId(void);
|
void resetColorByNodeId(void);
|
||||||
/// set the displacement for each node
|
/// set the displacement for each node
|
||||||
void setDisplacementByNodeId(const std::map<long,Base::Vector3d> &NodeDispMap);
|
void setDisplacementByNodeId(const std::map<long,Base::Vector3d> &NodeDispMap);
|
||||||
|
void setDisplacementByNodeId(const std::vector<long> &NodeIds,const std::vector<Base::Vector3d> &NodeDisps);
|
||||||
/// reset the view of the node displacement
|
/// reset the view of the node displacement
|
||||||
void resetDisplacementByNodeId(void);
|
void resetDisplacementByNodeId(void);
|
||||||
/// reaply the node displacement with a certain factor and do a redraw
|
/// reaply the node displacement with a certain factor and do a redraw
|
||||||
|
@ -136,6 +137,8 @@ protected:
|
||||||
/// get called by the container whenever a property has been changed
|
/// get called by the container whenever a property has been changed
|
||||||
virtual void onChanged(const App::Property* prop);
|
virtual void onChanged(const App::Property* prop);
|
||||||
|
|
||||||
|
void setColorByNodeIdHelper(const std::vector<App::Color> &);
|
||||||
|
void setDisplacementByNodeIdHelper(const std::vector<Base::Vector3d>& DispVector,long startId);
|
||||||
/// index of elements to their triangles
|
/// index of elements to their triangles
|
||||||
std::vector<unsigned long> vFaceElementIdx;
|
std::vector<unsigned long> vFaceElementIdx;
|
||||||
std::vector<unsigned long> vNodeElementIdx;
|
std::vector<unsigned long> vNodeElementIdx;
|
||||||
|
|
|
@ -25,6 +25,11 @@
|
||||||
<UserDocu></UserDocu>
|
<UserDocu></UserDocu>
|
||||||
</Documentation>
|
</Documentation>
|
||||||
</Methode>
|
</Methode>
|
||||||
|
<Methode Name="setNodeDisplacementByResult">
|
||||||
|
<Documentation>
|
||||||
|
<UserDocu></UserDocu>
|
||||||
|
</Documentation>
|
||||||
|
</Methode>
|
||||||
<Attribute Name="NodeColor" ReadOnly="false">
|
<Attribute Name="NodeColor" ReadOnly="false">
|
||||||
<Documentation>
|
<Documentation>
|
||||||
<UserDocu>Postprocessing color of the nodes. The faces between the nodes gets interpolated. </UserDocu>
|
<UserDocu>Postprocessing color of the nodes. The faces between the nodes gets interpolated. </UserDocu>
|
||||||
|
|
|
@ -35,6 +35,19 @@ PyObject* ViewProviderFemMeshPy::animate(PyObject * args)
|
||||||
Py_Return;
|
Py_Return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
App::Color calcColor(double value,double min, double max)
|
||||||
|
{
|
||||||
|
if (value < min)
|
||||||
|
return App::Color (0.0,1.0,0.0);
|
||||||
|
if (value > max)
|
||||||
|
return App::Color (1.0,0.0,0.0);
|
||||||
|
if ( value < (min + (max-min)/2.0 ))
|
||||||
|
return App::Color ((value-min) / ((max-min)/2.0),1.0,0.0) ;
|
||||||
|
else
|
||||||
|
return App::Color (1.0,1-((value-min-((max-min)/2.0)) / ((max-min)/2.0)),0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args)
|
PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *object=0;
|
PyObject *object=0;
|
||||||
|
@ -42,6 +55,23 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args)
|
||||||
App::DocumentObject* obj = static_cast<App::DocumentObjectPy*>(object)->getDocumentObjectPtr();
|
App::DocumentObject* obj = static_cast<App::DocumentObjectPy*>(object)->getDocumentObjectPtr();
|
||||||
if (obj && obj->getTypeId().isDerivedFrom(Fem::FemResultValue::getClassTypeId())){
|
if (obj && obj->getTypeId().isDerivedFrom(Fem::FemResultValue::getClassTypeId())){
|
||||||
Fem::FemResultValue *result = static_cast<Fem::FemResultValue*>(obj);
|
Fem::FemResultValue *result = static_cast<Fem::FemResultValue*>(obj);
|
||||||
|
const std::vector<long> & Ids = result->ElementNumbers.getValues() ;
|
||||||
|
const std::vector<double> & Vals = result->Values.getValues() ;
|
||||||
|
std::vector<App::Color> NodeColors(Vals.size());
|
||||||
|
float max = 0.0;
|
||||||
|
for(std::vector<double>::const_iterator it= Vals.begin();it!=Vals.end();++it)
|
||||||
|
if(*it > max)
|
||||||
|
max = *it;
|
||||||
|
|
||||||
|
// fill up color vector
|
||||||
|
long i=0;
|
||||||
|
for(std::vector<double>::const_iterator it= Vals.begin();it!=Vals.end();++it,i++)
|
||||||
|
NodeColors[i] = calcColor(*it,0.0,max);
|
||||||
|
|
||||||
|
// set the color to the view-provider
|
||||||
|
this->getViewProviderFemMeshPtr()->setColorByNodeId(Ids,NodeColors);
|
||||||
|
|
||||||
|
|
||||||
}else if (obj && obj->getTypeId().isDerivedFrom(Fem::FemResultVector::getClassTypeId())){
|
}else if (obj && obj->getTypeId().isDerivedFrom(Fem::FemResultVector::getClassTypeId())){
|
||||||
Fem::FemResultVector *result = static_cast<Fem::FemResultVector*>(obj);
|
Fem::FemResultVector *result = static_cast<Fem::FemResultVector*>(obj);
|
||||||
const std::vector<long> & Ids = result->ElementNumbers.getValues() ;
|
const std::vector<long> & Ids = result->ElementNumbers.getValues() ;
|
||||||
|
@ -51,22 +81,13 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args)
|
||||||
for(std::vector<Base::Vector3d>::const_iterator it= Vecs.begin();it!=Vecs.end();++it)
|
for(std::vector<Base::Vector3d>::const_iterator it= Vecs.begin();it!=Vecs.end();++it)
|
||||||
if(it->Length() > max)
|
if(it->Length() > max)
|
||||||
max = it->Length();
|
max = it->Length();
|
||||||
|
|
||||||
|
// fill up color vector
|
||||||
long i=0;
|
long i=0;
|
||||||
for(std::vector<Base::Vector3d>::const_iterator it= Vecs.begin();it!=Vecs.end();++it,i++){
|
for(std::vector<Base::Vector3d>::const_iterator it= Vecs.begin();it!=Vecs.end();++it,i++)
|
||||||
double value = it->Length();
|
NodeColors[i] = calcColor(it->Length(),0.0,max);
|
||||||
double min = 0.0;
|
|
||||||
|
|
||||||
if (value < min)
|
|
||||||
NodeColors[i] = App::Color (0.0,1.0,0.0);
|
|
||||||
else if (value > max)
|
|
||||||
NodeColors[i] = App::Color (1.0,0.0,0.0);
|
|
||||||
else if ( value < (min + (max-min)/2.0 ))
|
|
||||||
NodeColors[i] = App::Color ((value-min) / ((max-min)/2.0),1.0,0.0) ;
|
|
||||||
else
|
|
||||||
NodeColors[i] = App::Color (1.0,1-((value-min-((max-min)/2.0)) / ((max-min)/2.0)),0.0);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// set the color to the view-provider
|
||||||
this->getViewProviderFemMeshPtr()->setColorByNodeId(Ids,NodeColors);
|
this->getViewProviderFemMeshPtr()->setColorByNodeId(Ids,NodeColors);
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,7 +101,28 @@ PyObject* ViewProviderFemMeshPy::setNodeColorByResult(PyObject *args)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* ViewProviderFemMeshPy::setNodeDisplacementByResult(PyObject *args)
|
||||||
|
{
|
||||||
|
PyObject *object=0;
|
||||||
|
if (PyArg_ParseTuple(args,"O!",&(App::DocumentObjectPy::Type), &object)) {
|
||||||
|
App::DocumentObject* obj = static_cast<App::DocumentObjectPy*>(object)->getDocumentObjectPtr();
|
||||||
|
if (obj && obj->getTypeId().isDerivedFrom(Fem::FemResultVector::getClassTypeId())){
|
||||||
|
Fem::FemResultVector *result = static_cast<Fem::FemResultVector*>(obj);
|
||||||
|
const std::vector<long> & Ids = result->ElementNumbers.getValues() ;
|
||||||
|
const std::vector<Base::Vector3d> & Vecs = result->Values.getValues() ;
|
||||||
|
// set the displacement to the view-provider
|
||||||
|
this->getViewProviderFemMeshPtr()->setDisplacementByNodeId(Ids,Vecs);
|
||||||
|
|
||||||
|
|
||||||
|
}else{
|
||||||
|
PyErr_SetString(PyExc_Exception, "Argument has to be a ResultVector!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_Return;
|
||||||
|
|
||||||
|
}
|
||||||
Py::Dict ViewProviderFemMeshPy::getNodeColor(void) const
|
Py::Dict ViewProviderFemMeshPy::getNodeColor(void) const
|
||||||
{
|
{
|
||||||
//return Py::List();
|
//return Py::List();
|
||||||
|
|
|
@ -380,24 +380,19 @@ class _ResultControlTaskPanel:
|
||||||
self.formUi.lineEdit_Max.setText(str(maxL))
|
self.formUi.lineEdit_Max.setText(str(maxL))
|
||||||
self.formUi.doubleSpinBox_MinValueColor.setValue(maxL)
|
self.formUi.doubleSpinBox_MinValueColor.setValue(maxL)
|
||||||
|
|
||||||
colors = []
|
self.MeshObject.ViewObject.setNodeColorByResult(self.DisplacementObject)
|
||||||
for i in values:
|
|
||||||
colors.append( FemLib.colorValue(i.Length,0.0,maxL) )
|
|
||||||
self.MeshObject.ViewObject.NodeColor = dict(zip( self.DisplacementObject.ElementNumbers,colors))
|
|
||||||
def setDisplacement(self):
|
def setDisplacement(self):
|
||||||
if self.DisplacementObject:
|
if self.DisplacementObject:
|
||||||
values = self.DisplacementObject.Values
|
self.MeshObject.ViewObject.setNodeDisplacementByResult(self.DisplacementObject)
|
||||||
self.MeshObject.ViewObject.NodeDisplacement = dict(zip( self.DisplacementObject.ElementNumbers,values))
|
|
||||||
|
|
||||||
def setColorStress(self):
|
def setColorStress(self):
|
||||||
if self.StressObject:
|
if self.StressObject:
|
||||||
values = self.StressObject.Values
|
values = self.StressObject.Values
|
||||||
maxVal = max(values)
|
maxVal = max(values)
|
||||||
self.formUi.doubleSpinBox_MinValueColor.setValue(maxVal)
|
self.formUi.doubleSpinBox_MinValueColor.setValue(maxVal)
|
||||||
colors = []
|
|
||||||
for i in values:
|
self.MeshObject.ViewObject.setNodeColorByResult(self.StressObject)
|
||||||
colors.append( FemLib.colorValue(i,0.0,maxVal) )
|
|
||||||
self.MeshObject.ViewObject.ElementColor = dict(zip(self.StressObject.ElementNumbers,colors))
|
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
'fills the widgets'
|
'fills the widgets'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user