Skip to content

Commit 5de56ab

Browse files
author
Jens M. Plonka
committed
Fix for Issue #75
1 parent 36574be commit 5de56ab

File tree

1 file changed

+74
-46
lines changed

1 file changed

+74
-46
lines changed

Acis.py

+74-46
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from importerUtils import *
1717
from FreeCAD import Vector as VEC, Placement as PLC, Matrix as MAT, Base
18-
from math import pi, fabs, degrees, asin, sin, cos, tan, atan2, ceil, e, cosh, sinh, tanh, acos, acosh, asin, asinh, atan, atanh, log, sqrt, exp, log10
18+
from math import inf, pi, fabs, degrees, asin, sin, cos, tan, atan2, ceil, e, cosh, sinh, tanh, acos, acosh, asin, asinh, atan, atanh, log, sqrt, exp, log10
1919
from importerConstants import MIN_0, MIN_PI, MIN_PI2, MIN_INF, MAX_2PI, MAX_PI, MAX_PI2, MAX_INF, MAX_LEN, CENTER, DIR_X, DIR_Y, DIR_Z, ENCODING_FS
2020

2121
V2D = Base.Vector2d
@@ -91,7 +91,7 @@ def __build_bool_enum__(false_value, true_value, true_key = 'T'):
9191
_nameMtchAttr = {}
9292
_dcIdxAttributes = {} # dict of an attribute list
9393

94-
LENGTH_TEXT = re.compile('[ \t]*(\d+) +(.*)')
94+
LENGTH_TEXT = re.compile('[ \t]*(\\d+) +(.*)')
9595

