3D mesh updates:
- Can initialize GLMeshItem using MeshData instance - MeshData has save/restore methods
This commit is contained in:
parent
727214ca45
commit
5c0c47cda2
@ -827,6 +827,8 @@ def isosurface(data, level):
|
|||||||
*data* 3D numpy array of scalar values
|
*data* 3D numpy array of scalar values
|
||||||
*level* The level at which to generate an isosurface
|
*level* The level at which to generate an isosurface
|
||||||
|
|
||||||
|
Returns a list of faces; each face is a list of three vertexes and each vertex is a tuple of three floats.
|
||||||
|
|
||||||
This function is SLOW; plenty of room for optimization here.
|
This function is SLOW; plenty of room for optimization here.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from pyqtgraph.Qt import QtGui
|
from pyqtgraph.Qt import QtGui
|
||||||
|
import pyqtgraph.functions as fn
|
||||||
|
|
||||||
class MeshData(object):
|
class MeshData(object):
|
||||||
"""
|
"""
|
||||||
@ -37,6 +38,12 @@ class MeshData(object):
|
|||||||
else:
|
else:
|
||||||
self._setIndexedFaces(faces, vertexes)
|
self._setIndexedFaces(faces, vertexes)
|
||||||
|
|
||||||
|
def setMeshColor(self, color):
|
||||||
|
"""Set the color of the entire mesh. This removes any per-face or per-vertex colors."""
|
||||||
|
color = fn.Color(color)
|
||||||
|
self._meshColor = color.glColor()
|
||||||
|
self._vertexColors = None
|
||||||
|
self._faceColors = None
|
||||||
|
|
||||||
def _setUnindexedFaces(self, faces):
|
def _setUnindexedFaces(self, faces):
|
||||||
verts = {}
|
verts = {}
|
||||||
@ -107,7 +114,8 @@ class MeshData(object):
|
|||||||
for i, face in enumerate(self._faces):
|
for i, face in enumerate(self._faces):
|
||||||
## compute face normal
|
## compute face normal
|
||||||
pts = [self._vertexes[vind] for vind in face]
|
pts = [self._vertexes[vind] for vind in face]
|
||||||
norm = QtGui.QVector3D.crossProduct(pts[1]-pts[0], pts[2]-pts[0]).normalized()
|
norm = QtGui.QVector3D.crossProduct(pts[1]-pts[0], pts[2]-pts[0])
|
||||||
|
norm = norm / norm.length() ## don't use .normalized(); doesn't work for small values.
|
||||||
self._faceNormals.append(norm)
|
self._faceNormals.append(norm)
|
||||||
return self._faceNormals
|
return self._faceNormals
|
||||||
|
|
||||||
@ -126,7 +134,7 @@ class MeshData(object):
|
|||||||
norm = QtGui.QVector3D()
|
norm = QtGui.QVector3D()
|
||||||
for fn in norms:
|
for fn in norms:
|
||||||
norm += fn
|
norm += fn
|
||||||
norm.normalize()
|
norm = norm / norm.length() ## don't use .normalize(); doesn't work for small values.
|
||||||
self._vertexNormals.append(norm)
|
self._vertexNormals.append(norm)
|
||||||
return self._vertexNormals
|
return self._vertexNormals
|
||||||
|
|
||||||
@ -152,3 +160,19 @@ class MeshData(object):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
"""Serialize this mesh to a string appropriate for disk storage"""
|
||||||
|
import pickle
|
||||||
|
names = ['_vertexes', '_edges', '_faces', '_vertexFaces', '_vertexNormals', '_faceNormals', '_vertexColors', '_edgeColors', '_faceColors', '_meshColor']
|
||||||
|
state = {n:getattr(self, n) for n in names}
|
||||||
|
return pickle.dumps(state)
|
||||||
|
|
||||||
|
def restore(self, state):
|
||||||
|
"""Restore the state of a mesh previously saved using save()"""
|
||||||
|
import pickle
|
||||||
|
state = pickle.loads(state)
|
||||||
|
for k in state:
|
||||||
|
setattr(self, k, state[k])
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -20,6 +20,9 @@ class GLMeshItem(GLGraphicsItem):
|
|||||||
"""
|
"""
|
||||||
See MeshData for initialization arguments.
|
See MeshData for initialization arguments.
|
||||||
"""
|
"""
|
||||||
|
if isinstance(faces, MeshData):
|
||||||
|
self.data = faces
|
||||||
|
else:
|
||||||
self.data = MeshData()
|
self.data = MeshData()
|
||||||
self.data.setFaces(faces, vertexes)
|
self.data.setFaces(faces, vertexes)
|
||||||
GLGraphicsItem.__init__(self)
|
GLGraphicsItem.__init__(self)
|
||||||
|
Loading…
Reference in New Issue
Block a user