####################################################################################
#
#    STEPS - STochastic Engine for Pathway Simulation
#    Copyright (C) 2007-2023 Okinawa Institute of Science and Technology, Japan.
#    Copyright (C) 2003-2006 University of Antwerp, Belgium.
#    
#    See the file AUTHORS for details.
#    This file is part of STEPS.
#    
#    STEPS is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License version 3,
#    as published by the Free Software Foundation.
#    
#    STEPS 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 General Public License for more details.
#    
#    You should have received a copy of the GNU General Public License
#    along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#################################################################################   
###
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import numpy as np
import random
import steps.API_1.geom as sgeom
from steps.API_1.geom import INDEX_DTYPE
from steps.API_1.geom import UNKNOWN_TET
from steps.API_1.geom import UNKNOWN_TRI
import steps.API_1.utilities.meshctrl as smeshctrl
[docs]class VisualCompMesh(gl.GLMeshItem):
    """
    Static mesh component for a compartment
    Parameters:
    * id                      ID of the component
    * display                 Parent display
    * steps_mesh              STEPS mesh
    * comp_id                 ID of the compartment
    * color                   Color of the component
    """
    def __init__(self, id, display, steps_mesh, comp_id, color = None):
        """
        Constructor
        """
        self.id = id
        self. display = display
        self.steps_mesh = steps_mesh
        
        if not color:
            color = [random.random(), random.random(), random.random(), 0.3]
        tmcomp = sgeom.castToTmComp(steps_mesh.getComp(comp_id))
        self.bound_max = [v * display.scale for v in tmcomp.getBoundMax()]
        self.bound_min = [v * display.scale for v in tmcomp.getBoundMin()]
        ipatches = set(tmcomp.getIPatches())
        opatches = set(tmcomp.getOPatches())
        patches = ipatches.union(opatches)
        surface_tris = smeshctrl.findSurfTrisInComp(steps_mesh, tmcomp)
        for p in patches:
            surface_tris.extend(sgeom.castToTmPatch(p).getAllTriIndices())
        
        surface_tris = np.array(surface_tris, dtype = INDEX_DTYPE)
        
        
        v_set_size = steps_mesh.getTriVerticesSetSizeNP(surface_tris)
        tris_data = np.zeros(surface_tris.size * 3, dtype = INDEX_DTYPE)
        v_set = np.zeros(v_set_size, dtype = INDEX_DTYPE)
        verts_data = np.zeros(v_set_size * 3)
        steps_mesh.getTriVerticesMappingSetNP(surface_tris, tris_data, v_set)
        steps_mesh.getBatchVerticesNP(v_set, verts_data)
        verts_data *= display.scale
        tris_data.shape = -1, 3
        verts_data.shape = -1, 3
        mesh_data = gl.MeshData(vertexes=verts_data, faces = tris_data)
        gl.GLMeshItem.__init__(self, meshdata=mesh_data, smooth=False, computeNormals =True, shader='balloon', glOptions='additive')
        self.setColor(color)
        display.addItem(self)
    def updateItem(self):
        return 
[docs]class VisualPatchMesh(gl.GLMeshItem):
    """
    Static mesh component for a patch
    
    Parameters:
    * id                      ID of the component
    * display                 Parent display
    * steps_mesh              STEPS mesh
    * patch_id                ID of the patch
    * color                   Color of the component
    """
    def __init__(self, id, display, steps_mesh, patch_id, color = None):
        """
        Constructor
        """
        self.id = id
        self. display = display
        self.steps_mesh = steps_mesh
        
        if not color:
            color = [random.random(), random.random(), random.random(), 0.3]
        
        tmpatch = sgeom.castToTmPatch(steps_mesh.getPatch(patch_id))
        self.bound_max = [v * display.scale for v in tmpatch.getBoundMax()]
        self.bound_min = [v * display.scale for v in tmpatch.getBoundMin()]
        
        patch_surface = tmpatch.getAllTriIndices()
        patch_surface = np.array(patch_surface, dtype = INDEX_DTYPE)
        v_set_size = steps_mesh.getTriVerticesSetSizeNP(patch_surface)
        tris_data = np.zeros(patch_surface.size * 3, dtype = INDEX_DTYPE)
        v_set = np.zeros(v_set_size, dtype = INDEX_DTYPE)
        verts_data = np.zeros(v_set_size * 3)
        steps_mesh.getTriVerticesMappingSetNP(patch_surface, tris_data, v_set)
        steps_mesh.getBatchVerticesNP(v_set, verts_data)
        verts_data *= display.scale
        tris_data.shape = -1, 3
        verts_data.shape = -1, 3
        mesh_data = gl.MeshData(vertexes=verts_data, faces = tris_data)
        gl.GLMeshItem.__init__(self, meshdata=mesh_data, smooth=False, computeNormals =True, shader='balloon', glOptions='additive')
        self.setColor(color)
        display.addItem(self)
    def updateItem(self):
        return