def draw(self, startpoint=(0, 0), mode='plain', showfig=False):
        """ lattice visualization
            
            :param startpoint: start drawing point coords, default: (0, 0)
            :param showfig: show figure or not, default: False
            :param mode: artist mode, 'plain' or 'fancy', 'plain' by default
            :return: patchlist, anotelist, (xmin0, xmax0), (ymin0, ymax0)
                patchlist: list of element patches
                anotelist: list of annotations
                (xmin0, xmax0) and (ymin0, ymax0) are ploting range
        """
        p0 = startpoint
        angle = 0.0
        patchlist = []
        anotelist = []
        xmin0, xmax0, ymin0, ymax0 = 0, 0, 0, 0
        xmin, xmax, ymin, ymax = 0, 0, 0, 0
        for ele in self._lattice_eleobjlist:
            ele.setDraw(p0=p0, angle=angle, mode=mode)
            angle += ele.next_inc_angle
            # print(ele.name + ele.next_inc_angle + angle)
            patchlist.extend(ele._patches)
            if hasattr(ele, '_anote'):
                anotelist.append(ele._anote)
            try:
                p0 = ele.next_p0
                xyrange = ele._patches[0].get_path().get_extents()
                xmin, xmax = xyrange.xmin, xyrange.xmax
                ymin, ymax = xyrange.ymin, xyrange.ymax
            except:
                pass
            xmin0 = min(xmin, xmin0)
            xmax0 = max(xmax, xmax0)
            ymin0 = min(ymin, ymin0)
            ymax0 = max(ymax, ymax0)

        # show figure or not
        if showfig:
            fig = plt.figure()
            ax = fig.add_subplot(111, aspect='equal')
            [ax.add_patch(i) for i in patchlist]
            [ax.annotate(s=i['name'],
                         xy=i['xypos'],
                         xytext=i['textpos'],
                         arrowprops=dict(arrowstyle='->'),
                         rotation=-90,
                         fontsize='small')
             for i in anotelist]
            ax.set_xlim([xmin0 * 2, xmax0 * 2])
            ax.set_ylim([ymin0 * 2, ymax0 * 2])
            plt.show()

        return patchlist, anotelist, (xmin0, xmax0), (ymin0, ymax0)
lattice visualization
            
            :param startpoint: start drawing point coords, default: (0, 0)
            :param showfig: show figure or not, default: False
            :param mode: artist mode, 'plain' or 'fancy', 'plain' by default
            :return: patchlist, anotelist, (xmin0, xmax0), (ymin0, ymax0)
                patchlist: list of element patches
                anotelist: list of annotations
                (xmin0, xmax0) and (ymin0, ymax0) are ploting range