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