Merge branch 'master' of ssh://git.code.sf.net/p/free-cad/code

This commit is contained in:
wmayer 2013-12-31 14:57:21 +01:00
commit a1c5d981a5
5 changed files with 108 additions and 39 deletions

View File

@ -26,7 +26,7 @@ __author__ = "Heiko Jakob <heiko.jakob@gediegos.de>"
import re, FreeCAD, FreeCADGui, Part, cProfile, os, string import re, FreeCAD, FreeCADGui, Part, cProfile, os, string
from FreeCAD import Vector, Base from FreeCAD import Vector, Base
from Draft import * from Draft import makeWire
if open.__module__ == '__builtin__': if open.__module__ == '__builtin__':
pythonopen = open pythonopen = open
@ -68,60 +68,62 @@ def process(doc,filename):
# This code should work with almost every dialect # This code should work with almost every dialect
# Regex to identify data rows and throw away unused metadata # Regex to identify data rows and throw away unused metadata
expre = r"^\s*(?P<xval>\-*\d*?\.\d\d+)\s+(?P<yval>\-*\d*?\.\d+)\s*$" regex = re.compile(r'^\s*(?P<xval>(\-|\d*)\.\d+(E\-?\d+)?)\,?\s*(?P<yval>\-?\s*\d*\.\d+(E\-?\d+)?)\s*$')
afile = pythonopen(filename,'r') afile = pythonopen(filename,'r')
# read the airfoil name which is always at the first line # read the airfoil name which is always at the first line
airfoilname = afile.readline().strip() airfoilname = afile.readline().strip()
upper=[] coords=[]
lower=[]
upside=True upside=True
last_x=None last_x=None
# Collect the data for the upper and the lower side seperately if possible # Collect the data for the upper and the lower side seperately if possible
for lin in afile: for lin in afile:
curdat = re.match(expre,lin) curdat = regex.match(lin)
if curdat != None: if curdat != None:
x = float(curdat.group("xval")) x = float(curdat.group("xval"))
y = float(curdat.group("yval")) y = float(curdat.group("yval"))
if last_x == None:
last_x=x
# Separation between the sides is done in many different ways.
# The only way to safely detect the swap is when x is getting smaller
if x < last_x:
# The swap
upside=False
# Not needed because this will happen anyhow at the end of the loop last_x=x
# the normal processing # the normal processing
if upside: coords.append(Vector(x,y,0))
upper.append(Vector(x,y,0))
else:
lower.append(Vector(x,y,0))
last_x=x
# End of if curdat != None # End of if curdat != None
# End of for lin in file # End of for lin in file
afile.close() afile.close()
# reverse the lower side and append it to the upper to
# make the complete data be oriented clockwise
lower.reverse() if len(coords) < 3:
for i in lower: print 'Did not find enough coordinates\n'
upper.append(i) return
# End of for i in lower
# sometimes coords are divided in upper an lower side
# so that x-coordinate begin new from leading or trailing edge
# check for start coordinates in the middle of list
if coords[0:-1].count(coords[0]) > 1:
flippoint = coords.index(coords[0],1)
upper = coords[0:flippoint]
lower = coords[flippoint+1:]
lower.reverse()
for i in lower:
upper.append(i)
coords = upper
# do we use the parametric Draft Wire? # do we use the parametric Draft Wire?
if useDraftWire: if useDraftWire:
face = makeWire ( upper, True, None, True ) obj = makeWire ( coords, True )
#obj.label = airfoilname
else: else:
# alternate solution, uses common Part Faces # alternate solution, uses common Part Faces
lines = [] lines = []
first_v = None first_v = None
last_v = None last_v = None
for v in upper: for v in coords:
if first_v == None: if first_v == None:
first_v = v first_v = v
# End of if first_v == None # End of if first_v == None
@ -139,7 +141,8 @@ def process(doc,filename):
# End of if last_v != first_v # End of if last_v != first_v
wire = Part.Wire(lines) wire = Part.Wire(lines)
face = Part.Face(wire) face = Part.Face(wire)
Part.show(face) obj = FreeCAD.ActiveDocument.addObject('Part::Feature',airfoilname)
obj.Shape = face
doc.recompute() doc.recompute()

View File

