144 lines
4.2 KiB
Python
144 lines
4.2 KiB
Python
import maya.OpenMaya as OpenMaya
|
|
import maya.OpenMayaMPx as OpenMayaMPx
|
|
import sys
|
|
import os
|
|
import logging
|
|
import subprocess as sp
|
|
import reader.lxf_loader as lxf_loader
|
|
import reader.ldd_command as ldd_command
|
|
|
|
reload(lxf_loader)
|
|
reload(ldd_command)
|
|
|
|
logger = logging.getLogger('LDD')
|
|
|
|
kFileVersion = ''
|
|
kExtension = '.lxf'
|
|
kPluginName = 'Lego Digital Designer Reader for Maya '
|
|
kFilterName = '*.lxf'
|
|
kTranslatorName = 'LXF File'
|
|
|
|
|
|
class LXFReader(OpenMayaMPx.MPxFileTranslator):
|
|
def __init__(self):
|
|
OpenMayaMPx.MPxFileTranslator.__init__(self)
|
|
|
|
def haveReadMethod(self):
|
|
return True
|
|
|
|
def haveWriteMethod(self):
|
|
return False
|
|
|
|
def canBeOpened(self):
|
|
return True
|
|
|
|
def translatorName(self):
|
|
return kTranslatorName
|
|
|
|
def defaultExtension(self):
|
|
return kExtension
|
|
|
|
def filter(self):
|
|
return kFilterName
|
|
|
|
def identifyFile(self, fileName, buf, size):
|
|
if 'lxf' in fileName.name().lower():
|
|
logger.info('File is LDD lxf %s' % fileName.name())
|
|
return OpenMayaMPx.MPxFileTranslator.kIsMyFileType
|
|
|
|
return OpenMayaMPx.MPxFileTranslator.kNotMyFileType
|
|
|
|
def reader(self, fileName, options, mode):
|
|
logger.info('reader')
|
|
try:
|
|
loader = lxf_loader.LXFLoader()
|
|
loader.read(fileName.rawFullName())
|
|
except:
|
|
sys.stderr.write("Failed reader : %s" % kPluginName)
|
|
(typ, value, traceback) = sys.exc_info()
|
|
sys.excepthook(typ, value, traceback)
|
|
raise
|
|
|
|
|
|
def lxf_reader_creator():
|
|
return OpenMayaMPx.asMPxPtr(LXFReader())
|
|
|
|
|
|
def check_ldd_install():
|
|
program_dir = os.getenv('ProgramFiles(x86)')
|
|
ldd_install_dir = os.path.join(program_dir, 'LEGO Company', 'LEGO Digital Designer')
|
|
exec_file = os.path.normpath(os.path.join(ldd_install_dir, 'LDD.exe'))
|
|
|
|
if not os.path.exists(exec_file):
|
|
return False
|
|
|
|
cmd = r'powershell.exe [System.Diagnostics.FileVersionInfo]::GetVersionInfo(\"%s\").FileVersion' % exec_file
|
|
ldd_version = ''
|
|
p = sp.Popen(cmd, shell=True, stdout=sp.PIPE)
|
|
|
|
for li in p.stdout:
|
|
ldd_version = li.strip()
|
|
|
|
asset_file = os.path.join(ldd_install_dir, 'Assets.lif')
|
|
|
|
if not os.path.exists(asset_file):
|
|
logger.warning('LEGO Digital Designer Assets.lif not found.')
|
|
return False
|
|
|
|
logger.debug('LEGO Digital Designer %s installed.' % ldd_version)
|
|
return True
|
|
|
|
|
|
def init_ldd_asset_map():
|
|
""" Pre generate asset.lif data index
|
|
for reading geometry data
|
|
"""
|
|
|
|
|
|
def initializePlugin(mobject):
|
|
if os.getenv('OS') not in ['Windows_NT']:
|
|
sys.stderr.write('LDD.py only support window platform.')
|
|
return
|
|
|
|
if not check_ldd_install():
|
|
sys.stderr.write('LEGO Digital Designer not install.')
|
|
return
|
|
|
|
mplugin = OpenMayaMPx.MFnPlugin(mobject, "CGCG", "1.0", "Any")
|
|
try:
|
|
mplugin.registerFileTranslator(kTranslatorName,
|
|
None,
|
|
lxf_reader_creator,
|
|
None,
|
|
None,
|
|
False)
|
|
logger.debug('Register LDD File Translater :: %s' % kTranslatorName)
|
|
except:
|
|
sys.stderr.write("Failed to register translator: %s\n" % kPluginName)
|
|
raise
|
|
|
|
try:
|
|
mplugin.registerCommand(ldd_command.kPluginCmdName,
|
|
ldd_command.ldd_command_creater,
|
|
ldd_command.ldd_command_syntaxCreator)
|
|
logger.debug('Register LDD Command :: %s' % ldd_command.kPluginCmdName)
|
|
except:
|
|
sys.stderr.write('Failed to register command: ' + ldd_command.kPluginCmdName)
|
|
raise
|
|
|
|
|
|
def uninitializePlugin(mobject):
|
|
mplugin = OpenMayaMPx.MFnPlugin(mobject)
|
|
try:
|
|
mplugin.deregisterFileTranslator(kTranslatorName)
|
|
logger.debug('Deregister LDD File Translator :: %s' % kTranslatorName)
|
|
except:
|
|
sys.stderr.write("Failed to deregister translator: %s\n" % kPluginName)
|
|
raise
|
|
|
|
try:
|
|
mplugin.deregisterCommand(ldd_command.kPluginCmdName)
|
|
except:
|
|
sys.stderr.write('Failed to deregister command: ' + ldd_command.kPluginCmdName)
|
|
raise
|