def __init__(self, parent, wid, name):
        wx.Frame.__init__(self, parent, wid, name, wx.DefaultPosition, wx.Size(1024, 768))

        self.colony = CoralColony()
        self.encrusting_checkbox = None
        self.interval = 10
        self.growth_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.growth_timer)
        self.growth_timer.Start(self.interval)
        self.show_skeleton = False

        self.ColonyView = ColonyViewControl(self, -1)
        # self.ColonyView.SetMinSize((800,700))
        self.PlayButton = wx.Button(self, wx.ID_ANY, 'Play')
        self.ResetButton = wx.Button(self, wx.ID_ANY, 'Reset')
        #self.LoadNeighborButton = wx.Button(self, wx.ID_ANY, 'Watch')
        #self.ButtonExport = wx.Button(self, wx.ID_ANY, 'Export')
        #lb1 = wx.StaticText(self, wx.ID_ANY, '')
        #lb2 = wx.StaticText(self, wx.ID_ANY, '')

        self.determinategrowth_checkbox = wx.CheckBox(self, ID_DETERMINATEGROWTH_CHECKBOX, "Determinate growth")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleDeterminate, id=ID_DETERMINATEGROWTH_CHECKBOX)
        self.showskeleton_checkbox = wx.CheckBox(self, ID_SHOWSKELETON_CHECKBOX, "Show skeleton")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleSkeleton, id=ID_SHOWSKELETON_CHECKBOX)
        self.timer_checkbox = wx.CheckBox(self, ID_TIMER_CHECKBOX, "Use Timer")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleTimer, id=ID_TIMER_CHECKBOX)
        self.peripheralbudding_combobox = wx.ComboBox(self, ID_PERIPHERALBUDDING_COMBOBOX, "Peripheral budding",
            choices=["None", "Round", "Encrusting", "Platy"])
        self.Bind(wx.EVT_COMBOBOX, self.PeripheralBudding, id=ID_PERIPHERALBUDDING_COMBOBOX)

        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer1.Add(self.PlayButton, wx.ALIGN_CENTER)
        sizer1.Add(self.ResetButton, wx.ALIGN_CENTER)
        #sizer1.Add( self.ButtonExport, wx.ALIGN_CENTER )

        self.forms = dict()

        self.irradiance_label = wx.StaticText(self, -1, 'Irradiance', style=wx.ALIGN_RIGHT)
        self.irradiance_value = wx.TextCtrl(self, -1, '')

        self.depth_label = wx.StaticText(self, -1, 'Depth', style=wx.ALIGN_RIGHT)
        self.forms['depth'] = wx.TextCtrl(self, -1, str(DEPTH))
        self.lateral_growth_period_label = wx.StaticText(self, -1, 'Lat. Growth Period', style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_period'] = wx.TextCtrl(self, -1, str(LATERAL_GROWTH_PERIOD))
        self.lateral_growth_criterion_label = wx.StaticText(self, -1, 'Lat. Growth Criterion', style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_criterion'] = wx.TextCtrl(self, -1, str(LATERAL_GROWTH_CRITERION))
        self.surface_irradiance_label = wx.StaticText(self, -1, 'Surface Irradiance', style=wx.ALIGN_RIGHT)
        self.forms['surface_irradiance'] = wx.TextCtrl(self, -1, str(SURFACE_IRRADIANCE))
        self.attenuation_coefficient_label = wx.StaticText(self, -1, 'Attenuation Coeff.', style=wx.ALIGN_RIGHT)
        self.forms['attenuation_coefficient'] = wx.TextCtrl(self, -1, str(ATTENUATION_COEFFICIENT))
        self.max_irradiance_label = wx.StaticText(self, -1, 'Max Irradiance', style=wx.ALIGN_RIGHT)
        self.forms['max_irradiance'] = wx.TextCtrl(self, -1, str(MAX_IRRADIANCE))
        self.reflection_rate_label = wx.StaticText(self, -1, 'Reflection Rate', style=wx.ALIGN_RIGHT)
        self.forms['reflection_rate'] = wx.TextCtrl(self, -1, str(REFLECTION_RATE))
        self.growth_constant_label = wx.StaticText(self, -1, 'Growth constant', style=wx.ALIGN_RIGHT)
        self.forms['growth_constant'] = wx.TextCtrl(self, -1, str(GROWTH_CONSTANT))
        self.polyp_radius_label = wx.StaticText(self, -1, 'Polyp radius', style=wx.ALIGN_RIGHT)
        self.forms['polyp_radius'] = wx.TextCtrl(self, -1, str(POLYP_RADIUS))
        self.zoom_label = wx.StaticText(self, -1, 'Zoom', style=wx.ALIGN_RIGHT)
        self.forms['zoom'] = wx.TextCtrl(self, -1, str(ZOOM))

        self.polyp_list_label = wx.StaticText(self, -1, 'Polyps', style=wx.ALIGN_RIGHT)
        self.polyp_listbox = wx.ListBox(self, -1, choices=(), size=(100, 200), style=wx.LB_SINGLE)

        sizer2 = wx.FlexGridSizer(3, 3, 0, 0)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.determinategrowth_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.showskeleton_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.timer_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.peripheralbudding_combobox, flag=wx.EXPAND)

        sizer2.Add(self.depth_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['depth'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_period_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_period'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_criterion_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_criterion'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.surface_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['surface_irradiance'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.attenuation_coefficient_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['attenuation_coefficient'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.max_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['max_irradiance'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.reflection_rate_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['reflection_rate'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.growth_constant_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['growth_constant'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_radius_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['polyp_radius'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.zoom_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['zoom'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_list_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.polyp_listbox, flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.irradiance_value, flag=wx.EXPAND)

        fs = wx.FlexGridSizer(2, 2, 10, 5)
        fs.AddGrowableCol(0, 80)
        fs.AddGrowableCol(1, 20)
        fs.AddGrowableRow(0, 90)
        fs.Add(self.ColonyView, 0, wx.EXPAND)
        fs.Add(sizer2, 0, wx.ALIGN_CENTER)
        fs.Add(sizer1, 0, wx.EXPAND)
        self.Bind(wx.EVT_BUTTON, self.OnPlay, self.PlayButton)
        self.Bind(wx.EVT_BUTTON, self.OnReset, self.ResetButton)

        self.Bind(wx.EVT_LISTBOX, self.OnPolypSelected, self.polyp_listbox)
        self.SetSizer(fs)

        self.is_growing = False
        self.determinate_growth = False
        self.determinategrowth_checkbox.SetValue(self.determinate_growth)
        self.use_timer = True
        self.timer_checkbox.SetValue(self.use_timer)
        self.peripheral_budding = ID_ROUND
        self.peripheralbudding_combobox.SetStringSelection("Round")

        self.ResetColony()
class ColonySimulator2DFrame(wx.Frame):
    def __init__(self, parent, wid, name):
        wx.Frame.__init__(self, parent, wid, name, wx.DefaultPosition, wx.Size(1024, 768))

        self.colony = CoralColony()
        self.encrusting_checkbox = None
        self.interval = 10
        self.growth_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.growth_timer)
        self.growth_timer.Start(self.interval)
        self.show_skeleton = False

        self.ColonyView = ColonyViewControl(self, -1)
        # self.ColonyView.SetMinSize((800,700))
        self.PlayButton = wx.Button(self, wx.ID_ANY, 'Play')
        self.ResetButton = wx.Button(self, wx.ID_ANY, 'Reset')
        #self.LoadNeighborButton = wx.Button(self, wx.ID_ANY, 'Watch')
        #self.ButtonExport = wx.Button(self, wx.ID_ANY, 'Export')
        #lb1 = wx.StaticText(self, wx.ID_ANY, '')
        #lb2 = wx.StaticText(self, wx.ID_ANY, '')

        self.determinategrowth_checkbox = wx.CheckBox(self, ID_DETERMINATEGROWTH_CHECKBOX, "Determinate growth")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleDeterminate, id=ID_DETERMINATEGROWTH_CHECKBOX)
        self.showskeleton_checkbox = wx.CheckBox(self, ID_SHOWSKELETON_CHECKBOX, "Show skeleton")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleSkeleton, id=ID_SHOWSKELETON_CHECKBOX)
        self.timer_checkbox = wx.CheckBox(self, ID_TIMER_CHECKBOX, "Use Timer")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleTimer, id=ID_TIMER_CHECKBOX)
        self.peripheralbudding_combobox = wx.ComboBox(self, ID_PERIPHERALBUDDING_COMBOBOX, "Peripheral budding",
            choices=["None", "Round", "Encrusting", "Platy"])
        self.Bind(wx.EVT_COMBOBOX, self.PeripheralBudding, id=ID_PERIPHERALBUDDING_COMBOBOX)

        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer1.Add(self.PlayButton, wx.ALIGN_CENTER)
        sizer1.Add(self.ResetButton, wx.ALIGN_CENTER)
        #sizer1.Add( self.ButtonExport, wx.ALIGN_CENTER )

        self.forms = dict()

        self.irradiance_label = wx.StaticText(self, -1, 'Irradiance', style=wx.ALIGN_RIGHT)
        self.irradiance_value = wx.TextCtrl(self, -1, '')

        self.depth_label = wx.StaticText(self, -1, 'Depth', style=wx.ALIGN_RIGHT)
        self.forms['depth'] = wx.TextCtrl(self, -1, str(DEPTH))
        self.lateral_growth_period_label = wx.StaticText(self, -1, 'Lat. Growth Period', style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_period'] = wx.TextCtrl(self, -1, str(LATERAL_GROWTH_PERIOD))
        self.lateral_growth_criterion_label = wx.StaticText(self, -1, 'Lat. Growth Criterion', style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_criterion'] = wx.TextCtrl(self, -1, str(LATERAL_GROWTH_CRITERION))
        self.surface_irradiance_label = wx.StaticText(self, -1, 'Surface Irradiance', style=wx.ALIGN_RIGHT)
        self.forms['surface_irradiance'] = wx.TextCtrl(self, -1, str(SURFACE_IRRADIANCE))
        self.attenuation_coefficient_label = wx.StaticText(self, -1, 'Attenuation Coeff.', style=wx.ALIGN_RIGHT)
        self.forms['attenuation_coefficient'] = wx.TextCtrl(self, -1, str(ATTENUATION_COEFFICIENT))
        self.max_irradiance_label = wx.StaticText(self, -1, 'Max Irradiance', style=wx.ALIGN_RIGHT)
        self.forms['max_irradiance'] = wx.TextCtrl(self, -1, str(MAX_IRRADIANCE))
        self.reflection_rate_label = wx.StaticText(self, -1, 'Reflection Rate', style=wx.ALIGN_RIGHT)
        self.forms['reflection_rate'] = wx.TextCtrl(self, -1, str(REFLECTION_RATE))
        self.growth_constant_label = wx.StaticText(self, -1, 'Growth constant', style=wx.ALIGN_RIGHT)
        self.forms['growth_constant'] = wx.TextCtrl(self, -1, str(GROWTH_CONSTANT))
        self.polyp_radius_label = wx.StaticText(self, -1, 'Polyp radius', style=wx.ALIGN_RIGHT)
        self.forms['polyp_radius'] = wx.TextCtrl(self, -1, str(POLYP_RADIUS))
        self.zoom_label = wx.StaticText(self, -1, 'Zoom', style=wx.ALIGN_RIGHT)
        self.forms['zoom'] = wx.TextCtrl(self, -1, str(ZOOM))

        self.polyp_list_label = wx.StaticText(self, -1, 'Polyps', style=wx.ALIGN_RIGHT)
        self.polyp_listbox = wx.ListBox(self, -1, choices=(), size=(100, 200), style=wx.LB_SINGLE)

        sizer2 = wx.FlexGridSizer(3, 3, 0, 0)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.determinategrowth_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.showskeleton_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.timer_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.peripheralbudding_combobox, flag=wx.EXPAND)

        sizer2.Add(self.depth_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['depth'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_period_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_period'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_criterion_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_criterion'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.surface_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['surface_irradiance'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.attenuation_coefficient_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['attenuation_coefficient'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.max_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['max_irradiance'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.reflection_rate_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['reflection_rate'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.growth_constant_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['growth_constant'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_radius_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['polyp_radius'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.zoom_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['zoom'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_list_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.polyp_listbox, flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.irradiance_value, flag=wx.EXPAND)

        fs = wx.FlexGridSizer(2, 2, 10, 5)
        fs.AddGrowableCol(0, 80)
        fs.AddGrowableCol(1, 20)
        fs.AddGrowableRow(0, 90)
        fs.Add(self.ColonyView, 0, wx.EXPAND)
        fs.Add(sizer2, 0, wx.ALIGN_CENTER)
        fs.Add(sizer1, 0, wx.EXPAND)
        self.Bind(wx.EVT_BUTTON, self.OnPlay, self.PlayButton)
        self.Bind(wx.EVT_BUTTON, self.OnReset, self.ResetButton)

        self.Bind(wx.EVT_LISTBOX, self.OnPolypSelected, self.polyp_listbox)
        self.SetSizer(fs)

        self.is_growing = False
        self.determinate_growth = False
        self.determinategrowth_checkbox.SetValue(self.determinate_growth)
        self.use_timer = True
        self.timer_checkbox.SetValue(self.use_timer)
        self.peripheral_budding = ID_ROUND
        self.peripheralbudding_combobox.SetStringSelection("Round")

        self.ResetColony()

    def PeripheralBudding(self, event):
        idx = self.peripheralbudding_combobox.GetCurrentSelection()
        self.colony.config['peripheral_budding'] = idx
        print "peripheral budding:", idx
        return

    def OnPolypSelected(self, event):
        #print "on select"
        selected_list = self.polyp_listbox.GetSelections()
        #print selected_list
        for c in self.colony.polyp_list:
            c.selected = False
        for c in selected_list:
            self.polyp_listbox.GetClientData(c).selected = True
        #pass
        #c.selected = True
        #self.Refresh()
        self.ColonyView.DrawToBuffer()
        return


    def OnReset(self, event):

        self.ResetColony()

    def ResetColony(self):
        #self.colony = CoralColony()
        depth = int(self.forms['depth'].GetValue())

        self.colony = CoralColony(depth=depth)

        config = {}
        config['lateral_growth_criterion'] = float(self.forms['lateral_growth_criterion'].GetValue())
        config['lateral_growth_period'] = int(self.forms['lateral_growth_period'].GetValue())
        config['surface_irradiance'] = float(self.forms['surface_irradiance'].GetValue())
        config['attenuation_coefficient'] = float(self.forms['attenuation_coefficient'].GetValue())
        config['max_irradiance'] = float(self.forms['max_irradiance'].GetValue())
        config['reflection_rate'] = float(self.forms['reflection_rate'].GetValue())
        config['growth_constant'] = float(self.forms['growth_constant'].GetValue())
        config['polyp_radius'] = float(self.forms['polyp_radius'].GetValue())
        config['zoom'] = float(self.forms['zoom'].GetValue())
        #config['peripheral_budding'] = self.peripheral_budding
        config['show_skeleton'] = self.show_skeleton
        config['determinate_growth'] = self.determinate_growth
        #print "show skeleton on reset", self.show_skeleton
        config['peripheral_budding'] = self.peripheralbudding_combobox.GetCurrentSelection()
        #print "peripheral_budding on reset colony", config['peripheral_budding']

        self.colony.config = config

        #pos_list = [ [ -9, 0, 0 ], [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3], [9, 0, 0 ] ]
        #vec_list = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]

        #pos_list = [ [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3] ]
        #vec_list = [ array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) ,  array( [ 1, 0, 1 ], float ) ]

        pos_list = [[-2, 0, 3], [2, 0, 3]]
        vec_list = [array([-1, 0, 1], float), array([1, 0, 1], float)]

        for i in xrange(len(pos_list)):
            p = CoralPolyp(self.colony, pos=array(pos_list[i], float))
            p.growth_vector = vec_list[i] / linalg.norm(vec_list[i])
            self.colony.add_polyp(p)

        """
        x_pos = [ -9, -5, 0, 5, 9 ]
        y_pos = [ 0, 0, 0, 0, 0 ]
        z_pos = [ 0, 3, 5, 3, 0]
        grow_vector = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]


        for i in xrange( 5 ):
                p = CoralPolyp( self.colony, pos = array( pos_list[i], float ) )
                p.growth_vector = grow_vector[i] / linalg.norm( grow_vector[i] )
                self.colony.add_polyp( p )
        """
        #colony.prev_polyp_count = 3
        self.colony.init_colony_2d()

        #self.colony.apical_polyp_list.append( self.colony.head_polyp.next_polyp )
        #self.colony.head_polyp.next_polyp.apical_polyp = True


        self.ColonyView.SetColony(self.colony)
        self.ColonyView.Reset()
        self.ColonyView.DrawToBuffer()
        self.LoadList()

        '''
        self.colony.set_minimum_distance_for_division( float( self.forms['minimum_distance'].GetValue() ) )
        self.colony.set_neighbor_distance_threshold( float( self.forms['neighbor_distance'].GetValue() ) )
        self.colony.set_neighbor_count_threshold( float( self.forms['neighbor_count'].GetValue() ) )
        self.colony.set_reproduction_rate( float( self.forms['reproduction'].GetValue() ) )
        self.colony.set_elongation_rate( float( self.forms['elongation'].GetValue() ) )
        self.colony.set_branching_rate( float( self.forms['branching'].GetValue() ) )
        self.colony.set_away_1( float( self.forms['away1'].GetValue() ) )
        self.colony.set_away_2( float( self.forms['away2'].GetValue() ) )
        '''

    #self.ColonyView.SetColony( self.colony )

    def GrowColony(self):
        self.colony.grow()
        self.ColonyView.DrawToBuffer()
        self.LoadList()

    def OnTimer(self, event):
        if self.is_growing:
            self.GrowColony()

    def ToggleTimer(self, event):
        self.use_timer = self.timer_checkbox.GetValue()

    def ToggleDeterminate(self, event):
        self.determinate_growth = self.determinategrowth_checkbox.GetValue()

    def ToggleSkeleton(self, event):
        #print "toggle skeleton"
        self.show_skeleton = self.showskeleton_checkbox.GetValue()
        self.colony.config['show_skeleton'] = self.show_skeleton
        self.ColonyView.DrawToBuffer()

    #print "show skeleton 1", self.show_skeleton

    def ToggleEncrusting(self, event):
        self.allow_encrusting = self.encrusting_checkbox.GetValue()

    def OnPlay(self, event):
        if self.use_timer:
            if self.is_growing:
                self.is_growing = False
                self.PlayButton.SetLabel("Play")
            else:
                self.is_growing = True
                self.PlayButton.SetLabel("Pause")
        else:
            self.GrowColony()

    def LoadList(self):
        #test test
        self.polyp_listbox.Clear()
        h = self.colony.head_polyp
        self.polyp_listbox.Append(str(h.id), h)
        while h.next_polyp:
            h = h.next_polyp
            self.polyp_listbox.Append(str(h.id), h)
    def ResetColony(self):
        #self.colony = CoralColony()
        depth = int(self.forms['depth'].GetValue())

        self.colony = CoralColony(depth=depth)

        config = {}
        config['lateral_growth_criterion'] = float(self.forms['lateral_growth_criterion'].GetValue())
        config['lateral_growth_period'] = int(self.forms['lateral_growth_period'].GetValue())
        config['surface_irradiance'] = float(self.forms['surface_irradiance'].GetValue())
        config['attenuation_coefficient'] = float(self.forms['attenuation_coefficient'].GetValue())
        config['max_irradiance'] = float(self.forms['max_irradiance'].GetValue())
        config['reflection_rate'] = float(self.forms['reflection_rate'].GetValue())
        config['growth_constant'] = float(self.forms['growth_constant'].GetValue())
        config['polyp_radius'] = float(self.forms['polyp_radius'].GetValue())
        config['zoom'] = float(self.forms['zoom'].GetValue())
        #config['peripheral_budding'] = self.peripheral_budding
        config['show_skeleton'] = self.show_skeleton
        config['determinate_growth'] = self.determinate_growth
        #print "show skeleton on reset", self.show_skeleton
        config['peripheral_budding'] = self.peripheralbudding_combobox.GetCurrentSelection()
        #print "peripheral_budding on reset colony", config['peripheral_budding']

        self.colony.config = config

        #pos_list = [ [ -9, 0, 0 ], [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3], [9, 0, 0 ] ]
        #vec_list = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]

        #pos_list = [ [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3] ]
        #vec_list = [ array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) ,  array( [ 1, 0, 1 ], float ) ]

        pos_list = [[-2, 0, 3], [2, 0, 3]]
        vec_list = [array([-1, 0, 1], float), array([1, 0, 1], float)]

        for i in xrange(len(pos_list)):
            p = CoralPolyp(self.colony, pos=array(pos_list[i], float))
            p.growth_vector = vec_list[i] / linalg.norm(vec_list[i])
            self.colony.add_polyp(p)

        """
        x_pos = [ -9, -5, 0, 5, 9 ]
        y_pos = [ 0, 0, 0, 0, 0 ]
        z_pos = [ 0, 3, 5, 3, 0]
        grow_vector = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]


        for i in xrange( 5 ):
                p = CoralPolyp( self.colony, pos = array( pos_list[i], float ) )
                p.growth_vector = grow_vector[i] / linalg.norm( grow_vector[i] )
                self.colony.add_polyp( p )
        """
        #colony.prev_polyp_count = 3
        self.colony.init_colony_2d()

        #self.colony.apical_polyp_list.append( self.colony.head_polyp.next_polyp )
        #self.colony.head_polyp.next_polyp.apical_polyp = True


        self.ColonyView.SetColony(self.colony)
        self.ColonyView.Reset()
        self.ColonyView.DrawToBuffer()
        self.LoadList()

        '''
    def __init__(self, parent, wid, name):
        wx.Frame.__init__(self, parent, wid, name, wx.DefaultPosition,
                          wx.Size(1024, 768))

        self.colony = CoralColony()
        self.encrusting_checkbox = None
        self.interval = 10
        self.growth_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.growth_timer)
        self.growth_timer.Start(self.interval)
        self.show_skeleton = False

        self.ColonyView = ColonyViewControl(self, -1)
        # self.ColonyView.SetMinSize((800,700))
        self.PlayButton = wx.Button(self, wx.ID_ANY, 'Play')
        self.ResetButton = wx.Button(self, wx.ID_ANY, 'Reset')
        #self.LoadNeighborButton = wx.Button(self, wx.ID_ANY, 'Watch')
        #self.ButtonExport = wx.Button(self, wx.ID_ANY, 'Export')
        #lb1 = wx.StaticText(self, wx.ID_ANY, '')
        #lb2 = wx.StaticText(self, wx.ID_ANY, '')

        self.determinategrowth_checkbox = wx.CheckBox(
            self, ID_DETERMINATEGROWTH_CHECKBOX, "Determinate growth")
        self.Bind(wx.EVT_CHECKBOX,
                  self.ToggleDeterminate,
                  id=ID_DETERMINATEGROWTH_CHECKBOX)
        self.showskeleton_checkbox = wx.CheckBox(self,
                                                 ID_SHOWSKELETON_CHECKBOX,
                                                 "Show skeleton")
        self.Bind(wx.EVT_CHECKBOX,
                  self.ToggleSkeleton,
                  id=ID_SHOWSKELETON_CHECKBOX)
        self.timer_checkbox = wx.CheckBox(self, ID_TIMER_CHECKBOX, "Use Timer")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleTimer, id=ID_TIMER_CHECKBOX)
        self.peripheralbudding_combobox = wx.ComboBox(
            self,
            ID_PERIPHERALBUDDING_COMBOBOX,
            "Peripheral budding",
            choices=["None", "Round", "Encrusting", "Platy"])
        self.Bind(wx.EVT_COMBOBOX,
                  self.PeripheralBudding,
                  id=ID_PERIPHERALBUDDING_COMBOBOX)

        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer1.Add(self.PlayButton, wx.ALIGN_CENTER)
        sizer1.Add(self.ResetButton, wx.ALIGN_CENTER)
        #sizer1.Add( self.ButtonExport, wx.ALIGN_CENTER )

        self.forms = dict()

        self.irradiance_label = wx.StaticText(self,
                                              -1,
                                              'Irradiance',
                                              style=wx.ALIGN_RIGHT)
        self.irradiance_value = wx.TextCtrl(self, -1, '')

        self.depth_label = wx.StaticText(self,
                                         -1,
                                         'Depth',
                                         style=wx.ALIGN_RIGHT)
        self.forms['depth'] = wx.TextCtrl(self, -1, str(DEPTH))
        self.lateral_growth_period_label = wx.StaticText(self,
                                                         -1,
                                                         'Lat. Growth Period',
                                                         style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_period'] = wx.TextCtrl(
            self, -1, str(LATERAL_GROWTH_PERIOD))
        self.lateral_growth_criterion_label = wx.StaticText(
            self, -1, 'Lat. Growth Criterion', style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_criterion'] = wx.TextCtrl(
            self, -1, str(LATERAL_GROWTH_CRITERION))
        self.surface_irradiance_label = wx.StaticText(self,
                                                      -1,
                                                      'Surface Irradiance',
                                                      style=wx.ALIGN_RIGHT)
        self.forms['surface_irradiance'] = wx.TextCtrl(self, -1,
                                                       str(SURFACE_IRRADIANCE))
        self.attenuation_coefficient_label = wx.StaticText(
            self, -1, 'Attenuation Coeff.', style=wx.ALIGN_RIGHT)
        self.forms['attenuation_coefficient'] = wx.TextCtrl(
            self, -1, str(ATTENUATION_COEFFICIENT))
        self.max_irradiance_label = wx.StaticText(self,
                                                  -1,
                                                  'Max Irradiance',
                                                  style=wx.ALIGN_RIGHT)
        self.forms['max_irradiance'] = wx.TextCtrl(self, -1,
                                                   str(MAX_IRRADIANCE))
        self.reflection_rate_label = wx.StaticText(self,
                                                   -1,
                                                   'Reflection Rate',
                                                   style=wx.ALIGN_RIGHT)
        self.forms['reflection_rate'] = wx.TextCtrl(self, -1,
                                                    str(REFLECTION_RATE))
        self.growth_constant_label = wx.StaticText(self,
                                                   -1,
                                                   'Growth constant',
                                                   style=wx.ALIGN_RIGHT)
        self.forms['growth_constant'] = wx.TextCtrl(self, -1,
                                                    str(GROWTH_CONSTANT))
        self.polyp_radius_label = wx.StaticText(self,
                                                -1,
                                                'Polyp radius',
                                                style=wx.ALIGN_RIGHT)
        self.forms['polyp_radius'] = wx.TextCtrl(self, -1, str(POLYP_RADIUS))
        self.zoom_label = wx.StaticText(self, -1, 'Zoom', style=wx.ALIGN_RIGHT)
        self.forms['zoom'] = wx.TextCtrl(self, -1, str(ZOOM))

        self.polyp_list_label = wx.StaticText(self,
                                              -1,
                                              'Polyps',
                                              style=wx.ALIGN_RIGHT)
        self.polyp_listbox = wx.ListBox(self,
                                        -1,
                                        choices=(),
                                        size=(100, 200),
                                        style=wx.LB_SINGLE)

        sizer2 = wx.FlexGridSizer(3, 3, 0, 0)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.determinategrowth_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.showskeleton_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.timer_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.peripheralbudding_combobox, flag=wx.EXPAND)

        sizer2.Add(self.depth_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['depth'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_period_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_period'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_criterion_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_criterion'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.surface_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['surface_irradiance'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.attenuation_coefficient_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['attenuation_coefficient'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.max_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['max_irradiance'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.reflection_rate_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['reflection_rate'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.growth_constant_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['growth_constant'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_radius_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['polyp_radius'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.zoom_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['zoom'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_list_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.polyp_listbox, flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.irradiance_value, flag=wx.EXPAND)

        fs = wx.FlexGridSizer(2, 2, 10, 5)
        fs.AddGrowableCol(0, 80)
        fs.AddGrowableCol(1, 20)
        fs.AddGrowableRow(0, 90)
        fs.Add(self.ColonyView, 0, wx.EXPAND)
        fs.Add(sizer2, 0, wx.ALIGN_CENTER)
        fs.Add(sizer1, 0, wx.EXPAND)
        self.Bind(wx.EVT_BUTTON, self.OnPlay, self.PlayButton)
        self.Bind(wx.EVT_BUTTON, self.OnReset, self.ResetButton)

        self.Bind(wx.EVT_LISTBOX, self.OnPolypSelected, self.polyp_listbox)
        self.SetSizer(fs)

        self.is_growing = False
        self.determinate_growth = False
        self.determinategrowth_checkbox.SetValue(self.determinate_growth)
        self.use_timer = True
        self.timer_checkbox.SetValue(self.use_timer)
        self.peripheral_budding = ID_ROUND
        self.peripheralbudding_combobox.SetStringSelection("Round")

        self.ResetColony()
class ColonySimulator2DFrame(wx.Frame):
    def __init__(self, parent, wid, name):
        wx.Frame.__init__(self, parent, wid, name, wx.DefaultPosition,
                          wx.Size(1024, 768))

        self.colony = CoralColony()
        self.encrusting_checkbox = None
        self.interval = 10
        self.growth_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.growth_timer)
        self.growth_timer.Start(self.interval)
        self.show_skeleton = False

        self.ColonyView = ColonyViewControl(self, -1)
        # self.ColonyView.SetMinSize((800,700))
        self.PlayButton = wx.Button(self, wx.ID_ANY, 'Play')
        self.ResetButton = wx.Button(self, wx.ID_ANY, 'Reset')
        #self.LoadNeighborButton = wx.Button(self, wx.ID_ANY, 'Watch')
        #self.ButtonExport = wx.Button(self, wx.ID_ANY, 'Export')
        #lb1 = wx.StaticText(self, wx.ID_ANY, '')
        #lb2 = wx.StaticText(self, wx.ID_ANY, '')

        self.determinategrowth_checkbox = wx.CheckBox(
            self, ID_DETERMINATEGROWTH_CHECKBOX, "Determinate growth")
        self.Bind(wx.EVT_CHECKBOX,
                  self.ToggleDeterminate,
                  id=ID_DETERMINATEGROWTH_CHECKBOX)
        self.showskeleton_checkbox = wx.CheckBox(self,
                                                 ID_SHOWSKELETON_CHECKBOX,
                                                 "Show skeleton")
        self.Bind(wx.EVT_CHECKBOX,
                  self.ToggleSkeleton,
                  id=ID_SHOWSKELETON_CHECKBOX)
        self.timer_checkbox = wx.CheckBox(self, ID_TIMER_CHECKBOX, "Use Timer")
        self.Bind(wx.EVT_CHECKBOX, self.ToggleTimer, id=ID_TIMER_CHECKBOX)
        self.peripheralbudding_combobox = wx.ComboBox(
            self,
            ID_PERIPHERALBUDDING_COMBOBOX,
            "Peripheral budding",
            choices=["None", "Round", "Encrusting", "Platy"])
        self.Bind(wx.EVT_COMBOBOX,
                  self.PeripheralBudding,
                  id=ID_PERIPHERALBUDDING_COMBOBOX)

        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer1.Add(self.PlayButton, wx.ALIGN_CENTER)
        sizer1.Add(self.ResetButton, wx.ALIGN_CENTER)
        #sizer1.Add( self.ButtonExport, wx.ALIGN_CENTER )

        self.forms = dict()

        self.irradiance_label = wx.StaticText(self,
                                              -1,
                                              'Irradiance',
                                              style=wx.ALIGN_RIGHT)
        self.irradiance_value = wx.TextCtrl(self, -1, '')

        self.depth_label = wx.StaticText(self,
                                         -1,
                                         'Depth',
                                         style=wx.ALIGN_RIGHT)
        self.forms['depth'] = wx.TextCtrl(self, -1, str(DEPTH))
        self.lateral_growth_period_label = wx.StaticText(self,
                                                         -1,
                                                         'Lat. Growth Period',
                                                         style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_period'] = wx.TextCtrl(
            self, -1, str(LATERAL_GROWTH_PERIOD))
        self.lateral_growth_criterion_label = wx.StaticText(
            self, -1, 'Lat. Growth Criterion', style=wx.ALIGN_RIGHT)
        self.forms['lateral_growth_criterion'] = wx.TextCtrl(
            self, -1, str(LATERAL_GROWTH_CRITERION))
        self.surface_irradiance_label = wx.StaticText(self,
                                                      -1,
                                                      'Surface Irradiance',
                                                      style=wx.ALIGN_RIGHT)
        self.forms['surface_irradiance'] = wx.TextCtrl(self, -1,
                                                       str(SURFACE_IRRADIANCE))
        self.attenuation_coefficient_label = wx.StaticText(
            self, -1, 'Attenuation Coeff.', style=wx.ALIGN_RIGHT)
        self.forms['attenuation_coefficient'] = wx.TextCtrl(
            self, -1, str(ATTENUATION_COEFFICIENT))
        self.max_irradiance_label = wx.StaticText(self,
                                                  -1,
                                                  'Max Irradiance',
                                                  style=wx.ALIGN_RIGHT)
        self.forms['max_irradiance'] = wx.TextCtrl(self, -1,
                                                   str(MAX_IRRADIANCE))
        self.reflection_rate_label = wx.StaticText(self,
                                                   -1,
                                                   'Reflection Rate',
                                                   style=wx.ALIGN_RIGHT)
        self.forms['reflection_rate'] = wx.TextCtrl(self, -1,
                                                    str(REFLECTION_RATE))
        self.growth_constant_label = wx.StaticText(self,
                                                   -1,
                                                   'Growth constant',
                                                   style=wx.ALIGN_RIGHT)
        self.forms['growth_constant'] = wx.TextCtrl(self, -1,
                                                    str(GROWTH_CONSTANT))
        self.polyp_radius_label = wx.StaticText(self,
                                                -1,
                                                'Polyp radius',
                                                style=wx.ALIGN_RIGHT)
        self.forms['polyp_radius'] = wx.TextCtrl(self, -1, str(POLYP_RADIUS))
        self.zoom_label = wx.StaticText(self, -1, 'Zoom', style=wx.ALIGN_RIGHT)
        self.forms['zoom'] = wx.TextCtrl(self, -1, str(ZOOM))

        self.polyp_list_label = wx.StaticText(self,
                                              -1,
                                              'Polyps',
                                              style=wx.ALIGN_RIGHT)
        self.polyp_listbox = wx.ListBox(self,
                                        -1,
                                        choices=(),
                                        size=(100, 200),
                                        style=wx.LB_SINGLE)

        sizer2 = wx.FlexGridSizer(3, 3, 0, 0)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.determinategrowth_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.showskeleton_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.timer_checkbox, flag=wx.EXPAND)

        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.peripheralbudding_combobox, flag=wx.EXPAND)

        sizer2.Add(self.depth_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['depth'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_period_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_period'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.lateral_growth_criterion_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['lateral_growth_criterion'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.surface_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['surface_irradiance'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.attenuation_coefficient_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['attenuation_coefficient'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.max_irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['max_irradiance'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.reflection_rate_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['reflection_rate'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.growth_constant_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['growth_constant'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_radius_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['polyp_radius'],
                   flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.zoom_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.forms['zoom'], flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.polyp_list_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.polyp_listbox, flag=wx.EXPAND | wx.ALIGN_CENTER)

        sizer2.Add(self.irradiance_label, flag=wx.EXPAND)
        sizer2.Add((10, 10), flag=wx.EXPAND)
        sizer2.Add(self.irradiance_value, flag=wx.EXPAND)

        fs = wx.FlexGridSizer(2, 2, 10, 5)
        fs.AddGrowableCol(0, 80)
        fs.AddGrowableCol(1, 20)
        fs.AddGrowableRow(0, 90)
        fs.Add(self.ColonyView, 0, wx.EXPAND)
        fs.Add(sizer2, 0, wx.ALIGN_CENTER)
        fs.Add(sizer1, 0, wx.EXPAND)
        self.Bind(wx.EVT_BUTTON, self.OnPlay, self.PlayButton)
        self.Bind(wx.EVT_BUTTON, self.OnReset, self.ResetButton)

        self.Bind(wx.EVT_LISTBOX, self.OnPolypSelected, self.polyp_listbox)
        self.SetSizer(fs)

        self.is_growing = False
        self.determinate_growth = False
        self.determinategrowth_checkbox.SetValue(self.determinate_growth)
        self.use_timer = True
        self.timer_checkbox.SetValue(self.use_timer)
        self.peripheral_budding = ID_ROUND
        self.peripheralbudding_combobox.SetStringSelection("Round")

        self.ResetColony()

    def PeripheralBudding(self, event):
        idx = self.peripheralbudding_combobox.GetCurrentSelection()
        self.colony.config['peripheral_budding'] = idx
        print "peripheral budding:", idx
        return

    def OnPolypSelected(self, event):
        #print "on select"
        selected_list = self.polyp_listbox.GetSelections()
        #print selected_list
        for c in self.colony.polyp_list:
            c.selected = False
        for c in selected_list:
            self.polyp_listbox.GetClientData(c).selected = True
        #pass
        #c.selected = True
        #self.Refresh()
        self.ColonyView.DrawToBuffer()
        return

    def OnReset(self, event):

        self.ResetColony()

    def ResetColony(self):
        #self.colony = CoralColony()
        depth = int(self.forms['depth'].GetValue())

        self.colony = CoralColony(depth=depth)

        config = {}
        config['lateral_growth_criterion'] = float(
            self.forms['lateral_growth_criterion'].GetValue())
        config['lateral_growth_period'] = int(
            self.forms['lateral_growth_period'].GetValue())
        config['surface_irradiance'] = float(
            self.forms['surface_irradiance'].GetValue())
        config['attenuation_coefficient'] = float(
            self.forms['attenuation_coefficient'].GetValue())
        config['max_irradiance'] = float(
            self.forms['max_irradiance'].GetValue())
        config['reflection_rate'] = float(
            self.forms['reflection_rate'].GetValue())
        config['growth_constant'] = float(
            self.forms['growth_constant'].GetValue())
        config['polyp_radius'] = float(self.forms['polyp_radius'].GetValue())
        config['zoom'] = float(self.forms['zoom'].GetValue())
        #config['peripheral_budding'] = self.peripheral_budding
        config['show_skeleton'] = self.show_skeleton
        config['determinate_growth'] = self.determinate_growth
        #print "show skeleton on reset", self.show_skeleton
        config[
            'peripheral_budding'] = self.peripheralbudding_combobox.GetCurrentSelection(
            )
        #print "peripheral_budding on reset colony", config['peripheral_budding']

        self.colony.config = config

        #pos_list = [ [ -9, 0, 0 ], [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3], [9, 0, 0 ] ]
        #vec_list = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]

        #pos_list = [ [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3] ]
        #vec_list = [ array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) ,  array( [ 1, 0, 1 ], float ) ]

        pos_list = [[-2, 0, 3], [2, 0, 3]]
        vec_list = [array([-1, 0, 1], float), array([1, 0, 1], float)]

        for i in xrange(len(pos_list)):
            p = CoralPolyp(self.colony, pos=array(pos_list[i], float))
            p.growth_vector = vec_list[i] / linalg.norm(vec_list[i])
            self.colony.add_polyp(p)
        """
        x_pos = [ -9, -5, 0, 5, 9 ]
        y_pos = [ 0, 0, 0, 0, 0 ]
        z_pos = [ 0, 3, 5, 3, 0]
        grow_vector = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]


        for i in xrange( 5 ):
                p = CoralPolyp( self.colony, pos = array( pos_list[i], float ) )
                p.growth_vector = grow_vector[i] / linalg.norm( grow_vector[i] )
                self.colony.add_polyp( p )
        """
        #colony.prev_polyp_count = 3
        self.colony.init_colony_2d()

        #self.colony.apical_polyp_list.append( self.colony.head_polyp.next_polyp )
        #self.colony.head_polyp.next_polyp.apical_polyp = True

        self.ColonyView.SetColony(self.colony)
        self.ColonyView.Reset()
        self.ColonyView.DrawToBuffer()
        self.LoadList()
        '''
        self.colony.set_minimum_distance_for_division( float( self.forms['minimum_distance'].GetValue() ) )
        self.colony.set_neighbor_distance_threshold( float( self.forms['neighbor_distance'].GetValue() ) )
        self.colony.set_neighbor_count_threshold( float( self.forms['neighbor_count'].GetValue() ) )
        self.colony.set_reproduction_rate( float( self.forms['reproduction'].GetValue() ) )
        self.colony.set_elongation_rate( float( self.forms['elongation'].GetValue() ) )
        self.colony.set_branching_rate( float( self.forms['branching'].GetValue() ) )
        self.colony.set_away_1( float( self.forms['away1'].GetValue() ) )
        self.colony.set_away_2( float( self.forms['away2'].GetValue() ) )
        '''

    #self.ColonyView.SetColony( self.colony )

    def GrowColony(self):
        self.colony.grow()
        self.ColonyView.DrawToBuffer()
        self.LoadList()

    def OnTimer(self, event):
        if self.is_growing:
            self.GrowColony()

    def ToggleTimer(self, event):
        self.use_timer = self.timer_checkbox.GetValue()

    def ToggleDeterminate(self, event):
        self.determinate_growth = self.determinategrowth_checkbox.GetValue()

    def ToggleSkeleton(self, event):
        #print "toggle skeleton"
        self.show_skeleton = self.showskeleton_checkbox.GetValue()
        self.colony.config['show_skeleton'] = self.show_skeleton
        self.ColonyView.DrawToBuffer()

    #print "show skeleton 1", self.show_skeleton

    def ToggleEncrusting(self, event):
        self.allow_encrusting = self.encrusting_checkbox.GetValue()

    def OnPlay(self, event):
        if self.use_timer:
            if self.is_growing:
                self.is_growing = False
                self.PlayButton.SetLabel("Play")
            else:
                self.is_growing = True
                self.PlayButton.SetLabel("Pause")
        else:
            self.GrowColony()

    def LoadList(self):
        #test test
        self.polyp_listbox.Clear()
        h = self.colony.head_polyp
        self.polyp_listbox.Append(str(h.id), h)
        while h.next_polyp:
            h = h.next_polyp
            self.polyp_listbox.Append(str(h.id), h)
    def ResetColony(self):
        #self.colony = CoralColony()
        depth = int(self.forms['depth'].GetValue())

        self.colony = CoralColony(depth=depth)

        config = {}
        config['lateral_growth_criterion'] = float(
            self.forms['lateral_growth_criterion'].GetValue())
        config['lateral_growth_period'] = int(
            self.forms['lateral_growth_period'].GetValue())
        config['surface_irradiance'] = float(
            self.forms['surface_irradiance'].GetValue())
        config['attenuation_coefficient'] = float(
            self.forms['attenuation_coefficient'].GetValue())
        config['max_irradiance'] = float(
            self.forms['max_irradiance'].GetValue())
        config['reflection_rate'] = float(
            self.forms['reflection_rate'].GetValue())
        config['growth_constant'] = float(
            self.forms['growth_constant'].GetValue())
        config['polyp_radius'] = float(self.forms['polyp_radius'].GetValue())
        config['zoom'] = float(self.forms['zoom'].GetValue())
        #config['peripheral_budding'] = self.peripheral_budding
        config['show_skeleton'] = self.show_skeleton
        config['determinate_growth'] = self.determinate_growth
        #print "show skeleton on reset", self.show_skeleton
        config[
            'peripheral_budding'] = self.peripheralbudding_combobox.GetCurrentSelection(
            )
        #print "peripheral_budding on reset colony", config['peripheral_budding']

        self.colony.config = config

        #pos_list = [ [ -9, 0, 0 ], [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3], [9, 0, 0 ] ]
        #vec_list = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]

        #pos_list = [ [-5, 0, 3 ], [ 0, 0, 5 ], [5, 0, 3] ]
        #vec_list = [ array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) ,  array( [ 1, 0, 1 ], float ) ]

        pos_list = [[-2, 0, 3], [2, 0, 3]]
        vec_list = [array([-1, 0, 1], float), array([1, 0, 1], float)]

        for i in xrange(len(pos_list)):
            p = CoralPolyp(self.colony, pos=array(pos_list[i], float))
            p.growth_vector = vec_list[i] / linalg.norm(vec_list[i])
            self.colony.add_polyp(p)
        """
        x_pos = [ -9, -5, 0, 5, 9 ]
        y_pos = [ 0, 0, 0, 0, 0 ]
        z_pos = [ 0, 3, 5, 3, 0]
        grow_vector = [ array( [ -1, 0, 0.01 ], float ), array( [ -1, 0, 1 ], float ), array( [ 0, 0, 1 ], float ) , array( [ 1, 0, 1 ], float ),array( [ 1, 0, 0.01 ], float ) ]


        for i in xrange( 5 ):
                p = CoralPolyp( self.colony, pos = array( pos_list[i], float ) )
                p.growth_vector = grow_vector[i] / linalg.norm( grow_vector[i] )
                self.colony.add_polyp( p )
        """
        #colony.prev_polyp_count = 3
        self.colony.init_colony_2d()

        #self.colony.apical_polyp_list.append( self.colony.head_polyp.next_polyp )
        #self.colony.head_polyp.next_polyp.apical_polyp = True

        self.ColonyView.SetColony(self.colony)
        self.ColonyView.Reset()
        self.ColonyView.DrawToBuffer()
        self.LoadList()
        '''