diff --git a/src/Mod/Draft/importAirfoilDAT.py b/src/Mod/Draft/importAirfoilDAT.py index 4b0d68162..c1898f235 100644 --- a/src/Mod/Draft/importAirfoilDAT.py +++ b/src/Mod/Draft/importAirfoilDAT.py @@ -26,7 +26,7 @@ __author__ = "Heiko Jakob " import re, FreeCAD, FreeCADGui, Part, cProfile, os, string from FreeCAD import Vector, Base -from Draft import * +from Draft import makeWire if open.__module__ == '__builtin__': pythonopen = open @@ -68,60 +68,62 @@ def process(doc,filename): # This code should work with almost every dialect # Regex to identify data rows and throw away unused metadata - expre = r"^\s*(?P\-*\d*?\.\d\d+)\s+(?P\-*\d*?\.\d+)\s*$" + regex = re.compile(r'^\s*(?P(\-|\d*)\.\d+(E\-?\d+)?)\,?\s*(?P\-?\s*\d*\.\d+(E\-?\d+)?)\s*$') afile = pythonopen(filename,'r') # read the airfoil name which is always at the first line airfoilname = afile.readline().strip() - upper=[] - lower=[] + coords=[] upside=True last_x=None + # Collect the data for the upper and the lower side seperately if possible for lin in afile: - curdat = re.match(expre,lin) - if curdat != None: + curdat = regex.match(lin) + if curdat != None: + x = float(curdat.group("xval")) 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 - if upside: - upper.append(Vector(x,y,0)) - else: - lower.append(Vector(x,y,0)) - last_x=x + coords.append(Vector(x,y,0)) + # End of if curdat != None # End of for lin in file afile.close() - - # reverse the lower side and append it to the upper to - # make the complete data be oriented clockwise - lower.reverse() - for i in lower: - upper.append(i) - # End of for i in lower - + + + + if len(coords) < 3: + print 'Did not find enough coordinates\n' + return + + # 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? if useDraftWire: - face = makeWire ( upper, True, None, True ) + obj = makeWire ( coords, True ) + #obj.label = airfoilname else: # alternate solution, uses common Part Faces lines = [] first_v = None last_v = None - for v in upper: + for v in coords: if first_v == None: first_v = v # End of if first_v == None @@ -139,7 +141,8 @@ def process(doc,filename): # End of if last_v != first_v wire = Part.Wire(lines) - face = Part.Face(wire) - Part.show(face) + face = Part.Face(wire) + obj = FreeCAD.ActiveDocument.addObject('Part::Feature',airfoilname) + obj.Shape = face doc.recompute()