@ -574,6 +574,39 @@ void ViewProviderFemMesh::animateNodes(double factor)
DisplacementFactor = factor; DisplacementFactor = factor;
} }
void ViewProviderFemMesh::setColorByElementId(const std::map<long,App::Color> &ElementColorMap)
{
pcShapeMaterial->diffuseColor;
pcMatBinding->value = SoMaterialBinding::PER_FACE ;
// resizing and writing the color vector:
pcShapeMaterial->diffuseColor.setNum(vFaceElementIdx.size());
SbColor* colors = pcShapeMaterial->diffuseColor.startEditing();
int i=0;
for(std::vector<unsigned long>::const_iterator it=vFaceElementIdx.begin()
;it!=vFaceElementIdx.end()
;++it,i++){
unsigned long ElemIdx = ((*it)>>3);
const std::map<long,App::Color>::const_iterator pos = ElementColorMap.find(ElemIdx);
if(pos == ElementColorMap.end())
colors[i] = SbColor(0,1,0);
else
colors[i] = SbColor(pos->second.r,pos->second.g,pos->second.b);
}
pcShapeMaterial->diffuseColor.finishEditing();
}
void ViewProviderFemMesh::resetColorByElementId(void)
{
pcMatBinding->value = SoMaterialBinding::OVERALL;
pcShapeMaterial->diffuseColor.setNum(0);
const App::Color& c = ShapeColor.getValue();
pcShapeMaterial->diffuseColor.setValue(c.r,c.g,c.b);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -113,6 +113,11 @@ public:
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
void animateNodes(double factor); void animateNodes(double factor);
/// set the color for each element
void setColorByElementId(const std::map<long,App::Color> &ElementColorMap);
/// reset the view of the element colors
void resetColorByElementId(void);
//@} //@}
const std::vector<unsigned long> &getVisibleElementFaces(void)const{return vFaceElementIdx;} const std::vector<unsigned long> &getVisibleElementFaces(void)const{return vFaceElementIdx;}

View File

@ -20,12 +20,18 @@
<UserDocu></UserDocu> <UserDocu></UserDocu>
</Documentation> </Documentation>
</Methode> </Methode>
<Attribute Name="NodeColor" ReadOnly="false"> <Attribute Name="NodeColor" ReadOnly="false">
<Documentation> <Documentation>
<UserDocu>Postprocessing color of the the nodes. The faces between the nodes gets interpolated. </UserDocu> <UserDocu>Postprocessing color of the nodes. The faces between the nodes gets interpolated. </UserDocu>
</Documentation> </Documentation>
<Parameter Name="NodeColor" Type="Dict"/> <Parameter Name="NodeColor" Type="Dict"/>
</Attribute> </Attribute>
<Attribute Name="ElementColor" ReadOnly="false">
<Documentation>
<UserDocu>Postprocessing color of the elements. All faces of the element get the same color. </UserDocu>
</Documentation>
<Parameter Name="ElementColor" Type="Dict"/>
</Attribute>
<Attribute Name="NodeDisplacement" ReadOnly="false"> <Attribute Name="NodeDisplacement" ReadOnly="false">
<Documentation> <Documentation>
<UserDocu>Postprocessing color of the the nodes. The faces between the nodes gets interpolated. </UserDocu> <UserDocu>Postprocessing color of the the nodes. The faces between the nodes gets interpolated. </UserDocu>

View File

@ -57,6 +57,28 @@ void ViewProviderFemMeshPy::setNodeColor(Py::Dict arg)
} }
} }
Py::Dict ViewProviderFemMeshPy::getElementColor(void) const
{
//return Py::List();
throw Py::AttributeError("Not yet implemented");
}
void ViewProviderFemMeshPy::setElementColor(Py::Dict arg)
{
if(arg.size() == 0)
this->getViewProviderFemMeshPtr()->resetColorByNodeId();
else {
std::map<long,App::Color> NodeColorMap;
for( Py::Dict::iterator it = arg.begin(); it!= arg.end();++it){
Py::Int id((*it).first);
Py::Tuple color((*it).second);
NodeColorMap[id] = App::Color(Py::Float(color[0]),Py::Float(color[1]),Py::Float(color[2]),0);
}
this->getViewProviderFemMeshPtr()->setColorByElementId(NodeColorMap);
}
}
Py::Dict ViewProviderFemMeshPy::getNodeDisplacement(void) const Py::Dict ViewProviderFemMeshPy::getNodeDisplacement(void) const
{ {
//return Py::Dict(); //return Py::Dict();