9696
TOKEN_TRANSLATIONS = {
9797
'0x0a': TAG_TRUE,
@@ -410,8 +410,11 @@ def getFloats(chunks, index, count):
410410
arr += chunk.val
411411
n += len(chunk.val)
412412
else:
413-
arr.append(float(chunk.val))
414-
n += 1
413+
try:
414+
arr.append(float(chunk.val))
415+
n += 1
416+
except Exception as ex:
417+
raise(ex)
415418
return arr, i
416419

417420
def getFloatsScaled(chunks, index, count):
@@ -890,7 +893,7 @@ def createBSplinesPCurve(pcurve, surface, sense):
890893
shape.Orientation = str('Reversed') if (sense == 'reversed') else str('Forward')
891894
return shape
892895

893-
def createBSplinesCurve(nubs, sense):
896+
def createBSplinesCurve(nubs, sense, subtype):
894897
if (nubs is None):
895898
return None
896899
number_of_poles = len(nubs.poles)
@@ -920,7 +923,7 @@ def createBSplinesCurve(nubs, sense):
920923
# periodic = nubs.uPeriodic
921924
shape = bsc.toShape()
922925
except Exception as e:
923-
logError(traceback.format_exc())
926+
logWarning("Can't create BSpline-Curve for suptype '%s'!" %(subtype))
924927
if (shape is not None):
925928
shape.Orientation = str('Reversed') if (sense == 'reversed') else str('Forward')
926929
return shape
@@ -1333,6 +1336,12 @@ def calcPoint(u, min_U, a, r_maj, r_min, handed, pitch):
13331336
return VEC(x, y, z)
13341337

13351338
def build(self):
1339+
# TODO: see InporterViewProvider._Coil._makeHelix(self, coil) instead:
1340+
# line = Part.Line(self.posCenter, self.posCenter + self.vecAxis)
1341+
# radius = line.projectPoint(self.Profile.Shape.CenterOfMass, "LowerDistance")
1342+
# helix = Part.makeLongHelix(slef.getPitch(), self.getHeight(), self.getRadius(), self.getApexAngle(), self.isLeftHanded())
1343+
# self.pathWires.append(helix)
1344+
13361345
min_U = self.radAngles.getLowerLimit()
13371346
max_U = self.radAngles.getUpperLimit()
13381347
r_maj = self.dirMajor.Length
@@ -1806,7 +1815,9 @@ def getLoop(self): return None if (self._loop is None) else self._loop.ent
18061815
def getParent(self): return None if (self._parent is None) else self._parent.entity
18071816
def getSurface(self):
18081817
if (self._surface):
1809-
return self._surface.entity.getSurface()
1818+
if (self._surface.entity.subtype == 'ref'):
1819+
return self._surface.entity.getSurface()
1820+
return self._surface.entity
18101821
return None
18111822
def buildCoEdges(self):
18121823
edges = []
@@ -1820,27 +1831,25 @@ def build(self):
18201831
self.__ready_to_build__ = False
18211832
edges = self.buildCoEdges()
18221833
if (self._surface):
1823-
_surface = self.getSurface()
1824-
if (_surface):
1825-
surface = self.getSurface().build()
1826-
if (surface):
1827-
if (self.sense == 'reversed'):
1828-
surface.reverse()
1829-
if (len(edges) > 0):
1830-
tolerance = 0.1
1831-
component, elements = surface.generalFuse(edges, tolerance)
1832-
faces = elements[0]
1833-
if (len(faces) == 0):
1834-
logWarning("Can't apply wires for face (no elements) for %s" %(self._surface))
1835-
else:
1836-
self.shape = eliminateOuterFaces(faces, edges)
1837-
if (self.shape is None):
1838-
# edges can be empty because not all edges can be created right now :(
1839-
logWarning("Can't apply wires for face %s!" %(surface.Surface))
1840-
for f in faces:
1841-
Part.show(f, "Face-%d" %(self.record.index))
1834+
surface = self.getSurface().build()
1835+
if (surface):
1836+
if (self.sense == 'reversed'):
1837+
surface.reverse()
1838+
if (len(edges) > 0):
1839+
tolerance = 0.1
1840+
component, elements = surface.generalFuse(edges, tolerance)
1841+
faces = elements[0]
1842+
if (len(faces) == 0):
1843+
logWarning("Can't apply wires for face (no elements) for %s" %(self._surface))
18421844
else:
1843-
self.shape = surface
1845+
self.shape = eliminateOuterFaces(faces, edges)
1846+
if (self.shape is None):
1847+
# edges can be empty because not all edges can be created right now :(
1848+
logWarning("Can't apply wires for face %s!" %(surface.Surface))
1849+
for f in faces:
1850+
Part.show(f, "Face-%d" %(self.record.index))
1851+
else:
1852+
self.shape = surface
18441853
return self.shape
18451854
def isCone(self): return isinstance(self.getSurface(), SurfaceCone)
18461855
def isMesh(self): return isinstance(self.getSurface(), SurfaceMesh)
@@ -2616,7 +2625,7 @@ def setSubtype(self, chunks, index):
26162625
def build(self, start=None, end=None):
26172626
if (self.__ready_to_build__):
26182627
self.__ready_to_build__ = False
2619-
self.shape = createBSplinesCurve(self.spline, self.sense)
2628+
self.shape = createBSplinesCurve(self.spline, self.sense, self.subtype)
26202629

26212630
if (self.subtype == 'ref'):
26222631
cur = self.curve
@@ -2772,11 +2781,17 @@ def build(self, start, end):
27722781
if (start is None):
27732782
start = self.root
27742783
elif (type(start) == float):
2775-
start = line.value(start)
2784+
if (start == inf or start == -inf):
2785+
start = self.root
2786+
else:
2787+
start = line.value(start)
27762788
if (end is None):
27772789
end = self.dir + self.root
27782790
elif (type(end) == float):
2779-
end = line.value(end)
2791+
if (end == inf or end == -inf):
2792+
end = self.root + self.dir
2793+
else:
2794+
end = line.value(end)
27802795
self.shape = createLine(start, end)
27812796
return self.shape
27822797

@@ -2809,6 +2824,7 @@ def __init__(self):
28092824
self.sense = 'forward'
28102825
self.urange = Interval(Range('I', MIN_0), Range('I', MAX_2PI))
28112826
self.vrange = Interval(Range('I', MIN_INF), Range('I', MAX_INF))
2827+
self.apex = None
28122828
def getSatTextGeometry(self, index):
28132829
if (getVersion() >= 4.0):
28142830
return "%s %s %s %g %s %g %g %g %s %s %s #" %(
@@ -2851,7 +2867,7 @@ def setSubtype(self, chunks, index):
28512867
self.sense, i = getEnumByTag(chunks, i, SENSE)
28522868
self.urange, i = getInterval(chunks, i, MIN_0, MAX_2PI, 1.0)
28532869
self.vrange, i = getInterval(chunks, i, MIN_INF, MAX_INF, getScale())
2854-
if (self.sine == 0.):
2870+
if (isEqual1D(self.sine, 0.)): # 90 Deg
28552871
self.apex = None
28562872
else:
28572873
h = self.major.Length / tan(asin(self.sine))
@@ -2968,10 +2984,12 @@ def __init__(self, data, values):
29682984
self._ec = []
29692985
self._0m = []
29702986
self._0g = []
2987+
self._100edges = []
29712988
self._100verts = []
29722989
self._105sym = []
29732990
self._105plane = []
29742991
self._105a = []
2992+
self._106ek = []
29752993
self._50000grip = []
29762994
def parse_degree(self): self.header[self.values[0]] = self.values[1]
29772995
def parse_cap_type(self): self.header[self.values[0]] = self.values[1]
@@ -2989,6 +3007,7 @@ def parse_l(self): self._l.append(self.values[1:])
29893007
def parse_ec(self): self._ec.append(self.values[1:])
29903008
def parse_0m(self): self._0m.append(self.values[1:])
29913009
def parse_0g(self): self._0g.append(self.values[1:])
3010+
def parse_100edges(self): self._100edges.append(self.values[1:])
29923011
def parse_100verts(self): self._100verts.append(self.values[1:])
29933012
def parse_105sym(self): self._105sym.append(self.values[1:])
29943013
def parse_105plane(self):
@@ -3017,6 +3036,8 @@ def parse_105a(self):
30173036
else:
30183037
r = [sub_type,] + self.values[2:] #
30193038
self._105a.append(r)
3039+
def parse_106ek(self):
3040+
self._106ek.append(self.values[1:])
30203041
def parse_50000grip(self): self._50000grip.append(self.values[1:])
30213042

30223043
def next_line(self):
@@ -3068,9 +3089,11 @@ def __str__(self): return "%s %s {%s ...}" %(self.__name__, SENSE.get(self.sense
30683089
def __repr__(self): return "%s %s {%s ...}" %(self.__name__, SENSE.get(self.sense, self.sense), self.subtype)
30693090
def _readLoftData(self, chunks, index):
30703091
ld = LoftData()
3071-
ld.surface, i = readSurface(chunks, index)
3092+
i = index
3093+
ld.surface, i = readSurface(chunks, i)
30723094
ld.bs2cur, i = readBS2Curve(chunks, i)
30733095
ld.e1, i = getBoolean(chunks, i)
3096+
if (isASM() and getAsmMajor() > 228): i += 1 # skip -1
30743097
subdata, i = readLofSubdata(chunks, i)
30753098
(ld.type, n, m, v) = subdata
30763099
ld.e2, i = getBoolean(chunks, i)
@@ -3374,11 +3397,10 @@ def setDefm(self, chunks, index, inventor):
33743397
v31, i = getFloat(chunks, i)
33753398
elif (t1 == 5):
33763399
self.surface, i = readSurface(chunks, i)
3400+
i32, i = getLong(chunks, i) # iEdidF{...}
33773401
e31, i = getBoolean(chunks, i)
33783402
f32, i = getFloat(chunks, i)
33793403
i33, i = getInteger(chunks, i)
3380-
if (getVersion() > 225) and isASM():
3381-
i34, i = getEnumByTag(chunks, i, [])
33823404
f34, i = getFloat(chunks, i)
33833405
self.curve = CurveInt()
33843406
i = self.curve.setSubtype(chunks, i)
@@ -3999,10 +4021,10 @@ def build(self, face = None):
39994021
else:
40004022
logError(" Can't create curve for revolution of (%r)" %(self.profile))
40014023
elif (self.subtype == 'sum_spl_sur'):
4002-
rngU = self.tolerance[2]
4024+
rngU = self.rangeU
40034025
curve1 = self.curve1.build(rngU.getLowerLimit(), rngU.getUpperLimit())
40044026
if (curve1 is not None):
4005-
rngV = self.tolerance[3]
4027+
rngV = self.rangeV
40064028
curve2 = self.curve2.build(rngV.getLowerLimit(), rngV.getUpperLimit())
40074029
if (curve2 is not None):
40084030
self.shape = Part.makeRuledSurface(curve1, curve2)
@@ -4051,6 +4073,7 @@ def __init__(self):
40514073
self.sensev = 'forward_v'
40524074
self.urange = Interval(Range('I', MIN_0), Range('I', MAX_2PI))
40534075
self.vrange = Interval(Range('I', MIN_0), Range('I', MAX_2PI))
4076+
self.profile = None
40544077
def getSatTextGeometry(self, index): return "%s %s %s %s %s %s %s %s #" %(vec2sat(self.center), vec2sat(self.axis), self.major, self.minor, vec2sat(self.uvorigin), self.sensev, self.urange, self.vrange)
40554078
def __repr__(self): return "Surface-Torus: center=%s, normal=%s, R=%g, r=%g, uvorigin=%s" %(self.center, self.axis, self.major, self.minor, self.uvorigin)
40564079
def setSubtype(self, chunks, index):
@@ -4959,13 +4982,6 @@ def __str__(self):
49594982
sat += "%g %g %g\n" %(self.scale, self.resabs, self.resnor)
49604983
return sat
49614984

4962-
def getNextText(data):
4963-
m = LENGTH_TEXT.match(data)
4964-
count = int(m.group(1))
4965-
text = m.group(2)[0:count]
4966-
remaining = m.group(2)[count+1:]
4967-
return text, remaining
4968-
49694985
def int2version(num):
49704986
return float("%d.%d" %(num / 100, num % 100))
49714987

@@ -5104,9 +5120,9 @@ def _readHeaderText(self):
51045120
self.header.flags = int(tokens[3])
51055121
if (self.version >= 2.0):
51065122
data = self._stream.readline()
5107-
self.header.prodId, data = getNextText(data)
5108-
self.header.prodVer, data = getNextText(data)
5109-
self.date, data = getNextText(data)
5123+
self.header.prodId, data = self._getNextText(data)
5124+
self.header.prodVer, data = self._getNextText(data)
5125+
self.date, data = self._getNextText(data)
51105126
data = self._stream.readline()
51115127
tokens = data.split(' ')
51125128
self.header.scale = fabs(float(tokens[0])) # prevent STEP importer from handling negative scales -> "Cannot compute Inventor representation for the shape of Part__Feature"
@@ -5292,6 +5308,18 @@ def readBinary(self):
52925308
setReader(self)
52935309
return True
52945310

5311+
def _getNextText(self, data):
5312+
i = 0
5313+
while (data[i].isdigit()):
5314+
i += 1
5315+
count = int(data[:i])
5316+
data = data[i+1:]
5317+
if (len(data) < count):
5318+
data = self._stream.readline()
5319+
text = data[0:count]
5320+
remaining = data[count+1:]
5321+
return text, remaining
5322+
52955323
class Record(object):
52965324
def __init__(self, name):
52975325
self.chunks = []

0 commit comments

Comments
 (0)