def adjacency(self):
     """Find the elems adjacent to elems."""
     if self.adj is None:
         nfaces = self.nfaces()
         rfaces = connectivity.reverseIndex(self.faces)
         # this gives all adjacent elements including element itself
         adj = rfaces[self.faces].reshape((nfaces,-1))
         fnr = arange(nfaces).reshape((nfaces,-1))
         # remove the element itself
         self.adj = adj[adj != fnr].reshape((nfaces,-1))
     return self.adj
 def pointNormals(self):
     """Compute the normal vectors in each point of a collection of triangles.
     
     The normal vector in a point is the average of the normal vectors of the neighbouring triangles.
     The normal vectors are normalized.
     """
     con = connectivity.reverseIndex(self.getElems())
     NP = self.areaNormals()[1][con] #self.normal doesn't work here???
     w = where(con == -1)
     NP[w] = 0.
     NPA = NP.sum(axis=1)
     NPA /= sqrt((NPA*NPA).sum(axis=-1)).reshape(-1,1)
     return NPA
    def drawGL(self,mode,color=None,alpha=None):
        """Draw the surface."""
        print "SURFACE.DRAWGL"
        if mode.endswith('wire'):
            self.drawGL(mode[:-4],color=color)
            self.drawGL('wireframe',color=asarray(black))
            return

        if alpha is None:
            alpha = self.alpha           

        if color == None:
            color = self.color

##                 if mode == 'wireframe':
##                     # adapt color array to edgeselect
##                     color = concatenate([self.color,self.color,self.color],axis=-1)
##                     color = color.reshape((-1,2))[self.edgeselect]
        
        if color is None:  # no color
            pass
        
        elif color.dtype.kind == 'f' and color.ndim == 1:  # single color
            GL.glColor(append(color,alpha))
            color = None

        elif color.dtype.kind == 'i': # color index
            color = self.colormap[color]

        else: # a full color array : use as is
            pass

        #print "SURFACE COLOR = %s" % str(color)

        if self.linewidth is not None:
            GL.glLineWidth(self.linewidth)

        t = timer.Timer()
        if mode=='wireframe' :
            #print color.shape
            #print self.edges.shape
            #print self.faces.shape
            rev = reverseIndex(self.faces)
            if color is not None:
                color = color[rev[:,-1]]
            drawLineElems(self.coords,self.edges,color)
        else:
            self.refresh()
            drawTriangleElems(self.coords,self.elems,mode,color,alpha)
        GD.message("Drawing time: %s seconds" % t.seconds())
    def drawGL(self,mode='wireframe',color=None,colormap=None,alpha=None):
        """Draw the surface."""

        if mode.endswith('wire'):
            self.drawGL(mode='wireframe',color=asarray(black),colormap=None)
            self.drawGL(mode=mode[:-4],color=color,colormap=colormap,alpha=alpha)
            return

        if alpha is None:
            alpha = self.alpha           

        if color is None:  
            color,colormap = self.color,self.colormap
        else:
            color,colormap = saneColorSet(color,colormap,self.nelems())
        
        if color is None:  # no color
            pass
        
        elif color.dtype.kind == 'f' and color.ndim == 1:  # single color
            GL.glColor(append(color,alpha))
            color = None

        elif color.dtype.kind == 'i': # color index
            color = colormap[color]

        else: # a full color array : use as is
            pass

        if self.linewidth is not None:
            GL.glLineWidth(self.linewidth)

        t = timer.Timer()
        if mode=='wireframe' :
            rev = reverseIndex(self.faces)
            if color is not None:
                color = color[rev[:,-1]]
            drawLineElems(self.coords,self.edges,color)
        else:
            self.refresh()
            drawPolygonElems(self.coords,self.elems,mode,color,alpha)
        GD.debug("Drawing time: %s seconds" % t.seconds())
def removeTriangles(elems):
    """Remove the triangles from the centerline.
    
    This is a clean-up function for the centerline.
    Triangles appearing in the centerline are removed by this function.
    Both input and output are the connectivity of the centerline.
    """
    rev = connectivity.reverseIndex(elems)
    if rev.shape[1] > 2:
        w =  where(rev[:,-3] != -1)[0]
        for i in w:
            el = rev[i].compress(rev[i] != -1)
            u = unique(elems[el].reshape(-1))
            NB = u.compress(u != i)
            int = intersect1d(w,NB)
            if int.shape[0] == 2:
                tri = append(int,i)
                w1 = where(tri != tri.min())[0]
                t = (elems[:,0] == tri[w1[0]])*(elems[:,1] == tri[w1[1]])
                elems[t] = -1
    w2 = where(elems[:,0] != -1)[0]
    return elems[w2]
 def nodeConnections(self):
     """Find the elems connected to nodes."""
     if self.conn is None:
         self.refresh()
         self.conn = connectivity.reverseIndex(self.elems)
     return self.conn
 def edgeConnections(self):
     """Find the elems connected to edges."""
     if self.econn is None:
         self.econn = connectivity.reverseIndex(self.faces)
     return self.econn