Source code for export

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

"""
**Project Name:**      MakeHuman

**Product Home Page:** http://www.makehuman.org/

**Code Home Page:**    https://bitbucket.org/MakeHuman/makehuman/

**Authors:**           Glynn Clements

**Copyright(c):**      MakeHuman Team 2001-2015

**Licensing:**         AGPL3 (http://www.makehuman.org/doc/node/the_makehuman_application.html)

    This file is part of MakeHuman (www.makehuman.org).

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

**Coding Standards:**  See http://www.makehuman.org/node/165

Abstract
--------

Common base class for all exporters.
"""

from core import G
import log


[docs]class Exporter(object): """ Exporter GUI widget for use within ExportTaskView """ def __init__(self): self.group = "mesh" self.fileExtension = "" self.filter = 'All Files (*.*)' self.orderPriority = 10.0 # Priority that determines order of exporter in gui. Highest priority is on top. def build(self, options, taskview): import gui self.taskview = taskview self.feetOnGround = options.addWidget(gui.CheckBox("Feet on ground", True)) def export(self, human, filename): raise NotImplementedError() def getConfig(self, update): raise NotImplementedError("getConfig not implemented for Exporter")
[docs] def onShow(self, exportTaskView): """ This method is called when this exporter is selected and shown in the export GUI. """ pass
[docs] def onHide(self, exportTaskView): """ This method is called when this exporter is hidden from the export GUI. """ pass
class ExportConfig(object): def __init__(self): self.feetOnGround = False self.scale = 1.0 self.unit = "dm" self.useNormals = False self.useRelPaths = True self.texFolder = None self.customPrefix = "" self.human = None # TODO integrate meshOrientation and localBoneAxis properties in this config def selectedOptions(self, exporter): self.feetOnGround = exporter.feetOnGround.selected self.scale,self.unit = exporter.taskview.getScale() return self @property def offset(self): # TODO if meshOrientation property is integrated in this config, adapt this property to the orientation import numpy as np if self.feetOnGround: yOffset = -self.scale * self.human.getJointPosition('ground')[1] return np.asarray([0.0, yOffset, 0.0], dtype=np.float32) else: return np.zeros(3, dtype=np.float32) @property def subdivide(self): if not self.human: log.warning('No human set in config, disabled subdivision for export.') return False else: return self.human.isSubdivided() def setHuman(self, human): """ Set the human object for this config. """ self.human = human # TODO revise def setupTexFolder(self, filepath): import os def _getSubFolder(path, name): folder = os.path.join(path, name) if not os.path.exists(folder): log.message("Creating folder %s", folder) try: os.mkdir(folder) except: log.error("Unable to create separate folder:", exc_info=True) return None return folder (fname, ext) = os.path.splitext(filepath) fname = self.goodName(os.path.basename(fname)) self.outFolder = os.path.realpath(os.path.dirname(filepath)) self.filename = os.path.basename(filepath) self.texFolder = _getSubFolder(self.outFolder, "textures") self._copiedFiles = {} # TODO revise def copyTextureToNewLocation(self, filepath): import os import shutil srcDir = os.path.abspath(os.path.expanduser(os.path.dirname(filepath))) filename = os.path.basename(filepath) newpath = os.path.abspath( os.path.join(self.texFolder, filename) ) try: self._copiedFiles[filepath] done = True except: done = False if not done: try: shutil.copyfile(filepath, newpath) except: log.message("Unable to copy \"%s\" -> \"%s\"" % (filepath, newpath)) self._copiedFiles[filepath] = True if not self.useRelPaths: return newpath else: relpath = os.path.relpath(newpath, self.outFolder) return str(os.path.normpath(relpath)) def goodName(self, name): string = name.replace(" ", "_").replace("-","_").lower() return string