improves airfoil import
This commit is contained in:
parent
efc311f908
commit
7ab2d7ec49
|
@ -26,7 +26,7 @@ __author__ = "Heiko Jakob <heiko.jakob@gediegos.de>"
|
|||
|
||||
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<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')
|
||||
# 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)
|
||||
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
|
||||
|
@ -140,6 +142,7 @@ def process(doc,filename):
|
|||
|
||||
wire = Part.Wire(lines)
|
||||
face = Part.Face(wire)
|
||||
Part.show(face)
|
||||
obj = FreeCAD.ActiveDocument.addObject('Part::Feature',airfoilname)
|
||||
obj.Shape = face
|
||||
|
||||
doc.recompute()
|
||||
|
|
Loading…
Reference in New Issue
Block a user