Merge branch 'master' into master

pull/2395/head
Kim Kulling 2019-03-30 18:27:41 +01:00 committed by GitHub
commit 5a85ceaf18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 844 additions and 842 deletions

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,7 @@ FORMATS = ["CSM",
"STL", "STL",
"IRR", "IRR",
"Q3O", "Q3O",
"Q3D" "Q3D",
"MS3D", "MS3D",
"Q3S", "Q3S",
"ZGL", "ZGL",

View File

@ -1,280 +1,279 @@
#-*- coding: UTF-8 -*- #-*- coding: UTF-8 -*-
""" """
Some fancy helper functions. Some fancy helper functions.
""" """
import os import os
import ctypes import ctypes
from ctypes import POINTER import operator
import operator
from distutils.sysconfig import get_python_lib
from distutils.sysconfig import get_python_lib import re
import re import sys
import sys
try: import numpy
try: import numpy except ImportError: numpy = None
except: numpy = None
import logging;logger = logging.getLogger("pyassimp")
import logging;logger = logging.getLogger("pyassimp")
from .errors import AssimpError
from .errors import AssimpError
additional_dirs, ext_whitelist = [],[]
additional_dirs, ext_whitelist = [],[]
# populate search directories and lists of allowed file extensions
# populate search directories and lists of allowed file extensions # depending on the platform we're running on.
# depending on the platform we're running on. if os.name=='posix':
if os.name=='posix': additional_dirs.append('./')
additional_dirs.append('./') additional_dirs.append('/usr/lib/')
additional_dirs.append('/usr/lib/') additional_dirs.append('/usr/lib/x86_64-linux-gnu/')
additional_dirs.append('/usr/lib/x86_64-linux-gnu/') additional_dirs.append('/usr/local/lib/')
additional_dirs.append('/usr/local/lib/')
if 'LD_LIBRARY_PATH' in os.environ:
if 'LD_LIBRARY_PATH' in os.environ: additional_dirs.extend([item for item in os.environ['LD_LIBRARY_PATH'].split(':') if item])
additional_dirs.extend([item for item in os.environ['LD_LIBRARY_PATH'].split(':') if item])
# check if running from anaconda.
# check if running from anaconda. if "conda" or "continuum" in sys.version.lower():
if "conda" or "continuum" in sys.version.lower(): cur_path = get_python_lib()
cur_path = get_python_lib() pattern = re.compile('.*\/lib\/')
pattern = re.compile('.*\/lib\/') conda_lib = pattern.match(cur_path).group()
conda_lib = pattern.match(cur_path).group() logger.info("Adding Anaconda lib path:"+ conda_lib)
logger.info("Adding Anaconda lib path:"+ conda_lib) additional_dirs.append(conda_lib)
additional_dirs.append(conda_lib)
# note - this won't catch libassimp.so.N.n, but
# note - this won't catch libassimp.so.N.n, but # currently there's always a symlink called
# currently there's always a symlink called # libassimp.so in /usr/local/lib.
# libassimp.so in /usr/local/lib. ext_whitelist.append('.so')
ext_whitelist.append('.so') # libassimp.dylib in /usr/local/lib
# libassimp.dylib in /usr/local/lib ext_whitelist.append('.dylib')
ext_whitelist.append('.dylib')
elif os.name=='nt':
elif os.name=='nt': ext_whitelist.append('.dll')
ext_whitelist.append('.dll') path_dirs = os.environ['PATH'].split(';')
path_dirs = os.environ['PATH'].split(';') additional_dirs.extend(path_dirs)
additional_dirs.extend(path_dirs)
def vec2tuple(x):
def vec2tuple(x): """ Converts a VECTOR3D to a Tuple """
""" Converts a VECTOR3D to a Tuple """ return (x.x, x.y, x.z)
return (x.x, x.y, x.z)
def transform(vector3, matrix4x4):
def transform(vector3, matrix4x4): """ Apply a transformation matrix on a 3D vector.
""" Apply a transformation matrix on a 3D vector.
:param vector3: array with 3 elements
:param vector3: array with 3 elements :param matrix4x4: 4x4 matrix
:param matrix4x4: 4x4 matrix """
""" if numpy:
if numpy: return numpy.dot(matrix4x4, numpy.append(vector3, 1.))
return numpy.dot(matrix4x4, numpy.append(vector3, 1.)) else:
else: m0,m1,m2,m3 = matrix4x4; x,y,z = vector3
m0,m1,m2,m3 = matrix4x4; x,y,z = vector3 return [
return [ m0[0]*x + m0[1]*y + m0[2]*z + m0[3],
m0[0]*x + m0[1]*y + m0[2]*z + m0[3], m1[0]*x + m1[1]*y + m1[2]*z + m1[3],
m1[0]*x + m1[1]*y + m1[2]*z + m1[3], m2[0]*x + m2[1]*y + m2[2]*z + m2[3],
m2[0]*x + m2[1]*y + m2[2]*z + m2[3], m3[0]*x + m3[1]*y + m3[2]*z + m3[3]
m3[0]*x + m3[1]*y + m3[2]*z + m3[3] ]
]
def _inv(matrix4x4):
def _inv(matrix4x4): m0,m1,m2,m3 = matrix4x4
m0,m1,m2,m3 = matrix4x4
det = m0[3]*m1[2]*m2[1]*m3[0] - m0[2]*m1[3]*m2[1]*m3[0] - \
det = m0[3]*m1[2]*m2[1]*m3[0] - m0[2]*m1[3]*m2[1]*m3[0] - \ m0[3]*m1[1]*m2[2]*m3[0] + m0[1]*m1[3]*m2[2]*m3[0] + \
m0[3]*m1[1]*m2[2]*m3[0] + m0[1]*m1[3]*m2[2]*m3[0] + \ m0[2]*m1[1]*m2[3]*m3[0] - m0[1]*m1[2]*m2[3]*m3[0] - \
m0[2]*m1[1]*m2[3]*m3[0] - m0[1]*m1[2]*m2[3]*m3[0] - \ m0[3]*m1[2]*m2[0]*m3[1] + m0[2]*m1[3]*m2[0]*m3[1] + \
m0[3]*m1[2]*m2[0]*m3[1] + m0[2]*m1[3]*m2[0]*m3[1] + \ m0[3]*m1[0]*m2[2]*m3[1] - m0[0]*m1[3]*m2[2]*m3[1] - \
m0[3]*m1[0]*m2[2]*m3[1] - m0[0]*m1[3]*m2[2]*m3[1] - \ m0[2]*m1[0]*m2[3]*m3[1] + m0[0]*m1[2]*m2[3]*m3[1] + \
m0[2]*m1[0]*m2[3]*m3[1] + m0[0]*m1[2]*m2[3]*m3[1] + \ m0[3]*m1[1]*m2[0]*m3[2] - m0[1]*m1[3]*m2[0]*m3[2] - \
m0[3]*m1[1]*m2[0]*m3[2] - m0[1]*m1[3]*m2[0]*m3[2] - \ m0[3]*m1[0]*m2[1]*m3[2] + m0[0]*m1[3]*m2[1]*m3[2] + \
m0[3]*m1[0]*m2[1]*m3[2] + m0[0]*m1[3]*m2[1]*m3[2] + \ m0[1]*m1[0]*m2[3]*m3[2] - m0[0]*m1[1]*m2[3]*m3[2] - \
m0[1]*m1[0]*m2[3]*m3[2] - m0[0]*m1[1]*m2[3]*m3[2] - \ m0[2]*m1[1]*m2[0]*m3[3] + m0[1]*m1[2]*m2[0]*m3[3] + \
m0[2]*m1[1]*m2[0]*m3[3] + m0[1]*m1[2]*m2[0]*m3[3] + \ m0[2]*m1[0]*m2[1]*m3[3] - m0[0]*m1[2]*m2[1]*m3[3] - \
m0[2]*m1[0]*m2[1]*m3[3] - m0[0]*m1[2]*m2[1]*m3[3] - \ m0[1]*m1[0]*m2[2]*m3[3] + m0[0]*m1[1]*m2[2]*m3[3]
m0[1]*m1[0]*m2[2]*m3[3] + m0[0]*m1[1]*m2[2]*m3[3]
return[[( m1[2]*m2[3]*m3[1] - m1[3]*m2[2]*m3[1] + m1[3]*m2[1]*m3[2] - m1[1]*m2[3]*m3[2] - m1[2]*m2[1]*m3[3] + m1[1]*m2[2]*m3[3]) /det,
return[[( m1[2]*m2[3]*m3[1] - m1[3]*m2[2]*m3[1] + m1[3]*m2[1]*m3[2] - m1[1]*m2[3]*m3[2] - m1[2]*m2[1]*m3[3] + m1[1]*m2[2]*m3[3]) /det, ( m0[3]*m2[2]*m3[1] - m0[2]*m2[3]*m3[1] - m0[3]*m2[1]*m3[2] + m0[1]*m2[3]*m3[2] + m0[2]*m2[1]*m3[3] - m0[1]*m2[2]*m3[3]) /det,
( m0[3]*m2[2]*m3[1] - m0[2]*m2[3]*m3[1] - m0[3]*m2[1]*m3[2] + m0[1]*m2[3]*m3[2] + m0[2]*m2[1]*m3[3] - m0[1]*m2[2]*m3[3]) /det, ( m0[2]*m1[3]*m3[1] - m0[3]*m1[2]*m3[1] + m0[3]*m1[1]*m3[2] - m0[1]*m1[3]*m3[2] - m0[2]*m1[1]*m3[3] + m0[1]*m1[2]*m3[3]) /det,
( m0[2]*m1[3]*m3[1] - m0[3]*m1[2]*m3[1] + m0[3]*m1[1]*m3[2] - m0[1]*m1[3]*m3[2] - m0[2]*m1[1]*m3[3] + m0[1]*m1[2]*m3[3]) /det, ( m0[3]*m1[2]*m2[1] - m0[2]*m1[3]*m2[1] - m0[3]*m1[1]*m2[2] + m0[1]*m1[3]*m2[2] + m0[2]*m1[1]*m2[3] - m0[1]*m1[2]*m2[3]) /det],
( m0[3]*m1[2]*m2[1] - m0[2]*m1[3]*m2[1] - m0[3]*m1[1]*m2[2] + m0[1]*m1[3]*m2[2] + m0[2]*m1[1]*m2[3] - m0[1]*m1[2]*m2[3]) /det], [( m1[3]*m2[2]*m3[0] - m1[2]*m2[3]*m3[0] - m1[3]*m2[0]*m3[2] + m1[0]*m2[3]*m3[2] + m1[2]*m2[0]*m3[3] - m1[0]*m2[2]*m3[3]) /det,
[( m1[3]*m2[2]*m3[0] - m1[2]*m2[3]*m3[0] - m1[3]*m2[0]*m3[2] + m1[0]*m2[3]*m3[2] + m1[2]*m2[0]*m3[3] - m1[0]*m2[2]*m3[3]) /det, ( m0[2]*m2[3]*m3[0] - m0[3]*m2[2]*m3[0] + m0[3]*m2[0]*m3[2] - m0[0]*m2[3]*m3[2] - m0[2]*m2[0]*m3[3] + m0[0]*m2[2]*m3[3]) /det,
( m0[2]*m2[3]*m3[0] - m0[3]*m2[2]*m3[0] + m0[3]*m2[0]*m3[2] - m0[0]*m2[3]*m3[2] - m0[2]*m2[0]*m3[3] + m0[0]*m2[2]*m3[3]) /det, ( m0[3]*m1[2]*m3[0] - m0[2]*m1[3]*m3[0] - m0[3]*m1[0]*m3[2] + m0[0]*m1[3]*m3[2] + m0[2]*m1[0]*m3[3] - m0[0]*m1[2]*m3[3]) /det,
( m0[3]*m1[2]*m3[0] - m0[2]*m1[3]*m3[0] - m0[3]*m1[0]*m3[2] + m0[0]*m1[3]*m3[2] + m0[2]*m1[0]*m3[3] - m0[0]*m1[2]*m3[3]) /det, ( m0[2]*m1[3]*m2[0] - m0[3]*m1[2]*m2[0] + m0[3]*m1[0]*m2[2] - m0[0]*m1[3]*m2[2] - m0[2]*m1[0]*m2[3] + m0[0]*m1[2]*m2[3]) /det],
( m0[2]*m1[3]*m2[0] - m0[3]*m1[2]*m2[0] + m0[3]*m1[0]*m2[2] - m0[0]*m1[3]*m2[2] - m0[2]*m1[0]*m2[3] + m0[0]*m1[2]*m2[3]) /det], [( m1[1]*m2[3]*m3[0] - m1[3]*m2[1]*m3[0] + m1[3]*m2[0]*m3[1] - m1[0]*m2[3]*m3[1] - m1[1]*m2[0]*m3[3] + m1[0]*m2[1]*m3[3]) /det,
[( m1[1]*m2[3]*m3[0] - m1[3]*m2[1]*m3[0] + m1[3]*m2[0]*m3[1] - m1[0]*m2[3]*m3[1] - m1[1]*m2[0]*m3[3] + m1[0]*m2[1]*m3[3]) /det, ( m0[3]*m2[1]*m3[0] - m0[1]*m2[3]*m3[0] - m0[3]*m2[0]*m3[1] + m0[0]*m2[3]*m3[1] + m0[1]*m2[0]*m3[3] - m0[0]*m2[1]*m3[3]) /det,
( m0[3]*m2[1]*m3[0] - m0[1]*m2[3]*m3[0] - m0[3]*m2[0]*m3[1] + m0[0]*m2[3]*m3[1] + m0[1]*m2[0]*m3[3] - m0[0]*m2[1]*m3[3]) /det, ( m0[1]*m1[3]*m3[0] - m0[3]*m1[1]*m3[0] + m0[3]*m1[0]*m3[1] - m0[0]*m1[3]*m3[1] - m0[1]*m1[0]*m3[3] + m0[0]*m1[1]*m3[3]) /det,
( m0[1]*m1[3]*m3[0] - m0[3]*m1[1]*m3[0] + m0[3]*m1[0]*m3[1] - m0[0]*m1[3]*m3[1] - m0[1]*m1[0]*m3[3] + m0[0]*m1[1]*m3[3]) /det, ( m0[3]*m1[1]*m2[0] - m0[1]*m1[3]*m2[0] - m0[3]*m1[0]*m2[1] + m0[0]*m1[3]*m2[1] + m0[1]*m1[0]*m2[3] - m0[0]*m1[1]*m2[3]) /det],
( m0[3]*m1[1]*m2[0] - m0[1]*m1[3]*m2[0] - m0[3]*m1[0]*m2[1] + m0[0]*m1[3]*m2[1] + m0[1]*m1[0]*m2[3] - m0[0]*m1[1]*m2[3]) /det], [( m1[2]*m2[1]*m3[0] - m1[1]*m2[2]*m3[0] - m1[2]*m2[0]*m3[1] + m1[0]*m2[2]*m3[1] + m1[1]*m2[0]*m3[2] - m1[0]*m2[1]*m3[2]) /det,
[( m1[2]*m2[1]*m3[0] - m1[1]*m2[2]*m3[0] - m1[2]*m2[0]*m3[1] + m1[0]*m2[2]*m3[1] + m1[1]*m2[0]*m3[2] - m1[0]*m2[1]*m3[2]) /det, ( m0[1]*m2[2]*m3[0] - m0[2]*m2[1]*m3[0] + m0[2]*m2[0]*m3[1] - m0[0]*m2[2]*m3[1] - m0[1]*m2[0]*m3[2] + m0[0]*m2[1]*m3[2]) /det,
( m0[1]*m2[2]*m3[0] - m0[2]*m2[1]*m3[0] + m0[2]*m2[0]*m3[1] - m0[0]*m2[2]*m3[1] - m0[1]*m2[0]*m3[2] + m0[0]*m2[1]*m3[2]) /det, ( m0[2]*m1[1]*m3[0] - m0[1]*m1[2]*m3[0] - m0[2]*m1[0]*m3[1] + m0[0]*m1[2]*m3[1] + m0[1]*m1[0]*m3[2] - m0[0]*m1[1]*m3[2]) /det,
( m0[2]*m1[1]*m3[0] - m0[1]*m1[2]*m3[0] - m0[2]*m1[0]*m3[1] + m0[0]*m1[2]*m3[1] + m0[1]*m1[0]*m3[2] - m0[0]*m1[1]*m3[2]) /det, ( m0[1]*m1[2]*m2[0] - m0[2]*m1[1]*m2[0] + m0[2]*m1[0]*m2[1] - m0[0]*m1[2]*m2[1] - m0[1]*m1[0]*m2[2] + m0[0]*m1[1]*m2[2]) /det]]
( m0[1]*m1[2]*m2[0] - m0[2]*m1[1]*m2[0] + m0[2]*m1[0]*m2[1] - m0[0]*m1[2]*m2[1] - m0[1]*m1[0]*m2[2] + m0[0]*m1[1]*m2[2]) /det]]
def get_bounding_box(scene):
def get_bounding_box(scene): bb_min = [1e10, 1e10, 1e10] # x,y,z
bb_min = [1e10, 1e10, 1e10] # x,y,z bb_max = [-1e10, -1e10, -1e10] # x,y,z
bb_max = [-1e10, -1e10, -1e10] # x,y,z inv = numpy.linalg.inv if numpy else _inv
inv = numpy.linalg.inv if numpy else _inv return get_bounding_box_for_node(scene.rootnode, bb_min, bb_max, inv(scene.rootnode.transformation))
return get_bounding_box_for_node(scene.rootnode, bb_min, bb_max, inv(scene.rootnode.transformation))
def get_bounding_box_for_node(node, bb_min, bb_max, transformation):
def get_bounding_box_for_node(node, bb_min, bb_max, transformation):
if numpy:
if numpy: transformation = numpy.dot(transformation, node.transformation)
transformation = numpy.dot(transformation, node.transformation) else:
else: t0,t1,t2,t3 = transformation
t0,t1,t2,t3 = transformation T0,T1,T2,T3 = node.transformation
T0,T1,T2,T3 = node.transformation transformation = [ [
transformation = [ [ t0[0]*T0[0] + t0[1]*T1[0] + t0[2]*T2[0] + t0[3]*T3[0],
t0[0]*T0[0] + t0[1]*T1[0] + t0[2]*T2[0] + t0[3]*T3[0], t0[0]*T0[1] + t0[1]*T1[1] + t0[2]*T2[1] + t0[3]*T3[1],
t0[0]*T0[1] + t0[1]*T1[1] + t0[2]*T2[1] + t0[3]*T3[1], t0[0]*T0[2] + t0[1]*T1[2] + t0[2]*T2[2] + t0[3]*T3[2],
t0[0]*T0[2] + t0[1]*T1[2] + t0[2]*T2[2] + t0[3]*T3[2], t0[0]*T0[3] + t0[1]*T1[3] + t0[2]*T2[3] + t0[3]*T3[3]
t0[0]*T0[3] + t0[1]*T1[3] + t0[2]*T2[3] + t0[3]*T3[3] ],[
],[ t1[0]*T0[0] + t1[1]*T1[0] + t1[2]*T2[0] + t1[3]*T3[0],
t1[0]*T0[0] + t1[1]*T1[0] + t1[2]*T2[0] + t1[3]*T3[0], t1[0]*T0[1] + t1[1]*T1[1] + t1[2]*T2[1] + t1[3]*T3[1],
t1[0]*T0[1] + t1[1]*T1[1] + t1[2]*T2[1] + t1[3]*T3[1], t1[0]*T0[2] + t1[1]*T1[2] + t1[2]*T2[2] + t1[3]*T3[2],
t1[0]*T0[2] + t1[1]*T1[2] + t1[2]*T2[2] + t1[3]*T3[2], t1[0]*T0[3] + t1[1]*T1[3] + t1[2]*T2[3] + t1[3]*T3[3]
t1[0]*T0[3] + t1[1]*T1[3] + t1[2]*T2[3] + t1[3]*T3[3] ],[
],[ t2[0]*T0[0] + t2[1]*T1[0] + t2[2]*T2[0] + t2[3]*T3[0],
t2[0]*T0[0] + t2[1]*T1[0] + t2[2]*T2[0] + t2[3]*T3[0], t2[0]*T0[1] + t2[1]*T1[1] + t2[2]*T2[1] + t2[3]*T3[1],
t2[0]*T0[1] + t2[1]*T1[1] + t2[2]*T2[1] + t2[3]*T3[1], t2[0]*T0[2] + t2[1]*T1[2] + t2[2]*T2[2] + t2[3]*T3[2],
t2[0]*T0[2] + t2[1]*T1[2] + t2[2]*T2[2] + t2[3]*T3[2], t2[0]*T0[3] + t2[1]*T1[3] + t2[2]*T2[3] + t2[3]*T3[3]
t2[0]*T0[3] + t2[1]*T1[3] + t2[2]*T2[3] + t2[3]*T3[3] ],[
],[ t3[0]*T0[0] + t3[1]*T1[0] + t3[2]*T2[0] + t3[3]*T3[0],
t3[0]*T0[0] + t3[1]*T1[0] + t3[2]*T2[0] + t3[3]*T3[0], t3[0]*T0[1] + t3[1]*T1[1] + t3[2]*T2[1] + t3[3]*T3[1],
t3[0]*T0[1] + t3[1]*T1[1] + t3[2]*T2[1] + t3[3]*T3[1], t3[0]*T0[2] + t3[1]*T1[2] + t3[2]*T2[2] + t3[3]*T3[2],
t3[0]*T0[2] + t3[1]*T1[2] + t3[2]*T2[2] + t3[3]*T3[2], t3[0]*T0[3] + t3[1]*T1[3] + t3[2]*T2[3] + t3[3]*T3[3]
t3[0]*T0[3] + t3[1]*T1[3] + t3[2]*T2[3] + t3[3]*T3[3] ] ]
] ]
for mesh in node.meshes:
for mesh in node.meshes: for v in mesh.vertices:
for v in mesh.vertices: v = transform(v, transformation)
v = transform(v, transformation) bb_min[0] = min(bb_min[0], v[0])
bb_min[0] = min(bb_min[0], v[0]) bb_min[1] = min(bb_min[1], v[1])
bb_min[1] = min(bb_min[1], v[1]) bb_min[2] = min(bb_min[2], v[2])
bb_min[2] = min(bb_min[2], v[2]) bb_max[0] = max(bb_max[0], v[0])
bb_max[0] = max(bb_max[0], v[0]) bb_max[1] = max(bb_max[1], v[1])
bb_max[1] = max(bb_max[1], v[1]) bb_max[2] = max(bb_max[2], v[2])
bb_max[2] = max(bb_max[2], v[2])
for child in node.children:
for child in node.children: bb_min, bb_max = get_bounding_box_for_node(child, bb_min, bb_max, transformation)
bb_min, bb_max = get_bounding_box_for_node(child, bb_min, bb_max, transformation)
return bb_min, bb_max
return bb_min, bb_max
def try_load_functions(library_path, dll):
def try_load_functions(library_path, dll): '''
''' Try to bind to aiImportFile and aiReleaseImport
Try to bind to aiImportFile and aiReleaseImport
Arguments
Arguments ---------
--------- library_path: path to current lib
library_path: path to current lib dll: ctypes handle to library
dll: ctypes handle to library
Returns
Returns ---------
--------- If unsuccessful:
If unsuccessful: None
None If successful:
If successful: Tuple containing (library_path,
Tuple containing (library_path, load from filename function,
load from filename function, load from memory function,
load from memory function, export to filename function,
export to filename function, export to blob function,
export to blob function, release function,
release function, ctypes handle to assimp library)
ctypes handle to assimp library) '''
'''
try:
try: load = dll.aiImportFile
load = dll.aiImportFile release = dll.aiReleaseImport
release = dll.aiReleaseImport load_mem = dll.aiImportFileFromMemory
load_mem = dll.aiImportFileFromMemory export = dll.aiExportScene
export = dll.aiExportScene export2blob = dll.aiExportSceneToBlob
export2blob = dll.aiExportSceneToBlob except AttributeError:
except AttributeError: #OK, this is a library, but it doesn't have the functions we need
#OK, this is a library, but it doesn't have the functions we need return None
return None
# library found!
# library found! from .structs import Scene, ExportDataBlob
from .structs import Scene, ExportDataBlob load.restype = ctype.POINTER(Scene)
load.restype = POINTER(Scene) load_mem.restype = ctype.POINTER(Scene)
load_mem.restype = POINTER(Scene) export2blob.restype = ctype.POINTER(ExportDataBlob)
export2blob.restype = POINTER(ExportDataBlob) return (library_path, load, load_mem, export, export2blob, release, dll)
return (library_path, load, load_mem, export, export2blob, release, dll)
def search_library():
def search_library(): '''
''' Loads the assimp library.
Loads the assimp library. Throws exception AssimpError if no library_path is found
Throws exception AssimpError if no library_path is found
Returns: tuple, (load from filename function,
Returns: tuple, (load from filename function, load from memory function,
load from memory function, export to filename function,
export to filename function, export to blob function,
export to blob function, release function,
release function, dll)
dll) '''
''' #this path
#this path folder = os.path.dirname(__file__)
folder = os.path.dirname(__file__)
# silence 'DLL not found' message boxes on win
# silence 'DLL not found' message boxes on win try:
try: ctypes.windll.kernel32.SetErrorMode(0x8007)
ctypes.windll.kernel32.SetErrorMode(0x8007) except AttributeError:
except AttributeError: pass
pass
candidates = []
candidates = [] # test every file
# test every file for curfolder in [folder]+additional_dirs:
for curfolder in [folder]+additional_dirs: if os.path.isdir(curfolder):
if os.path.isdir(curfolder): for filename in os.listdir(curfolder):
for filename in os.listdir(curfolder): # our minimum requirement for candidates is that
# our minimum requirement for candidates is that # they should contain 'assimp' somewhere in
# they should contain 'assimp' somewhere in # their name
# their name if filename.lower().find('assimp')==-1 :
if filename.lower().find('assimp')==-1 : continue
continue is_out=1
is_out=1 for et in ext_whitelist:
for et in ext_whitelist: if et in filename.lower():
if et in filename.lower(): is_out=0
is_out=0 break
break if is_out:
if is_out: continue
continue
library_path = os.path.join(curfolder, filename)
library_path = os.path.join(curfolder, filename) logger.debug('Try ' + library_path)
logger.debug('Try ' + library_path) try:
try: dll = ctypes.cdll.LoadLibrary(library_path)
dll = ctypes.cdll.LoadLibrary(library_path) except Exception as e:
except Exception as e: logger.warning(str(e))
logger.warning(str(e)) # OK, this except is evil. But different OSs will throw different
# OK, this except is evil. But different OSs will throw different # errors. So just ignore any errors.
# errors. So just ignore any errors. continue
continue # see if the functions we need are in the dll
# see if the functions we need are in the dll loaded = try_load_functions(library_path, dll)
loaded = try_load_functions(library_path, dll) if loaded: candidates.append(loaded)
if loaded: candidates.append(loaded)
if not candidates:
if not candidates: # no library found
# no library found raise AssimpError("assimp library not found")
raise AssimpError("assimp library not found") else:
else: # get the newest library_path
# get the newest library_path candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates) res = max(candidates, key=operator.itemgetter(0))[1]
res = max(candidates, key=operator.itemgetter(0))[1] logger.debug('Using assimp library located at ' + res[0])
logger.debug('Using assimp library located at ' + res[0])
# XXX: if there are 1000 dll/so files containing 'assimp'
# XXX: if there are 1000 dll/so files containing 'assimp' # in their name, do we have all of them in our address
# in their name, do we have all of them in our address # space now until gc kicks in?
# space now until gc kicks in?
# XXX: take version postfix of the .so on linux?
# XXX: take version postfix of the .so on linux? return res[1:]
return res[1:]
def hasattr_silent(object, name):
def hasattr_silent(object, name): """
""" Calls hasttr() with the given parameters and preserves the legacy (pre-Python 3.2)
Calls hasttr() with the given parameters and preserves the legacy (pre-Python 3.2) functionality of silently catching exceptions.
functionality of silently catching exceptions.
Returns the result of hasatter() or False if an exception was raised.
Returns the result of hasatter() or False if an exception was raised. """
"""
try:
try: return hasattr(object, name)
return hasattr(object, name) except AttributeError:
except: return False
return False

View File

@ -435,6 +435,7 @@ aiProcess_Debone = 0x4000000
aiProcess_GenEntityMeshes = 0x100000 aiProcess_GenEntityMeshes = 0x100000
aiProcess_OptimizeAnimations = 0x200000 aiProcess_OptimizeAnimations = 0x200000
aiProcess_FixTexturePaths = 0x200000 aiProcess_FixTexturePaths = 0x200000
aiProcess_EmbedTextures = 0x10000000,
## @def aiProcess_ConvertToLeftHanded ## @def aiProcess_ConvertToLeftHanded
# @brief Shortcut flag for Direct3D-based applications. # @brief Shortcut flag for Direct3D-based applications.

View File

@ -1,6 +1,6 @@
#-*- coding: UTF-8 -*- #-*- coding: UTF-8 -*-
from ctypes import POINTER, c_void_p, c_int, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte, c_size_t, c_uint32 from ctypes import POINTER, c_void_p, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte, c_size_t, c_uint32
class Vector2D(Structure): class Vector2D(Structure):
@ -70,7 +70,7 @@ class String(Structure):
See 'types.h' for details. See 'types.h' for details.
""" """
MAXLEN = 1024 MAXLEN = 1024
_fields_ = [ _fields_ = [
# Binary length of the string excluding the terminal 0. This is NOT the # Binary length of the string excluding the terminal 0. This is NOT the

View File

@ -24,12 +24,13 @@ This sample is based on several sources, including:
- ASSIMP's C++ SimpleOpenGL viewer - ASSIMP's C++ SimpleOpenGL viewer
""" """
import os, sys import sys
from OpenGL.GLUT import * from OpenGL.GLUT import *
from OpenGL.GLU import * from OpenGL.GLU import *
from OpenGL.GL import * from OpenGL.GL import *
import logging;logger = logging.getLogger("pyassimp_opengl") import logging
logger = logging.getLogger("pyassimp_opengl")
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
import math import math

View File

@ -5,7 +5,7 @@
This module demonstrates the functionality of PyAssimp. This module demonstrates the functionality of PyAssimp.
""" """
import os, sys import sys
import logging import logging
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
@ -50,8 +50,8 @@ def main(filename=None):
print(" colors:" + str(len(mesh.colors))) print(" colors:" + str(len(mesh.colors)))
tcs = mesh.texturecoords tcs = mesh.texturecoords
if tcs.any(): if tcs.any():
for index, tc in enumerate(tcs): for tc_index, tc in enumerate(tcs):
print(" texture-coords "+ str(index) + ":" + str(len(tcs[index])) + "first3:" + str(tcs[index][:3])) print(" texture-coords "+ str(tc_index) + ":" + str(len(tcs[tc_index])) + "first3:" + str(tcs[tc_index][:3]))
else: else:
print(" no texture coordinates") print(" no texture coordinates")

View File

@ -291,7 +291,9 @@ def main():
#s += "#endif\n" #s += "#endif\n"
output.write(templt.replace("<HERE>",s)) output.write(templt.replace("<HERE>",s))
# we got here, so no error
return 0
if __name__ == "__main__": if __name__ == "__main__":
sys.exit(main()) sys.exit(main())

View File

@ -151,11 +151,8 @@ def handle_unset_args(field,entity,schema,argnum):
return n+template_allow_optional.format() return n+template_allow_optional.format()
def get_single_conversion(field,schema,argnum=0,classname='?'): def get_single_conversion(field,schema,argnum=0,classname='?'):
typen = field.type
name = field.name name = field.name
if field.collection: return template_convert_single.format(name=name,argnum=argnum,classname=classname,full_type=field.fullspec)
typen = 'LIST'
return template_convert_single.format(type=typen,name=name,argnum=argnum,classname=classname,full_type=field.fullspec)
def count_args_up(entity,schema): def count_args_up(entity,schema):
return len(entity.members) + (count_args_up(schema.entities[entity.parent],schema) if entity.parent else 0) return len(entity.members) + (count_args_up(schema.entities[entity.parent],schema) if entity.parent else 0)
@ -218,7 +215,7 @@ def get_derived(e,schema):
return res return res
def get_hierarchy(e,schema): def get_hierarchy(e,schema):
return get_derived(e.schema)+[e.name]+get_base_classes(e,schema) return get_derived(e, schema)+[e.name]+get_base_classes(e,schema)
def sort_entity_list(schema): def sort_entity_list(schema):
deps = [] deps = []
@ -300,5 +297,8 @@ def work(filename):
with open(output_file_cpp,'wt') as outp: with open(output_file_cpp,'wt') as outp:
outp.write(inp.read().replace('{schema-static-table}',schema_table).replace('{converter-impl}',converters)) outp.write(inp.read().replace('{schema-static-table}',schema_table).replace('{converter-impl}',converters))
# Finished without error, so return 0
return 0
if __name__ == "__main__": if __name__ == "__main__":
sys.exit(work(sys.argv[1] if len(sys.argv)>1 else 'schema.exp')) sys.exit(work(sys.argv[1] if len(sys.argv)>1 else 'schema.exp'))

View File

@ -43,7 +43,8 @@
"""Parse an EXPRESS file and extract basic information on all """Parse an EXPRESS file and extract basic information on all
entities and data types contained""" entities and data types contained"""
import sys, os, re import sys
import re
from collections import OrderedDict from collections import OrderedDict
re_match_entity = re.compile(r""" re_match_entity = re.compile(r"""