An .egm file contains facial shape modifiers, that is, morphs that modify static properties of the face, such as nose size, chin shape, and so on.
Bases: pyffi.object_models.xml.FileFormat
This class implements the EGM format.
Bases: pyffi.object_models.Data
A class to contain the actual egm data.
Add an asymmetric morph, and return it.
Add a symmetric morph, and return it.
Apply scale factor to all morphs.
Quickly checks if stream contains EGM data, and reads the header.
| Parameters: | stream (file) – The stream to inspect. |
|---|
Quickly checks if stream contains EGM data, and gets the version, by looking at the first 8 bytes.
| Parameters: | stream (file) – The stream to inspect. |
|---|
Read a egm file.
| Parameters: | stream (file) – The stream from which to read. |
|---|
Write a egm file.
| Parameters: | stream (file) – The stream to which to write. |
|---|
Bases: pyffi.object_models.xml.basic.BasicBase
Basic type which implements the header of a EGM file.
Return a hash value for this value.
| Returns: | An immutable object that can be used as a hash. |
|---|
Return number of bytes the header string occupies in a file.
| Returns: | Number of bytes. |
|---|
Read header string from stream and check it.
| Parameters: | stream (file) – The stream to read from. |
|---|
Write the header string to stream.
| Parameters: | stream (file) – The stream to write to. |
|---|
Bases: pyffi.formats.egm._MorphRecord
>>> # create morph with 3 vertices.
>>> morph = EgmFormat.MorphRecord(argument=3)
>>> morph.set_relative_vertices(
... [(3, 5, 2), (1, 3, 2), (-9, 3, -1)])
>>> # scale should be 9/32768.0 = 0.0002746...
>>> morph.scale
0.0002746...
>>> for vert in morph.get_relative_vertices():
... print([int(1000 * x + 0.5) for x in vert])
[3000, 5000, 2000]
[1000, 3000, 2000]
[-8999, 3000, -999]
Apply scale factor to data.
>>> # create morph with 3 vertices.
>>> morph = EgmFormat.MorphRecord(argument=3)
>>> morph.set_relative_vertices(
... [(3, 5, 2), (1, 3, 2), (-9, 3, -1)])
>>> morph.apply_scale(2)
>>> for vert in morph.get_relative_vertices():
... print([int(1000 * x + 0.5) for x in vert])
[6000, 10000, 4000]
[2000, 6000, 4000]
[-17999, 6000, -1999]
alias of Byte
alias of Char
alias of Float
alias of Int
alias of Short
alias of UByte
alias of UInt
alias of UShort
Converts version string into an integer.
| Parameters: | version_str (str) – The version string. |
|---|---|
| Returns: | A version integer. |
>>> EgmFormat.version_number('002')
2
>>> EgmFormat.version_number('XXX')
-1
>>> # check and read egm file
>>> stream = open('tests/egm/mmouthxivilai.egm', 'rb')
>>> data = EgmFormat.Data()
>>> data.inspect_quick(stream)
>>> data.version
2
>>> data.inspect(stream)
>>> data.header.num_vertices
89
>>> data.header.num_sym_morphs
50
>>> data.header.num_asym_morphs
30
>>> data.header.time_date_stamp
2001060901
>>> data.read(stream)
>>> data.sym_morphs[0].vertices[0].x
17249
>>> for stream, data in EgmFormat.walkData('tests/egm'):
... print(stream.name)
tests/egm/mmouthxivilai.egm
>>> data = EgmFormat.Data(num_vertices=10)
>>> data.header.num_vertices
10
>>> morph = data.add_sym_morph()
>>> len(morph.vertices)
10
>>> morph.scale = 0.4
>>> morph.vertices[0].z = 123
>>> morph.vertices[9].x = -30000
>>> morph = data.add_asym_morph()
>>> morph.scale = 2.3
>>> morph.vertices[3].z = -5
>>> morph.vertices[4].x = 99
>>> from tempfile import TemporaryFile
>>> stream = TemporaryFile()
>>> data.write(stream)