assimp/port/PyAssimp/pyassimp/helper.py

119 lines
3.3 KiB
Python
Raw Normal View History

#-*- coding: UTF-8 -*-
"""
Some fancy helper functions.
"""
import os
import ctypes
import structs
import operator
from errors import AssimpError
from ctypes import POINTER
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':
additional_dirs.append('/usr/local/lib/')
# note - this won't catch libassimp.so.N.n, but
# currently there's always a symlink called
# libassimp.so in /usr/local/lib.
ext_whitelist.append('.so')
elif os.name=='nt':
ext_whitelist.append('.dll')
print(additional_dirs)
def vec2tuple(x):
""" Converts a VECTOR3D to a Tuple """
return (x.x, x.y, x.z)
def try_load_functions(library,dll,candidates):
"""try to functbind to aiImportFile and aiReleaseImport
library - path to current lib
dll - ctypes handle to it
candidates - receives matching candidates
They serve as signal functions to detect assimp,
also they're currently the only functions we need.
insert (library,aiImportFile,aiReleaseImport,dll)
into 'candidates' if successful.
"""
try:
load = dll.aiImportFile
release = dll.aiReleaseImport
except AttributeError:
#OK, this is a library, but it has not the functions we need
pass
else:
#Library found!
load.restype = POINTER(structs.Scene)
candidates.append((library, load, release, dll))
def search_library():
"""Loads the assimp-Library.
result (load-function, release-function)
exception AssimpError if no library is found
"""
#this path
folder = os.path.dirname(__file__)
# silence 'DLL not found' message boxes on win
try:
ctypes.windll.kernel32.SetErrorMode(0x8007)
except AttributeError:
pass
candidates = []
# test every file
for curfolder in [folder]+additional_dirs:
for filename in os.listdir(curfolder):
# our minimum requirement for candidates is that
# they should contain 'assimp' somewhere in
# their name
if filename.lower().find('assimp')==-1 or\
os.path.splitext(filename)[-1].lower() not in ext_whitelist:
continue
library = os.path.join(curfolder, filename)
print 'Try ',library
try:
dll = ctypes.cdll.LoadLibrary(library)
except:
# OK, this except is evil. But different OSs will throw different
# errors. So just ignore any errors.
continue
try_load_functions(library,dll,candidates)
if not candidates:
# no library found
raise AssimpError, "assimp library not found"
else:
# get the newest library
candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
res = max(candidates, key=operator.itemgetter(0))[1]
print 'Taking ',res[0]
# 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:]