Source code for woo._monkey.gts
'''
This module reimplements the gts.read function in python, since it is stragenly broken under windows, and replaces the original one by monkey-patching.
'''
[docs]def py_gts_read(f):
'''Pure-python implementation of the pygts._gts.read function; it hangs under Windows
when using woo.gts (not pure pygts), in gts-0.7.6/src/misc.c:173 in next_char, where
fgetc is waiting for the next character indefinitely (why?); when fgetc was replaced by lower-level read(fileno,buf,1), GTS was complaining about not seeing the first integer
(number of vertices) at the beginning of the file.
Since there seemed little point digging into GTS any further, this monkey-patch
replaces that function with a pure-python implementation, which is perhaps not as
efficient, but works reliably under Windows.
The patch is only applied under Windows, and if 'gts' is in woo.config.features
(i.e. the module woo.gts exists, and is also exposed as gts).
'''
import woo.gts
lineno=1
surf=woo.gts.Surface()
#nVert,nEdge,nFace=0,0,0
try:
l1=f.readline()[:-1].split()
nVert,nEdge,nFace=int(l1[0]),int(l1[1]),int(l1[2])
if l1[3:]!=['GtsSurface','GtsFace','GtsEdge','GtsVertex']: sys.stderr.write('Warning: expected "GtsSurface GtsFace GtsEdge GtsVertex" at the end of line 1; ignoring.\n')
except: raise RuntimeError('Error reading GTS header (number of vertices, edges, faces), line %d'%lineno)
vv,ee=[],[]
for vn in range(0,nVert):
lineno+=1
try:
vv.append(woo.gts.Vertex(*tuple([float(x) for x in f.readline()[:-1].split()])))
except: raise RuntimeError('Error reading vertex no. %d, line %d'%(vn,lineno))
assert len(vv)==nVert
for en in range(0,nEdge):
lineno+=1
try:
n=[int(i) for i in f.readline()[:-1].split()]
assert len(n)==2
ee.append(woo.gts.Edge(vv[n[0]-1],vv[n[1]-1]))
except: raise RuntimeError('Error reading edge no. %d, line %d'%(en,lineno))
assert len(ee)==nEdge
for fn in range(0,nFace):
lineno+=1
try:
n=[int(i) for i in f.readline()[:-1].split()]
assert len(n)==3
except:
raise RuntimeError('Error reading face no. %d, line %d'%(fn,lineno))
surf.add(woo.gts.Face(ee[n[0]-1],ee[n[1]-1],ee[n[2]-1]))
return surf
import woo.config, sys
if 'gts' in woo.config.features and sys.platform=='win32':
import woo.gts
woo.gts.read=py_gts_read