# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Python Computer Graphics Kit.
#
# The Initial Developer of the Original Code is Matthias Baas.
# Portions created by the Initial Developer are Copyright (C) 2004
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
# $Id: plyimport.py,v 1.4 2005/05/09 14:34:24 mbaas Exp $
import os.path
import _core
from cgtypes import *
from geomobject import *
from polyhedron import *
import pluginmanager
# PLYImporter
class PLYImporter:
_protocols = ["Import"]
# extension
def extension():
"""Return the file extensions for this format."""
return ["ply"]
extension = staticmethod(extension)
# description
def description(self):
"""Return a short description for the file dialog."""
return "Polygon (PLY)"
description = staticmethod(description)
# importFile
def importFile(self, filename, includevar=None, excludevar=None, invertfaces=False):
"""Import a PLY file.
includevar is a list of primitive variable names that should be
imported. excludevar is a list of primitive variable names that
should not be imported.
invertfaces specifies if the face orientations should be inverted
or not.
"""
self.includevar = includevar
self.excludevar = excludevar
imp = _core.PLYReader()
imp.open(filename)
# Obtain the header information
header = imp.readHeader()
# Create the variable declaration tuples for importing the data...
inttypes = ["int8", "uint8", "int16", "uint16", "int32", "uint32",
"char", "uchar", "short", "ushort", "int", "uint"]
vardecl = []
vec3vars = {}
elements, comment, objinfo = header
for elname, ninstances, properties in elements:
for propname, type, len_type, val_type in properties:
# Vertex indices? (they are handled by default)
if elname=="vertex" and propname in ["x", "y", "z"]:
continue
# Vertex indices? (they are handled by default)
if elname=="face" and propname in ["vertex_indices"]:
continue
# Normals?
if propname in ["nx", "ny", "nz"]:
if "N" not in vec3vars and self.isVarAccepted("N"):
vardecl.append(("N", NORMAL, elname, ("nx", "ny", "nz")))
vec3vars["N"] = True
continue
if type=="list":
type = val_type
if type in inttypes:
t = INT
else:
t = FLOAT
if self.isVarAccepted(propname):
vardecl.append((propname, t, elname, (propname,)))
# print vardecl
# Create a polyhedron
name = os.path.splitext(os.path.basename(filename))[0]
p = Polyhedron(name=name)
# Set the comment and objinfo
if comment!="":
p.geom.newVariable("comment", CONSTANT, STRING)
s = p.geom.slot("comment")
s[0] = comment
if objinfo!="":
p.geom.newVariable("obj_info", CONSTANT, STRING)
s = p.geom.slot("obj_info")
s[0] = objinfo
# Read the model
imp.read(p.geom, vardecl, invertfaces)
imp.close()
# isVarAccepted
def isVarAccepted(self, name):
"""Return True if the variable should be imported.
name is the name of the primitive variable (which is not necessarily
the ply property!).
"""
if self.includevar!=None:
if name not in self.includevar:
return False
if self.excludevar!=None:
if name in self.excludevar:
return False
return True
######################################################################
# Register the Importer class as a plugin class
pluginmanager.register(PLYImporter)
|