Rm abipy.gui

This commit is contained in:
gmatteo 2023-08-18 16:48:07 +02:00
parent e235e5d645
commit 208506d72a
94 changed files with 8 additions and 20556 deletions

View File

@ -1,3 +1,10 @@
Release 0.9.5:
* Force make_dte_inputs to consider the psp to be in LDA
* Fix ngfft issue when going to DTE
* Force DTE to overwrite nband and nbdbuf to number of VBs and 0 respectively
Release 0.9.4:
* Require pymatgen == 2023.7.17

View File

@ -1,15 +0,0 @@
============
gui examples
============
Below is a brief description of the different directories found here:
* awx - contains generic widgets used to construct more complicated interfaces.
* wxFormBuilder - wxFormBuilder input file used to design some of of the UI.
* demo - Scripts showing the different widgets/applications
If you add a new widget/application, add a new script in the demo directory.
Name the script following the conventions `demo_awx_[name_widget]` so that
run.py can import and run it automatically.

View File

View File

@ -1,39 +0,0 @@
#import os
__all__ = []
#_MODS = [
# "buttons.py",
# "core",
# "apps",
# "frames",
# "grids",
# "dialogs",
# "panels",
# "eggs",
# "func1dframe",
# "threads",
# "utils",
#]
#_MODS = [os.path.join(os.path.dirname(__file__), f) for f in _MODS]
#for _mod in _MODS:
# try:
# exec('from .' + _mod + ' import *')
# exec('__all__.extend(' + _mod + '.__all__)')
# exec('del ' + _mod)
# except ImportError:
# pass
from abipy.gui.awx.buttons import *
from abipy.gui.awx.core import *
from abipy.gui.awx.apps import *
from abipy.gui.awx.frames import *
from abipy.gui.awx.grids import *
from abipy.gui.awx.dialogs import *
from abipy.gui.awx.panels import *
from abipy.gui.awx.eggs import *
from abipy.gui.awx.func1dframe import *
from abipy.gui.awx.threads import *
from abipy.gui.awx.utils import *

View File

@ -1,111 +0,0 @@
from __future__ import print_function, division
import abc
import sys
import wx
#from abipy.gui.awx.dialogs import showErrorMessage
__all__ = [
"App",
]
def ExceptionHook(exctype, value, trace):
"""
Handler for all unhandled exceptions
Create a simple exception hook to handle and inform the user of
any unexpected errors that occur while the program is running:
@param exctype: Exception Type
@param value: Error Value
@param trace: Trace back info
"""
# Format the traceback
import traceback
exc = traceback.format_exception(exctype, value, trace)
ftrace = "".join(exc)
app = wx.GetApp()
if app:
msg = "An unexpected error has occurred: %s" % ftrace
parent = app.GetTopWindow()
parent.Raise()
wx.MessageBox(parent=parent, message=msg, caption=app.GetAppName(), style=wx.ICON_ERROR|wx.OK)
#showErrorMessage(parent=parent, message=None)
#app.Exit()
else:
sys.stderr.write(ftrace)
class App(wx.App):
__metaclass__ = abc.ABCMeta
def __init__(self, *args, **kwargs):
wx.App.__init__(self, *args, **kwargs)
# Initialize the logger
import logging
loglevel = "WARNING"
loglevel = "DEBUG"
loglevel = "CRITICAL"
numeric_level = getattr(logging, loglevel.upper(), None)
if not isinstance(numeric_level, int):
raise ValueError('Invalid log level: %s' % loglevel)
logging.basicConfig(level=numeric_level)
# This catches events when the app is asked to activate by some other process
self.Bind(wx.EVT_ACTIVATE_APP, self.OnActivate)
def OnInit(self):
# Handler for all unhandled exceptions
sys.excepthook = ExceptionHook
# Enforce WXAgg as matplotlib backend to avoid nasty SIGSEGV in the C++ layer
# occurring when WX Guis produce plots with other backends.
import matplotlib
matplotlib.use('WXAgg')
return True
@property
def appname(self):
"""Name of the application."""
return self.__class__.__name__
def __repr__(self):
return "<%s at %s>" % (self.appname, id(self))
def __str__(self):
return self.__repr__()
def BringWindowToFront(self):
try:
# it's possible for this event to come when the frame is closed
self.GetTopWindow().Raise()
except:
pass
def OnActivate(self, event):
# if this is an activate event, rather than something else, like iconize.
if event.GetActive():
self.BringWindowToFront()
event.Skip()
#@abc.abstractmethod
#def MacOpenFile(self, filename):
# """Called for files droped on dock icon, or opened via finders context menu"""
# #if filename.endswith(".py"):
# # return
# # Code to load filename.
# #self.log("%s dropped on app %s" % (filename, self.appname))
#
#def MacReopenApp(self):
# """Called when the dock icon is clicked."""
# self.BringWindowToFront()
#def MacNewFile(self):
# pass
#def MacPrintFile(self, filepath):
# pass

View File

@ -1,127 +0,0 @@
from __future__ import division, print_function
import io
#import wxversion
#wxversion.ensureMinimal('2.8')
import wx
from wx.lib import buttons
__all__ = [
"DisclosureCtrl"
]
class DisclosureCtrl(buttons.GenBitmapTextToggleButton):
"""Disclosure triangle button."""
bmp0 = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\r\x00\x00'
b'\x00\r\x08\x06\x00\x00\x00r\xeb\xe4|\x00\x00\x00\x04sBIT'
b'\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\xd5IDAT(\x91\x9d'
b'\x921n\x83@\x10E\xdf.!\x96\x9c\x90P"\xd9\x86\x92\x82\x03p'
b'\x02h\xa9i9A\xe2\xb38)9\x02w\xc0\t\x94I\xa0H\xd2\xc7'
b'\x96(\x918\xc0\xa6Z\x17\x91\x05&_\x1a\xe9k4O\xfa3\x1a!'
b'\xa4\xc1\\Im>\xde\xdf\xd4l\xa8,K\x9e\x9fv\xeax\xf8\x99\x84'
b'\x85\x8e\xb7}|P\x00\xb6m\x13\x04\x01q\x1cc\xdd\xdd\x8bs\xd0'
b'\xd5\xdfF\xdf\xf7TUE\xdb\xb6\xbc\xbe\xecU\x18\x86\x98\xd7'
b'\x0b1\ni\r\xc3@Q\x14\xd4u\xcd\xf7\xd7\xa7r]\x97\xe5\xcd'
b'\xad\x18\x85\xb4\xba\xae#\xcfs|\xdf?\xf5\xe4\xc8<\x00\x8e'
b'\xe3\x90e\x19i\x9aN\xc7\xb3,\x8b(\x8a\xb8h\xa7Y\xd7'
b'\xf3<\x0f\xd34I\x92\x84\xd5zsv\xf8$!\r\x844h\x9aFi?Y\xff'
b'\xf9\xbd_\xd7\x8c7Z\xc0k\x8d8\x00\x00\x00\x00IEND\xaeB`\x82')
bmp1 = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\r\x00\x00'
b'\x00\r\x08\x06\x00\x00\x00r\xeb\xe4|\x00\x00\x00\x04sBIT'
b'\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\xc1IDAT(\x91\x9d\xd2;'
b'\x8e\xc20\x10\x80\xe1\x7fB\x0c\x95\xc1\xa5%\xc0)S\xb8I\xd2'
b'\xb8Le\x97\xf6\x99s\x81\xdd\xbdBN\xb2\xdb!Y\t\xac`\xbay|'
b'\xa3)F\xa49\xf0n4o\x8bOQ\x0b\xf0\xf3\xfd\xf5\xbb,\x0b\xeb'
b'\xba>\x1d\xec\xba\x8ey\x9e\x19\xc6I\x1a\x80a\x9cD)\xf5r'
b'\xbbR\x8aa\x9c\xa4:\xaf\x94\x821f\x17\x18c(\xa5<\xf2\x07'
b'\xba\xde\xee\xe2\xbd\xdfE\xde{\xae\xb7\xbbl\x10@J\t\xadu\x05'
b'\xb4\xd6\xa4\x94\xaaZ\x85\xf4\xf9"1\xc6j \xc6\x88>_\xe4)\x02'
b'\x08!`\xad\x05\xc0ZK\x08as\xee\x06\xa9\xe3Ir\xce\xb4mK\xce'
b'\x19u<\xc9\xbf\x08\xc09G\xdf\xf78\xe7\xf6\xda\xc8\'\xbf\xf7'
b'\x07\x13\x12\x18B\x17\x9fx\xa0\x00\x00\x00\x00IEND\xaeB`\x82')
def __init__(self, parent, winid, label, *args, **kwds):
kwds["style"] = wx.BORDER_NONE|wx.BU_EXACTFIT
buttons.GenBitmapTextToggleButton.__init__(self, parent, winid, None,
label, *args, **kwds)
if isinstance(self.bmp0, type(b'')):
self.__class__.bmp0 = wx.BitmapFromImage(wx.ImageFromStream(
io.BytesIO(self.bmp0)))
self.__class__.bmp1 = wx.BitmapFromImage(wx.ImageFromStream(
io.BytesIO(self.bmp1)))
self.SetBitmapLabel(self.bmp0)
self.SetBitmapSelected(self.bmp1)
if not label:
self.SetSize(self.bmp0.GetSize())
else:
self.SetBestSize()
self.labelDelta = 0
self.useFocusInd = False
self.SetToolTipString('Show')
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
def OnEraseBackground(self, event):
pass
def Notify(self):
wx.lib.buttons.GenBitmapTextToggleButton.Notify(self)
self.SetToolTipString("%s" % ('Show' if self.up else 'Hide'))
def DoGetBestSize(self):
width, height, usemin = self._GetLabelSize()
return width + 5, height + 4
def OnPaint(self, event):
width, height = self.GetClientSizeTuple()
dc = wx.BufferedPaintDC(self)
bgcol = self.GetBackgroundColour()
brush = wx.Brush(bgcol, wx.SOLID)
defattr = self.GetDefaultAttributes()
if self.style & wx.BORDER_NONE and bgcol == defattr.colBg:
defattr = self.GetParent().GetDefaultAttributes()
if self.GetParent().GetBackgroundColour() == defattr.colBg:
if wx.Platform == "__WXMSW__":
if self.DoEraseBackground(dc):
brush = None
elif wx.Platform == "__WXMAC__":
brush.MacSetTheme(1)
else:
bgcol = self.GetParent().GetBackgroundColour()
brush = wx.Brush(bgcol, wx.SOLID)
if brush is not None:
dc.SetBackground(brush)
dc.Clear()
self.DrawLabel(dc, width, height)
def DrawLabel(self, dc, width, height, center=False):
bmp = self.bmpLabel
if bmp is not None:
if self.bmpDisabled and not self.IsEnabled():
bmp = self.bmpDisabled
if self.bmpFocus and self.hasFocus:
bmp = self.bmpFocus
if self.bmpSelected and not self.up:
bmp = self.bmpSelected
bmpwidth, bmpheight = bmp.GetWidth(), bmp.GetHeight()
hasmask = bmp.GetMask() is not None
else:
bmpwidth = bmpheight = 0
dc.SetFont(self.GetFont())
color = (self.GetForegroundColour() if self.IsEnabled() else
wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
dc.SetTextForeground(color)
label = self.GetLabel()
txtwidth, txtheight = dc.GetTextExtent(label)
# center bitmap and text
xpos = (width - bmpwidth - txtwidth) // 2 if center else 0
if bmp is not None:
dc.DrawBitmap(bmp, xpos, (height - bmpheight) // 2, hasmask)
xpos += 5
dc.DrawText(label, xpos + bmpwidth, (height - txtheight) // 2)

View File

@ -1,172 +0,0 @@
from __future__ import print_function, division
import wx
__all__ = [
"ConsoleEvent",
"ConsoleWindow",
]
#######################################################################
# Events for the console widget
#######################################################################
EVT_CONSOLE_TYPE = wx.NewEventType()
EVT_CONSOLE = wx.PyEventBinder(EVT_CONSOLE_TYPE, 1)
class ConsoleEvent(wx.PyEvent):
"""
This event is triggering for messages that
should be displayed within the console.
"""
def __init__(self, kind, msg):
wx.PyEvent.__init__(self)
self.SetEventType(EVT_CONSOLE_TYPE)
self.kind, self.msg = kind, msg
class ConsoleWindow(wx.TextCtrl):
"""
This serves as the primary console for displaying commands and initialization information.
The console window is color coded. To write to the console window, widgets should post console events.
"""
# Message kinds
INFO = "info"
DEBUG = "debug"
WARNING = "warning"
CRITICAL = "critical"
ERROR = 'error'
ALL_KINDS =[INFO, DEBUG, WARNING, CRITICAL, ERROR]
def __init__(self, parent):
"""Creates the console window."""
wx.TextCtrl.__init__(self, parent, -1, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.NO_BORDER | wx.TE_RICH2)
self.idPOPUP_CLEAR = wx.NewId()
# "kind > %s\n",
self.format = {}
for kind in self.ALL_KINDS:
self.format[kind] = kind + "> %s\n"
self.colors = {k: None for k in self.ALL_KINDS}
self.wxColors = {k: None for k in self.ALL_KINDS}
# Set ourselves to receive all console events
self.Bind(EVT_CONSOLE, self.onConsoleEvent)
# Set up the console menu handler
self.Bind(wx.EVT_RIGHT_DOWN, self.onRightClick, self)
def displayBanner(self, **kwargs):
"""Displays the application startup banner."""
self.insertText('===============================================')
self.insertText("Welcome to program %s" % version)
self.insertText('===============================================')
self.insertText('')
def insertText(self, text, kind=None):
"""
Writes text to the console window in the appropriate color for the kind of message.
"""
self.SetDefaultStyle(wx.TextAttr(self.getColor(kind)))
self.AppendText(self.format[kind] % text)
def getColor(self, kind):
"""Gets the wx color object for the specified text kind."""
#config = utils.getApplicationConfiguration()
#current_color = config[kind + '_color']
if kind is None:
return None
wx_color = None
#current_color = "error"
#if self.colors[kind] == current_color:
# wx_color = self.wxColors[kind]
#else:
# wx_color = apply(wx.Colour, current_color)
# self.colors[kind] = current_color
# self.wxColors[kind] = wx_color
return wx_color
def onConsoleEvent(self, event):
"""
Processes a console event by displaying the contents of the event to the console window.
"""
self.insertText(event.msg, event.kind)
def onRightClick(self, event):
"""Handles a right click by displaying the popupmenu at the click point."""
menu = self.makePopupMenu()
self.PopupMenu(menu, event.GetPosition())
def makePopupMenu(self):
"""Creates the popup menu for operations on the console window."""
menu = wx.Menu()
menu.Append(self.idPOPUP_CLEAR, "Clear Console")
self.Bind(wx.EVT_MENU, self.onClear, id=self.idPOPUP_CLEAR)
return menu
def onClear(self, event):
"""Processes a clearing of the console window event."""
self.Clear()
class FrameWithConsole(wx.Frame):
"""
Simple frame with a Choice control and two buttons: OK, Cancel
Subclasses will usually redefine onOkButton.
"""
def __init__(self, parent, choices, **kwargs):
super(FrameWithConsole, self).__init__(parent, id=-1, **kwargs)
self.parent = parent
main_sizer = wx.BoxSizer(wx.VERTICAL)
panel = wx.Panel(self, -1)
main_sizer.Add(panel, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=5)
ok_button = wx.Button(self, wx.ID_OK, label='Ok')
ok_button.Bind(wx.EVT_BUTTON, self.onOkButton)
close_button = wx.Button(self, wx.ID_CANCEL, label='Cancel')
close_button.Bind(wx.EVT_BUTTON, self.onCloseButton)
hbox = wx.BoxSizer(wx.HORIZONTAL)
hbox.Add(ok_button)
hbox.Add(close_button, flag=wx.LEFT, border=5)
main_sizer.Add(hbox, flag=wx.ALIGN_CENTER | wx.ALL | wx.EXPAND)
splitter = wx.SplitterWindow(self, -1, style=wx.SP_3DSASH)
self.console = ConsoleWindow(splitter)
csplitter = wx.SplitterWindow(splitter, -1, style=wx.SP_3DSASH)
# Set the default control window size
splitter.SplitHorizontally(self.console, csplitter, 150)
main_sizer.Add(splitter, 1, wx.EXPAND)
#main_sizer.Add(self.console, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=5)
self.SetAutoLayout(True)
self.SetSizerAndFit(main_sizer)
def onOkButton(self, event):
event = ConsoleEvent(kind="error", msg="Hello")
#print("Firing %s" % event)
wx.PostEvent(self.console, event)
def onCloseButton(self, event):
self.Destroy()
if __name__ == "__main__":
app = wx.App()
frame = FrameWithConsole(None, -1)
frame.Show(True)
app.SetTopWindow(frame)
app.MainLoop()

View File

@ -1,157 +0,0 @@
"""Core objects and helper functions."""
from __future__ import print_function, division
import os
import sys
import wx
from monty.string import list_strings
#import abipy.tools.decorators as dec
#import logging
#logger = logging.getLogger(__name__)
__all__ = [
"path_img",
"makeAboutBox",
"verbose",
"Panel",
"Frame",
"get_width_height",
]
_DEBUG = True
_DEBUG = False
#if _DEBUG:
# verbose = dec.verbose
#
#else:
def verbose(func):
return func
#class Error(Exception):
# """Base class for exceptions raised by awx library"""
def path_img(filename):
"""Returns the absolute path of an image."""
dirname = os.path.dirname(__file__)
return os.path.join(dirname, "images", filename)
def makeAboutBox(codename, version, description, developers, website=None, icon_path=None):
licence = """%(codename)s is free software; you can redistribute
it and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
%(codename)s 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 the code;
if not, write to the Free Software Foundation, Inc., 59 Temple Place,
Suite 330, Boston, MA 02111-1307 USA""" % {"codename": codename}
# Make a template for the description
#desc = "\n".join(["\nwxPython Cookbook Chapter 5\n",
# "Platform Info: (%s,%s)",
# "License: Public Domain"])
## Get the platform information
#py_version = [sys.platform, ", python ", sys.version.split()[0]]
#platform = list(wx.PlatformInfo[1:])
#platform[0] += (" " + wx.VERSION_STRING)
#wx_info = ", ".join(platform)
#info.SetDescription(desc % (py_version, wx_info))
info = wx.AboutDialogInfo()
if icon_path is not None:
info.SetIcon(wx.Icon(icon_path, wx.BITMAP_TYPE_PNG))
info.SetName(codename)
info.SetVersion(version)
info.SetDescription(description)
info.SetCopyright('(C) Abipy group')
if website is not None:
info.SetWebSite(website)
info.SetLicence(licence)
for dev in list_strings(developers):
info.AddDeveloper(dev)
wx.AboutBox(info)
def get_width_height(window, string, pads=(10, 10)):
"""
Returns the width and the height (in pixels) of a string used in window.
Returns are padded with pads
See http://docs.wxwidgets.org/2.8/wx_wxdc.html#wxdcgettextextent
"""
f = window.GetFont()
dc = wx.WindowDC(window)
dc.SetFont(f)
width, height = dc.GetTextExtent(string)
return width + pads[0], height + pads[1]
class MyWindow(object):
"""
Mixin class providing helper functions and commonly used callbacks.
Attributes:
HELP_MSG:
string with a short help (will be displayed in MessageDialog in onHelp callback)
"""
HELP_MSG = "No help available"
def getParentWithType(self, cls):
"""
Returns the first parent window of type cls.
Raises:
RuntimeError if we have reached the head of the linked list.
"""
parent = self.GetParent()
while True:
if parent is None:
raise RuntimeError("Cannot find parent with class %s, reached None parent!" % cls)
if isinstance(parent, cls):
return parent
else:
parent = parent.GetParent()
def onHelp(self, event):
"""Short help."""
dialog = wx.MessageDialog(self, self.HELP_MSG, " Quick Reference", wx.OK | wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
class Panel(wx.Panel, MyWindow):
def __init__(self, parent, *args, **kwargs):
super(Panel, self).__init__(parent, *args, **kwargs)
class Frame(wx.Frame, MyWindow):
"""Base class for frames."""
def __init__(self, parent, *args, **kwargs):
if "title" not in kwargs:
kwargs["title"] = self.__class__.__name__
super(Frame, self).__init__(parent, *args, **kwargs)

View File

@ -1,220 +0,0 @@
from __future__ import print_function, division
import os
import wx
from shutil import which
from monty.string import is_string
__all__ = [
"showErrorMessage",
"askUser",
"showLicense",
]
# Helper functions.
def _straceback():
"""Returns a string with the traceback."""
import traceback
return traceback.format_exc()
def askUser(parent, message):
"""Open dialog with message, return user's answer."""
ask = wx.MessageDialog(parent, message)
answer = ask.ShowModal() == wx.ID_OK
ask.Destroy()
return answer
class ErrorDialog(wx.MessageDialog):
def __init__(self, parent, message):
super(ErrorDialog, self).__init__(parent, message=message, caption='Error Message',
style=wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT | wx.ICON_ERROR | wx.STAY_ON_TOP)
def showErrorMessage(parent, message=None):
"""
Open a `MessageDialog` with an error message.
If message is None, the python traceback is used.
"""
if message is None: message = _straceback()
message += "\n\n Do you want to send a bug report?"
dialog = ErrorDialog(parent, message)
# Send mail if the user clicked YES.
if dialog.ShowModal() == wx.ID_YES:
mail = SendMail(parent)
mail.setSender(_user_at_host())
mail.setSubject("Bug report")
mail.setBody(message)
mail.ShowModal()
mail.Destroy()
dialog.Destroy()
def showLicense(parent=None, codename=None):
codename = "Abipy" if codename is None else codename
license_text = """%(codename)s is free software; you can redistribute
it and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
%(codename)s 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 the code;
if not, write to the Free Software Foundation, Inc., 59 Temple Place,
Suite 330, Boston, MA 02111-1307 USA""" % {"codename": codename}
dialog = License(parent, license_text)
dialog.ShowModal()
dialog.Destroy()
class License(wx.Dialog):
def __init__(self, parent, license_text, **kwargs):
wx.Dialog.__init__ (self, parent, id=-1, title="License")
vsizer = wx.BoxSizer( wx.VERTICAL )
text = wx.TextCtrl( self, -1, license_text, style=wx.TE_MULTILINE | wx.TE_READONLY )
vsizer.Add(text, 0, wx.ALL|wx.EXPAND, 5 )
vsizer.Add(wx.Button( self, wx.ID_OK), 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
self.SetSizerAndFit(vsizer)
class SendMail(wx.Dialog):
"""This dialog allows the user to send an email with sendmail."""
def __init__(self, parent, title="SendMail"):
super(SendMail, self).__init__(parent, -1, title, wx.DefaultPosition, wx.Size(400, 420))
panel = wx.Panel(self, -1)
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)
st1 = wx.StaticText(panel, -1, 'From: ')
st2 = wx.StaticText(panel, -1, 'To: ')
st3 = wx.StaticText(panel, -1, 'Subject: ')
self.sender = wx.TextCtrl(panel, -1, size=(180, -1))
self.mailto = wx.TextCtrl(panel, -1, size=(180, -1))
self.subject = wx.TextCtrl(panel, -1, size=(180, -1))
self.body = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE)
button_send = wx.Button(panel, 1, 'Send')
hbox1.Add(st1, 0, wx.LEFT, 10)
hbox1.Add(self.sender, 0, wx.LEFT, 20)
hbox2.Add(st2, 0, wx.LEFT, 10)
hbox2.Add(self.mailto, 0, wx.LEFT, 35)
hbox3.Add(st3, 0, wx.LEFT, 10)
hbox3.Add(self.subject, 0)
vbox.Add(hbox1, 0, wx.TOP, 10)
vbox.Add(hbox2, 0, wx.TOP, 10)
vbox.Add(hbox3, 0, wx.TOP, 10)
vbox.Add(self.body, 1, wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, 15)
vbox.Add(button_send, 0, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 20)
self.Bind(wx.EVT_BUTTON, self.onSend, id=1)
panel.SetSizer(vbox)
self.Centre()
def setSender(self, s):
self.sender.SetValue(s)
def setMailto(self, s):
self.mailto.SetValue(s)
def setSubject(self, s):
self.subject.SetValue(s)
def setBody(self, text):
self.body.SetValue(text)
def onSend(self, event):
sender = self.sender.GetValue()
mailto = self.mailto.GetValue()
subject = self.subject.GetValue()
body = self.body.GetValue()
header = 'From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n' % (sender, mailto, subject)
try:
retcode = sendmail(subject, body, mailto, sender=sender)
if retcode:
dialog = wx.MessageDialog(self, 'Email was not sent', 'Failure', wx.OK | wx.ICON_INFORMATION)
else:
dialog = wx.MessageDialog(self, 'Email was successfully sent', 'Success', wx.OK | wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
except:
showErrorMessage(self)
def _user_at_host():
from socket import gethostname
return os.getlogin() + "@" + gethostname()
def sendmail(subject, text, mailto, sender=None):
"""
Sends an e-mail with unix sendmail.
Args:
subject:
String with the subject of the mail.
text:
String with the body of the mail.
mailto:
String or list of string with the recipients.
sender:
string with the sender address.
If sender is None, username@hostname is used.
Returns:
exit status
"""
# Body of the message.
sender = _user_at_host() if sender is None else sender
if is_string(mailto): mailto = [mailto]
from email.mime.text import MIMEText
mail = MIMEText(text)
mail["Subject"] = subject
mail["From"] = sender
mail["To"] = ", ".join(mailto)
msg = mail.as_string()
# sendmail works much better than the python interface.
# Note that sendmail is available only on Unix-like OS.
from subprocess import Popen, PIPE
sendmail = which("sendmail")
if sendmail is None: return -1
p = Popen([sendmail, "-t"], stdin=PIPE, stderr=PIPE)
outdata, errdata = p.communicate(msg)
return len(errdata)
class MyApp(wx.App):
def OnInit(self):
dialog = SendMail(None)
dialog.ShowModal()
dialog.Destroy()
return True
if __name__ == "__main__":
MyApp(0).MainLoop()

View File

@ -1,462 +0,0 @@
#!/usr/bin/env python
import wx
import random
import numpy as np
from abipy.gui.awx.core import path_img
__all__ = [
"tetris_game",
"puzzle_game",
]
# Taken from http://zetcode.com/wxpython/thetetrisgame/
class Tetris(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(180, 380))
self.statusbar = self.CreateStatusBar()
self.statusbar.SetStatusText('0')
self.board = Board(self)
self.board.SetFocus()
self.board.start()
self.Centre()
self.Show(True)
class Board(wx.Panel):
BoardWidth = 10
BoardHeight = 22
Speed = 300
ID_TIMER = 1
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.timer = wx.Timer(self, Board.ID_TIMER)
self.isWaitingAfterLine = False
self.curPiece = Shape()
self.nextPiece = Shape()
self.curX = 0
self.curY = 0
self.numLinesRemoved = 0
self.board = []
self.isStarted = False
self.isPaused = False
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
self.Bind(wx.EVT_TIMER, self.OnTimer, id=Board.ID_TIMER)
self.clearBoard()
def shapeAt(self, x, y):
return self.board[(y * Board.BoardWidth) + x]
def setShapeAt(self, x, y, shape):
self.board[(y * Board.BoardWidth) + x] = shape
def squareWidth(self):
return self.GetClientSize().GetWidth() / Board.BoardWidth
def squareHeight(self):
return self.GetClientSize().GetHeight() / Board.BoardHeight
def start(self):
if self.isPaused:
return
self.isStarted = True
self.isWaitingAfterLine = False
self.numLinesRemoved = 0
self.clearBoard()
self.newPiece()
self.timer.Start(Board.Speed)
def pause(self):
if not self.isStarted:
return
self.isPaused = not self.isPaused
statusbar = self.GetParent().statusbar
if self.isPaused:
self.timer.Stop()
statusbar.SetStatusText('paused')
else:
self.timer.Start(Board.Speed)
statusbar.SetStatusText(str(self.numLinesRemoved))
self.Refresh()
def clearBoard(self):
for i in range(Board.BoardHeight * Board.BoardWidth):
self.board.append(Tetrominoes.NoShape)
def OnPaint(self, event):
dc = wx.PaintDC(self)
size = self.GetClientSize()
boardTop = size.GetHeight() - Board.BoardHeight * self.squareHeight()
for i in range(Board.BoardHeight):
for j in range(Board.BoardWidth):
shape = self.shapeAt(j, Board.BoardHeight - i - 1)
if shape != Tetrominoes.NoShape:
self.drawSquare(dc,
0 + j * self.squareWidth(),
boardTop + i * self.squareHeight(), shape)
if self.curPiece.shape() != Tetrominoes.NoShape:
for i in range(4):
x = self.curX + self.curPiece.x(i)
y = self.curY - self.curPiece.y(i)
self.drawSquare(dc, 0 + x * self.squareWidth(),
boardTop + (Board.BoardHeight - y - 1) * self.squareHeight(),
self.curPiece.shape())
def OnKeyDown(self, event):
if not self.isStarted or self.curPiece.shape() == Tetrominoes.NoShape:
event.Skip()
return
keycode = event.GetKeyCode()
if keycode in (ord('P'), ord('p')):
self.pause()
return
if self.isPaused:
return
elif keycode == wx.WXK_LEFT:
self.tryMove(self.curPiece, self.curX - 1, self.curY)
elif keycode == wx.WXK_RIGHT:
self.tryMove(self.curPiece, self.curX + 1, self.curY)
elif keycode == wx.WXK_DOWN:
self.tryMove(self.curPiece.rotatedRight(), self.curX, self.curY)
elif keycode == wx.WXK_UP:
self.tryMove(self.curPiece.rotatedLeft(), self.curX, self.curY)
elif keycode == wx.WXK_SPACE:
self.dropDown()
elif keycode == ord('D') or keycode == ord('d'):
self.oneLineDown()
else:
event.Skip()
def OnTimer(self, event):
if event.GetId() == Board.ID_TIMER:
if self.isWaitingAfterLine:
self.isWaitingAfterLine = False
self.newPiece()
else:
self.oneLineDown()
else:
event.Skip()
def dropDown(self):
newY = self.curY
while newY > 0:
if not self.tryMove(self.curPiece, self.curX, newY - 1):
break
newY -= 1
self.pieceDropped()
def oneLineDown(self):
if not self.tryMove(self.curPiece, self.curX, self.curY - 1):
self.pieceDropped()
def pieceDropped(self):
for i in range(4):
x = self.curX + self.curPiece.x(i)
y = self.curY - self.curPiece.y(i)
self.setShapeAt(x, y, self.curPiece.shape())
self.removeFullLines()
if not self.isWaitingAfterLine:
self.newPiece()
def removeFullLines(self):
numFullLines = 0
statusbar = self.GetParent().statusbar
rowsToRemove = []
for i in range(Board.BoardHeight):
n = 0
for j in range(Board.BoardWidth):
if not self.shapeAt(j, i) == Tetrominoes.NoShape:
n = n + 1
if n == 10:
rowsToRemove.append(i)
rowsToRemove.reverse()
for m in rowsToRemove:
for k in range(m, Board.BoardHeight):
for l in range(Board.BoardWidth):
self.setShapeAt(l, k, self.shapeAt(l, k + 1))
numFullLines = numFullLines + len(rowsToRemove)
if numFullLines > 0:
self.numLinesRemoved = self.numLinesRemoved + numFullLines
statusbar.SetStatusText(str(self.numLinesRemoved))
self.isWaitingAfterLine = True
self.curPiece.setShape(Tetrominoes.NoShape)
self.Refresh()
def newPiece(self):
self.curPiece = self.nextPiece
statusbar = self.GetParent().statusbar
self.nextPiece.setRandomShape()
self.curX = Board.BoardWidth / 2 + 1
self.curY = Board.BoardHeight - 1 + self.curPiece.minY()
if not self.tryMove(self.curPiece, self.curX, self.curY):
self.curPiece.setShape(Tetrominoes.NoShape)
self.timer.Stop()
self.isStarted = False
statusbar.SetStatusText('Game over')
def tryMove(self, newPiece, newX, newY):
for i in range(4):
x = newX + newPiece.x(i)
y = newY - newPiece.y(i)
if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight:
return False
if self.shapeAt(x, y) != Tetrominoes.NoShape:
return False
self.curPiece = newPiece
self.curX = newX
self.curY = newY
self.Refresh()
return True
def drawSquare(self, dc, x, y, shape):
colors = ['#000000', '#CC6666', '#66CC66', '#6666CC',
'#CCCC66', '#CC66CC', '#66CCCC', '#DAAA00']
light = ['#000000', '#F89FAB', '#79FC79', '#7979FC',
'#FCFC79', '#FC79FC', '#79FCFC', '#FCC600']
dark = ['#000000', '#803C3B', '#3B803B', '#3B3B80',
'#80803B', '#803B80', '#3B8080', '#806200']
pen = wx.Pen(light[shape])
pen.SetCap(wx.CAP_PROJECTING)
dc.SetPen(pen)
dc.DrawLine(x, y + self.squareHeight() - 1, x, y)
dc.DrawLine(x, y, x + self.squareWidth() - 1, y)
darkpen = wx.Pen(dark[shape])
darkpen.SetCap(wx.CAP_PROJECTING)
dc.SetPen(darkpen)
dc.DrawLine(x + 1, y + self.squareHeight() - 1,
x + self.squareWidth() - 1, y + self.squareHeight() - 1)
dc.DrawLine(x + self.squareWidth() - 1,
y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)
dc.SetPen(wx.TRANSPARENT_PEN)
dc.SetBrush(wx.Brush(colors[shape]))
dc.DrawRectangle(x + 1, y + 1, self.squareWidth() - 2,
self.squareHeight() - 2)
class Tetrominoes(object):
NoShape = 0
ZShape = 1
SShape = 2
LineShape = 3
TShape = 4
SquareShape = 5
LShape = 6
MirroredLShape = 7
class Shape(object):
coordsTable = (
((0, 0), (0, 0), (0, 0), (0, 0)),
((0, -1), (0, 0), (-1, 0), (-1, 1)),
((0, -1), (0, 0), (1, 0), (1, 1)),
((0, -1), (0, 0), (0, 1), (0, 2)),
((-1, 0), (0, 0), (1, 0), (0, 1)),
((0, 0), (1, 0), (0, 1), (1, 1)),
((-1, -1), (0, -1), (0, 0), (0, 1)),
((1, -1), (0, -1), (0, 0), (0, 1))
)
def __init__(self):
self.coords = [[0,0] for i in range(4)]
self.pieceShape = Tetrominoes.NoShape
self.setShape(Tetrominoes.NoShape)
def shape(self):
return self.pieceShape
def setShape(self, shape):
table = Shape.coordsTable[shape]
for i in range(4):
for j in range(2):
self.coords[i][j] = table[i][j]
self.pieceShape = shape
def setRandomShape(self):
self.setShape(random.randint(1, 7))
def x(self, index):
return self.coords[index][0]
def y(self, index):
return self.coords[index][1]
def setX(self, index, x):
self.coords[index][0] = x
def setY(self, index, y):
self.coords[index][1] = y
def minX(self):
m = self.coords[0][0]
for i in range(4):
m = min(m, self.coords[i][0])
return m
def maxX(self):
m = self.coords[0][0]
for i in range(4):
m = max(m, self.coords[i][0])
return m
def minY(self):
m = self.coords[0][1]
for i in range(4):
m = min(m, self.coords[i][1])
return m
def maxY(self):
m = self.coords[0][1]
for i in range(4):
m = max(m, self.coords[i][1])
return m
def rotatedLeft(self):
if self.pieceShape == Tetrominoes.SquareShape:
return self
result = Shape()
result.pieceShape = self.pieceShape
for i in range(4):
result.setX(i, self.y(i))
result.setY(i, -self.x(i))
return result
def rotatedRight(self):
if self.pieceShape == Tetrominoes.SquareShape:
return self
result = Shape()
result.pieceShape = self.pieceShape
for i in range(4):
result.setX(i, -self.y(i))
result.setY(i, self.x(i))
return result
def tetris_game():
app = wx.App()
Tetris(None, -1, 'Tetris')
app.MainLoop()
class Puzzle(wx.Dialog):
def __init__(self, *args, **kw):
super(Puzzle, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
# convert image.png -crop 120x90 image%d.png
# image should be 360x270
images = ["abipy" + str(i) + ".png" for i in range(9)]
images = map(path_img, images)
self.pos = np.reshape(list(range(9)), (3,3))
self.sizer = wx.GridSizer(3, 3, 0, 0)
numbers = list(range(8))
random.shuffle(numbers)
for i in numbers:
btn = wx.BitmapButton(self, i, wx.Bitmap(images[i]))
btn.Bind(wx.EVT_BUTTON, self.OnPressButton, btn)
self.sizer.Add(btn)
self.empty = wx.BitmapButton(self, bitmap=wx.Bitmap(path_img('empty.png')))
self.empty.Bind(wx.EVT_BUTTON, self.OnPressButton, self.empty)
self.sizer.Add(self.empty)
self.SetSizerAndFit(self.sizer)
self.SetTitle('Puzzle')
self.Centre()
self.ShowModal()
self.Destroy()
def OnPressButton(self, e):
btn = e.GetEventObject()
width = self.empty.GetSize().x
height = self.empty.GetSize().y
btnX = btn.GetPosition().x
btnY = btn.GetPosition().y
emptyX = self.empty.GetPosition().x
emptyY = self.empty.GetPosition().y
if (((btnX == emptyX) and (emptyY - btnY) == height)
or ((btnX == emptyX) and (emptyY - btnY) == -height)
or ((btnY == emptyY) and (emptyX - btnX) == width)
or ((btnY == emptyY) and (emptyX - btnX) == -width)):
self.ExchangeImages(btn)
def ExchangeImages(self, btn):
bmp1 = self.empty.GetBitmapLabel()
bmp2 = btn.GetBitmapLabel()
self.empty.SetBitmapLabel(bmp2)
btn.SetBitmapLabel(bmp1)
self.empty = btn
def puzzle_game():
ex = wx.App()
Puzzle(None)
ex.MainLoop()
if __name__ == "__main__":
#tetris_game()
puzzle_game()

File diff suppressed because it is too large Load Diff

View File

@ -1,944 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# elements_gui.py
# Copyright (c) 2005-2014, Christoph Gohlke
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the copyright holders nor the names of any
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
"""Periodic Table of Elements - A user interface for elements.py.
:Author: `Christoph Gohlke <http://www.lfd.uci.edu/~gohlke/>`_
:Version: 2013.03.18
Requirements
------------
* `CPython 2.7 <http://www.python.org>`_
* `wxPython 2.8 <http://www.wxpython.org>`_
* `Elements.py 2013.03.18 <http://www.lfd.uci.edu/~gohlke/>`_
"""
from __future__ import division, print_function
import sys
import math
import io
import webbrowser
import wxversion
#wxversion.ensureMinimal('2.8')
import wx
from wx.lib import fancytext, buttons, rcsizer
from elements import ELEMENTS, SERIES
from abipy.gui.awx.panels import ListCtrlFromTable
try:
from pseudo_dojo.refdata.nist import database as nist
except ImportError:
pass
class MainApp(wx.App):
"""Main application."""
name = "Periodic Table of Elements"
version = "2012.04.05"
website = "http://www.lfd.uci.edu/~gohlke/"
copyright = ("Christoph Gohlke\n"
"Laboratory for Fluorescence Dynamics\n"
"University of California, Irvine")
icon = "elements"
def OnInit(self):
_ = wx.LogNull()
wx.InitAllImageHandlers()
mainframe = WxPeriodicTable(None, -1)
self.SetTopWindow(mainframe)
if wx.Platform != "__WXMAC__":
mainframe.Centre()
mainframe.ApplyLayout(False)
mainframe.Show()
return 1
class ElementButton(buttons.GenToggleButton):
"""Button representing chemical element."""
def __init__(self, *args, **kwds):
buttons.GenToggleButton.__init__(self, *args, **kwds)
self.color = wx.Colour(255, 255, 255)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_RIGHT_DOWN, self.onRightDown)
@property
def Z(self):
"""Atomic number corresponding to this button."""
return self.GetId() - 100
def OnEraseBackground(self, event):
pass
def SetButtonColour(self, color):
self.color = color
def OnPaint(self, event):
width, height = self.GetClientSizeTuple()
dc = wx.BufferedPaintDC(self)
brush = wx.Brush(self.GetBackgroundColour(), wx.SOLID)
if wx.Platform == "__WXMAC__":
brush.MacSetTheme(1) # kThemeBrushDialogBackgroundActive
dc.SetBackground(brush)
dc.SetPen(wx.TRANSPARENT_PEN)
dc.SetBrush(wx.Brush(self.color if self.up else 'WHITE', wx.SOLID))
dc.Clear()
dc.DrawRectanglePointSize((1, 1), (width - 2, height - 2))
if self.up:
self.DrawBezel(dc, 0, 0, width - 1, height - 1)
self.DrawLabel(dc, width, height)
if (self.hasFocus and self.useFocusInd):
self.DrawFocusIndicator(dc, width, height)
def DrawLabel(self, dc, width, height):
font = self.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
dc.SetFont(font)
if self.IsEnabled():
dc.SetTextForeground(self.GetForegroundColour())
else:
dc.SetTextForeground(wx.SystemSettings.GetColour(
wx.SYS_COLOUR_GRAYTEXT))
label = self.GetLabel()
txtwidth, txtheight = dc.GetTextExtent(label)
xpos = (width - txtwidth) // 2
ypos = (height*0.75 - txtheight) // 2 - 1
dc.DrawText(label, xpos, ypos)
font.SetWeight(wx.FONTWEIGHT_LIGHT)
font.SetPointSize((font.GetPointSize()*6) // 8)
dc.SetFont(font)
label = "%i" % (self.GetId() - 100)
txtwidth, txtheight = dc.GetTextExtent(label)
dc.DrawText(label, (width-txtwidth)//2, 4+ypos+(height-txtheight)//2)
def makePopupMenu(self):
"""Build and return the popup menu."""
menu = wx.Menu()
self.ID_POPUP_NIST_LDA = wx.NewId()
menu.Append(self.ID_POPUP_NIST_LDA, "NIST SCF data (LDA)")
# Associate menu/toolbar items with their handlers.
menu_handlers = [
(self.ID_POPUP_NIST_LDA, self.onNistLda),
]
for combo in menu_handlers:
mid, handler = combo[:2]
self.Bind(wx.EVT_MENU, handler, id=mid)
return menu
def onRightDown(self, event):
"""Called when right button is pressed."""
popup_menu = self.makePopupMenu()
self.PopupMenu(popup_menu, event.GetPosition())
def onNistLda(self, event):
"""
Show the LDA levels of the neutral atom.
(useful to decide if semicore states should be included in the valence).
"""
try:
entry = nist.get_neutral_entry(self.Z)
except KeyError:
return
table = entry.to_table()
frame = wx.Frame(self, title="LDA levels for atom %s (NIST database) " % entry.symbol)
ListCtrlFromTable(frame, table)
frame.Show()
class PeriodicPanel(wx.Panel):
"""Periodic table of elements panel."""
layout = """
. 1 . . . . . . . . . . . . . . . . 18 .
1 H 2 . . . . . . . . . . 13 14 15 16 17 He .
2 Li Be . . . . . . . . . . B C N O F Ne .
3 Na Mg 3 4 5 6 7 8 9 10 11 12 Al Si P S Cl Ar .
4 K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr .
5 Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe .
6 Cs Ba * Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn .
7 Fr Ra ** Rf Db Sg Bh Hs Mt . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . * La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu .
. . . ** Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr .
"""
# Class used to instanciates the buttons in the panel.
element_button_class = ElementButton
def __init__(self, *args, **kwds):
kwds["style"] = wx.TAB_TRAVERSAL
wx.Panel.__init__(self, *args, **kwds)
rows = len(self.layout.splitlines()) - 2
cols = len(self.layout.splitlines()[1].split())
self.sizer = wx.FlexGridSizer(rows, cols, 0, 0)
self.buttons = list(range(0, len(ELEMENTS)))
self.selected = -1
self.info = ElementPanel(self, -1, pos=(0, 0))
# create element buttons
buttonsize = math.ceil(float(self.info.GetSize()[0] + 4) / 9.0)
if buttonsize < 30:
buttonsize = 30
for row in self.layout.splitlines()[1:-1]:
for col in row.split():
if col == '.':
self.sizer.Add((SPACER, SPACER))
elif col[0] in '123456789*':
static = wx.StaticText(self, -1, col,
style=wx.ALIGN_CENTER|wx.ALIGN_BOTTOM)
self.sizer.Add(static, 0,
(wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|
wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE), SPACER//2)
else:
ele = ELEMENTS[col]
button = self.element_button_class(self, ele.number+100, ele.symbol,
size=(buttonsize, buttonsize))
self.buttons[ele.number - 1] = button
button.SetBezelWidth(1)
button.SetToolTipString(ele.name)
col = COLORS[ele.series]
button.SetButtonColour(wx.Colour(col[0], col[1], col[2]))
self.sizer.Add(button, 0, (wx.LEFT|wx.BOTTOM|
wx.FIXED_MINSIZE|wx.ALIGN_CENTER_HORIZONTAL|
wx.ALIGN_CENTER_VERTICAL), 0)
self.Bind(wx.EVT_BUTTON, self.OnSelect, button)
self.SetAutoLayout(True)
self.SetSizer(self.sizer)
self.sizer.SetSizeHints(self)
self.sizer.Fit(self)
# position element info panel
cw = self.sizer.GetColWidths()
rh = self.sizer.GetRowHeights()
self.info.Move((sum(cw[:3])+cw[3]//2, (rh[0]-SPACER)//2-1))
# legend of chemical series
self.legendpos = (sum(cw[:13]), (rh[0]-SPACER)//2-1)
self.legendsize = (sum(cw[13:17]) + cw[17]//2, -1)
self.legend = wx.StaticText(self, -1, " Alkaline earth metals ",
style=wx.ALIGN_CENTER, pos=self.legendpos, size=self.legendsize)
self.legend.SetToolTipString("Chemical series")
# blinking element button
self.highlight = False
self.timer = wx.Timer(self)
self.timer.Start(750)
self.Bind(wx.EVT_TIMER, self.OnTimer)
def AddCtrl(self, ctrl, pos=200):
self.sizer.Remove(pos)
self.sizer.Insert(pos, ctrl, 0, (wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|
wx.ALIGN_BOTTOM|wx.FIXED_MINSIZE), 0)
self.Layout()
def OnTimer(self, evt):
button = self.buttons[self.selected]
button.SetToggle(button.up)
def OnSelect(self, evt):
self.GetParent().SetSelection(evt.GetId() - 101)
def SetSelection(self, select):
"""Set active element."""
if self.selected == select:
return
# reset old selection
self.buttons[self.selected].SetToggle(False)
# highlight new selection
self.selected = select
self.buttons[select].SetToggle(True)
ele = ELEMENTS[select + 1]
col = COLORS[ele.series]
self.legend.SetBackgroundColour(wx.Colour(col[0], col[1], col[2]))
self.legend.SetLabel(SERIES[ele.series])
self.legend.Move(self.legendpos)
self.legend.SetSize(self.legendsize)
self.info.SetSelection(select)
class ElementPanel(wx.Panel):
"""Element information panel."""
def __init__(self, *args, **kwds):
kwds["style"] = wx.NO_BORDER | wx.TAB_TRAVERSAL
wx.Panel.__init__(self, *args, **kwds)
self.selected = -1
# create controls
self.number = wx.StaticText(self, -1, "808",
style=wx.ALIGN_RIGHT)
self.position = wx.StaticText(self, -1, "6, 88, 9",
style=wx.ALIGN_LEFT)
self.symbol = wx.StaticText(self, -1, "Mm",
style=wx.ALIGN_CENTER_HORIZONTAL)
self.name = wx.StaticText(self, -1, "Praseodymium ",
style=wx.ALIGN_CENTER_HORIZONTAL)
self.mass = wx.StaticText(self, -1, "123.4567890 ",
style=wx.ALIGN_CENTER_HORIZONTAL)
self.massnumber = wx.StaticText(self, -1, "123 A ",
style=wx.ALIGN_RIGHT)
self.protons = wx.StaticText(self, -1, "123 P ",
style=wx.ALIGN_RIGHT)
self.neutrons = wx.StaticText(self, -1, "123 N ",
style=wx.ALIGN_RIGHT)
self.electrons = wx.StaticText(self, -1, "123 e ",
style=wx.ALIGN_RIGHT)
self.eleshell = wx.StaticText(self, -1, "2, 8, 18, 32, 32, 15, 2",
style=wx.ALIGN_LEFT)
self.eleconfig = StaticFancyText(self, -1,
"[Xe] 4f<sup>14</sup> 5d<sup>10</sup>"
" 6s<sup>2</sup> 6p<sup>6</sup> ",
style=wx.ALIGN_LEFT)
self.oxistates = wx.StaticText(self, -1, "1*, 2, 3, 4, 5, 6, -7 ")
self.atmrad = wx.StaticText(self, -1, "1.234 A ",
style=wx.ALIGN_RIGHT)
self.ionpot = wx.StaticText(self, -1, "123.4567890 eV ")
self.eleneg = wx.StaticText(self, -1, "123.45678 ")
# set control properties
font = self.GetFont()
font.SetWeight(wx.FONTWEIGHT_BOLD)
self.number.SetFont(font)
self.name.SetFont(font)
font.SetPointSize(font.GetPointSize() * 1.9)
self.symbol.SetFont(font)
self.number.SetToolTipString("Atomic number")
self.position.SetToolTipString("Group, Period, Block")
self.symbol.SetToolTipString("Symbol")
self.name.SetToolTipString("Name")
self.mass.SetToolTipString("Relative atomic mass")
self.eleshell.SetToolTipString("Electrons per shell")
self.massnumber.SetToolTipString("Mass number (most abundant isotope)")
self.protons.SetToolTipString("Protons")
self.neutrons.SetToolTipString("Neutrons (most abundant isotope)")
self.electrons.SetToolTipString("Electrons")
self.eleconfig.SetToolTipString("Electron configuration")
self.oxistates.SetToolTipString("Oxidation states")
self.atmrad.SetToolTipString("Atomic radius")
self.ionpot.SetToolTipString("Ionization potentials")
self.eleneg.SetToolTipString("Electronegativity")
# layout
sizer = rcsizer.RowColSizer()
sizer.col_w = SPACER
sizer.row_h = SPACER
sizer.Add(self.number, row=0, col=0,
flag=wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE)
sizer.Add(self.position, row=0, col=1,
flag=wx.ALIGN_LEFT|wx.FIXED_MINSIZE)
sizer.Add(self.symbol, row=1, col=0, rowspan=2, colspan=2,
flag=(wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|
wx.FIXED_MINSIZE))
sizer.Add(self.name, row=3, col=0, colspan=2,
flag=wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE)
sizer.Add(self.mass, row=4, col=0, colspan=2,
flag=wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE)
sizer.Add(self.massnumber, row=0, col=2,
flag=wx.ALIGN_RIGHT|wx.FIXED_MINSIZE)
sizer.Add(self.protons, row=1, col=2,
flag=wx.ALIGN_RIGHT|wx.FIXED_MINSIZE)
sizer.Add(self.neutrons, row=2, col=2,
flag=wx.ALIGN_RIGHT|wx.FIXED_MINSIZE)
sizer.Add(self.electrons, row=3, col=2,
flag=wx.ALIGN_RIGHT|wx.FIXED_MINSIZE)
sizer.Add(self.atmrad, row=4, col=2,
flag=wx.ALIGN_RIGHT|wx.FIXED_MINSIZE)
sizer.Add(self.eleconfig, row=0, col=4, flag=wx.ADJUST_MINSIZE)
sizer.Add(self.eleshell, row=1, col=4, flag=wx.ADJUST_MINSIZE)
sizer.Add(self.oxistates, row=2, col=4, flag=wx.ADJUST_MINSIZE)
sizer.Add(self.ionpot, row=3, col=4, flag=wx.ADJUST_MINSIZE)
sizer.Add(self.eleneg, row=4, col=4, flag=wx.ADJUST_MINSIZE)
self.SetAutoLayout(True)
self.SetSizer(sizer)
sizer.Fit(self)
sizer.SetSizeHints(self)
self.Layout()
def SetSelection(self, select):
"""Set active element."""
if self.selected == select:
return
self.Freeze()
self.selected = select
ele = ELEMENTS[select + 1]
self.number.SetLabel("%i" % ele.number)
self.position.SetLabel("%i, %i, %s" % (
ele.group, ele.period, ele.block))
self.mass.SetLabel("%.10g" % ele.mass)
self.eleshell.SetLabel(', '.join("%i" % i for i in ele.eleshells))
self.massnumber.SetLabel('%i A ' % ele.nominalmass)
self.protons.SetLabel('%i P ' % ele.protons)
self.neutrons.SetLabel('%i N ' % ele.neutrons)
self.electrons.SetLabel('%i e ' % ele.electrons)
self.oxistates.SetLabel(ele.oxistates)
self.atmrad.SetLabel(_u("%.10g \xc5 ") % ele.atmrad if ele.atmrad else
"")
self.eleneg.SetLabel("%.10g" % ele.eleneg if ele.eleneg else "")
self.ionpot.SetLabel(
"%.10g eV" % ele.ionenergy[0] if ele.ionenergy else "")
self.symbol.SetLabel(ele.symbol)
self.name.SetLabel(ele.name)
label = []
for orb in ele.eleconfig.split():
if not orb.startswith('[') and len(orb) > 2:
orb = orb[:2] + '<sup>' + orb[2:] + '</sup>'
label.append(orb)
label.append("<sup> </sup>") # fix ADJUST_MINSIZE
self.eleconfig.SetLabel(' '.join(label))
self.Thaw()
self.Layout()
class DetailsPanel(wx.Panel):
"""Element details panel."""
def __init__(self, *args, **kwds):
kwds["style"] = wx.NO_BORDER|wx.TAB_TRAVERSAL
wx.Panel.__init__(self, *args, **kwds)
self.selected = -1
# create controls
cb_style = wx.CB_READONLY|wx.CB_SORT
if wx.Platform == "__WXMAC__":
cb_style = wx.CB_READONLY
self.names = LabeledCtrl(self, wx.ComboBox, "Element Name",
choices=[p.name for p in ELEMENTS],
style=cb_style, size=(1, -1))
self.symbols = LabeledCtrl(self, wx.ComboBox, "Symbol", '',
choices=[p.symbol for p in ELEMENTS],
style=cb_style, size=(1, -1))
self.numbers = LabeledCtrl(self, wx.ComboBox, "Number",
choices=["%s" % p.number for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.mass = LabeledCtrl(self, wx.ComboBox, "Relative Atomic Mass",
choices=["%-.10g" % p.mass for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.atmrad = LabeledCtrl(self, wx.ComboBox,
_u("Atomic Radius (\xc5)"),
choices=["%-.10g" % p.atmrad for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.covrad = LabeledCtrl(self, wx.ComboBox,
_u("Covalent Radius (\xc5)"),
choices=["%-.10g" % p.covrad for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.vdwrad = LabeledCtrl(self, wx.ComboBox,
_u("V.d.Waals Radius (\xc5)"),
choices=["%-.10g" % p.vdwrad for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.eleneg = LabeledCtrl(self, wx.ComboBox, "Electronegativity",
choices=["%-.10g" % p.eleneg for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.eleconfig = LabeledCtrl(self, wx.ComboBox, "e- Config",
choices=[p.eleconfig for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.eleshells = LabeledCtrl(self, wx.ComboBox, "Electrons per Shell",
choices=[', '.join("%i" % i for i in p.eleshells)
for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.oxistates = LabeledCtrl(self, wx.ComboBox, "Oxidation States",
choices=[p.oxistates for p in ELEMENTS],
style=wx.CB_READONLY, size=(1, -1))
self.ionpot = LabeledCtrl(self, wx.Choice,
"Ionization Potentials (eV)", choices=[], size=(1, -1))
self.isotopes = LabeledCtrl(self, wx.Choice, "Isotopes",
choices=[], size=(1, -1))
# layout
sizer = wx.BoxSizer(wx.VERTICAL)
sizer_top = wx.BoxSizer(wx.HORIZONTAL)
sizer_left = wx.BoxSizer(wx.VERTICAL)
sizer_right = wx.BoxSizer(wx.VERTICAL)
sizer_num = wx.BoxSizer(wx.HORIZONTAL)
style = wx.RIGHT|wx.BOTTOM|wx.EXPAND|wx.ADJUST_MINSIZE
sizer_left.Add(self.names, 0, style, SPACER)
sizer_left.Add(self.mass, 0, style, SPACER)
sizer_left.Add(self.atmrad, 0, style, SPACER)
sizer_left.Add(self.covrad, 0, style, SPACER)
sizer_left.Add(self.vdwrad, 0, style, SPACER)
sizer_left.Add(self.eleneg, 0, style, SPACER)
sizer_top.Add(sizer_left, 1, wx.LEFT|wx.RIGHT, 0)
style = wx.BOTTOM|wx.EXPAND|wx.ADJUST_MINSIZE
sizer_num.Add(self.symbols, 1, style, 0)
sizer_num.Add((SPACER, 5), 0, 0, 0)
sizer_num.Add(self.numbers, 1, style, 0)
sizer_right.Add(sizer_num, 0, style, SPACER)
sizer_right.Add(self.eleconfig, 0, style, SPACER)
sizer_right.Add(self.eleshells, 0, style, SPACER)
sizer_right.Add(self.oxistates, 0, style, SPACER)
sizer_right.Add(self.ionpot, 0, style, SPACER)
sizer_right.Add(self.isotopes, 0, style, SPACER)
sizer_top.Add(sizer_right, 1, wx.TOP|wx.RIGHT, 0)
sizer.Add(sizer_top, 1,
wx.LEFT|wx.RIGHT|wx.TOP|wx.EXPAND|wx.ADJUST_MINSIZE, SPACER)
self.SetAutoLayout(True)
self.SetSizerAndFit(sizer, True)
sizer.SetSizeHints(self)
self.Layout()
# bind events
self.Bind(wx.EVT_COMBOBOX, self.OnSelectName, self.names.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelectSymbol, self.symbols.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.numbers.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.mass.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.atmrad.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.covrad.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.vdwrad.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.eleshells.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.eleneg.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.eleconfig.ctrl)
self.Bind(wx.EVT_COMBOBOX, self.OnSelect, self.oxistates.ctrl)
def SetSelection(self, select):
"""Set active element."""
if self.selected == select:
return
self.selected = select
ele = ELEMENTS[select+1]
self.names.ctrl.SetStringSelection(ele.name)
self.symbols.ctrl.SetStringSelection(ele.symbol)
self.numbers.ctrl.SetSelection(select)
self.mass.ctrl.SetSelection(select)
self.eleconfig.ctrl.SetSelection(select)
self.atmrad.ctrl.SetSelection(select)
self.covrad.ctrl.SetSelection(select)
self.vdwrad.ctrl.SetSelection(select)
self.eleneg.ctrl.SetSelection(select)
self.eleshells.ctrl.SetSelection(select)
self.oxistates.ctrl.SetSelection(select)
self.isotopes.ctrl.Clear()
for index, massnum in enumerate(sorted(ele.isotopes)):
iso = ele.isotopes[massnum]
self.isotopes.ctrl.Append("%3i: %8.4f , %8.4f%%" % (
massnum, iso.mass, iso.abundance*100.0))
if massnum == ele.nominalmass:
self.isotopes.ctrl.SetSelection(index)
self.ionpot.ctrl.Clear()
for ion in ele.ionenergy:
self.ionpot.ctrl.Append("%8.4f" % ion)
self.ionpot.ctrl.SetSelection(0)
def OnSelect(self, evt):
self.SetSelection(evt.GetSelection())
event = SelectionEvent(pteEVT_ELE_CHANGED, self.GetId(), self.selected)
self.GetEventHandler().ProcessEvent(event)
evt.Skip()
def OnSelectName(self, evt):
name = self.names.ctrl.GetValue()
self.SetSelection(ELEMENTS[name].number - 1)
event = SelectionEvent(pteEVT_ELE_CHANGED, self.GetId(), self.selected)
self.GetEventHandler().ProcessEvent(event)
evt.Skip()
def OnSelectSymbol(self, evt):
name = self.symbols.ctrl.GetValue()
self.SetSelection(ELEMENTS[name].number - 1)
event = SelectionEvent(pteEVT_ELE_CHANGED, self.GetId(), self.selected)
self.GetEventHandler().ProcessEvent(event)
evt.Skip()
class DecriptionPanel(wx.Panel):
"""Element description panel."""
def __init__(self, *args, **kwds):
kwds["style"] = wx.NO_BORDER|wx.TAB_TRAVERSAL
wx.Panel.__init__(self, *args, **kwds)
self.selected = -1
self.description = wx.TextCtrl(self, -1, " \n \n",
style=wx.TE_MULTILINE|wx.TE_READONLY)
font = self.description.GetFont()
font.SetPointSize((font.GetPointSize() + 1))
self.description.SetFont(font)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.description, 1,
wx.TOP|wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND|wx.FIXED_MINSIZE,
SPACER)
self.SetAutoLayout(True)
self.SetSizerAndFit(sizer, True)
sizer.SetSizeHints(self)
self.Layout()
def SetSelection(self, select):
"""Set active element."""
if self.selected == select:
return
self.selected = select
ele = ELEMENTS[select + 1]
self.description.SetValue(ele.description)
class LabeledCtrl(wx.BoxSizer):
"""BoxSizer containing label, control, and unit."""
def __init__(self, parent, control, label, unit=None, space=" ",
*args, **kwds):
wx.BoxSizer.__init__(self, wx.HORIZONTAL)
self.label = wx.StaticText(parent, -1, label + space)
self.ctrl = control(parent, -1, *args, **kwds)
self.Add(self.label, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE)
self.Add(self.ctrl, 1, (wx.LEFT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|
wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE), 0)
if unit:
self.unit = wx.StaticText(parent, -1, unit)
self.Add(self.unit, 0,
wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
else:
self.unit = None
class StaticFancyText(fancytext.StaticFancyText):
"""StaticFancyText with SetLabel function."""
def SetLabel(self, label):
bmp = fancytext.RenderToBitmap(
label, wx.Brush(self.GetBackgroundColour(), wx.SOLID))
self.SetBitmap(bmp)
class DisclosureCtrl(buttons.GenBitmapTextToggleButton):
"""Disclosure triangle button."""
bmp0 = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\r\x00\x00'
b'\x00\r\x08\x06\x00\x00\x00r\xeb\xe4|\x00\x00\x00\x04sBIT'
b'\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\xd5IDAT(\x91\x9d'
b'\x921n\x83@\x10E\xdf.!\x96\x9c\x90P"\xd9\x86\x92\x82\x03p'
b'\x02h\xa9i9A\xe2\xb38)9\x02w\xc0\t\x94I\xa0H\xd2\xc7'
b'\x96(\x918\xc0\xa6Z\x17\x91\x05&_\x1a\xe9k4O\xfa3\x1a!'
b'\xa4\xc1\\Im>\xde\xdf\xd4l\xa8,K\x9e\x9fv\xeax\xf8\x99\x84'
b'\x85\x8e\xb7}|P\x00\xb6m\x13\x04\x01q\x1cc\xdd\xdd\x8bs\xd0'
b'\xd5\xdfF\xdf\xf7TUE\xdb\xb6\xbc\xbe\xecU\x18\x86\x98\xd7'
b'\x0b1\ni\r\xc3@Q\x14\xd4u\xcd\xf7\xd7\xa7r]\x97\xe5\xcd'
b'\xad\x18\x85\xb4\xba\xae#\xcfs|\xdf?\xf5\xe4\xc8<\x00\x8e'
b'\xe3\x90e\x19i\x9aN\xc7\xb3,\x8b(\x8a\xb8h\xa7Y\xd7'
b'\xf3<\x0f\xd34I\x92\x84\xd5zsv\xf8$!\r\x844h\x9aFi?Y\xff'
b'\xf9\xbd_\xd7\x8c7Z\xc0k\x8d8\x00\x00\x00\x00IEND\xaeB`\x82')
bmp1 = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\r\x00\x00'
b'\x00\r\x08\x06\x00\x00\x00r\xeb\xe4|\x00\x00\x00\x04sBIT'
b'\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\xc1IDAT(\x91\x9d\xd2;'
b'\x8e\xc20\x10\x80\xe1\x7fB\x0c\x95\xc1\xa5%\xc0)S\xb8I\xd2'
b'\xb8Le\x97\xf6\x99s\x81\xdd\xbdBN\xb2\xdb!Y\t\xac`\xbay|'
b'\xa3)F\xa49\xf0n4o\x8bOQ\x0b\xf0\xf3\xfd\xf5\xbb,\x0b\xeb'
b'\xba>\x1d\xec\xba\x8ey\x9e\x19\xc6I\x1a\x80a\x9cD)\xf5r'
b'\xbbR\x8aa\x9c\xa4:\xaf\x94\x821f\x17\x18c(\xa5<\xf2\x07'
b'\xba\xde\xee\xe2\xbd\xdfE\xde{\xae\xb7\xbbl\x10@J\t\xadu\x05'
b'\xb4\xd6\xa4\x94\xaaZ\x85\xf4\xf9"1\xc6j \xc6\x88>_\xe4)\x02'
b'\x08!`\xad\x05\xc0ZK\x08as\xee\x06\xa9\xe3Ir\xce\xb4mK\xce'
b'\x19u<\xc9\xbf\x08\xc09G\xdf\xf78\xe7\xf6\xda\xc8\'\xbf\xf7'
b'\x07\x13\x12\x18B\x17\x9fx\xa0\x00\x00\x00\x00IEND\xaeB`\x82')
def __init__(self, parent, winid, label, *args, **kwds):
kwds["style"] = wx.BORDER_NONE|wx.BU_EXACTFIT
buttons.GenBitmapTextToggleButton.__init__(self, parent, winid, None,
label, *args, **kwds)
if isinstance(self.bmp0, type(b'')):
self.__class__.bmp0 = wx.BitmapFromImage(wx.ImageFromStream(
io.BytesIO(self.bmp0)))
self.__class__.bmp1 = wx.BitmapFromImage(wx.ImageFromStream(
io.BytesIO(self.bmp1)))
self.SetBitmapLabel(self.bmp0)
self.SetBitmapSelected(self.bmp1)
if not label:
self.SetSize(self.bmp0.GetSize())
else:
self.SetBestSize()
self.labelDelta = 0
self.useFocusInd = False
self.SetToolTipString('Show')
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
def OnEraseBackground(self, event):
pass
def Notify(self):
wx.lib.buttons.GenBitmapTextToggleButton.Notify(self)
self.SetToolTipString("%s" % ('Show' if self.up else 'Hide'))
def DoGetBestSize(self):
width, height, usemin = self._GetLabelSize()
return width + 5, height + 4
def OnPaint(self, event):
width, height = self.GetClientSizeTuple()
dc = wx.BufferedPaintDC(self)
brush = None
bgcol = self.GetBackgroundColour()
brush = wx.Brush(bgcol, wx.SOLID)
defattr = self.GetDefaultAttributes()
if self.style & wx.BORDER_NONE and bgcol == defattr.colBg:
defattr = self.GetParent().GetDefaultAttributes()
if self.GetParent().GetBackgroundColour() == defattr.colBg:
if wx.Platform == "__WXMSW__":
if self.DoEraseBackground(dc):
brush = None
elif wx.Platform == "__WXMAC__":
brush.MacSetTheme(1)
else:
bgcol = self.GetParent().GetBackgroundColour()
brush = wx.Brush(bgcol, wx.SOLID)
if brush is not None:
dc.SetBackground(brush)
dc.Clear()
self.DrawLabel(dc, width, height)
def DrawLabel(self, dc, width, height, center=False):
bmp = self.bmpLabel
if bmp is not None:
if self.bmpDisabled and not self.IsEnabled():
bmp = self.bmpDisabled
if self.bmpFocus and self.hasFocus:
bmp = self.bmpFocus
if self.bmpSelected and not self.up:
bmp = self.bmpSelected
bmpwidth, bmpheight = bmp.GetWidth(), bmp.GetHeight()
hasmask = bmp.GetMask() is not None
else:
bmpwidth = bmpheight = 0
dc.SetFont(self.GetFont())
color = (self.GetForegroundColour() if self.IsEnabled() else
wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
dc.SetTextForeground(color)
label = self.GetLabel()
txtwidth, txtheight = dc.GetTextExtent(label)
# center bitmap and text
xpos = (width - bmpwidth - txtwidth) // 2 if center else 0
if bmp is not None:
dc.DrawBitmap(bmp, xpos, (height - bmpheight) // 2, hasmask)
xpos += 5
dc.DrawText(label, xpos + bmpwidth, (height - txtheight) // 2)
class SelectionEvent(wx.PyCommandEvent):
"""Notification of changed element."""
def __init__(self, evtType, winid, sel):
wx.PyCommandEvent.__init__(self, evtType, winid)
self.selection = sel
def SetSelection(self, select):
self.selection = select
def GetSelection(self):
return self.selection
class WxPeriodicTable(wx.Frame):
"""Main application window."""
# Class used to instanciate the panel with the elements.
periodic_panel_class = PeriodicPanel
def __init__(self, *args, **kwds):
kwds["style"] = (wx.DEFAULT_DIALOG_STYLE | wx.MINIMIZE_BOX | wx.TAB_TRAVERSAL)
wx.Frame.__init__(self, *args, **kwds)
self.selected = -1
self.SetTitle(MainApp.name)
icon = wx.EmptyIcon()
#icon.CopyFromBitmap(wx.Bitmap(MainApp.icon + '.png',
# wx.BITMAP_TYPE_ANY))
self.SetIcon(icon)
self.SetBackgroundColour(wx.SystemSettings_GetColour(
wx.SYS_COLOUR_3DFACE))
# create menu
self.menu = wx.MenuBar()
self.SetMenuBar(self.menu)
menu = wx.Menu()
menu.Append(wx.ID_EXIT, "Exit", "Exit the application", wx.ITEM_NORMAL)
self.menu.Append(menu, "File")
menu = wx.Menu()
menu.Append(wx.ID_COPY,
"Copy\tCtrl+C", "Copy selected element to the clipboard",
wx.ITEM_NORMAL)
self.menu.Append(menu, "Edit")
menu = wx.Menu()
menu.Append(wx.ID_VIEW_DETAILS, "Details", "Show or hide details",
wx.ITEM_CHECK)
self.menu.Append(menu, "View")
menu = wx.Menu()
menu.Append(wx.ID_ABOUT, "About...",
"Display information about the program", wx.ITEM_NORMAL)
self.menu.Append(menu, "Help")
# create panels and controls
self.notebook = wx.Notebook(self, -1, style=0)
self.description = DecriptionPanel(self.notebook, -1)
self.details = DetailsPanel(self.notebook, -1)
self.table = self.periodic_panel_class(self, id=-1)
self.disclose = DisclosureCtrl(self.table, -1, '')
self.table.AddCtrl(self.disclose)
self.notebook.AddPage(self.description, "Description")
self.notebook.AddPage(self.details, "Properties")
# event bindings
self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
self.Bind(wx.EVT_MENU, self.OnCopy, id=wx.ID_COPY)
self.Bind(wx.EVT_MENU, self.OnDetails, id=wx.ID_VIEW_DETAILS)
self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
self.Bind(EVT_ELE_CHANGED, self.OnSelect, self.table)
self.Bind(EVT_ELE_CHANGED, self.OnSelect, self.details)
self.Bind(wx.EVT_BUTTON, self.OnDetails, self.disclose)
# create sizers
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.table, 1, (wx.LEFT|wx.TOP|wx.RIGHT|wx.EXPAND|
wx.ALIGN_CENTER_HORIZONTAL| wx.EXPAND|wx.ADJUST_MINSIZE), BORDER-5)
self.sizer.Add((BORDER, BORDER))
self.sizer.Add(self.notebook, 0, (wx.LEFT|wx.RIGHT|wx.BOTTOM|
wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|
wx.ADJUST_MINSIZE), BORDER)
self.notebook.SetSelection(1)
self.SetAutoLayout(True)
self.SetSizerAndFit(self.sizer, True)
self.sizer.SetSizeHints(self)
self.ApplyLayout(True)
self.SetSelection(0)
def ApplyLayout(self, show=False):
self.show_info = show
self.sizer.Show(2, show, True)
self.SetAutoLayout(True)
self.SetSizerAndFit(self.sizer, True)
self.sizer.SetSizeHints(self)
self.Layout()
self.menu.Check(wx.ID_VIEW_DETAILS, show)
self.disclose.SetToggle(self.show_info)
def OnDetails(self, evt):
self.ApplyLayout(not self.show_info)
def OnEraseBackground(self, event):
pass
def OnCopy(self, evt):
dobj = wx.TextDataObject()
dobj.SetText(repr(ELEMENTS[self.selected + 1]))
if wx.TheClipboard.Open():
wx.TheClipboard.SetData(dobj)
wx.TheClipboard.Close()
def OnAbout(self, evt):
info = wx.AboutDialogInfo()
info.Name = MainApp.name
info.Version = MainApp.version
info.Copyright = MainApp.copyright
info.WebSite = MainApp.website
wx.AboutBox(info)
def OnWebsite(self, evt):
webbrowser.open(MainApp.website)
def OnWikipedia(self, evt):
webbrowser.open("http://en.wikipedia.org/wiki/%s" % (
ELEMENTS[self.selected].name), 1)
def OnWebElements(self, evt):
webbrowser.open("http://www.webelements.com/%s/" % (
ELEMENTS[self.selected].name.lower()))
def OnSelect(self, evt):
self.SetSelection(evt.GetSelection())
def SetSelection(self, select):
"""Set active element."""
if self.selected != select:
self.selected = select
self.description.SetSelection(select)
self.table.SetSelection(select)
self.details.SetSelection(select)
def OnExit(self, evt):
self.Close()
if __name__ == "__main__":
sys.exit(0)
else:
return self.selected
pteEVT_ELE_CHANGED = wx.NewEventType()
EVT_ELE_CHANGED = wx.PyEventBinder(pteEVT_ELE_CHANGED, 1)
SPACER = 12 if wx.Platform == "__WXMAC__" else 10
BORDER = 22 if wx.Platform == "__WXMAC__" else 10
COLORS = {
1: (0x99, 0xff, 0x99), # Nonmetals
2: (0xc0, 0xff, 0xff), # Noble gases
3: (0xff, 0x99, 0x99), # Alkali metals
4: (0xff, 0xde, 0xad), # Alkaline earth metals
5: (0xcc, 0xcc, 0x99), # Metalloids
6: (0xff, 0xff, 0x99), # Halogens
7: (0xcc, 0xcc, 0xcc), # Poor metals
8: (0xff, 0xc0, 0xc0), # Transition metals
9: (0xff, 0xbf, 0xff), # Lanthanides
10: (0xff, 0x99, 0xcc), # Actinides
}
_u = (lambda x: x.decode('latin-1')) if sys.version[0] == '2' else str
if __name__ == "__main__":
MainApp(0).MainLoop()

View File

@ -1,59 +0,0 @@
"""Collections of simple frames used to solve typical (simple) problems."""
from __future__ import print_function, division
import wx
from abipy.gui.awx.core import Frame as awxFrame
__all__ = [
"FrameWithChoice",
]
class FrameWithChoice(wx.Frame):
"""
Simple frame with a Choice control and two buttons: OK, Cancel
Subclasses will usually redefine onOkButton.
"""
def __init__(self, parent, choices, **kwargs):
super(FrameWithChoice, self).__init__(parent, id=-1, **kwargs)
main_sizer = wx.BoxSizer(wx.VERTICAL)
panel = wx.Panel(self, -1)
self.wxchoices = wx.Choice(panel, -1, wx.DefaultPosition, wx.DefaultSize, list(choices), 0)
self.wxchoices.SetSelection(0)
main_sizer.Add(self.wxchoices, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=5)
ok_button = wx.Button(panel, wx.ID_OK, label='Ok')
ok_button.Bind(wx.EVT_BUTTON, self.onOkButton)
close_button = wx.Button(panel, wx.ID_CANCEL, label='Cancel')
close_button.Bind(wx.EVT_BUTTON, self.onCloseButton)
hbox = wx.BoxSizer(wx.HORIZONTAL)
hbox.Add(ok_button, 0, flag=wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, border=5)
hbox.Add(close_button, 0, flag=wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, border=5)
main_sizer.Add(hbox, 0, flag=wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, border=5)
panel.SetSizerAndFit(main_sizer)
#self.SetSizerAndFit(main_sizer)
def getChoice(self):
"""Returns the string selected by the user."""
return self.wxchoices.GetStringSelection()
def onOkButton(self, event):
print("In onOkButton with choice selected %s" % self.wxchoices.GetStringSelection())
def onCloseButton(self, event):
self.Destroy()
if __name__ == "__main__":
app = wx.App()
FrameWithChoice(None, ["hello", "ciao"]).Show()
app.MainLoop()

View File

@ -1,96 +0,0 @@
from __future__ import print_function, division
import wx
import inspect
import warnings
from dialogs import showErrorMessage
__all__ = [
"Func1dPlotFrame",
]
class Func1dPlotFrame(wx.Frame):
"""
Simple Frame that allows the user to have access to the method
of a `Function1D` objects and plot the results with wxmplot.
"""
def __init__(self, parent, func1d, **kwargs):
"""
Args:
parent:
wx parent window.
func1d:
`Function1d` object.
"""
super(Func1dPlotFrame, self).__init__(parent=parent, **kwargs)
self.func1d = func1d
self.BuildUi()
# Store PlotFrames in this list.
self._pframes = []
def BuildUi(self):
panel = wx.Panel(self, id=-1, size=wx.Size(500, 300))
bSizer10 = wx.BoxSizer(wx.VERTICAL)
# Get the methods of the objects.
obj_methods = ["None"]
obj_methods += [t[0] for t in inspect.getmembers(self.func1d, predicate=inspect.ismethod)
if not t[0].startswith("_")]
sorted(obj_methods)
self.method_choice = wx.Choice(panel, -1, wx.DefaultPosition, wx.DefaultSize, obj_methods, 0)
self.method_choice.SetSelection(0)
bSizer10.Add(self.method_choice, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5)
fgSizer4 = wx.FlexGridSizer(0, 2, 0, 0)
fgSizer4.SetFlexibleDirection(wx.BOTH)
fgSizer4.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
self.replot_checkbox = wx.CheckBox(panel, id=-1, label="Replot")
self.replot_checkbox.SetValue(True)
fgSizer4.Add(self.replot_checkbox, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
self.plot_button = wx.Button(panel, -1, u"Plot", wx.DefaultPosition, wx.DefaultSize, 0)
fgSizer4.Add(self.plot_button, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
bSizer10.Add(fgSizer4, 0, 0, 5)
self.SetSizerAndFit(bSizer10)
self.plot_button.Bind(wx.EVT_BUTTON, self.OnClick)
def OnClick(self, event):
method = self.method_choice.GetStringSelection()
try:
from wxmplot import PlotFrame
except ImportError:
#warnings.warn("Error while importing wxmplot. Some features won't be available")
raise
plotframe = None
if self.replot_checkbox.GetValue() and len(self._pframes):
plotframe = self._pframes[-1]
try:
if method == "None":
g = self.func1d
else:
g = getattr(self.func1d, method)()
if plotframe is None:
plotframe = PlotFrame(self)
self._pframes.append(plotframe)
plotframe.plot(g.mesh, g.values, label=method, draw_legend=True)
plotframe.Show()
else:
plotframe.oplot(g.mesh, g.values, label=method, draw_legend=True)
except:
showErrorMessage(self)

View File

@ -1,440 +0,0 @@
from __future__ import print_function, division
import sys
import wx
import wx.grid as gridlib
__all__ = [
"SimpleGrid",
"SimpleGridFrame",
]
class CopyPasteGrid(gridlib.Grid):
"""
A Copy&Paste enabled grid class
taken from http://wxpython-users.1045709.n5.nabble.com/copy-and-pasting-selections-in-wx-grid-cells-td2353289.html
"""
def __init__(self, parent, **kwargs):
super(CopyPasteGrid, self).__init__(parent, **kwargs)
wx.EVT_KEY_DOWN(self, self.OnKey)
def selection(self):
# Show cell selection
# If selection is cell...
if self.GetSelectedCells():
print("Selected cells " + str(self.GetSelectedCells()))
# If selection is block...
if self.GetSelectionBlockTopLeft():
print("Selection block top left " + str(self.GetSelectionBlockTopLeft()))
if self.GetSelectionBlockBottomRight():
print("Selection block bottom right " + str(self.GetSelectionBlockBottomRight()))
# If selection is col...
if self.GetSelectedCols():
print("Selected cols " + str(self.GetSelectedCols()))
# If selection is row...
if self.GetSelectedRows():
print("Selected rows " + str(self.GetSelectedRows()))
def currentcell(self):
# Show cursor position
row = self.GetGridCursorRow()
col = self.GetGridCursorCol()
cell = (row, col)
print("Current cell " + str(cell))
def OnKey(self, event):
# If Ctrl+C is pressed...
if event.ControlDown() and event.GetKeyCode() == 67:
print("Ctrl+C")
self.selection()
# Call copy method
self.copy()
# If Ctrl+V is pressed...
if event.ControlDown() and event.GetKeyCode() == 86:
print("Ctrl+V")
self.currentcell()
# Call paste method
self.paste()
# If Supr is pressed
if event.GetKeyCode() == 127:
print("Supr")
# Call delete method
self.delete()
# Skip other Key events
if event.GetKeyCode():
event.Skip()
return
def copy(self):
print("Copy method")
# Number of rows and cols
rows = self.GetSelectionBlockBottomRight()[0][0] - self.GetSelectionBlockTopLeft()[0][0] + 1
cols = self.GetSelectionBlockBottomRight()[0][1] - self.GetSelectionBlockTopLeft()[0][1] + 1
# data variable contain text that must be set in the clipboard
data = ''
# For each cell in selected range append the cell value in the data variable
# Tabs '\t' for cols and '\r' for rows
for r in range(rows):
for c in range(cols):
data = data + str(self.GetCellValue(self.GetSelectionBlockTopLeft()[0][0] + r, self.GetSelectionBlockTopLeft()[0][1] + c))
if c < cols - 1:
data = data + '\t'
data = data + '\n'
# Create text data object
clipboard = wx.TextDataObject()
# Set data object value
clipboard.SetText(data)
# Put the data in the clipboard
if wx.TheClipboard.Open():
wx.TheClipboard.SetData(clipboard)
wx.TheClipboard.Close()
else:
wx.MessageBox("Can't open the clipboard", "Error")
def paste(self):
print("Paste method")
clipboard = wx.TextDataObject()
if wx.TheClipboard.Open():
wx.TheClipboard.GetData(clipboard)
wx.TheClipboard.Close()
else:
wx.MessageBox("Can't open the clipboard", "Error")
data = clipboard.GetText()
table = []
y = -1
# Convert text in a array of lines
for r in data.splitlines():
y = y +1
x = -1
# Convert c in a array of text separated by tab
for c in r.split('\t'):
x = x +1
self.SetCellValue(self.GetGridCursorRow() + y, self.GetGridCursorCol() + x, c)
def delete(self):
print("Delete method")
# Number of rows and cols
rows = self.GetSelectionBlockBottomRight()[0][0] - self.GetSelectionBlockTopLeft()[0][0] + 1
cols = self.GetSelectionBlockBottomRight()[0][1] - self.GetSelectionBlockTopLeft()[0][1] + 1
# Clear cells contents
for r in range(rows):
for c in range(cols):
self.SetCellValue(self.GetSelectionBlockTopLeft()[0][0] + r, self.GetSelectionBlockTopLeft()[0][1] + c, '')
#class SimpleGrid(gridlib.Grid):
class SimpleGrid(CopyPasteGrid):
def __init__(self, parent, table, row_labels=None, col_labels=None, **kwargs):
"""
Args:
parent:
parent window.
table:
List of string lists.
row_labels:
List of strings used to name the rows.
col_labels:
List of strings used to name the col.
"""
super(SimpleGrid, self).__init__(parent, id=-1, **kwargs)
self.log = sys.stdout
self.moveTo = None
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.nrows = nrows = len(table)
dims = {len(row) for row in table}
if len(dims) == 1:
self.ncols = ncols = list(dims)[0]
else:
raise ValueError("Each row must have the same number of columns but dims %s" % str(dims))
self.CreateGrid(nrows, ncols)
attr = gridlib.GridCellAttr()
attr.SetTextColour(wx.BLACK)
attr.SetBackgroundColour(wx.WHITE)
attr.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL))
self.SetGridCellAttr(attr)
if row_labels is not None:
assert len(row_labels) == nrows
for i, label in enumerate(row_labels):
self.SetRowLabelValue(i, label)
if col_labels is not None:
assert len(col_labels) == ncols
for i, label in enumerate(col_labels):
self.SetColLabelValue(i, label)
self.SetColLabelAlignment(wx.ALIGN_LEFT, wx.ALIGN_BOTTOM)
# Cell formatting
for r, row in enumerate(table):
for c, col in enumerate(row):
self.SetCellValue(r, c, table[r][c])
self.SetReadOnly(r, c, True)
self.AutoSize()
self.ForceRefresh()
# test all the events
self.Bind(gridlib.EVT_GRID_CELL_LEFT_CLICK, self.OnCellLeftClick)
self.Bind(gridlib.EVT_GRID_CELL_RIGHT_CLICK, self.OnCellRightClick)
self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick)
self.Bind(gridlib.EVT_GRID_CELL_RIGHT_DCLICK, self.OnCellRightDClick)
self.Bind(gridlib.EVT_GRID_LABEL_LEFT_CLICK, self.OnLabelLeftClick)
self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_CLICK, self.OnLabelRightClick)
self.Bind(gridlib.EVT_GRID_LABEL_LEFT_DCLICK, self.OnLabelLeftDClick)
self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_DCLICK, self.OnLabelRightDClick)
self.Bind(gridlib.EVT_GRID_ROW_SIZE, self.OnRowSize)
self.Bind(gridlib.EVT_GRID_COL_SIZE, self.OnColSize)
self.Bind(gridlib.EVT_GRID_RANGE_SELECT, self.OnRangeSelect)
self.Bind(gridlib.EVT_GRID_CELL_CHANGE, self.OnCellChange)
self.Bind(gridlib.EVT_GRID_SELECT_CELL, self.OnSelectCell)
self.Bind(gridlib.EVT_GRID_EDITOR_SHOWN, self.OnEditorShown)
self.Bind(gridlib.EVT_GRID_EDITOR_HIDDEN, self.OnEditorHidden)
self.Bind(gridlib.EVT_GRID_EDITOR_CREATED, self.OnEditorCreated)
def SetGridCellAttr(self, attr):
"""
Set cell attributes for the whole row.
Args:
attr:
`gridlib.GridCellAttr`
"""
# Note that GridCellAttr objects are reference counted, so attr.IncRef
# should be called every time Grid.Set*Attr(attr) is called. This is
# required to keep the Grid.Delete* methods from unexpectedly deleting the
# GridCellAttr object.
for row in range(self.nrows):
attr.IncRef()
self.SetRowAttr(row, attr)
self.AutoSize()
self.ForceRefresh()
def OnCellLeftClick(self, evt):
self.log.write("OnCellLeftClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnCellRightClick(self, evt):
self.log.write("OnCellRightClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnCellLeftDClick(self, evt):
self.log.write("OnCellLeftDClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnCellRightDClick(self, evt):
self.log.write("OnCellRightDClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnLabelLeftClick(self, evt):
self.log.write("OnLabelLeftClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnLabelRightClick(self, evt):
self.log.write("OnLabelRightClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnLabelLeftDClick(self, evt):
self.log.write("OnLabelLeftDClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnLabelRightDClick(self, evt):
self.log.write("OnLabelRightDClick: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnRowSize(self, evt):
self.log.write("OnRowSize: row %d, %s\n" % (evt.GetRowOrCol(), evt.GetPosition()))
evt.Skip()
def OnColSize(self, evt):
self.log.write("OnColSize: col %d, %s\n" % (evt.GetRowOrCol(), evt.GetPosition()))
evt.Skip()
def OnRangeSelect(self, evt):
if evt.Selecting():
msg = 'Selected'
else:
msg = 'Deselected'
self.log.write("OnRangeSelect: %s top-left %s, bottom-right %s\n" %
(msg, evt.GetTopLeftCoords(), evt.GetBottomRightCoords()))
evt.Skip()
def OnCellChange(self, evt):
self.log.write("OnCellChange: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
# Show how to stay in a cell that has bad data. We can't just
# call SetGridCursor here since we are nested inside one so it
# won't have any effect. Instead, set coordinates to move to in
# idle time.
value = self.GetCellValue(evt.GetRow(), evt.GetCol())
if value == 'no good':
self.moveTo = evt.GetRow(), evt.GetCol()
def OnIdle(self, evt):
if self.moveTo is not None:
self.SetGridCursor(self.moveTo[0], self.moveTo[1])
self.moveTo = None
evt.Skip()
def OnSelectCell(self, evt):
if evt.Selecting():
msg = 'Selected'
else:
msg = 'Deselected'
self.log.write("OnSelectCell: %s (%d,%d) %s\n" % (msg, evt.GetRow(), evt.GetCol(), evt.GetPosition()))
# Another way to stay in a cell that has a bad value...
row = self.GetGridCursorRow()
col = self.GetGridCursorCol()
if self.IsCellEditControlEnabled():
self.HideCellEditControl()
self.DisableCellEditControl()
value = self.GetCellValue(row, col)
if value == 'no good 2':
return # cancels the cell selection
evt.Skip()
def OnEditorShown(self, evt):
if evt.GetRow() == 6 and evt.GetCol() == 3 and \
wx.MessageBox("Are you sure you wish to edit this cell?",
"Checking", wx.YES_NO) == wx.NO:
evt.Veto()
return
self.log.write("OnEditorShown: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnEditorHidden(self, evt):
if evt.GetRow() == 6 and evt.GetCol() == 3 and \
wx.MessageBox("Are you sure you wish to finish editing this cell?",
"Checking", wx.YES_NO) == wx.NO:
evt.Veto()
return
self.log.write("OnEditorHidden: (%d,%d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
evt.Skip()
def OnEditorCreated(self, evt):
self.log.write("OnEditorCreated: (%d, %d) %s\n" % (evt.GetRow(), evt.GetCol(), evt.GetControl()))
#def InstallGridHint(grid, rowcolhintcallback):
# prev_rowcol = [None,None]
# def OnMouseMotion(evt):
# # evt.GetRow() and evt.GetCol() would be nice to have here,
# # but as this is a mouse event, not a grid event, they are not
# # available and we need to compute them by hand.
# x, y = grid.CalcUnscrolledPosition(evt.GetPosition())
# row = grid.YToRow(y)
# col = grid.XToCol(x)
# if (row,col) != prev_rowcol and row >= 0 and col >= 0:
# prev_rowcol[:] = [row,col]
# hinttext = rowcolhintcallback(row, col)
# if hinttext is None:
# hinttext = ''
# grid.GetGridWindow().SetToolTipString(hinttext)
# evt.Skip()
# wx.EVT_MOTION(grid.GetGridWindow(), OnMouseMotion)
class SimpleGridFrame(wx.Frame):
def __init__(self, parent, table, row_labels=None, col_labels=None, labels_from_table=False, **kwargs):
"""
Args:
labels_from_table:
If True row_labes and col_labels are taken from the table. Not compatible with `row_labels` and `col_labels`.
"""
super(SimpleGridFrame, self).__init__(parent, -1, **kwargs)
if labels_from_table:
# Extract labes from table and extract the subtable.
assert not row_labels and not col_labels
col_labels = table[0][1:]
row_labels, new_table = [], []
for row in table[1:]:
row_labels.append(row[0])
new_table.append(row[1:])
table = new_table
self.makeToolBar()
self.panel = panel = wx.Panel(self, -1)
self.grid = SimpleGrid(panel, table, row_labels=row_labels, col_labels=col_labels)
self.main_sizer = main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.grid, 1, wx.EXPAND | wx.ALL, 5)
panel.SetSizerAndFit(main_sizer)
def makeToolBar(self):
"""Creates the tool bar."""
self.toolbar = toolbar = self.CreateToolBar()
self.font_picker = wx.FontPickerCtrl(toolbar, -1)
toolbar.AddControl(control=self.font_picker)
toolbar.Realize()
#menu_bar = wx.MenuBar()
# Associate menu/toolbar items with their handlers.
#self.ID_ = wx.NewId()
#menu_handlers = [
# (self.ID_FONT_CHANGED, self.onFontChanged),
#]
#for combo in menu_handlers:
# mid, handler = combo[:2]
# self.Bind(wx.EVT_MENU, handler, id=mid)
self.Bind(wx.EVT_FONTPICKER_CHANGED, self.OnFontPickerChanged, self.font_picker)
def OnFontPickerChanged(self, event):
"""Change the Font."""
font = self.font_picker.GetSelectedFont()
attr = gridlib.GridCellAttr()
attr.SetFont(font)
self.grid.SetGridCellAttr(attr)
self.main_sizer.Fit(self.panel)
#class DemoSimpleGrid(wx.Frame):
# def __init__(self, parent):
# wx.Frame.__init__(self, parent, -1, "Simple Grid Demo")
#
# row_labels = ["row1", "row2"]
# col_labels = ["col1", "col2", "col3"]
#
# table = [
# ["1", "2", "3"],
# ["4", "5", "6"]
# ]
# self.grid = SimpleGrid(self, table, row_labels, col_labels)
#
#
#if __name__ == '__main__':
# app = wx.App()
# frame = DemoSimpleGrid(None)
# frame.Show(True)
# app.MainLoop()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,609 +0,0 @@
"""Collections on controls."""
from __future__ import print_function, division
import wx
import collections
import numpy as np
from monty.collections import AttrDict
__all__ = [
"LinspaceControl",
"ArangeControl",
"IntervalControl",
"RowMultiCtrl",
"TableMultiCtrl",
"ListCtrlFromTable",
"FoldPanelMgr",
]
class LinspaceControl(wx.Panel):
"""
This control merges two `SpinCtrlDouble` and a `SpinCtrl` to allow
the user to specify a range using the `numpy.linspace` syntax.
"""
# Default parameters passed to SpinCtrl and SpinCtrlDouble.
SPIN_DEFAULTS = dict(value=str(50), min=0, max=10000, initial=0)
SPIN_DOUBLE_DEFAULTS = dict(value=str(0.0), min=0, max=10000, initial=0, inc=1)
def __init__(self, parent, start=None, stop=None, num=1, **kwargs):
"""
value (string) Default value (as text).
min (float) Minimal value.
max (float) Maximal value.
initial (float) Initial value.
inc (float) Increment value.
"""
super(LinspaceControl, self).__init__(parent, id=-1, **kwargs)
text_opts = dict(flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
ctrl_opts = text_opts
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
# start
text = wx.StaticText(self, -1, "Start:")
text.Wrap(-1)
text.SetToolTipString("The starting value of the sequence.")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
if start is not None:
p["value"] = str(start)
self.start_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.start_ctrl, **ctrl_opts)
# stop
text = wx.StaticText(self, -1, "Stop:")
text.Wrap(-1)
text.SetToolTipString("The end value of the sequence")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
if stop is not None:
p["value"] = str(stop)
self.stop_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.stop_ctrl, **ctrl_opts)
# num
text = wx.StaticText(self, -1, "Num:")
text.Wrap(-1)
text.SetToolTipString("Number of samples to generate.")
p = self.SPIN_DEFAULTS.copy()
if num is not None:
p["value"] = str(num)
self.num_ctrl = wx.SpinCtrl(self, -1, **p)
# FIXME:
# There's a problem since the text entered in the SpinCtrl is processed
# only when the widget looses focus. I tried the solution discussed at
# https://groups.google.com/forum/#!topic/wxpython-users/Gud8PI6n-4E
# but it didn't work on my Mac
#txtctrl = self.num_ctrl.GetChildren[0]
#txtctrl.WindowStyle |= wx.TE_PROCESS_ENTER
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.num_ctrl, **ctrl_opts)
self.SetSizerAndFit(main_sizer)
def getValues(self):
"""Returns the numpy array built with numpy.linspace."""
# FIXME Values are not updated if I edit the string in the SpinCtrl
p = dict(start=self.start_ctrl.GetValue(),
stop=self.stop_ctrl.GetValue(),
num=self.num_ctrl.GetValue())
return np.linspace(**p)
class ArangeControl(wx.Panel):
"""
This control merges three `SpinCtrlDouble` controls to allow
the user to specify a range using the `numpy.arange` syntax.
"""
# Default parameters passed to SpinCtrlDouble.
SPIN_DOUBLE_DEFAULTS = dict(value=str(0.0), min=0, max=10000, initial=0, inc=1)
def __init__(self, parent, start=None, stop=None, step=None, **kwargs):
"""
"""
super(ArangeControl, self).__init__(parent, id=-1, **kwargs)
text_opts = dict(flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
ctrl_opts = text_opts
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
# start
text = wx.StaticText(self, -1, "Start:")
text.Wrap(-1)
text.SetToolTipString("Start of interval. The interval includes this value.")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
if start is not None:
p["value"] = str(start)
self.start_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.start_ctrl, **ctrl_opts)
# stop
text = wx.StaticText(self, -1, "Stop:")
text.Wrap(-1)
text.SetToolTipString("""\
End of interval. The interval does not include this value, except
in some cases where `step` is not an integer and floating point round-off affects the length of `out`.""")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
if stop is not None:
p["value"] = str(stop)
self.stop_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.stop_ctrl, **ctrl_opts)
# step
text = wx.StaticText(self, -1, "Step:")
text.Wrap(-1)
text.SetToolTipString("""\
Spacing between values. For any output `out`, this is the distance between two adjacent values, out[i+1] - out[i].""")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
if step is not None:
p["value"] = str(step)
self.step_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.step_ctrl, **ctrl_opts)
self.SetSizerAndFit(main_sizer)
def getValues(self):
"""Returns the numpy array built with numpy.linspace."""
p = dict(start=self.start_ctrl.GetValue(),
stop=self.stop_ctrl.GetValue(),
step=self.step_ctrl.GetValue())
return np.arange(**p)
class IntervalControl(wx.Panel):
"""
This control merges two `SpinCtrlDouble` controls, a `SpinCtrl` and a combo box
to allow the user to specify a numerical interval
"""
# Default parameters passed to SpinCtrl and SpinCtrlDouble.
SPIN_DEFAULTS = dict(value=str(50), min=0, max=10000, initial=0)
SPIN_DOUBLE_DEFAULTS = dict(value=str(0.0), min=0, max=10000, initial=0, inc=0.1)
def __init__(self, parent, start, step, num=5, choices=None, **kwargs):
"""
Args:
start: Initial value
step: Step used to generate the mesh
num: Number of points
"""
super(IntervalControl, self).__init__(parent, id=-1, **kwargs)
text_opts = dict(flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
ctrl_opts = text_opts
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
# start
text = wx.StaticText(self, -1, "Start:")
text.Wrap(-1)
text.SetToolTipString("Start of interval. The interval includes this value.")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
p["value"] = str(start)
self.start_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.start_ctrl, **ctrl_opts)
# step
text = wx.StaticText(self, -1, "Step:")
text.Wrap(-1)
text.SetToolTipString("""\
Spacing between values. For any output `out`, this is the distance between two adjacent values, out[i+1] - out[i].""")
p = self.SPIN_DOUBLE_DEFAULTS.copy()
p["value"] = str(step)
self.step_ctrl = wx.SpinCtrlDouble(self, -1, **p)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.step_ctrl, **ctrl_opts)
# num
text = wx.StaticText(self, -1, "Num:")
text.Wrap(-1)
text.SetToolTipString("Number of samples to generate.")
p = self.SPIN_DEFAULTS.copy()
if num is not None:
p["value"] = str(num)
self.num_ctrl = wx.SpinCtrl(self, -1, **p)
# FIXME:
# There's a problem since the text entered in the SpinCtrl is processed
# only when the widget looses focus. I tried the solution discussed at
# https://groups.google.com/forum/#!topic/wxpython-users/Gud8PI6n-4E
# but it didn't work on my Mac
#txtctrl = self.num_ctrl.GetChildren[0]
#txtctrl.WindowStyle |= wx.TE_PROCESS_ENTER
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.num_ctrl, **ctrl_opts)
# Combo box to select the interval type.
text = wx.StaticText(self, -1, "Interval type:")
text.SetToolTipString("""\
Select the interval type:
centered if values are centered on start,
> if the lower bound of the interval is start, < if the uppper bound is start.""")
if choices is None: choices = ["centered", ">", "<"]
self.interval_type = wx.ComboBox(
self, id=-1, name='Interval type type', choices=choices, value=choices[0], style=wx.CB_READONLY)
main_sizer.Add(text, **text_opts)
main_sizer.Add(self.interval_type, **ctrl_opts)
self.SetSizerAndFit(main_sizer)
def getValues(self):
"""Returns a numpy array with the interval."""
start = self.start_ctrl.GetValue()
step = self.step_ctrl.GetValue()
num = self.num_ctrl.GetValue()
int_type = self.interval_type.GetValue()
assert num > 0
if num == 1:
return np.array(start)
if int_type in [">", "<"]:
sign = 1 if int_type == ">" else -1
values = [start + i * sign * step for i in range(num)]
if int_type == "<":
values.reverse()
elif int_type == "centered":
v_left = [start - i * step for i in range(1, num)]
v_left.reverse()
v_right = [start + i * step for i in range(num)]
values = v_left + v_right
else:
raise ValueError("Wrong int_type %s" % int_type)
#print("values", values)
return np.array(values)
class RowMultiCtrl(wx.Panel):
"""A panel with control widgets for integer, floats, ... placed on a row."""
# Default parameters passed to SpinCtrl and SpinCtrlDouble.
SPIN_DEFAULTS = dict(value="0", min=0, max=10000, initial=1)
SPIN_DOUBLE_DEFAULTS = dict(value="0.0", min=-10000, max=10000, initial=0.0, inc=0.1)
def __init__(self, parent, ctrl_params):
"""
Args:
ctrl_params:
List whose items are in the form (label: params)
where label is the name of the Spin button and
and params is a dictionary with the arguments used
to build the controller. Available keys are listed below.
Note that dtype must be specified.
=========== ============================================================
dtype "f" for floats, "i" for integers, "cbox" for combo box
tooltip tooltip of the controller
choices list of possible choices (used if dtype == cbox, mandatory
style used if dtype == "cbox"
=========== ============================================================
Example:
RowMultiCtrl(parent, ctrl_params=[
("I'm an integer", dict(dtype="i", value="-1", tooltip="hello integer)),
("I'm a float", dict(dtype="f", value=str(1/3.))),
])
"""
super(RowMultiCtrl, self).__init__(parent, -1)
# Accepts lists or tuples as well.
if isinstance(ctrl_params, (list, tuple)):
ctrl_params = collections.OrderedDict(ctrl_params)
self.ctrl_params = ctrl_params
self.ctrls = collections.OrderedDict()
self.main_sizer = main_sizer = wx.BoxSizer(wx.HORIZONTAL)
for label, params in ctrl_params.items():
params = AttrDict(**params)
dtype = params.pop("dtype", None)
if dtype is None:
raise ValueError("dtype must be specified")
txt = wx.StaticText(self, -1, label)
txt.Wrap(-1)
# Set the tooltip
tooltip = params.get("tooltip", None)
if tooltip is not None:
txt.SetToolTipString(tooltip)
# Create the controller and save it in self.ctrls
if dtype == "f":
# Initialize default values then update them with the values in params.
opts = self.SPIN_DOUBLE_DEFAULTS.copy()
for k in opts:
if k in params:
opts[k] = params[k]
# Make sure value is a string and create the Ctrl
opts["value"] = str(opts["value"])
ctrl = wx.SpinCtrlDouble(self, id=-1, **opts)
elif dtype == "i":
# Initialize default values then update them with the values in params.
opts = self.SPIN_DEFAULTS.copy()
for k in opts:
if k in params:
opts[k] = params[k]
# Make sure value is a string and create the Ctrl
opts["value"] = str(opts["value"])
ctrl = wx.SpinCtrl(self, id=-1, **opts)
elif dtype == "cbox":
# Combo box
if not hasattr(params, "choices"):
raise ValueError("choices must be specified if dtype == cbox")
choices = params.choices
ctrl = wx.ComboBox(self, id=-1, choices=choices, value=choices[0],
style=params.get("style", wx.CB_READONLY))
else:
raise ValueError("Wrong dtype %s" % str(dtype))
self.ctrls[label] = ctrl
hsizer = wx.BoxSizer(wx.HORIZONTAL)
hsizer.Add(txt, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
hsizer.Add(ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
main_sizer.Add(hsizer)
self.SetSizerAndFit(main_sizer)
def GetParams(self):
"""Return the parameters selected by the user in a `OrderedDict`"""
tuples = [(label, ctrl.GetValue()) for label, ctrl in self.ctrls.items()]
return collections.OrderedDict(tuples)
def SetParams(self, d):
"""
Set the value of the controllers from a dictionary
Returns the difference between the number of controllers
and the number of keys in kwargs that have been set
"""
for k, v in d.items():
self.ctrls[k].SetValue(v)
class TableMultiCtrl(wx.Panel):
"""
A panel with a table of control widgets for integer, floats, ....
"""
def __init__(self, parent, nrows, ctrls, rowmctrl_class=None):
"""
Args:
nrows:
Number of rows
ctrls:
List whose items are in the form (dtype: param). See RowMultiCtrl
rowmctrl_class:
Subclass of RowMultiCtrl used to customize the behaviour of the
widget (optional)
"""
super(TableMultiCtrl, self).__init__(parent, -1)
# Allow the user to customize RowMultiCtrl
self.rowmctrl_class = RowMultiCtrl if rowmctrl_class is None else rowmctrl_class
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
self.ctrl_list, self.ctrls = [], ctrls
for row in range(nrows):
rowmc = self.rowmctrl_class(self, ctrls)
self.main_sizer.Add(rowmc, 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
self.ctrl_list.append(rowmc)
self.SetSizerAndFit(self.main_sizer)
def __getitem__(self, item):
return self.ctrl_list.__getitem__(item)
def __iter__(self):
return self.ctrl_list.__iter__()
def __len__(self):
return len(self.ctrl_list)
def removeRow(self, index=-1):
"""Remove row with the give index (default: last row)."""
if index == -1: index = len(self) - 1
if index >= len(self) or len(self) == 0: return
#print("removing row with index: %s/%s" % (index, len(self)))
self.main_sizer.Hide(index)
self.main_sizer.Remove(index)
self.ctrl_list.pop(index)
self.main_sizer.Layout()
def appendRow(self):
"""Add a new row."""
rowmc = self.rowmctrl_class(self, self.ctrls)
self.main_sizer.Add(rowmc, 1, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
self.ctrl_list.append(rowmc)
self.main_sizer.Layout()
def GetParams(self):
"""Return the parameters selected by the user in a list of `AttrDict` dictionary"""
olist = []
for row in self.ctrl_list:
olist.append(row.GetParams())
return olist
def SetParams(self, ilist):
"""
Set the value of the controllers from a list of dictionaries
"""
assert len(ilist) == len(self.ctrl_list)
for i, d in enumerate(ilist):
ctrl = self.ctrl_list[i]
ctrl.SetParams(d)
import wx.lib.mixins.listctrl as listmix
from abipy.gui.awx.core import get_width_height
class ListCtrlFromTable(wx.ListCtrl, listmix.ColumnSorterMixin, listmix.ListCtrlAutoWidthMixin):
"""
This ListCtrl displays a list of strings. Support column sorting.
"""
def __init__(self, parent, table, **kwargs):
"""
Args:
parent:
Parent window.
table:
Table of strings (List of lists). The first item contains the names of the columns.
kwargs:
enumrows:
If True, the first column will contain the row index (default)
"""
enumrows = kwargs.pop("enumrows", True)
super(ListCtrlFromTable, self).__init__(parent, id=-1, style=wx.LC_REPORT | wx.BORDER_SUNKEN, **kwargs)
# Make sure we have a list of strings
for i, row in enumerate(table):
table[i] = map(str, row)
columns = table[0]
if enumrows:
columns = ["#"] + columns
for (index, col) in enumerate(columns):
self.InsertColumn(index, col)
# Used to store the Max width in pixels for the data in the column.
column_widths = [get_width_height(self, s)[0] for s in columns]
# Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
self.itemDataMap = {}
for (index, entry) in enumerate(table[1:]):
if enumrows:
entry = [str(index)] + entry
self.Append(entry)
self.itemDataMap[index] = entry
self.SetItemData(index, index)
w = [get_width_height(self, s)[0] for s in entry]
column_widths = map(max, zip(w, column_widths))
for (index, col) in enumerate(columns):
self.SetColumnWidth(index, column_widths[index])
# Now that the list exists we can init the other base class, see wx/lib/mixins/listctrl.py
listmix.ColumnSorterMixin.__init__(self, len(columns))
listmix.ListCtrlAutoWidthMixin.__init__(self)
def GetListCtrl(self):
"""Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py"""
return self
import wx.lib.foldpanelbar as foldpanel
class FoldPanelMgr(foldpanel.FoldPanelBar):
"""
Fold panel that manages a collection of Panels
The FoldPanelBar is a custom container class that allows multiple controls
to be grouped together into FoldPanelItem controls that allow them to be expanded
or contracted by clicking on its CaptionBar.
The FoldPanelBar doesn't work with layouts based on a Sizer and as such its API can get a little cumbersome,
because it requires you to add each control one by one and set its layout by using various flags.
This recipe shows how to create a custom FoldPanelBar that works with Panel objects.
This class will allow for you to modularize your code into Panel classes and then just add them to the FoldPanelBar
instead of directly adding everything to the FoldPanelBar itself.
"""
def __init__(self, parent, *args, **kwargs):
super(FoldPanelMgr, self).__init__(parent, *args, **kwargs)
def addPanel(self, pclass, title="", collapsed=False):
"""
Add a panel to the manager
@param pclass: Class constructor (callable)
@keyword title: foldpanel title
@keyword collapsed: start with it collapsed @return: pclass instance
"""
fpitem = self.AddFoldPanel(title, collapsed=collapsed)
wnd = pclass(fpitem)
best = wnd.GetBestSize()
wnd.SetSize(best)
self.AddFoldPanelWindow(fpitem, wnd)
return wnd
if __name__ == "__main__":
app = wx.App()
frame = wx.Frame(None)
#table = [["ciao", "values"], [1,2], ["3", "4"]]
#ctrl = ListCtrlFromTable(frame, table)
#panel = LinspaceControl(frame)
#panel = ArangeControl(frame, start=10, stop=15, step=1)
#panel = IntervalControl(frame, start=10, step=1, num=2)
#panel = RowMultiCtrl(frame, [
# ("hello", dict(dtype="f", tooltip="Tooltip for hello", value=1/3.0)),
# ("integer", dict(dtype="i")),
# ("combo", dict(dtype="cbox", choices=["default", "another"])),
#])
panel = TableMultiCtrl(frame, 1, [
("hello", dict(dtype="f", tooltip="Tooltip for hello")),
("integer", dict(dtype="i", value=-1)),
])
panel.appendRow()
panel.removeRow()
frame.Show()
app.MainLoop()

View File

@ -1,70 +0,0 @@
"""Inspired to http://wiki.wxpython.org/LongRunningTasks."""
from __future__ import print_function, division
import time
import wx
from threading import Thread
__all__ = [
"WorkerThread",
]
# Define notification event for thread completion
EVT_THREAD_RESULT_ID = wx.NewId()
def EVT_THREAD_RESULT(win, func):
"""Define Thread_Result Event."""
win.Connect(-1, -1, EVT_THREAD_RESULT_ID, func)
class ThreadResultEvent(wx.PyEvent):
"""Simple event to carry arbitrary result data."""
def __init__(self, **data):
"""Init Result Event."""
wx.PyEvent.__init__(self)
self.SetEventType(EVT_THREAD_RESULT_ID)
self.data = data
class WorkerThread(Thread):
"""Worker Thread Class that executes processing."""
def __init__(self, notify_window, group=None, target=None, name=None, *args, **kwargs):
"""Init Worker Thread Class."""
super(WorkerThread,self).__init__(group=group, target=target, name=name, args=args, kwargs=kwargs)
self._notify_window = notify_window
self._want_abort = 0
def start(self):
"""Start Worker Thread."""
super(WorkerThread, self).start()
def run(self):
"""Run Worker Thread."""
# This is the code executing in the new thread. Simulation of
# a long process (well, 10s here) as a simple loop - you will
# need to structure your processing so that you periodically
# peek at the abort variable
retcode = super(WorkerThread, self).run()
#while True:
# time.sleep(1)
# if self._want_abort:
# # Use a result of None to acknowledge the abort (of
# # course you can use whatever you'd like or even a separate event type)
# wx.PostEvent(self._notify_window, ThreadResultEvent(retcode="abort"))
# return
# Here's where the result would be returned (this is an
# example fixed result of the number 10, but it could be any Python object)
wx.PostEvent(self._notify_window, ThreadResultEvent(retcode=retcode))
return retcode
def abort(self):
"""Abort worker thread."""
# Method for use by main thread to signal an abort
self._want_abort = 1

View File

@ -1,112 +0,0 @@
"""
Utilities and helper functions.
"""
from __future__ import division, print_function
import wx
__all__ = [
]
def getApplicationConfigDirectory():
"""Returns the directory for application configuration information."""
app = getApplication()
return app.getConfigDirectory()
def getApplicationConfiguration():
"""Returns the application configuration object."""
app = getApplication()
return app.getConfiguration()
def beautifySize(size):
"""Returns a string representing the size in bytes in a more human readable way."""
if size / 1073741824:
return "%(size)0.2f GBytes" % {'size': (float(size) / 1073741824.0)}
elif size / 1048576:
return "%(size)0.2f MBytes" % {'size': (float(size) / 1048576.0)}
elif size / 1024:
return "%(size)0.2f KBytes" % {'size': (float(size) / 1024.0)}
else:
return "%(size)s Bytes" % {'size': size}
def addHorizontalSpaceTool(toolbar, width):
"""Adds horizontal space in a portable manner."""
space = wx.StaticText(toolbar, -1, "")
space.SetSize((width, -1))
toolbar.AddControl(space)
def addLineSeparator(toolbar, height):
"""Adds a line separator to a toolbar."""
addHorizontalSpaceTool(toolbar, 3)
line = wx.StaticLine(toolbar, -1, style=wx.LI_VERTICAL)
line.SetSize((-1, height))
toolbar.AddControl(line)
addHorizontalSpaceTool(toolbar, 3)
def getColumnText(list, index, col):
"""Gets the text from the specified column entry in a list."""
item = list.GetItem(index, col)
return item.GetText()
def getSelected(list):
"""Gets the selected items from a list object."""
selected = []
item = -1
while 1:
item = list.GetNextItem(item, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED)
if item == -1:
break
selected.append(item)
return selected
def setListColumnAlignment(list, col, align):
"""Sets the column alignment for a column in a list."""
item_info = list.GetColumn(col)
item_info.SetAlign(align)
list.SetColumn(col, item_info)
def colorToTuple(color):
"""Coverts a color object to a tuple RGB tuple representing the color."""
return (color.Red(), color.Green(), color.Blue())
def isStrOrUnicode(value):
"""Returns true if the value is either a string or a unicode type."""
return isinstance(value, str) or isinstance(value, unicode)
def is_string(s):
"""True if s behaves like a string (duck typing test)."""
try:
dummy = s + " "
return True
except TypeError:
return False
def straceback(color=None):
"""
Returns a string with the traceback.
Use ANSII color formatting for output in terminal if color is not None.
"""
import traceback
s = traceback.format_exc()
if color is not None:
try:
from termcolor import colored
return colored(s, color)
except ImportError:
return s
else:
return s

View File

@ -1,233 +0,0 @@
import os
import wx
import abc
import wx.lib.agw.flatnotebook as fnb
import abipy.gui.awx as awx
from monty.string import list_strings
class MultiViewerFrame(awx.Frame, metaclass=abc.ABCMeta):
"""
Base class for Viewers that can handle the multiple netcdf files
of the same type. A `MultiViewerFrame` has a notebook where
each page provides tools to interact with the data stored in the netcd file
Concrete classes should provide the method that open a new file and creates
a new page (specific to the file type) that will be added to the notebook.
Concrete classes must also define the following (class) attributes.
.. attributes:
VERSION:
String with the version of the visualizer e.g "0.1"
HELP_MSG:
Multi line string with a Quick help. For example a list of shortcuts
or a brief description of the usage of the GUI.
"""
def __init__(self, parent, filepaths=(), **kwargs):
"""
Args:
parent:
parent window.
filepaths:
String or list of strings with the path of the netcdf files to open
Empty tuple if no file should be opened during the initialization of the frame.
"""
super(MultiViewerFrame, self).__init__(parent, -1, title=self.codename, **kwargs)
# This combination of options for config seems to work on my Mac.
self.config = wx.FileConfig(appName=self.codename, localFilename=self.codename + ".ini",
style=wx.CONFIG_USE_LOCAL_FILE)
# Build menu, toolbar and status bar.
self.makeMenu()
self.makeToolBar()
self.statusbar = self.CreateStatusBar()
# Open netcdf files.
filepaths, exceptions = list_strings(filepaths), []
filepaths = map(os.path.abspath, filepaths)
# Create the notebook (each file will have its own tab).
panel = wx.Panel(self, -1)
try:
style = fnb.FNB_NO_X_BUTTON | fnb.FNB_NAV_BUTTONS_WHEN_NEEDED
except AttributeError:
style = fnb.FNB_NO_X_BUTTON
self.notebook = fnb.FlatNotebook(panel, -1, style=style)
for path in filepaths:
self.read_file(path)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.notebook, 1, wx.EXPAND, 5)
panel.SetSizerAndFit(sizer)
@abc.abstractproperty
def codename(self):
"""The name of the viewer."""
@property
def active_tab(self):
"""Returns the active tab. None if notebook is empty."""
return self.notebook.GetCurrentPage()
def makeMenu(self):
"""
Method of the base class that provides a base menu
that can be extended by the subclass.
"""
menu_bar = wx.MenuBar()
file_menu = wx.Menu()
file_menu.Append(wx.ID_OPEN, "&Open", help="Open an existing file in a new tab")
file_menu.Append(wx.ID_CLOSE, "&Close", help="Close the file associated to the active tab")
file_menu.Append(wx.ID_EXIT, "&Quit", help="Exit the application")
file_history = self.file_history = wx.FileHistory(8)
file_history.Load(self.config)
recent = wx.Menu()
file_history.UseMenu(recent)
file_history.AddFilesToMenu()
file_menu.AppendMenu(-1, "&Recent Files", recent)
self.Bind(wx.EVT_MENU_RANGE, self.OnFileHistory, id=wx.ID_FILE1, id2=wx.ID_FILE9)
menu_bar.Append(file_menu, "File")
# Associate menu/toolbar items with their handlers.
menu_handlers = [
(wx.ID_OPEN, self.OnOpen),
(wx.ID_CLOSE, self.OnClose),
(wx.ID_EXIT, self.OnExit),
]
for combo in menu_handlers:
mid, handler = combo[:2]
self.Bind(wx.EVT_MENU, handler, id=mid)
return menu_bar
def makeHelpMenu(self):
"""
Method of the base class that provides a base help menu
that can be extended by the subclass.
"""
help_menu = wx.Menu()
self.ID_HELP_QUICKREF = wx.NewId()
help_menu.Append(self.ID_HELP_QUICKREF, "Quick Reference ", help="Quick reference for " + self.codename)
help_menu.Append(wx.ID_ABOUT, "About " + self.codename, help="Info on the application")
# Associate menu/toolbar items with their handlers.
menu_handlers = [
(self.ID_HELP_QUICKREF, self.onQuickRef),
(wx.ID_ABOUT, self.OnAboutBox),
]
for combo in menu_handlers:
mid, handler = combo[:2]
self.Bind(wx.EVT_MENU, handler, id=mid)
return help_menu
@abc.abstractmethod
def makeToolBar(self):
"""To be provided by the concrete class."""
@abc.abstractmethod
def addFileTab(self, parent, filepath):
"""
This method must be provided by the subclass.
It receives a string with the file path, opens the file
and adds a new tab to the notebook.
Example::
wfk = abiopen(filepath)
tab = WfkFileTab(self.notebook, wfk)
self.notebook.AddPage(tab, os.path.basename(filepath))
"""
def read_file(self, filepath):
"""Open netcdf file, create new tab and save the file in the history."""
self.statusbar.PushStatusText("Reading %s" % filepath)
try:
self.addFileTab(self, filepath)
# don't know why but this does not work!
self.notebook.Refresh()
self.notebook.SetSelection(self.notebook.GetPageCount())
self.AddFileToHistory(filepath)
except:
awx.showErrorMessage(self)
def OnOpen(self, event):
"""Open FileDialog to allow the user to select a file."""
# intercept possible problems when determining the current directory (e.g. it has been deleted)
try:
def_dir = os.getcwd()
except OSError:
def_dir = os.path.expanduser('~')
# Show the dialog and retrieve the user response.
# If it is the OK response, process the data.
dialog = wx.FileDialog(self, message="Choose a netcdf file", defaultDir=def_dir,
wildcard="Netcdf files (*.nc)|*.nc",
style=wx.OPEN | wx.CHANGE_DIR)
if dialog.ShowModal() == wx.ID_CANCEL: return
self.read_file(dialog.GetPath())
def OnClose(self, event):
"""
Remove the active tab from the notebook and
close the corresponding netcdf file,
"""
notebook = self.notebook
if notebook.GetPageCount() == 0: return
idx = notebook.GetSelection()
if idx == -1: return None
# Close the file
tab = notebook.GetPage(idx)
# Remove tab.
notebook.DeletePage(idx)
notebook.Refresh()
#notebook.SendSizeEvent()
def OnExit(self, event):
"""Exits the application."""
# Close open netcdf files.
#try:
# for index in range(self.notebook.GetPageCount()):
# tab = self.notebook.GetPage(index)
# try:
# tab.wfk.close()
# except:
# pass
#finally:
self.Destroy()
def OnAboutBox(self, event):
""""Info on the application."""
awx.makeAboutBox(codename=self.codename, version=self.VERSION,
description="", developers="M. Giantomassi")
def onQuickRef(self, event=None):
"""Show a dialog with a brief description of the commands."""
dialog = wx.MessageDialog(self, self.HELP_MSG, self.codename + " Quick Reference",
wx.OK | wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
def AddFileToHistory(self, filepath):
"""Add the absolute filepath to the file history."""
self.file_history.AddFileToHistory(filepath)
self.file_history.Save(self.config)
self.config.Flush()
def OnFileHistory(self, event):
fileNum = event.GetId() - wx.ID_FILE1
filepath = self.file_history.GetHistoryFile(fileNum)
self.read_file(filepath)

View File

@ -1,4 +0,0 @@
#!/usr/bin/env python
from abipy.gui.wxapps import wxapp_converter
wxapp_converter().MainLoop()

View File

@ -1,9 +0,0 @@
#!/usr/bin/env python
import os
import abipy
import abipy.data
import abipy.gui.wxapps as wxapps
wxapps.wxapp_dirbrowser(abipy.data.dirpath).MainLoop()

View File

@ -1,4 +0,0 @@
#!/usr/bin/env python
import abipy.gui.wxapps as wxapps
wxapps.wxapp_fftprof().MainLoop()

View File

@ -1,8 +0,0 @@
#!/usr/bin/env python
import abipy.data as abidata
from abipy.gui.wxapps import wxapp_gsrviewer
gsr_filepath = abidata.ref_file("si_nscf_GSR.nc")
wxapp_gsrviewer(gsr_filepath).MainLoop()

View File

@ -1,17 +0,0 @@
#!/usr/bin/env python
import wx
import abipy.data as abidata
from abipy.abilab import abiopen
from abipy.gui.kpoints import KpointsPanel
gsr = abiopen(abidata.ref_file("si_nscf_GSR.nc"))
app = wx.App()
frame = wx.Frame(None, -1)
KpointsPanel(frame, gsr.structure, gsr.kpoints)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()
gsr.close()

View File

@ -1,8 +0,0 @@
#!/usr/bin/env python
import abipy
import abipy.data
import abipy.gui.wxapps as wxapps
wxapps.wxapp_listbrowser(dirpaths=abipy.data.dirpath).MainLoop()

View File

@ -1,7 +0,0 @@
#!/usr/bin/env python
import abipy.data as abidata
from abipy.gui.wxapps import wxapp_mdfviewer
mdf_filenames = abidata.ref_file("tbs_4o_DS2_MDF.nc")
wxapp_mdfviewer(mdf_filenames).MainLoop()

View File

@ -1,5 +0,0 @@
#!/usr/bin/env python
#from abipy.gui.wxapps import wxapp_oncvpsp
from abipy.gui.oncvgui import wxapp_oncvpsp
wxapp_oncvpsp().MainLoop()

View File

@ -1,9 +0,0 @@
#!/usr/bin/env python
import wx
from abipy.gui.awx.elements_gui import WxPeriodicTable
app = wx.App()
frame = WxPeriodicTable(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()

View File

@ -1,8 +0,0 @@
#!/usr/bin/env python
import abipy
import abipy.data
from abipy.gui.wxapps import wxapp_sigresviewer
app = wxapp_sigresviewer(abipy.data.ref_file("tgw1_9o_DS4_SIGRES.nc"))
app.MainLoop()

View File

@ -1,9 +0,0 @@
#!/usr/bin/env python
import os
import abipy.data as abidata
from abipy.gui.wxapps import wxapp_wfkviewer
wfk_filename = abidata.WFK_NCFILES[0]
wxapp_wfkviewer(wfk_filename).MainLoop()

View File

@ -1,6 +0,0 @@
#!/usr/bin/env python
import abipy.data as abidata
from abipy.gui.wxapps import wxapp_ncview
wxapp_ncview(filepaths=abidata.WFK_NCFILES[0]).MainLoop()

View File

@ -1,81 +0,0 @@
#!/usr/bin/env python
from __future__ import print_function
import sys
import os
import time
import argparse
from subprocess import call, Popen
def str_examples():
examples = (
"Usage example:\n"
"run.py => Run all demo scripts.\n"
"run.py -m automatic -t 7 => Run all tests, close the demo after 7 seconds.\n"
)
return examples
def show_examples_and_exit(err_msg=None, error_code=1):
"""Display the usage of the script."""
sys.stderr.write(str_examples())
if err_msg:
sys.stderr.write("Fatal Error\n" + err_msg + "\n")
sys.exit(error_code)
def main():
parser = argparse.ArgumentParser(epilog=str_examples(),formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('-m', '--mode', type=str, default="automatic",
help="execution mode. Either s (sequential) or a (automatic)")
parser.add_argument('-t', '--time', type=float, default=5,
help="wait time seconds before running next demo.")
options = parser.parse_args()
# Find scripts.
dirpath = os.path.dirname(__file__)
scripts = []
for fname in os.listdir(dirpath):
if fname.endswith(".py") and fname.startswith("demo_"):
scripts.append(os.path.join(dirpath, fname))
python = "pythonw"
python = "python.app"
print("Using python:", python)
# Run scripts depending on mode.
if options.mode in ["s", "sequential"]:
for script in scripts:
retcode = call([python, script])
if retcode != 0: break
elif options.mode in ["a", "automatic"]:
for script in scripts:
p = Popen([python, script])
time.sleep(options.time)
p.kill()
retcode = 0
elif options.mode == "screenshot":
processes = []
for script in scripts:
p = Popen([python, script])
processes.append(p)
time.sleep(options.time)
for p in processes:
p.kill()
retcode = 0
else:
show_examples_and_exit(err_msg="Wrong value for mode: %s" % options.mode)
return retcode
if __name__ == "__main__":
sys.exit(main())

View File

@ -1,196 +0,0 @@
"""Frames for text visualization."""
import os
import wx
import tempfile
import wx.lib.agw.flatnotebook as fnb
import abipy.gui.awx as awx
from monty.fnmatch import WildCard
from wx.py.editor import EditorFrame, EditorNotebookFrame
__all__ = [
"SimpleTextViewer",
"TextNotebookFrame",
]
def add_size(kwargs, size=(800, 600)):
"""Add size to kwargs if not present."""
if "size" not in kwargs:
kwargs["size"] = size
return kwargs
class SimpleTextViewer(awx.Frame):
"""Very simple frame that displays text (string ) in read-only mode."""
def __init__(self, parent, text, **kwargs):
super(SimpleTextViewer, self).__init__(parent, **add_size(kwargs))
wx.TextCtrl(self, -1, text, style=wx.TE_MULTILINE | wx.TE_LEFT | wx.TE_READONLY)
class MyEditorFrame(EditorFrame):
def __init__(self, parent, filename, **kwargs):
super(MyEditorFrame, self).__init__(parent, filename=filename, **add_size(kwargs))
@classmethod
def from_text(cls, parent, text, **kwargs):
"""Hack so that we can open a string in the Editor."""
fd, filename = tempfile.mkstemp(text=True)
with open(filename, "w") as fh:
fh.write(text)
return cls(parent, filename, **kwargs)
class TextNotebookFrame(awx.Frame):
"""
This frame receives a list of strings and displays them in a notebook (read-only mode)
"""
def __init__(self, parent, text_list, page_names, num_dirs=2, **kwargs):
"""
Args:
parent:
Parent Widget.
text_list:
List of strings. Each string is displayed in its own page in the notebook.
page_names:
List of strings giving the name of the tab for each string in text_list.
num_dirs:
Maximum number of directories that will be shown in the tab.
"""
super(TextNotebookFrame, self).__init__(parent, **add_size(kwargs))
# Add the pages to the notebook with the name to show on the tab
if not isinstance(text_list, (list, tuple)):
text_list = [text_list]
if not isinstance(page_names, (list, tuple)):
page_names = [page_names]
assert len(page_names) == len(text_list)
# Here we create a panel and a notebook on the panel
nb_panel = awx.Panel(self)
try:
style = fnb.FNB_X_ON_TAB | fnb.FNB_NAV_BUTTONS_WHEN_NEEDED
except AttributeError:
style = fnb.FNB_X_ON_TAB
nb = fnb.FlatNotebook(nb_panel, style=style)
for page_name, text in zip(page_names, text_list):
page = wx.TextCtrl(nb, -1, text, style=wx.TE_MULTILINE|wx.TE_LEFT|wx.TE_READONLY)
if num_dirs > 0:
tokens = page_name.split(os.path.sep)
page_name = os.path.join(*tokens[-num_dirs:])
nb.AddPage(page, text=page_name)
# Finally, put the notebook in a sizer for the nb_panel to manage the layout
sizer = wx.BoxSizer()
sizer.Add(nb, 1, wx.EXPAND)
nb_panel.SetSizerAndFit(sizer)
@classmethod
def from_files_and_dir(cls, parent, filenames=None, dirpath=None, walk=True, wildcard=""):
"""
Static constructure that reads the content of the files/directory specified in input.
Args:
filenames:
List of files to show in the botebook. Defaults to an empty list.
dirpath:
Directory to scan for additional files.
walk:
Used only if dirpath is not None.
If True, we scan all the files contained within dirpath and
we add them to the list if their name match the regular expression
given in wildcard.
wildcard:
String with regular expressions separated by `|`.
Only the files matching one of the regular expressions will be showed.
example: wildcard='*.nc|*.txt' shows only the files whose extension is in ['nc', 'txt'].
"""
wildcard = WildCard(wildcard)
if filenames is None:
filenames = []
filenames = wildcard.filter(filenames)
if dirpath is not None:
if not walk:
filenames += wildcard.filter(os.listdir(dirpath))
else:
for root, dirnames, fnames in os.walk(dirpath):
for fname in fnames:
if wildcard.match(fname):
filenames.append(os.path.join(root, fname))
#frame = EditorNotebookFrame(parent)
#frame.notebook.DeletePage(0)
#for fname in filenames:
# frame.bufferCreate(filename=fname)
#return frame
# Open the files and read the content in a string
text_list = []
for fname in filenames:
with open(fname, "r") as fh:
# Sanitize strings: use "ignore" to skip invalid characters in .encode/.decode like
s = fh.read().decode("utf-8", "ignore")
text_list.append(s)
return cls(parent, text_list, page_names=filenames)
def wxapp_showfiles(filenames=None, dirpath=None, walk=True, wildcard=None):
"""
Standalone applications that reads the content of the files specified
in input and show them in a notebook.
Args:
filenames:
List of files to show in the notebook. Defaults to an empty list.
dirpath:
Directory to scan for additional files.
walk:
Used only if dirpath is not None.
If True, we scan all the files contained within dirpath and
we add them to the list if their name match the regular expression
given in wildcard.
wildcard:
String with regular expressions separated by |.
Only the files matching one of the regular expressions will be showed.
example: wildcard="*.nc|*.txt" shows only the files whose extension is in ["nc", "txt"].
Returns:
`wxpython` application.
"""
app = awx.App()
frame = TextNotebookFrame.from_files_and_dir(None, filenames=filenames, dirpath=dirpath, walk=walk, wildcard=wildcard)
frame.Show()
return app
if __name__ == "__main__":
app = awx.App()
frame = EditorNotebookFrame()
#frame = wx.Frame(None, -1)
#notebook = EditorNotebook(frame)
for filename in ["editor.py", "__init__.py"]:
frame.bufferCreate(filename=filename)
#Editor(frame)
frame.Show()
#frame = EditorFrame()
#frame.bufferCreate(file.path)
#frame = EditorNotebookFrame(filename=file.path)
app.MainLoop()

View File

@ -1,532 +0,0 @@
import os
import wx
import collections
import abipy.gui.awx as awx
from monty.collections import AttrDict
from abipy.electrons import ElectronBands
def showElectronDosFrame(parent, filepath):
"""
Read the electron bands from file filepath and shows an `ElectronDosFrame`.
"""
bands = ElectronBands.from_file(filepath)
title = "File: %s" % os.path.relpath(filepath)
ElectronDosFrame(parent, bands, title=title).Show()
def showElectronBandsPlot(parent, filepath):
"""
Read the electron bands from file filepath and plot the bands.
"""
ebands = ElectronBands.from_file(filepath)
title = "File: %s" % os.path.relpath(filepath)
ebands.plot(title=title)
def showElectronJdosFrame(parent, filepath):
"""
Read the electron bands from file filepath and shows an `ElectronJdosFrame`.
"""
ebands = ElectronBands.from_file(filepath)
ElectronJdosFrame(parent, ebands).Show()
class DosPanel(awx.Panel):
"""
Base class defining a panel with controls for specifying the DOS parameters (step, width).
"""
DEFAULT_WIDTH = 0.2
DEFAULT_STEP = 0.1
def __init__(self, parent, **kwargs):
super(DosPanel, self).__init__(parent, -1, **kwargs)
self.BuildUi()
def BuildUi(self):
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(self, -1, "Broadening [eV]:")
label.Wrap(-1)
self.width_ctrl = wx.SpinCtrlDouble(self, id=-1, value=str(self.DEFAULT_WIDTH), min=self.DEFAULT_WIDTH/1000, inc=0.1)
main_sizer.Add(label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
main_sizer.Add(self.width_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
label = wx.StaticText(self, -1, "Mesh step [eV]:")
label.Wrap(-1)
self.step_ctrl = wx.SpinCtrlDouble(self, id=-1, value=str(self.DEFAULT_STEP), min=self.DEFAULT_STEP/1000, inc=0.1)
main_sizer.Add(label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
main_sizer.Add(self.step_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
self.SetSizerAndFit(main_sizer)
def GetParams(self):
"""Return the parameters for the computation of the DOS in a `AttrDict`."""
return AttrDict(
width=float(self.width_ctrl.GetValue()),
step=float(self.step_ctrl.GetValue()),
)
class PhononDosPanel(DosPanel):
"""Panel for the specification of the phonon DOS parameters."""
DEFAULT_WIDTH = 0.002
DEFAULT_STEP = 0.001
class ElectronDosPanel(DosPanel):
"""Panel for the specification of the electron DOS parameters."""
DEFAULT_WIDTH = 0.2
DEFAULT_STEP = 0.1
class ElectronDosDialog(wx.Dialog):
"""Dialog that asks the user to enter the parameters for the electron DOS."""
def __init__(self, parent, **kwargs):
if "title" not in kwargs: kwargs["title"] = "Select DOS parameters"
super(ElectronDosDialog, self).__init__(parent, -1, **kwargs)
vbox = wx.BoxSizer(wx.VERTICAL)
self.panel = ElectronDosPanel(self)
hbox = wx.BoxSizer(wx.HORIZONTAL)
ok_button = wx.Button(self, wx.ID_OK, label='Ok')
close_button = wx.Button(self, wx.ID_CANCEL, label='Cancel')
hbox.Add(ok_button)
hbox.Add(close_button, flag=wx.LEFT, border=5)
vbox.Add(self.panel, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
vbox.Add(hbox, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizerAndFit(vbox)
def GetParams(self):
"""Return a parameters in a `AttrDict`."""
return self.panel.GetParams()
class EbandsDosDialog(wx.Dialog):
"""
Dialog that asks the user to select two files with Ebands and Edos
and enter the parameters for the electron DOS.
"""
def __init__(self, parent, filepaths, **kwargs):
if "title" not in kwargs: kwargs["title"] = "Select paramater forEbands with DOS plot"
super(EbandsDosDialog, self).__init__(parent, -1, **kwargs)
main_sizer = wx.BoxSizer(wx.VERTICAL)
# Use relative paths to save space.
choices = map(os.path.relpath, filepaths)
band_label = wx.StaticText(self, -1, "File for bands:"); band_label.Wrap(-1)
self.bandsfile_cbox = wx.ComboBox(self, id=-1, name='Bands file', choices=choices, value=choices[0], style=wx.CB_READONLY)
hbox0 = wx.BoxSizer(wx.HORIZONTAL)
hbox0.Add(band_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hbox0.Add(self.bandsfile_cbox)
main_sizer.Add(hbox0, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
dos_label = wx.StaticText(self, -1, "File for DOS:"); dos_label.Wrap(-1)
self.dosfile_cbox = wx.ComboBox(self, id=-1, name='Bands file', choices=choices, value=choices[0], style=wx.CB_READONLY)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(dos_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hbox1.Add(self.dosfile_cbox)
main_sizer.Add(hbox1, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.dos_panel = ElectronDosPanel(self)
ok_button = wx.Button(self, wx.ID_OK, label='Ok')
close_button = wx.Button(self, wx.ID_CANCEL, label='Cancel')
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox2.Add(ok_button)
hbox2.Add(close_button, flag=wx.LEFT, border=5)
main_sizer.Add(self.dos_panel, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
main_sizer.Add(hbox2, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizerAndFit(main_sizer)
def getEdosParams(self):
"""Return a parameters in a `AttrDict`."""
return self.dos_panel.GetParams()
def getBandsDosIndex(self):
"""Return the index of the files for Bands and Dos selected by the user`."""
ipath = self.bandsfile_cbox.GetSelection()
imesh = self.dosfile_cbox.GetSelection()
# Default values if no item is selected.:
if ipath == wx.NOT_FOUND: ipath = 0
if imesh == wx.NOT_FOUND: imesh = 0
return ipath, imesh
class ElectronDosFrame(awx.Frame):
"""
This frames allows the user to select the parameters and to compute the Electron DOS.
"""
def __init__(self, parent, bands, **kwargs):
"""
Args:
bands:
`ElectronBands` instance.
parent:
WX parent window.
"""
if "title" not in kwargs:
kwargs["title"] = "Electron DOS"
if "size" not in kwargs:
kwargs["size"] = (600, 100)
super(ElectronDosFrame, self).__init__(parent, id=-1, **kwargs)
self.bands = bands
self.BuildUi()
# Store PlotFrames in this list.
self._pframes = []
def BuildUi(self):
main_sizer = wx.BoxSizer(wx.VERTICAL)
panel = awx.Panel(self, -1)
self.dos_panel = ElectronDosPanel(panel)
main_sizer.Add(self.dos_panel, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
dos_button = wx.Button(panel, -1, "Compute DOS")
self.Bind(wx.EVT_BUTTON, self.OnClick, dos_button)
self.replot_checkbox = wx.CheckBox(panel, id=-1, label="Replot")
self.replot_checkbox.SetValue(True)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
hsizer.Add(dos_button, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
hsizer.Add(self.replot_checkbox, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
main_sizer.Add(hsizer, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
panel.SetSizerAndFit(main_sizer)
def OnClick(self, event):
p = self.dos_panel.GetParams()
if p.step == 1234:
awx.tetris_game()
try:
edos = self.bands.get_edos(step=p.step, width=p.width)
except:
awx.showErrorMessage(self)
return
tot_dos, tot_idos = edos.dos_idos()
label = "$\sigma = %s, step = %s$" % (p.width, p.step)
try:
from wxmplot import PlotApp, PlotFrame
except ImportError:
pass
plotframe = None
if self.replot_checkbox.GetValue() and len(self._pframes):
plotframe = self._pframes[-1]
if plotframe is None:
plotframe = PlotFrame(parent=self)
plotframe.plot(tot_dos.mesh, tot_dos.values, label=label, draw_legend=True)
plotframe.Show()
self._pframes.append(plotframe)
else:
plotframe.oplot(tot_dos.mesh, tot_dos.values, label=label, draw_legend=True)
class ElectronJdosPanel(awx.Panel):
"""
This panel allows the user to specify the parameters for the
calculation of the Electron JDOS.
"""
DEFAULT_STEP = 0.1
DEFAULT_WIDTH = 0.2
def __init__(self, parent, nsppol, mband):
"""
Args:
parent:
WX parent window.
nsppol:
Number of spins.
mband:
Maximum number of bands
"""
super(ElectronJdosPanel, self).__init__(parent, -1)
self.nsppol = nsppol
self.mband = mband
self.BuildUi()
def BuildUi(self):
main_sizer = wx.BoxSizer(wx.VERTICAL)
sz1 = wx.BoxSizer(wx.HORIZONTAL)
spin_label = wx.StaticText(self, -1, "Spin:")
spin_label.Wrap(-1)
self.spin_cbox = wx.ComboBox(self, id=-1, choices=map(str, range(self.nsppol)), style=wx.CB_READONLY)
sz1.Add(spin_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
sz1.Add(self.spin_cbox, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
label = wx.StaticText(self, -1, "Broadening [eV]:")
label.Wrap(-1)
self.width_ctrl = wx.SpinCtrlDouble(self, id=-1, value=str(self.DEFAULT_WIDTH), min=self.DEFAULT_WIDTH/1000, inc=0.1)
sz1.Add(label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
sz1.Add(self.width_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
label = wx.StaticText(self, -1, "Mesh step [eV]:")
label.Wrap(-1)
self.step_ctrl = wx.SpinCtrlDouble(self, id=-1, value=str(self.DEFAULT_STEP), min=self.DEFAULT_STEP/1000, inc=0.1)
sz1.Add(label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
sz1.Add(self.step_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
main_sizer.Add(sz1)
start_label = wx.StaticText(self, -1, "Start:")
start_label.Wrap(-1)
stop_label = wx.StaticText(self, -1, "Stop:")
stop_label.Wrap(-1)
self.vstart = wx.ComboBox(self, id=-1, choices=map(str, range(self.mband)))
self.vstop = wx.ComboBox(self, id=-1, choices=map(str, range(self.mband)))
val_sizer = wx.GridSizer(rows=2, cols=2, vgap=5, hgap=5)
val_sizer.AddMany((start_label, self.vstart))
val_sizer.AddMany((stop_label, self.vstop))
val_sb = wx.StaticBox(self, label="Valence bands")
val_boxsizer = wx.StaticBoxSizer(val_sb, wx.VERTICAL)
val_boxsizer.Add(val_sizer)
start_label = wx.StaticText(self, -1, "Start:")
start_label.Wrap(-1)
stop_label = wx.StaticText(self, -1, "Stop:")
stop_label.Wrap(-1)
self.cstart = wx.ComboBox(self, id=-1, choices=map(str, range(self.mband)))
self.cstop = wx.ComboBox(self, id=-1, choices=map(str, range(self.mband)))
cond_sizer = wx.GridSizer(rows=2, cols=2, vgap=5, hgap=5)
cond_sizer.AddMany((start_label, self.cstart))
cond_sizer.AddMany((stop_label, self.cstop))
cond_sb = wx.StaticBox(self, label="Conduction bands")
cond_boxsizer = wx.StaticBoxSizer(cond_sb, wx.VERTICAL)
cond_boxsizer.Add(cond_sizer)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
hsizer.AddMany((val_boxsizer, cond_boxsizer))
main_sizer.Add(hsizer, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
self.SetSizerAndFit(main_sizer)
def GetParams(self):
"""Returns the parameter for the JDOS calculation in a `AttrDict`"""
vstart = int(self.vstart.GetValue())
vstop = int(self.vstop.GetValue())
vrange = range(vstart, vstop)
if vstart == vstop: vrange = vstart
cstart = int(self.cstart.GetValue())
cstop = int(self.cstop.GetValue())
crange = range(cstart, cstop)
if cstart == cstop: crange = cstart
return AttrDict(
vrange=vrange,
crange=crange,
spin=int(self.spin_cbox.GetValue()),
step=float(self.step_ctrl.GetValue()),
width=float(self.width_ctrl.GetValue()),
cumulative=True,
)
class ElectronJdosDialog(wx.Dialog):
"""
Dialog that asks the user to enter the parameters for the electron JDOS.
"""
def __init__(self, parent, nsppol, mband, **kwargs):
"""
Args:
parent:
Parent window.
nsppol:
Number of spins.
mband
Maximum number of bands.
"""
super(ElectronJdosDialog, self).__init__(parent, -1, **kwargs)
self.SetSize((250, 200))
self.SetTitle("Select JDOS parameters")
vbox = wx.BoxSizer(wx.VERTICAL)
self.panel = ElectronJdosPanel(self, nsppol, mband)
hbox = wx.BoxSizer(wx.HORIZONTAL)
ok_button = wx.Button(self, wx.ID_OK, label='Ok')
close_button = wx.Button(self, wx.ID_CANCEL, label='Cancel')
hbox.Add(ok_button)
hbox.Add(close_button, flag=wx.LEFT, border=5)
vbox.Add(self.panel, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
vbox.Add(hbox, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizerAndFit(vbox)
def GetParams(self):
"""Return a parameters in a `AttrDict`."""
return self.panel.GetParams()
class ElectronJdosFrame(awx.Frame):
"""
Frame for the computation of the JDOS.
"""
def __init__(self, parent, bands, **kwargs):
"""
Args:
parent:
WX parent window.
bands:
`ElectronBands` instance.
"""
if "title" not in kwargs:
kwargs["title"] = "Electron JDOS"
super(ElectronJdosFrame, self).__init__(parent, id=-1, **kwargs)
self.bands = bands
self.BuildUi()
def BuildUi(self):
self.jdos_panel = ElectronJdosPanel(self, self.bands.nsppol, self.bands.mband)
jdos_button = wx.Button(self, -1, "Compute JDOS", (20, 100))
self.Bind(wx.EVT_BUTTON, self.OnClick, jdos_button)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.jdos_panel, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5)
sizer.Add(jdos_button, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5)
self.SetSizerAndFit(sizer)
def OnClick(self, event):
p = self.jdos_panel.GetParams()
try:
self.bands.plot_ejdosvc(vrange=p.vrange, crange=p.crange, step=p.step, width=p.width,
cumulative=p.cumulative)
except:
awx.showErrorMessage(self)
class BandsCompareDialog(wx.Dialog):
"""
Dialog that asks the user to select two files with Ebands and Edos
and enter the parameters for the electron DOS.
"""
def __init__(self, parent, filepaths, **kwargs):
if "title" not in kwargs: kwargs["title"] = "Select files to compare"
super(BandsCompareDialog, self).__init__(parent, -1, **kwargs)
main_sizer = wx.BoxSizer(wx.VERTICAL)
static_sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Files"), wx.VERTICAL)
self.check_boxes = collections.OrderedDict()
# Use relative paths to save space.
self.filepaths = map(os.path.relpath, filepaths)
for path in self.filepaths:
assert path not in self.check_boxes
cbox = wx.CheckBox(self, -1, path, wx.DefaultPosition, wx.DefaultSize, 0)
cbox.SetValue(True)
static_sizer.Add(cbox, 0, wx.ALL | wx.EXPAND, 5)
self.check_boxes[path] = cbox
main_sizer.Add(static_sizer, 1, wx.EXPAND, 5)
# Add buttons to (select|deselect) all checkboxes.
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
all_button = wx.Button(self, -1, "Select all", wx.DefaultPosition, wx.DefaultSize, 0)
all_button.Bind(wx.EVT_BUTTON, self.OnSelectAll)
hbox1.Add(all_button, 0, wx.ALL, 5)
deselect_button = wx.Button(self, -1, "Deselect all", wx.DefaultPosition, wx.DefaultSize, 0)
deselect_button.Bind(wx.EVT_BUTTON, self.OnDeselectAll)
hbox1.Add(deselect_button, 0, wx.ALL, 5)
main_sizer.Add(hbox1, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
ok_button = wx.Button(self, wx.ID_OK, label='Ok')
close_button = wx.Button(self, wx.ID_CANCEL, label='Cancel')
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox2.Add(ok_button)
hbox2.Add(close_button, flag=wx.LEFT, border=5)
main_sizer.Add(hbox2, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizerAndFit(main_sizer)
def OnSelectAll(self, event):
for cbox in self.check_boxes.values():
cbox.SetValue(True)
def OnDeselectAll(self, event):
for cbox in self.check_boxes.values():
cbox.SetValue(False)
def GetSelectedFilepaths(self):
"""
Return the list of filepaths selected by the user.
Main entry point for client code.
"""
selected = []
for path, cbox in self.check_boxes.items():
if cbox.GetValue():
selected.append(path)
return selected
def GetSelectedIndices(self):
"""
Return the list of selected indices by the user.
Main entry point for client code.
"""
selected = []
for i, cbox in enumerate(self.check_boxes.values()):
if cbox.GetValue():
selected.append(i)
return selected

View File

@ -1,195 +0,0 @@
import os
import wx
import wx.lib.agw.flatnotebook as fnb
import abipy.gui.awx as awx
from collections import OrderedDict
from monty.string import list_strings, is_string
from abipy.flowtk import EventsParser
class AbinitEventsPanel(awx.Panel):
"""
Panel with a TreeCtrl that allows the user to navigate
the events (WARNINGS/COMMENTS/ERRORS) reported by ABINIT
in the main output file or in the log file.
"""
def __init__(self, parent, filepath, **kwargs):
super(AbinitEventsPanel, self).__init__(parent, -1, **kwargs)
self.filepath = os.path.abspath(filepath)
parser = EventsParser()
self.events = events = parser.parse(self.filepath)
main_sizer = wx.BoxSizer(wx.VERTICAL)
vbox = wx.BoxSizer(wx.VERTICAL)
panel1 = awx.Panel(self, -1)
panel2 = awx.Panel(self, -1)
self.tree = tree = wx.TreeCtrl(panel1, 1, wx.DefaultPosition, (-1, -1), wx.TR_HIDE_ROOT | wx.TR_HAS_BUTTONS)
root = self.tree.AddRoot('Events')
err_tree = tree.AppendItem(root, "%d Errors" % events.num_errors)
warn_tree = tree.AppendItem(root, "%d Warnings" % events.num_warnings)
com_tree = tree.AppendItem(root, "%d Comments" % events.num_comments)
for e in self.events.errors:
tree.AppendItem(err_tree, "line: " + str(e.lineno), data=wx.TreeItemData(e.message))
for w in self.events.warnings:
tree.AppendItem(warn_tree, "line: " + str(w.lineno), data=wx.TreeItemData(w.message))
for c in self.events.comments:
tree.AppendItem(com_tree, "line: " + str(c.lineno), data=wx.TreeItemData(c.message))
tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1)
self.display = wx.StaticText(panel2, -1, '', (10, 10), style=wx.ALIGN_LEFT)
vbox.Add(self.tree, 1, wx.EXPAND)
main_sizer.Add(panel1, 1, wx.EXPAND)
main_sizer.Add(panel2, 1, wx.EXPAND)
panel1.SetSizerAndFit(vbox)
self.SetSizerAndFit(main_sizer)
self.Centre()
@property
def has_events(self):
return len(self.events) > 0
def OnSelChanged(self, event):
item = event.GetItem()
proxy = self.tree.GetItemData(item)
if proxy is None: return
data = proxy.GetData()
self.display.SetLabel(data)
class AbinitEventsFrame(awx.Frame):
"""
Frame with an EventsPanel
"""
def __init__(self, parent, filepath, **kwargs):
filepath = os.path.abspath(filepath)
if "title" not in kwargs:
kwargs["title"] = "Abinit Events: %s" % os.path.basename(filepath)
super(AbinitEventsFrame, self).__init__(parent, **kwargs)
self.event_panel = AbinitEventsPanel(self, filepath)
class AbiOutLogDirCtrl(wx.GenericDirCtrl):
def __init__(self, *args, **kwargs):
if "filter" not in kwargs:
kwargs["filter"] = "All files (*.*)|*.*|ABINIT output files (*.abo)|*.out| ABINIT log files (*.log)|*.log"
if "dir" not in kwargs:
kwargs["dir"] = os.getcwd()
if "style" not in kwargs:
kwargs["style"] = wx.TR_MULTIPLE
super(AbiOutLogDirCtrl, self).__init__(*args, **kwargs)
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnItemActivated)
#self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnRightClick)
def OnItemActivated(self, event):
path = self.GetFilePath()
if not path: return
EventFrame(self, path).Show()
#def OnRightClick(self, event):
# path = self.GetFilePath()
# if not path: return
# print("in right with path %s" % path)
class AbinitEventsNotebookFrame(awx.Frame):
"""
This frame receives a list of filenames and displays the ABINIT events in a notebook.
"""
def __init__(self, parent, filenames, num_dirs=2, **kwargs):
"""
Args:
parent:
Parent Widget.
filenames:
List of filenames.
num_dirs:
Maximum number of directories that will be shown in the tab.
"""
if "title" not in kwargs:
kwargs["title"] = "Abinit Events"
super(AbinitEventsNotebookFrame, self).__init__(parent, **kwargs)
filenames = list_strings(filenames)
# Remove inexistent files.
filenames = filter(os.path.exists, filenames)
if not filenames:
return
# Here we create a panel and a notebook on the panel
panel = awx.Panel(self)
nb = fnb.FlatNotebook(panel)
for fname in filenames:
page = AbinitEventsPanel(nb, fname)
page_name = fname
if num_dirs > 0:
tokens = page_name.split(os.path.sep)
page_name = os.path.join(*tokens[-num_dirs:])
# Add only files for which we have events.
#if page.has_events:
# Add the pages to the notebook with the name to show on the tab
nb.AddPage(page, text=page_name)
# Finally, put the notebook in a sizer for the panel to manage the layout
sizer = wx.BoxSizer()
sizer.Add(nb, 1, wx.EXPAND)
panel.SetSizerAndFit(sizer)
def wxapp_events(root):
"""
Start up the AbinitOutputViewer application.
Args:
root:
Can be: None, filename, directory name or list of filenames.
None means that we just open the browser without accessing any file.
If root is a directory, we locate all the output files
starting from root and we visualize them in the main Frame.
"""
if root is None:
filenames = []
elif is_string(root):
root = os.path.abspath(root)
if os.path.isdir(root):
filenames = [os.path.join(root, f) for f in os.listdir(root) if f.endswith(".abo")]
else:
filenames = [root]
else:
filenames = root
class AbiEventsViewerApp(awx.App):
def OnInit(self):
frame = AbinitEventsNotebookFrame(None, filenames)
self.SetTopWindow(frame)
frame.Show()
return True
return AbiEventsViewerApp()

View File

@ -1,309 +0,0 @@
import wx
from collections import OrderedDict
from abipy.gui import awx
from abipy.tools.fftprof import FFTProf
from abipy.gui.editor import SimpleTextViewer
from .awx.panels import LinspaceControl
FFTALGS = OrderedDict([
(112, "Goedecker"),
(312, "FFTW3"),
(412, "Goedecker-2002"),
(512, "MKL-DFTI"),
])
class FftalgsPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, id=-1)
main_sizer = wx.BoxSizer(wx.VERTICAL)
static_sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "FFT Libraries"), wx.VERTICAL)
grid_sizer = wx.GridSizer(0, 2, 0, 0)
self.check_boxes = OrderedDict()
for fftalg, fft_name in FFTALGS.items():
cbox = wx.CheckBox(self, -1, fft_name)
if fftalg == 112:
cbox.SetValue(True)
else:
cbox.SetValue(False)
self.check_boxes[fftalg] = cbox
grid_sizer.Add(cbox, 0, wx.ALL, 5)
static_sizer.Add(grid_sizer, 0, wx.ALL | wx.EXPAND, 5)
main_sizer.Add(static_sizer, 1, wx.EXPAND, 5)
self.SetSizerAndFit(main_sizer)
def GetValues(self):
"""Returns a list with the fftalgs selected by the user."""
fftalgs = []
for (fftalg, cbox) in self.check_boxes.items():
if cbox.GetValue():
fftalgs.append(fftalg)
if not fftalgs:
fftalgs = [112]
return fftalgs
class ControlPanel(wx.Panel):
"""
!! &CONTROL
!! tasks = string specifying the tasks to perform i.e. the routines that should be tested or profiled.
!! allowed values:
!! fourdp --> Test FFT transforms of density and potentials on the full box.
!! fourwf --> Test FFT transforms of wavefunctions using the zero-padded algorithm.
!! gw_fft --> Test the FFT transforms used in the GW code.
!! all --> Test all FFT routines (DEFAULT)
!! fftalgs = list of fftalg values (used to select the FFT libraries to use, see abinit doc for more info)
!! ncalls = integer defining the number of calls for each tests. The final Wall time and CPU time
!! are computed by averaging the final results over ncalls executions.
!! max_nthreads = Maximum number of threads (DEFAULT 1, meaningful only if the code
!! uses threaded external libraries or OpenMP parallelization)
!! ndat = integer specifying how many FFT transforms should be executed for each call to the FFT routine
!! (same meaning as the ndat input variable passed to fourwf)
!! necut = Used if tasks = "bench". Specifies the number of cutoff energies to profile (see also ecut_arth)
!! ecut_arth = Used if tasks = "bench". Used to generate an arithmetic progression of cutoff energies
!! whose starting value is ecut_arth(1) and whose step is ecut_arth(2)
"""
BENCHMARKS = ["bench_fourwf", "bench_fourdp", "bench_rhotwg"]
def __init__(self, parent):
wx.Panel.__init__(self, parent, id=-1)
main_sizer = wx.BoxSizer(wx.VERTICAL)
hsz1 = wx.BoxSizer(wx.HORIZONTAL)
text = wx.StaticText(self, -1, "Tasks:")
text.Wrap(-1)
text.SetToolTipString("Select the routines for the benchmark.")
self.task_choice = wx.Choice(self, -1, wx.DefaultPosition, wx.DefaultSize, self.BENCHMARKS, 0)
self.task_choice.SetSelection(0)
hsz1.Add(text, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hsz1.Add(self.task_choice, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
text = wx.StaticText(self, -1, "ndat:")
text.Wrap(-1)
text.SetToolTipString("Number of FFT transform per call.")
self.ndat_ctrl = wx.SpinCtrl(self, -1, value="1", min=1)
hsz1.Add(text, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hsz1.Add(self.ndat_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
text = wx.StaticText(self, -1, "ncalls:")
text.Wrap(-1)
text.SetToolTipString("Number of calls (used to get mean results)")
self.ncalls_ctrl = wx.SpinCtrl(self, -1, value="5", min=1)
hsz1.Add(text, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hsz1.Add(self.ncalls_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
text = wx.StaticText(self, -1, "max_nthreads:")
text.Wrap(-1)
text.SetToolTipString("Maximum number of OpenMP threads")
self.max_nthreads_ctrl = wx.SpinCtrl(self, -1, value="1", min=1)
hsz1.Add(text, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hsz1.Add(self.max_nthreads_ctrl, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
main_sizer.Add(hsz1, 1, wx.EXPAND, 5)
# Control to read the range of cutoff energies.
self.ecut_linspace = LinspaceControl(self, start=dict(value="20"), stop=dict(value="120"), num=dict(value="10"))
static_sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Ecut list:"), wx.VERTICAL)
static_sizer.Add(self.ecut_linspace, 0, wx.ALL | wx.EXPAND, 5)
# Control to specify fftalgs.
self.fftalgs = FftalgsPanel(self)
#vsz1 = wx.BoxSizer(wx.VERTICAL)
#vsz1.Add(static_sizer, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
#vsz1.Add(self.fftalgs, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
#main_sizer.Add(vsz1, 1, wx.EXPAND, 5)
main_sizer.Add(static_sizer, 1, wx.EXPAND, 5)
main_sizer.Add(self.fftalgs, 1, wx.EXPAND, 5)
self.SetSizerAndFit(main_sizer)
def GetNamelist(self):
"""
Build and returns a string with whe &CONTROL Fortran NAMELIST.
"""
ecut_list = self.ecut_linspace.getValues()
if len(ecut_list) <= 1:
return awx.showErrorMessage(self, message="Ecut list is empty or contains only one item!")
step = ecut_list[1] - ecut_list[0]
d = OrderedDict(
tasks="'" + self.task_choice.GetStringSelection() + "'",
fftalgs=",".join(str(v) for v in self.fftalgs.GetValues()),
ncalls=self.ncalls_ctrl.GetValue(),
max_nthreads=self.max_nthreads_ctrl.GetValue(),
ndat=self.ndat_ctrl.GetValue(),
necut=len(ecut_list),
ecut_arth="%s, %s" % (ecut_list[0], step)
)
namelist = ["&CONTROL"]
for k, v in d.items():
namelist.append(k + " = " + str(v) + ",")
namelist.append("/")
return "\n".join(namelist)
class KpointChoice(wx.Choice):
def __init__(self, parent):
choices = map(str, [
(0.1, 0.2, 0.3),
(0.0, 0.0, 0.0),
(1 / 2, 0, 0),
(0, 0, 1 / 2),
(1 / 2, 0, 1 / 2),
(0, 1 / 2, 0),
(1 / 2, 1 / 2, 0),
(0, 1 / 2, 1 / 2),
(1 / 2, 1 / 2, 1 / 2),
])
wx.Choice.__init__(self, parent, -1, choices=choices)
self.SetSelection(0)
def GetStringSelection(self):
s = super(KpointChoice, self).GetStringSelection()
return s.replace("(", "").replace(")", "")
class SystemPanel(wx.Panel):
"""
!! ecut = cutoff energy for wavefunctions (real, Hartree units)
!! rprimd = Direct lattice vectors in Bohr. (3,3) matrix in Fortran column-major order
!! kpoint = real(3) vector specifying the reduced coordinates of the k-point of the wavefunction (used if tasks = "fourwf").
!! The value of the k-point defines the storage scheme (istwfk) of the u(G) coefficients and therefore
!! the FFT algorithm used to perform the transform u(G) <--> u(R) in fourwf.
!! osc_ecut = cutoff energy (Hartree) for the oscillator matrix elements computed in the GW code
!! Corresponds to the input variables (ecuteps, ecutsigx) used in the main code.
!! nsym =Number of symmetry operations (DEFAULT 1)
!! symrel(3,3,nsym) = Symmetry operation in real space used to select the FFT mesh in the routine getng (default: Identity matrix)
"""
def __init__(self, parent):
wx.Panel.__init__(self, parent, id=-1)
main_sizer = wx.BoxSizer(wx.VERTICAL)
hsz1 = wx.BoxSizer(wx.HORIZONTAL)
text = wx.StaticText(self, -1, "kpoint:")
text.Wrap(-1)
text.SetToolTipString("K-point used in the FFT of the wavefunctions (istwfk).")
self.kpoint_choice = KpointChoice(self)
hsz1.Add(text, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
hsz1.Add(self.kpoint_choice, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
main_sizer.Add(hsz1, 1, wx.EXPAND, 5)
self.SetSizerAndFit(main_sizer)
def GetNamelist(self):
"""
Build and returns a string with whe &SYSTEM Fortran NAMELIST.
"""
d = OrderedDict(
ecut=10,
rprimd="20, 0, 0, 0, 20, 0, 0, 0, 20",
kpoint=self.kpoint_choice.GetStringSelection()
#osc_ecut= TODO why here and not in control?
#nsym=
#symrel=
)
namelist = ["&SYSTEM"]
for k, v in d.items():
namelist.append(k + " = " + str(v) + ",")
namelist.append("/")
return "\n".join(namelist)
class FFTProfFrame(awx.Frame):
def __init__(self, parent, **kwargs):
super(FFTProfFrame, self).__init__(parent, -1, **kwargs)
panel = wx.Panel(self, -1)
self.control = ControlPanel(panel)
self.system = SystemPanel(panel)
start_button = wx.Button(panel, -1, label='Start Benchmark')
start_button.Bind(wx.EVT_BUTTON, self.OnStartButton)
show_button = wx.Button(panel, -1, label='Show Input')
show_button.Bind(wx.EVT_BUTTON, self.OnShowInput)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.control, 1, wx.EXPAND, 5)
main_sizer.Add(self.system, 1, wx.EXPAND, 5)
hsz = wx.BoxSizer(wx.HORIZONTAL)
hsz.Add(start_button, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
hsz.Add(show_button, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
main_sizer.Add(hsz, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
panel.SetSizerAndFit(main_sizer)
def MakeInput(self):
"""Build the input file for FFTPROF."""
fft_input = self.control.GetNamelist() + "\n"
fft_input += self.system.GetNamelist() + "\n"
return fft_input
def OnShowInput(self, event):
"""Show the fftprof input in an external window."""
fft_input = self.MakeInput()
SimpleTextViewer(self, fft_input).Show()
def OnStartButton(self, event):
"""Run the benchmark and plot the results with `matplotlib`."""
fft_input = self.MakeInput()
#return
# Run FFTPROF.
try:
fftprof = FFTProf(fft_input)
returncode = fftprof.run()
if returncode != 0:
raise RunTimeError("fftprof exited with returncode %s" % returncode)
# Analyze the results.
fftprof.plot()
except:
return awx.showErrorMessage(self)
def wxapp_fftprof():
"""Stand alone application."""
app = awx.App()
frame = FFTProfFrame(None)
frame.Show()
return app
if __name__ == "__main__":
wxapp_fftprof().MainLoop()

File diff suppressed because it is too large Load Diff

View File

@ -1,251 +0,0 @@
"""Collection of widgets that allow the user to interact with list of K-points."""
import wx
import wx.lib.newevent
import abipy.gui.awx as awx
import wx.lib.mixins.listctrl as listmix
class KpointsListCtrl(wx.ListCtrl, listmix.ColumnSorterMixin):
"""
ListCtrl that allows the user to interact with a list of k-points.
Support column sorting.
"""
def __init__(self, parent, kpoints, **kwargs):
"""
Args:
parent:
Parent window.
kpoints:
List of `Kpoint` instances.
"""
super(KpointsListCtrl, self).__init__(parent, id=-1, style=wx.LC_REPORT | wx.BORDER_SUNKEN, **kwargs)
self.kpoints = kpoints
columns = ["#", 'Reduced coordinates', 'Weight', 'Name']
for (index, col) in enumerate(columns):
self.InsertColumn(index, col)
# Used to store the Max width in pixels for the data in the column.
column_widths = [awx.get_width_height(self, s)[0] for s in columns]
# Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
self.itemDataMap = {}
for (index, kpt) in enumerate(self.kpoints):
entry = ["%d\t\t" % index,
"[%.5f, %.5f, %.5f]\t\t" % tuple(c for c in kpt.frac_coords),
"%.3f\t\t" % kpt.weight,
"%s" % kpt.name,
]
self.Append(entry)
self.itemDataMap[index] = entry
self.SetItemData(index, index)
w = [awx.get_width_height(self, s)[0] for s in entry]
column_widths = map(max, zip(w, column_widths))
for (index, col) in enumerate(columns):
self.SetColumnWidth(index, column_widths[index])
# Now that the list exists we can init the other base class, see wx/lib/mixins/listctrl.py
listmix.ColumnSorterMixin.__init__(self, len(columns))
def GetListCtrl(self):
"""Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py"""
return self
def getSelectedKpoint(self):
"""
Returns the kpoint selected by the user.
None if no selection has been done.
"""
# Get selected index, map to index in kpoints and return the kpoint.
item = self.GetFirstSelected()
if item == -1: return None
index = self.GetItemData(item)
return self.kpoints[index]
class KpointsPanel(awx.Panel):
"""
A panel with a list of k-points and a structure.
Provides popup menus for retrieving information on a single k-point.
"""
def __init__(self, parent, structure, kpoints, **kwargs):
"""
Args:
parent:
Parent window.
structure:
`Structure` object.
kpoints:
`KpointList` object.
"""
super(KpointsPanel, self).__init__(parent, **kwargs)
self.klist_ctrl = KpointsListCtrl(self, kpoints)
self.structure = structure
self.klist_ctrl.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.onRightClick)
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.klist_ctrl, 1, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 5)
self.SetSizerAndFit(main_sizer)
def onRightClick(self, event):
"""Generate the popup menu."""
popup_menu = self.makePopupMenu()
self.PopupMenu(popup_menu, event.GetPoint())
popup_menu.Destroy()
def getSelectedKpoint(self):
return self.klist_ctrl.getSelectedKpoint()
def makePopupMenu(self):
"""
Build and return a popup menu. Subclasses can extend or replace this base method.
"""
self.ID_POPUP_LITTLEGROUP = wx.NewId()
self.ID_POPUP_STAR = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_POPUP_LITTLEGROUP, "Little group")
menu.Append(self.ID_POPUP_STAR, "Show star")
# Associate menu/toolbar items with their handlers.
menu_handlers = [
(self.ID_POPUP_LITTLEGROUP, self.onLittleGroup),
(self.ID_POPUP_STAR, self.onShowStar),
]
for combo in menu_handlers:
mid, handler = combo[:2]
self.Bind(wx.EVT_MENU, handler, id=mid)
return menu
def onLittleGroup(self, event):
"""Show a table with the character table of the little group."""
kpoint = self.klist_ctrl.getSelectedKpoint()
if kpoint is None: return
ltk = self.structure.abi_spacegroup.find_little_group(kpoint)
table, header = ltk.bilbao_character_table()
awx.SimpleGridFrame(self, table, title=header, labels_from_table=True).Show()
def onShowStar(self, event):
"""Show a new `KpointsFrame` with the list of points in the star of the selected k-point."""
kpoint = self.klist_ctrl.getSelectedKpoint()
if kpoint is None: return
star = kpoint.compute_star(self.structure.abi_spacegroup.fm_symmops)
KpointsFrame(self, self.structure, star, title="Star of point: " + str(star.base_point)).Show()
class KpointsFrame(awx.Frame):
"""A frame with a `KpointsPanel`."""
def __init__(self, parent, structure, kpoints, **kwargs):
"""
Args:
parent:
Parent window.
structure:
`Structure` object.
kpoints:
`KpointList` object.
"""
super(KpointsFrame, self).__init__(parent, **kwargs)
self.panel = KpointsPanel(self, structure, kpoints)
class SpinKpointBandPanel(awx.Panel):
"""
This panel shows information on the k-points and the set of bands, spins.
Useful if we want to allow the user to select the set of indices (spin, kpt_idx, band).
"""
# Command event used to signal that the spin-kpoint-band has been selected.
SkbActivatedEvent, MYEVT_SKB_ACTIVATED = wx.lib.newevent.NewCommandEvent()
def __init__(self, parent, structure, nsppol, kpoints, mband, bstart=0, **kwargs):
"""
Args:
structure:
Structure object.
nsppol:
Number of spins.
kpoints:
List of `Kpoint` instances.
mband:
Maximum band index.
bstart:
First band index.
"""
super(SpinKpointBandPanel, self).__init__(parent, style=wx.LC_REPORT | wx.BORDER_SUNKEN, **kwargs)
self.parent = parent
self.nsppol, self.mband = nsppol, mband
self.bstart = bstart
# Build UI
main_sizer = wx.BoxSizer(wx.VERTICAL)
hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
band_label = wx.StaticText(self, -1, "Band:", wx.DefaultPosition, wx.DefaultSize, 0)
band_label.Wrap(-1)
hsizer1.Add(band_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
self.band_cbox = wx.ComboBox(self, -1, choices=map(str, range(self.bstart, self.mband)))
hsizer1.Add(self.band_cbox, 0, wx.ALL, 5)
spin_label = wx.StaticText(self, -1, "Spin:", wx.DefaultPosition, wx.DefaultSize, 0)
spin_label.Wrap(-1)
hsizer1.Add(spin_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM | wx.LEFT, 5)
self.spin_cbox = wx.ComboBox(self, -1, choices=map(str, range(self.nsppol)))
hsizer1.Add(self.spin_cbox, 0, wx.ALL, 5)
main_sizer.Add(hsizer1, 0, wx.ALIGN_CENTER_HORIZONTAL, 5)
hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
kpoint_label = wx.StaticText(self, -1, "Kpoint:", wx.DefaultPosition, wx.DefaultSize, 0)
kpoint_label.Wrap(-1)
hsizer2.Add(kpoint_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
self.kpanel = KpointsPanel(self, structure, kpoints)
klist_ctrl = self.kpanel.klist_ctrl
hsizer2.Add(self.kpanel, 1, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 5)
main_sizer.Add(hsizer2, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 5)
self.SetSizerAndFit(main_sizer)
# Connect the events whose callback will be set by the client code.
klist_ctrl.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
#klist_ctrl.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.OnRightClick)
#klist_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
def getSelectedKpoint(self):
return self.kpanel.getSelectedKpoint()
def GetSKB(self):
"""Returns the tuple (spin, kpoint, band) selected by the user."""
spin = int(self.spin_cbox.GetValue())
kpoint = self.getSelectedKpoint()
band = int(self.band_cbox.GetValue())
# Default values if no item is selected.:
if spin == wx.NOT_FOUND: spin = 0
if band == wx.NOT_FOUND: band = 0
return spin, kpoint, band
def OnItemActivated(self, event):
"""Fire SkbActivatedEvent."""
#print("Firing SkbActivatedEvent")
event = self.SkbActivatedEvent(id=-1, skb=self.GetSKB())
wx.PostEvent(self.parent, event)

View File

@ -1,261 +0,0 @@
#!/usr/bin/env python
"""MANDELBROT SET"""
import numpy as np
def mandelbrot(extent=None, ndivs=(1000,1000), iterations=100):
"""
Based on http://cyrille.rossant.net/mandelbrot-set/
Args:
extent:
(x_min, x_max, y_min, y_max))
(nx,ny):
Number of points sampled along x and y.
iterations:
number of iterations
"""
if extent is None:
extent = (-2, 1, -1.5, 1.5)
x_min, x_max, y_min, y_max = extent
nx, ny = ndivs
# x, y are matrices containing the real and imaginary parts of all z values in the grid
xvals = np.linspace(x_min, x_max, nx)
yvals = np.linspace(y_min, y_max, ny)
x, y = np.meshgrid(xvals, yvals)
# we define c as c=x+iy, c is a nx x ny matrix.
c = x + 1j*y
# initially, z=c, we copy so that z and c are different objects in memory
z = c.copy()
# m is used to plot the fractal
m = np.zeros((nx, ny))
# iterations
for n in range(iterations):
print("Completed %d %%" % (100 * n/iterations))
# indices of the numbers c such that |z(c)|<=10, with z = z_n
indices = (np.abs(z) <= 10)
# update z
z[indices] = z[indices]**2 + c[indices]
# update the values in m
m[indices] = n
return xvals, yvals, m
import wx
from wxmplot import ImageFrame, ImagePanel
class MyPanel(ImagePanel):
"""Pass"""
def __init__(self, parent, **kwargs):
super(MyPanel, self).__init__(parent, **kwargs)
#def onLeftUp(self, event=None):
# super(MyPanel, self).onLeftUp(event=event)
# print("onLeftUp")
# print(self.zoom_ini)
def zoom_leftup(self, event=None):
super(MyPanel, self).zoom_leftup(event=event)
print("zoom_leftup", self.zoom_lims[-1])
#def redraw(self, col='int'):
# print("in redraw")
# super(MyPanel, self).redraw(col=col)
def set_viewlimits(self, axes=None, autoscale=False):
super(MyPanel, self).set_viewlimits(axes=None, autoscale=False)
xmin, xmax = self.axes.get_xlim()
ymin, ymax = self.axes.get_ylim()
print(xmin, xmax)
print(ymin, ymax)
#x, y, m = mandelbrot(density=100)
#self.clear()
#self.display(m)
#def lasso_leftup(self, event=None):
# """leftup event handler for lasso mode"""
# print("in lasso")
#def zoom_motion(self, event=None):
# print("zoom_motion")
# super(MyPanel, self).zoom_motion(event=event)
# print(self.zoom_ini)
class FractalsFrame(ImageFrame):
def __init__(self, parent, **kwargs):
super(FractalsFrame, self).__init__(parent, **kwargs)
ndivs = (1000,1000)
x, y, m = mandelbrot(ndivs=ndvis)
#print("x",x[0])
#print("y",x[0])
self.display(m) # x=x[0], y=x[0])
self.panel.__class__ = MyPanel
"""
An example of how to use wx or wxagg in an application with the new
toolbar - comment out the setA_toolbar line for no toolbar
"""
# Used to guarantee to use at least Wx2.8
import wxversion
wxversion.ensureMinimal('2.8')
import matplotlib
from mandelbrot import mandelbrot
import matplotlib.pyplot as plt
# uncomment the following to use wx rather than wxagg
#matplotlib.use('WX')
#from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas
# comment out the following to use wx rather than wxagg
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure
class MyNavigationToolbar(NavigationToolbar2Wx):
def __init__(self, frame):
super(MyNavigationToolbar, self).__init__(frame.canvas)
self.frame = frame
def release_zoom(self, event):
super(MyNavigationToolbar, self).release_zoom(event)
print("in release_zoom",event)
ax = self.canvas.figure.get_axes()[0]
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()
print("xlim",xmin, xmax)
print("ylim",ymin, ymax)
extent = (xmin, xmax, ymin, ymax)
self.frame.imshow_fractal(extent=extent)
self.canvas.draw()
self.canvas.Refresh(eraseBackground=False)
class ConfPanel(wx.Panel):
def __init__(self, parent, **kwargs):
super(ConfPanel, self).__init__(parent, -1, **kwargs)
self.BuildUi()
def BuildUi(self):
main_sizer = wx.BoxSizer(wx.VERTICAL)
# Get a list of the colormaps in matplotlib. Ignore the ones that end with
# '_r' because these are simply reversed versions of ones that don't end with '_r'
colormap_list = sorted(m for m in plt.cm.datad if not m.endswith("_r"))
self.cmap_choice = wx.Choice(self, choices=colormap_list)
main_sizer.Add(self.cmap_choice, 0, wx.LEFT, 5)
self.SetSizerAndFit(main_sizer)
class CanvasFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, 'CanvasFrame', size=(550,350))
#main_sizer = wx.BoxSizer(wx.VERTICAL)
#self.conf_panel = ConfPanel(self)
#main_sizer.Add(self.conf_panel, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 5)
self.SetBackgroundColour(wx.NamedColour("WHITE"))
self.figure = Figure()
self.axes = self.figure.add_subplot(111)
self.cmap = plt.cm.hot
self.ndivs = (1000, 1000)
self.canvas = FigureCanvas(self, -1, self.figure)
self.sizer = sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
self.toolbar = MyNavigationToolbar(self)
self.toolbar.Realize()
# On Windows platform, default window size is incorrect, so set toolbar width to figure width.
tw, th = self.toolbar.GetSizeTuple()
fw, fh = self.canvas.GetSizeTuple()
# By adding toolbar in sizer, we are able to put it at the bottom
# of the frame - so appearance is closer to GTK version.
self.toolbar.SetSize(wx.Size(fw, th))
sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
# Update the axes menu on the toolbar
self.toolbar.update()
self.SetSizerAndFit(sizer)
# Compute fractal and show picture.
self.imshow_fractal()
def imshow_fractal(self, extent=None):
xvals, yvals, data = mandelbrot(extent=extent, ndivs=self.ndivs)
if extent is None:
extent = (xvals[0], xvals[-1], yvals[0], yvals[-1])
self.axes.imshow(np.log(data), cmap=plt.cm.hot, origin="lower", extent=extent)
# Save values
self.xvals, self.yvals, self.data = xvals, yvals, data
#def onclick(self, event):
# print('button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
# event.button, event.x, event.y, event.xdata, event.ydata))
def wxapp_fractals():
app = wx.App()
#frame = FractalsFrame(None)
frame = CanvasFrame(None)
app.SetTopWindow(frame)
frame.Show()
return app
if __name__ == "__main__":
import sys
wxapp_fractals().MainLoop()
sys.exit(0)
x, y, m = mandelbrot()
# we plot log(m)
import matplotlib.pyplot as plt
fig = plt.imshow(np.log(m), cmap=plt.cm.hot, extent=extent)
plt.title('Mandelbrot Set')
plt.xlabel('Re(z)')
plt.ylabel('Im(z)')
plt.show()

View File

@ -1,366 +0,0 @@
import os
import wx
import wx.lib.agw.flatnotebook as fnb
import abipy.gui.awx as awx
from wx.py.shell import Shell
from monty.string import marquee
from abipy.abilab import abiopen
from abipy.electrons.bse import MdfPlotter
from abipy.iotools.visualizer import Visualizer
from abipy.gui.kpoints import KpointsPanel
from abipy.gui import mixins as mix
from abipy.gui.baseviewer import MultiViewerFrame
# TODO Add ebands to MDF.nc
class MdfViewerFrame(MultiViewerFrame, mix.Has_Structure, mix.Has_MultipleEbands, mix.Has_Tools, mix.Has_NetcdfFiles):
#class MdfViewerFrame(MultiViewerFrame, mix.Has_Structure, mix.Has_Tools, mix.Has_NetcdfFiles):
VERSION = "0.1"
HELP_MSG = """Quick help:
Toolbar:
Click the button to plot the spectrum (averaged over the q-points)
Use the combo boxes to select the type of spectrum and the quantity to plot.
Qpoint list:
Right-Click: display popup menu with choices.
Select: plot the spectra for this qpoint.
Also, these key bindings can be used
(For Mac OSX, replace 'Ctrl' with 'Apple'):
Ctrl-Q: quit
"""
@property
def codename(self):
return "MdfViewer"
@property
def active_mdf_file(self):
"""The active MDF file i.e. the MDF associated to the active tab."""
return self.active_tab.mdf_file
@property
def structure(self):
"""`Structure` associated to the active tab."""
return self.active_mdf_file.structure
@property
def ebands(self):
"""`ElectronBands` associated to the active tab."""
return self.active_mdf_file.ebands
@property
def ebands_list(self):
"""List of `ElectronBands`."""
ebands_list = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
ebands_list.append(tab.mdf_file.ebands)
return ebands_list
@property
def ebands_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `ElectronBands` have been read.
"""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.mdf_file.filepath)
return paths
@property
def nc_filepaths(self):
"""String with the absolute paths of the netcdf files."""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.mdf_file.filepath)
return paths
@property
def mdf_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `MDF_Files` have been read.
"""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.mdf_file.filepath)
return paths
@property
def mdf_files_list(self):
"""List of `MDF_Files`."""
mdf_lists = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
mdf_lists.append(tab.mdf_file)
return mdf_lists
def makeMenu(self):
"""Creates the main menu."""
# Base menu.
menu_bar = super(MdfViewerFrame, self).makeMenu()
# Add Mixin menus.
menu_bar.Append(self.CreateStructureMenu(), "Structure")
#menu_bar.Append(self.CreateEbandsMenu(), "Ebands")
menu_bar.Append(self.CreateMdfMenu(), "Mdf")
menu_bar.Append(self.CreateToolsMenu(), "Tools")
menu_bar.Append(self.CreateNetcdfMenu(), "Netcdf")
# Help menu
help_menu = self.makeHelpMenu()
menu_bar.Append(help_menu, "Help")
self.SetMenuBar(menu_bar)
def CreateMdfMenu(self):
# MDF Menu ID's
self.ID_MDF_PLOT_AVERAGE = wx.NewId()
self.ID_MDF_COMPARE = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_MDF_PLOT_AVERAGE, "Plot averaged MDF", "Plot the average of the macroscopic dielectric function")
self.Bind(wx.EVT_MENU, self.onPlotAveragedMdf, id=self.ID_MDF_PLOT_AVERAGE)
menu.AppendSeparator()
menu.Append(self.ID_MDF_COMPARE, "Compare MDF", "Compare multiple macroscopic dielectric functions")
self.Bind(wx.EVT_MENU, self.OnMdfCompare, id=self.ID_MDF_COMPARE)
return menu
def onPlotAveragedMdf(self, event):
"""Plot the average of the macroscopic dielectric function"""
mdf_type = self.getMdfType()
cplx_mode = self.getCplxMode()
#print(mdf_type, cplx_mode)
mdf_file = self.active_mdf_file
mdf_file.plot_mdfs(cplx_mode=cplx_mode, mdf_type=mdf_type)
def OnMdfCompare(self, event):
"""Compare multiple averaged macroscopic dielectric functions"""
mdf_type = self.getMdfType()
cplx_mode = self.getCplxMode()
if mdf_type == "ALL":
return awx.showErrorMessage(self, "ALL is not supported by Compare. Please use EXC, RPA, GWRPA")
plotter = MdfPlotter()
for path, mdf_file in zip(self.mdf_filepaths, self.mdf_files_list):
label = os.path.relpath(path)
mdf = mdf_file.get_mdf(mdf_type)
plotter.add_mdf(label, mdf)
plotter.plot(cplx_mode, qpoint=None)
def makeToolBar(self):
"""Creates the toolbar."""
self.toolbar = toolbar = self.CreateToolBar()
toolbar.SetToolBitmapSize(wx.Size(48, 48))
def bitmap(path):
return wx.Bitmap(awx.path_img(path))
artBmp = wx.ArtProvider.GetBitmap
toolbar.AddSimpleTool(wx.ID_OPEN, artBmp(wx.ART_FILE_OPEN, wx.ART_TOOLBAR), "Open")
toolbar.AddSeparator()
# Button to plot the averaged MDD
# TODO: Change icon.
toolbar.AddSimpleTool(self.ID_MDF_PLOT_AVERAGE, bitmap("wave.png"), "Plot averaged MDF")
# Combo box with the list of MDF types
mdf_types = ["ALL", "EXC", "RPA", "GWRPA"]
self.mdftype_cbox = wx.ComboBox(toolbar, id=-1, name='MDF type', choices=mdf_types, value="ALL", style=wx.CB_READONLY)
self.mdftype_cbox.SetToolTipString("Select the type of MDF spectra to plot.")
toolbar.AddControl(control=self.mdftype_cbox, label="MDF Type:")
# Combo box with the list of complex modes
cplx_modes = ["Re-Im", "Re", "Im"]
self.cplx_cbox = wx.ComboBox(toolbar, id=-1, name='COMPLEX mode', choices=cplx_modes, value="Re-Im", style=wx.CB_READONLY)
self.cplx_cbox.SetToolTipString("Select the component of the MDF spectra to plot (real or imaginary part).")
toolbar.AddControl(control=self.cplx_cbox, label="Complex Mode:")
toolbar.Realize()
def addFileTab(self, parent, filepath):
"""Open a file and add a new tab to the notebook."""
mdf_file = abiopen(filepath)
tab = MdfFileTab(self.notebook, mdf_file)
self.notebook.AddPage(tab, os.path.basename(filepath))
# List to events triggered by the popup menu in the qpoints_table.
qpanel = tab.qpoints_panel
self.Bind(qpanel.MYEVT_COMPARE_SPECTRAQ, self.onCompareSpectraQ)
def getMdfType(self):
"""Return the sting with the MDF type selected by the user."""
mdf_type = self.mdftype_cbox.GetStringSelection()
if not mdf_type: mdf_type = "ALL"
return mdf_type
def getCplxMode(self):
"""Return the sting with the complex mode used for plotting the spectra."""
cplx_mode = self.cplx_cbox.GetStringSelection()
if not cplx_mode: cplx_mode = "Re-Im"
return cplx_mode
def onCompareSpectraQ(self, event):
"""
Compare different MDF(q) spectra (provided that we have multiple tabs in the notebook).
This callback is executed when MdfQpointsPanel fires CompareSpectraQEvent.
"""
qpoint = event.qpoint
mdf_type = self.getMdfType()
cplx_mode = self.getCplxMode()
if mdf_type == "ALL":
return awx.showErrorMessage(self, "ALL is not supported by Compare. Please use EXC, RPA, GWRPA")
plotter = MdfPlotter()
# Extract the type of MDF we are interested in
for path, mdf_file in zip(self.mdf_filepaths, self.mdf_files_list):
label = os.path.relpath(path)
mdf = mdf_file.get_mdf(mdf_type)
plotter.add_mdf(label, mdf)
plotter.plot(cplx_mode, qpoint=qpoint)
class MdfQpointsPanel(KpointsPanel):
"""Extend KpointsPanel adding popupmenus"""
# Command event used to signal that the we should compare multiple spectra (fixed q, move along files).
CompareSpectraQEvent, MYEVT_COMPARE_SPECTRAQ = wx.lib.newevent.NewCommandEvent()
def __init__(self, parent, mdf_file, **kwargs):
KpointsPanel.__init__(self, parent, mdf_file.structure, mdf_file.qpoints)
self.parent = parent
self.mdf_file = mdf_file
# Connect the events fired by klist_ctrl.
self.klist_ctrl.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.onQpointActivated)
def makePopupMenu(self):
"""Build the popup menu."""
# Menu of the base class
menu = super(MdfQpointsPanel, self).makePopupMenu()
# Add other options
self.ID_POPUP_MDF_QCOMPARE = wx.NewId()
menu.Append(self.ID_POPUP_MDF_QCOMPARE, "Compare spectra(q)")
# Associate menu/toolbar items with their handlers.
menu_handlers = [
(self.ID_POPUP_MDF_QCOMPARE, self.onCompareSpectraQ),
]
for combo in menu_handlers:
mid, handler = combo[:2]
self.Bind(wx.EVT_MENU, handler, id=mid)
return menu
@property
def viewer_frame(self):
"""The parent frame `MdfViewerFrame`."""
try:
return self._viewer_frame
except AttributeError:
self._viewer_frame = self.getParentWithType(MdfViewerFrame)
return self._viewer_frame
def onQpointActivated(self, event):
"""Plot MDF(q) for the selected q-point."""
qpoint = self.getSelectedKpoint()
if qpoint is None: return
# Get the options from the ViewerFrame.
mdf_type = self.viewer_frame.getMdfType()
cplx_mode = self.viewer_frame.getCplxMode()
#print(qpoint)
self.mdf_file.plot_mdfs(cplx_mode=cplx_mode, mdf_type=mdf_type, qpoint=qpoint)
def onCompareSpectraQ(self, event):
"""
Get the selected q-point and fire CompareSpectraQEvent.
The parent frame will detect the event and will compare the
different MDF spectra (provided that we have multiple tabs in the notebook.
"""
qpoint = self.getSelectedKpoint()
if qpoint is None: return
# Post the event.
event = self.CompareSpectraQEvent(id=-1, qpoint=qpoint)
wx.PostEvent(self.parent, event)
class MdfFileTab(awx.Panel):
"""Tab showing information on a single MDF file."""
def __init__(self, parent, mdf_file, **kwargs):
"""
Args:
parent:
parent window.
mdf_file:
"""
super(MdfFileTab, self).__init__(parent, -1, **kwargs)
self.mdf_file = mdf_file
splitter = wx.SplitterWindow(self, id=-1, style=wx.SP_3D)
splitter.SetSashGravity(0.95)
self.qpoints_panel = MdfQpointsPanel(splitter, mdf_file)
# Add Python shell
msg = "MDF_object is accessible via the mdf_file variable. Use mdf_file.<TAB> to access the list of methods."
msg = marquee(msg, width=len(msg) + 8, mark="#")
msg = "#"*len(msg) + "\n" + msg + "\n" + "#"*len(msg) + "\n"
# FIXME <Error>: CGContextRestoreGState: invalid context 0x0
pyshell = Shell(splitter, introText=msg, locals={"mdf_file": mdf_file})
splitter.SplitHorizontally(self.qpoints_panel, pyshell)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(splitter, 1, wx.EXPAND, 5)
self.SetSizerAndFit(sizer)
@property
def statusbar(self):
return self.viewer_frame.statusbar
@property
def viewer_frame(self):
"""The parent frame `MdfViewerFrame`."""
try:
return self._viewer_frame
except AttributeError:
self._viewer_frame = self.getParentWithType(MdfViewerFrame)
return self._viewer_frame
class MdfViewerApp(awx.App):
pass
def wxapp_mdfviewer(mdf_filepaths):
"""Standalone application."""
app = MdfViewerApp()
frame = MdfViewerFrame(None, filepaths=mdf_filepaths)
app.SetTopWindow(frame)
frame.Show()
return app

View File

@ -1,513 +0,0 @@
import abc
import os
import wx
import wx.lib.dialogs as wxdg
import abipy.gui.awx as awx
import abipy.gui.electronswx as ewx
from shutil import which
from abipy.core.mixins import NcDumper
from abipy.iotools.visualizer import Visualizer
from abipy.electrons.ebands import ElectronBandsPlotter, ElectronDosPlotter
from abipy.gui.structure import StructureConverterFrame
from abipy.gui.converter import ConverterFrame
from abipy.gui.wxncview import NcViewerFrame
from abipy.dfpt.phonons import PhononBandsPlotter, PhononDosPlotter
from abipy.abilab import abiopen
from abipy.iotools import ETSF_Reader
class Has_Structure(metaclass=abc.ABCMeta):
"""
Mixin class that provides a menu and callbacks
for analyzing the crystalline structure.
"""
@abc.abstractproperty
def structure(self):
"""Structure object."""
def CreateStructureMenu(self):
"""Creates the structure menu."""
# Structure Menu ID's
self.ID_STRUCT_CONVERT = wx.NewId()
self.ID_STRUCT_VISUALIZE = wx.NewId()
self.ID_STRUCT_SHOWBZ = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_STRUCT_CONVERT, "Convert", "Convert structure data to cif, POSCAR ...")
self.Bind(wx.EVT_MENU, self.OnStructureConvert, id=self.ID_STRUCT_CONVERT)
menu.Append(self.ID_STRUCT_SHOWBZ, "Show BZ", "Visualize the first Brillouin zone with matplotlib.")
self.Bind(wx.EVT_MENU, self.OnStructureShowBz, id=self.ID_STRUCT_SHOWBZ)
# Make sub-menu with the list of supported visualizers.
visu_menu = wx.Menu()
self._id2visuname = {}
available_visus = [visu.name for visu in Visualizer.get_available()]
for appname in available_visus:
_id = wx.NewId()
visu_menu.Append(_id, appname)
self._id2visuname[_id] = appname
self.Bind(wx.EVT_MENU, self.OnStructureVisualize, id=_id)
menu.AppendMenu(-1, 'Visualize', visu_menu)
return menu
def OnStructureConvert(self, event):
"""Open new frame that allows the user to convert the structure."""
StructureConverterFrame(self, self.structure).Show()
def OnStructureVisualize(self, event):
""""Call the visualizer to visualize the crystalline structure."""
appname = self._id2visuname[event.GetId()]
try:
visu = self.structure.visualize(appname=appname)
thread = awx.WorkerThread(self, target=visu)
thread.start()
except Exception:
awx.showErrorMessage(self)
def OnStructureShowBz(self, event):
""""Visualize the Brillouin zone with matplotlib."""
self.structure.show_bz()
class Has_Ebands(metaclass=abc.ABCMeta):
"""
Mixin class that provides a menu and callbacks for analyzing electron bands.
"""
@abc.abstractproperty
def ebands(self):
"""`ElectronBands` object."""
def CreateEbandsMenu(self):
"""Creates the ebands menu."""
# Ebands Menu ID's
self.ID_EBANDS_GETINFO = wx.NewId()
self.ID_EBANDS_PLOT = wx.NewId()
self.ID_EBANDS_DOS = wx.NewId()
self.ID_EBANDS_JDOS = wx.NewId()
#self.ID_EBANDS_FSURF = wx.NewId()
#self.ID_EBANDS_SCISSORS = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_EBANDS_GETINFO, "Get Info", "Show info on the band structure")
self.Bind(wx.EVT_MENU, self.OnEbandsGetInfo, id=self.ID_EBANDS_GETINFO)
menu.Append(self.ID_EBANDS_PLOT, "Plot ebands", "Plot electron bands with matplotlib")
self.Bind(wx.EVT_MENU, self.OnEbandsPlot, id=self.ID_EBANDS_PLOT)
menu.Append(self.ID_EBANDS_DOS, "DOS", "Compute the electron DOS")
self.Bind(wx.EVT_MENU, self.OnEbandsDos, id=self.ID_EBANDS_DOS)
menu.Append(self.ID_EBANDS_JDOS, "JDOS", "Compute the electron Joint DOS")
self.Bind(wx.EVT_MENU, self.OnEbandsJdos, id=self.ID_EBANDS_JDOS)
# TODO
#menu.Append(self.ID_EBANDS_FSURF, "Fermi surface", "Visualize the Fermi surface with Xcrysden")
#self.Bind(wx.EVT_MENU, self.OnFermiSurface, id=self.ID_EBANDS_FSURF)
# TODO
#menu.Append(self.ID_EBANDS_SCISSORS, "Apply scissors", "Apply a scissors operator")
#self.Bind(wx.EVT_MENU, self.OnApplyScissors, id=self.ID_EBANDS_SCISSORS)
return menu
def OnEbandsGetInfo(self, event):
"""Shows info on the bandstructure."""
s = self.ebands.info
caption = "Ebands info"
wxdg.ScrolledMessageDialog(self, s, caption=caption, style=wx.MAXIMIZE_BOX).Show()
def OnEbandsPlot(self, event):
"""Plot band energies with matplotlib."""
self.ebands.plot()
def OnEbandsDos(self, event):
"""Open Frame for the computation of the DOS."""
ewx.ElectronDosFrame(self, bands=self.ebands).Show()
def OnEbandsJdos(self, event):
"""Open Frame for the computation of the JDOS."""
ewx.ElectronJdosFrame(self, bands=self.ebands).Show()
def OnFermiSurface(self, event):
"""Visualize the Fermi surface with Xcrysden."""
try:
visu = self.ebands.export_bxsf(".bxsf")
thread = awx.WorkerThread(self, target=visu)
thread.start()
except Exception:
awx.showErrorMessage(self)
#def OnApplyScissors(self, event):
# """
# Read the scissors operator from a pickle file, apply it to the electron bands and save the results.
# """
# Get the scissors operator from file
# Apply the scissors.
# new_ebands = self.ebands.apply_scissors(self, scissors)
# new_ebands.plot()
# new_ebands.pickle_dump()
class Has_MultipleEbands(Has_Ebands):
"""
Mixin class that provides a menu and callbacks
for analyzing and comparing multiple electron bands.
"""
def CreateEbandsMenu(self):
"""Creates the ebands menu."""
menu = super(Has_MultipleEbands, self).CreateEbandsMenu()
menu.AppendSeparator()
# Multiple Ebands Menu ID's
self.ID_MULTI_EBANDS_PLOT = wx.NewId()
self.ID_MULTI_EBANDS_DOS = wx.NewId()
#self.ID_MULTI_EBANDS_JDOS = wx.NewId()
self.ID_MULTI_EBANDS_BANDSWITHDOS = wx.NewId()
menu.Append(self.ID_MULTI_EBANDS_PLOT, "Compare ebands", "Plot multiple electron bands")
self.Bind(wx.EVT_MENU, self.OnCompareEbands, id=self.ID_MULTI_EBANDS_PLOT)
menu.Append(self.ID_MULTI_EBANDS_DOS, "Compare DOSes", "Compare multiple electron DOSes")
self.Bind(wx.EVT_MENU, self.OnCompareEdos, id=self.ID_MULTI_EBANDS_DOS)
#menu.Append(self.ID_MULTI_EBANDS_JDOS, "Compare JDOSes", "Compare multiple electron JDOSes")
#self.Bind(wx.EVT_MENU, self.OnCompareJdos, id=self.ID_MULTI_EBANDS_JDOS)
menu.Append(self.ID_MULTI_EBANDS_BANDSWITHDOS, "Plot bands and DOS", "Plot electron bands and DOS on the same figure")
self.Bind(wx.EVT_MENU, self.onPlotEbandsWithDos, id=self.ID_MULTI_EBANDS_BANDSWITHDOS)
return menu
@abc.abstractproperty
def ebands_list(self):
"""Return a list of `ElectronBands`."""
@abc.abstractproperty
def ebands_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `ElectronBands` have been read.
"""
def OnCompareEbands(self, event):
"""Plot multiple electron bands"""
plotter = ElectronBandsPlotter()
for path, ebands in zip(self.ebands_filepaths, self.ebands_list):
label = os.path.relpath(path)
plotter.add_ebands(label, ebands)
try:
print(plotter.bands_statdiff())
except:
pass
plotter.plot()
def OnCompareEdos(self, event):
"""Plot multiple electron DOSes"""
# Open dialog to get DOS parameters.
dialog = ewx.ElectronDosDialog(self)
if dialog.ShowModal() == wx.ID_CANCEL: return
dos_params = dialog.GetParams()
plotter = ElectronDosPlotter()
for path, ebands in zip(self.ebands_filepaths, self.ebands_list):
try:
edos = ebands.get_edos(**dos_params)
label = os.path.relpath(path)
plotter.add_edos(label, edos)
except:
awx.showErrorMessage(self)
plotter.plot()
#def OnCompareJdos(self, event):
#"""Plot multiple electron JDOSes"""
# Open dialog to get DOS parameters.
#dialog = ElectronJdosDialog(self, nsppol, mband)
#jdos_params = dialog.GetParams()
#plotter = ElectronBandsPlotter()
#for ebands in self.ebands_list:
# jos = ebands.get_jdos(**jdos_params)
# plotter.add_edos(label, edos)
#
#plotter.plot()
def onPlotEbandsWithDos(self, event):
"""Plot electron bands with DOS. Requires the specification of two files."""
# Open dialog to get files and DOS parameters.
dialog = ewx.EbandsDosDialog(self, self.ebands_filepaths)
if dialog.ShowModal() == wx.ID_CANCEL: return
try:
dos_params = dialog.getEdosParams()
ipath, idos = dialog.getBandsDosIndex()
ebands_path = self.ebands_list[ipath]
ebands_mesh = self.ebands_list[idos]
edos = ebands_mesh.get_edos(**dos_params)
ebands_path.plot_with_edos(edos)
except:
awx.showErrorMessage(self)
class Has_Tools(object):
"""
Mixin class that provides a menu with external tools.
"""
def CreateToolsMenu(self):
"""Create the tools menu."""
# Tools Menu ID's
self.ID_TOOLS_UNIT_CONVERTER = wx.NewId()
self.ID_TOOLS_PERIODIC_TABLE = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_TOOLS_PERIODIC_TABLE, "Periodic table", "Periodic Table")
self.Bind(wx.EVT_MENU, self.OnTools_PeriodicTable, id=self.ID_TOOLS_PERIODIC_TABLE)
menu.Append(self.ID_TOOLS_UNIT_CONVERTER, "Unit converter", "Unit Converter")
self.Bind(wx.EVT_MENU, self.OnTools_UnitConverter, id=self.ID_TOOLS_UNIT_CONVERTER)
return menu
def OnTools_PeriodicTable(self, event):
"""Open new frame with the periodic table."""
from awx.elements_gui import WxPeriodicTable
WxPeriodicTable(self).Show()
def OnTools_UnitConverter(self, event):
"""Open new frame with the unit converter."""
ConverterFrame(self).Show()
class Has_NetcdfFiles(metaclass=abc.ABCMeta):
"""
Mixin class that provides a menu and callbacks
for analyzing and comparing netcdf files.
"""
@abc.abstractproperty
def nc_filepaths(self):
"""List of absolute paths of the netcdf file."""
def CreateNetcdfMenu(self):
"""Creates the ebands menu."""
# Netcdf Menu ID's
self.ID_NETCDF_WXNCVIEW = wx.NewId()
self.ID_NETCDF_NCDUMP = wx.NewId()
self.ID_NETCDF_NCVIEW = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_NETCDF_WXNCVIEW, "wxncview", "Call wxncview")
self.Bind(wx.EVT_MENU, self.OnNetcdf_WxNcView, id=self.ID_NETCDF_WXNCVIEW)
menu.Append(self.ID_NETCDF_NCDUMP, "ncdump", "Show the output of ncdump")
self.Bind(wx.EVT_MENU, self.OnNetcdf_NcDump, id=self.ID_NETCDF_NCDUMP)
menu.Append(self.ID_NETCDF_NCVIEW, "ncview", "Call ncview")
self.Bind(wx.EVT_MENU, self.OnNetcdf_NcView, id=self.ID_NETCDF_NCVIEW)
return menu
def OnNetcdf_NcDump(self, event):
"""Call ncdump and show results in a dialog."""
for path in self.nc_filepaths:
s = NcDumper().dump(path)
caption = "ncdump output for %s" % path
wxdg.ScrolledMessageDialog(self, s, caption=caption, style=wx.MAXIMIZE_BOX).Show()
def OnNetcdf_NcView(self, event):
"""Call ncview in an subprocess."""
if which("ncview") is None:
return awx.showErrorMessage(self, "Cannot find ncview in $PATH")
for path in self.nc_filepaths:
def target():
os.system("ncview %s" % path)
thread = awx.WorkerThread(self, target=target)
thread.start()
def OnNetcdf_WxNcView(self, event):
"""Open wxncview frame."""
NcViewerFrame(self, filepaths=self.nc_filepaths).Show()
class Has_Phbands(metaclass=abc.ABCMeta):
"""
Mixin class that provides a menu and callbacks for analyzing phonon bands.
"""
@abc.abstractproperty
def phbands(self):
"""`PhononBands` object."""
def CreatePhbandsMenu(self):
"""Creates the ebands menu."""
# Ebands Menu ID's
self.ID_PHBANDS_ADD_DOS = wx.NewId()
self.ID_PHBANDS_ADD_LO_TO = wx.NewId()
self.ID_PHBANDS_PLOT = wx.NewId()
self.ID_PHBANDS_DOS = wx.NewId()
self.ID_MULTI_PHBANDS_BANDSWITHDOS = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_PHBANDS_ADD_DOS, "Add phdos data", "Add the phonon dos data from a PHDOS.nc file")
self.Bind(wx.EVT_MENU, self.OnAddDos, id=self.ID_PHBANDS_ADD_DOS)
menu.Append(self.ID_PHBANDS_ADD_LO_TO, "Add LO-TO data", "Add the LO-TO splitting data from a PHDOS.nc file")
self.Bind(wx.EVT_MENU, self.OnAddLoTo, id=self.ID_PHBANDS_ADD_LO_TO)
menu.Append(self.ID_PHBANDS_PLOT, "Plot phbands", "Plot phonon bands with matplotlib")
self.Bind(wx.EVT_MENU, self.OnPhbandsPlot, id=self.ID_PHBANDS_PLOT)
menu.Append(self.ID_PHBANDS_DOS, "DOS", "Plot the phonon DOS")
self.Bind(wx.EVT_MENU, self.OnPhbandsDos, id=self.ID_PHBANDS_DOS)
menu.Append(self.ID_MULTI_PHBANDS_BANDSWITHDOS, "Plot bands and DOS", "Plot phonon bands and DOS on the same figure")
self.Bind(wx.EVT_MENU, self.onPlotPhbandsWithDos, id=self.ID_MULTI_PHBANDS_BANDSWITHDOS)
return menu
def OnAddDos(self, event):
"""Add PHDOS data to the active tab"""
dialog = wx.FileDialog(self, message="Choose a PHDOS.nc file", defaultDir=os.getcwd(),
wildcard="Netcdf files (*.nc)|*.nc",
style=wx.OPEN | wx.CHANGE_DIR)
if dialog.ShowModal() == wx.ID_CANCEL: return
phdos = abiopen(dialog.GetPath())
self.active_tab.phdos_file = phdos
def OnAddLoTo(self, event):
"""Add LO-TO splitting data to the phbands in the active tab"""
dialog = wx.FileDialog(self, message="Choose an anaddb.nc file", defaultDir=os.getcwd(),
wildcard="Netcdf files (*.nc)|*.nc",
style=wx.OPEN | wx.CHANGE_DIR)
if dialog.ShowModal() == wx.ID_CANCEL: return
self.phbands.read_non_anal_from_file(dialog.GetPath())
def OnPhbandsPlot(self, event):
"""Plot phonon frequencies with matplotlib."""
self.phbands.plot()
def OnPhbandsDos(self, event):
"""Open Frame for the computation of the DOS."""
if not self.phdos:
awx.showErrorMessage(self, message="PHDOS data should be loaded using the menu Phband->Add phdos data")
else:
plotter = PhononDosPlotter()
try:
label = os.path.relpath(self.active_phdos_file.filepath)
plotter.add_phdos(label, self.phdos)
except:
awx.showErrorMessage(self)
plotter.plot()
def onPlotPhbandsWithDos(self, event):
"""Plot phonon bands with DOS"""
try:
if not self.phdos:
awx.showErrorMessage(self, message="PHDOS data should be loaded using the menu Phband->Add phdos data")
else:
self.phbands.plot_with_phdos(self.phdos)
except:
awx.showErrorMessage(self)
@abc.abstractproperty
def phdos(self):
"""PHDOS data for the active tab if it has been added. None otherwise"""
class Has_MultiplePhbands(Has_Phbands):
"""
Mixin class that provides a menu and callbacks
for analyzing and comparing multiple phonon bands.
"""
def CreatePhbandsMenu(self):
"""Creates the ebands menu."""
menu = super(Has_MultiplePhbands, self).CreatePhbandsMenu()
menu.AppendSeparator()
# Multiple Ebands Menu ID's
self.ID_MULTI_PHBANDS_PLOT = wx.NewId()
self.ID_MULTI_PHBANDS_DOS = wx.NewId()
menu.Append(self.ID_MULTI_PHBANDS_PLOT, "Compare phbands", "Plot multiple phonon bands")
self.Bind(wx.EVT_MENU, self.OnComparePhbands, id=self.ID_MULTI_PHBANDS_PLOT)
menu.Append(self.ID_MULTI_PHBANDS_DOS, "Compare DOSes", "Compare multiple phonon DOSes")
self.Bind(wx.EVT_MENU, self.OnComparePhdos, id=self.ID_MULTI_PHBANDS_DOS)
return menu
@abc.abstractproperty
def phbands_list(self):
"""Return a list of `PhononBands`."""
@abc.abstractproperty
def phbands_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `PhononBands` have been read.
"""
@abc.abstractproperty
def phdos_list(self):
"""Return a list of `PhononDos`."""
@abc.abstractproperty
def phdos_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `PhononDos` have been read.
"""
def OnComparePhbands(self, event):
"""Plot multiple phonon bands"""
dialog = ewx.BandsCompareDialog(self, self.phbands_filepaths)
if dialog.ShowModal() == wx.ID_CANCEL: return
try:
selected = dialog.GetSelectedIndices()
except:
awx.showErrorMessage(self)
plotter = PhononBandsPlotter()
for i in selected:
label = os.path.relpath(self.phbands_filepaths[i])
plotter.add_phbands(label, self.phbands_list[i])
try:
print(plotter.bands_statdiff())
except:
pass
plotter.plot()
def OnComparePhdos(self, event):
"""Plot multiple phonon DOSes"""
plotter = PhononDosPlotter()
for path, phdos in zip(self.phdos_filepaths, self.phdos_list):
try:
label = os.path.relpath(path)
plotter.add_phdos(label, phdos)
except:
awx.showErrorMessage(self)
plotter.plot()

File diff suppressed because it is too large Load Diff

View File

@ -1,83 +0,0 @@
"""Tooltips for oncv GUI."""
def oncv_tip(key):
"""Tip for variable key."""
return _ONCVTIPS[key]
_ONCVTIPS = dict(
atsym="Atomic symbol",
z="Atomic number",
nc="Number of core states",
nv="Number of valence states",
iexc="""\
Exchange-correlation functional:
1-Wigner
2-Hedin-Lundquist
3-Perdew-Wang-Ceperly-Alder
4-Perdew-Burke-Enzerhof""",
psfile="Format of pseudopotential file, psp8 for ABINIT, upf for PWSCF",
n="Principal quantum number",
l="Angular momentum",
f="Occupancy (MUST be >0)",
lmax="Maximum angular momentum for which psp is calculated (<=3)",
rc="Core radius for this l",
ep="""\
Energy at which psp is generated (eigenvalue inserted for occupied
state in reference configuration, positive energy must be specified
for barrier-confined "scattering" state for unoccupied l <=lmax.
A small positive energy is usually good (0.1-0.25 Ha).""",
ncon="""\
Number of constraints for pseudo wave function to match all-electron wave function at rc,
value + ncon-1 derivatives, must be between 3 and 5 ("M" in the paper, Eq.(6))""",
nbas="Number of basis functions. Must be between ncon+2 and ncon+5 (`N` in the paper, Eqs.(4-5))",
qcut="Wave vector defining `residual energy` in the RRKJ method (`q_c` in the paper, Eq.(1)",
lloc="""\
Angular momentum whose semi-local psp is taken as local.
lloc=4 denotes a smooth polynomial continuation of the all-electron potential.
If lloc<=lmax, remaining data are ignored, but must be there (zeros are OK).""",
lpopt="""\
Type of polynomial continuation for lloc=4. values 1-5 permitted.
1) match 2 derivatives, r^0,2,4
2) match 2 derivatives, r^0,4,6
3) match 3 derivatives, r^0,4,5,6
4) match 3 derivatives, r^0,4,6,8
5) match 3 derivatives, r^0,2,4,6""",
rc5="Info not available",
dvloc0="""\
Shift of r=0 potential from basic continuation (Ha) for lloc=4
depends on lpopt above as follows, with x=(r/rc)
1) dvloc0*(1-x^2)^3
2) dvloc0*(1-x^4)^3
3-5) dvloc0*(1-x^4)^4""",
nproj="Number of projectors, 1 or 2. Automatically set to 0 for l=lloc",
debl="""\
Energy added to basic psp energy ep for 2nd projector, automatically reset to match 2nd projector with 2nd bound state
at this l when it is occupied (i.e., the psp is generated for a corresponding-l shallow core state)""",
icmod="""\
0: no non-linear core correction charge.
1: smooth monotonic polynomial model core charge fit at "matching" rc following reference 35.""",
fcfact="""\
Radius for above determined by rho_core(r)=fcfact*rho_pseudo_valence(r).
Values 0.25-0.5 are usually good (look at plots)""",
epsh1="""\
Lower energy limit for `phase-shift-like` log-derivative plot,
should be below the nearest core level for this l to make sure
there are no ghosts, but -2.0 Ha usually is OK""",
epsh2="Upper energy limit, 2.0 usually good",
depsh="Energy mesh interval for plot, 0.02 usually good enough",
rcfact="rcfact scales the crossover radius to determine the range of the Teter function.",
rlmax="""\
Maximum radius for Abinit psp code 8 format output.
Must be greater than maximum rc (including lloc=4 rc), but also determines
range of diagnostic plots, so ~2*rcmax is usually good""",
drl="""\
Mesh spacing of linear radial mesh for Abinit output.
0.02 is good for "softer" psps, 0.01 is probably better with 1st row, 3d's, or semi-core psps.""",
ncnf="""\
Number of test configurations (<=4).
The reference config is always run first as a consistency check.
Core always is the reference core configuration""",
)
# nvcnf (repeated ncnf times) number of valence states in this test configuration
# n, l, f (nvcnf lines, repeated follwing nvcnf's ncnf times)

View File

@ -1,308 +0,0 @@
"""Collections of Popup menus associated to filenames."""
import wx
import wx.lib.dialogs as wxdg
import abipy.gui.awx as awx
import abipy.gui.electronswx as ewx
from collections import OrderedDict
from abipy.abilab import abifile_subclass_from_filename, abiopen
from abipy.core.mixins import NcDumper, get_filestat
from abipy.abio.outputs import AbinitLogFile, AbinitOutputFile
from abipy.iotools.visualizer import Visualizer
from abipy.waves import WfkFile
from abipy.electrons import SigresFile, GsrFile
from abipy.electrons.bse import MdfFile
from abipy.gui.events import AbinitEventsFrame
from abipy.gui.timer import AbinitTimerFrame
from abipy.gui.editor import SimpleTextViewer, MyEditorFrame
from abipy.gui.wxncview import NcViewerFrame
__all__ = [
"popupmenu_for_filename",
]
def popupmenu_for_filename(parent, filename):
"""
Factory function that returns the appropriate popup menu.
Args:
parent:
The parent wx window. Used to connect the children created
by the popupmenu to the calling window.
"""
menu = PopupMenu.from_filename(filename)
if menu is not None:
menu.set_target(filename)
menu.set_parent(parent)
return menu
#--------------------------------------------------------------------------------------------------
# Callbacks
def showNcdumpMessage(parent, filepath):
"""Open a dialog with the output of ncdump."""
title = "ncdump output for file %s" % filepath
text = NcDumper().dump(filepath)
# TODO: Get a decent wxpython editor somewhere
#SimpleTextViewer(parent, text, title=title).Show()
MyEditorFrame.from_text(parent, text, title=title).Show()
def openWxncview(parent, filepath):
"""Open a dialog with the output of ncdump."""
title = "wxncview: %s" % filepath
text = NcDumper().dump(filepath)
NcViewerFrame(parent, filepath, title=title).Show()
def showFileStat(parent, filepath):
"""Open a dialog reporting file stats."""
caption = "Info on file %s" % filepath
stat_dict = get_filestat(filepath)
msg = str(stat_dict)
style = wx.DEFAULT_FRAME_STYLE
wxdg.ScrolledMessageDialog(parent, msg, caption=caption, size=(600, 600), style=style).Show()
def showAbinitEventsFrame(parent, filepath):
"""Open a dialog reporting file stats."""
AbinitEventsFrame(parent, filepath).Show()
def showAbinitTimerFrame(parent, filepath):
"""Open a dialog reporting file stats."""
try:
frame = AbinitTimerFrame(parent, filepath)
frame.Show()
except awx.Error as exc:
awx.showErrorMessage(parent, str(exc))
def showStructure(parent, filepath):
ncfile = abiopen(filepath)
visu_classes = Visualizer.get_available(ext="xsf")
if not visu_classes:
print("Not visualizer found for extension xsf")
return
vname = visu_classes[0].name
visu = ncfile.structure.visualize(vname)
thread = awx.WorkerThread(parent, target=visu)
thread.start()
class PopupMenu(wx.Menu):
"""
Base class for popup menus. `A PopupMenu` has a list of callback functions
indexed by the menu title. The signature of the callback function is func(parent, filename) where
filename is the name of the file selected in the Widget and parent is the wx
Window that will become the parent of the new frame created by the callback.
"""
MENU_TITLES = OrderedDict([
])
HANDLED_FILES = []
def __init__(self):
super(PopupMenu, self).__init__()
self._make_menu()
@staticmethod
def from_filename(filename):
"""
Static factory function that instanciates the appropriate subclass of `NcFilePopupMenu`
Returns None if the extesion of filename is not supported.
"""
# Find the AbinitNcFile subclass associated to files.
try:
file_class = abifile_subclass_from_filename(filename)
except KeyError:
if filename.endswith(".nc"): NcFilePopupMenu()
return None
# Check whether a subclass handles this file..
# Fallback to a simple PopupMenu if no match.
def allsubclasses(cls):
"""Returns the set of subclasses of cls."""
children = [cls]
for sc in cls.__subclasses__():
if sc.__subclasses__():
for k in sc.__subclasses__():
children.extend(allsubclasses(k))
else:
children.append(sc)
return set(children)
for cls in allsubclasses(PopupMenu):
if cls.handle_file_class(file_class):
return cls()
else:
if filename.endswith(".nc"): NcFilePopupMenu()
return PopupMenu()
@classmethod
def handle_file_class(cls, file_class):
"""True if the popupmenu is associated to file_class."""
return file_class in cls.HANDLED_FILES
def _make_menu(self):
"""Build the menu taking into account the options of the superclasses."""
base_classes = list(self.__class__.__bases__) + [self.__class__]
base_classes.reverse()
assert not hasattr(self, "menu_title_by_id")
assert not hasattr(self, "menu_titles")
self.menu_title_by_id, self.menu_titles = OrderedDict(), OrderedDict()
for cls in base_classes:
try:
menus = cls.MENU_TITLES
except AttributeError as exc:
awx.WARNING("exc ",exc," for cls", cls)
continue
self.menu_titles.update(menus)
for title in menus:
self.menu_title_by_id[wx.NewId()] = title
# Add sentinel for Menu separator.
self.menu_title_by_id["separator_" + str(len(self.menu_titles))] = None
for (id, title) in self.menu_title_by_id.items():
if title is None:
sepid = int(id.split("_")[-1])
if sepid != len(self.menu_titles):
self.AppendSeparator()
else:
# Register menu handlers with EVT_MENU, on the menu.
self.Append(id, title)
wx.EVT_MENU(self, id, self.OnMenuSelection)
def set_parent(self, parent):
"""Set the parent window."""
self._parent = parent
@property
def parent(self):
"""Returns the parent window."""
try:
return self._parent
except AttributeError:
awx.WARNING("Popup menu doesn't have parent")
return None
def set_target(self, target):
"""Set the target of the callback."""
self._target = target
@property
def target(self):
"""The target of the callback."""
try:
return self._target
except AttributeError:
return None
def _get_callback(self, title):
return self.menu_titles[title]
def OnMenuSelection(self, event):
title = self.menu_title_by_id[event.GetId()]
callback = self._get_callback(title)
#print("Calling callback %s on target %s" % (callback, self.target))
try:
callback(parent=self.parent, filepath=self.target)
except:
awx.showErrorMessage(parent=self.parent)
class AbinitTextFilePopupMenu(PopupMenu):
"""
"""
MENU_TITLES = OrderedDict([
("events", showAbinitEventsFrame),
("properties", showFileStat),
("timer", showAbinitTimerFrame),
])
HANDLED_FILES = [AbinitLogFile, AbinitOutputFile]
class NcFilePopupMenu(PopupMenu):
"""
Base class for popup menus. `A PopupMenu` has a list of callback functions
indexed by the menu title and a list of `AbinitNcFile` associated to it.
The signature of the callback function is func(filename, parent) where
filename is the name of the file selected in the Widget and parent is the wx
Window that will become the parent of the new frame created by the callback.
How to subclass PopupMenu:
1. Define a new class that inherits from NcFilePopupMenu.
2. Define the callbacks in the class variable MENU_TITLES.
Use OrderedDict to have a fixed ordering of the labels.
3. Define the class variable HANDLED_FILES with the list of
`AbinitNcFile` subclasses associated to the popupmenu.
4. Done (most of the work is indeed done in the base class and in
the factory function popupmenu_for_filename.
"""
MENU_TITLES = OrderedDict([
("structure", showStructure),
("ncdump", showNcdumpMessage),
("wxncview", openWxncview),
("properties", showFileStat),
])
HANDLED_FILES = []
class EbandsPopupMenu(NcFilePopupMenu):
"""Popup menu for Netcdf files that contain the electron band structure."""
MENU_TITLES = OrderedDict([
("ePlot", ewx.showElectronBandsPlot),
("eDos", ewx.showElectronDosFrame),
("eJdos", ewx.showElectronJdosFrame),
])
HANDLED_FILES = [WfkFile, GsrFile]
def showQPData(parent, filepath):
sigres = abiopen(filepath)
qps_spin = sigres.qplist_spin
assert len(qps_spin) == 1
qps_spin[0].plot_qps_vs_e0()
class SigResPopupMenu(NcFilePopupMenu):
"""Popup menu for SIGRES files."""
MENU_TITLES = OrderedDict([
("qpDataPlot", showQPData),
])
HANDLED_FILES = [SigresFile]
def showEXCMDF(parent, filepath):
mdf_file = MdfFile(filepath)
mdf_file.plot_mdfs()
class MDFPopupMenu(NcFilePopupMenu):
"""Popup menu for MDF files."""
MENU_TITLES = OrderedDict([
("mdfPlot", showEXCMDF),
])
HANDLED_FILES = [MdfFile]

View File

@ -1,349 +0,0 @@
import os
import wx
import wx.lib.agw.flatnotebook as fnb
import abipy.gui.awx as awx
from monty.string import marquee
from monty.collections import AttrDict
from wx.py.shell import Shell
from abipy.abilab import abiopen
from abipy.electrons import SigresPlotter
from abipy.gui.scissors import ScissorsBuilderFrame
from abipy.gui.baseviewer import MultiViewerFrame
from abipy.gui import mixins as mix
from abipy.gui.kpoints import SpinKpointBandPanel
class SigresViewerFrame(MultiViewerFrame, mix.Has_Structure, mix.Has_MultipleEbands, mix.Has_Tools, mix.Has_NetcdfFiles):
VERSION = "0.1"
HELP_MSG = """Quick help:
Kpoint list:
Left-Click: to visualize table with QP results for the selected spin, k-point
Right-Click: display popup menu with choices.
Also, these key bindings can be used
(For Mac OSX, replace 'Ctrl' with 'Apple'):
Ctrl-Q: quit
"""
@property
def codename(self):
return "SigmaResultsViewer"
@property
def active_sigres(self):
"""The active SIGRES file i.e. the SIGRES associated to the active tab."""
return self.active_tab.sigres
@property
def structure(self):
"""`Structure` associated to the active tab."""
return self.active_sigres.structure
@property
def ebands(self):
"""The electron bands associated to the active SIGRES file."""
return self.active_sigres.ebands
@property
def ebands_list(self):
"""List of `ElectronBands`."""
ebands_list = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
ebands_list.append(tab.sigres.ebands)
return ebands_list
@property
def ebands_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `ElectronBands` have been read.
"""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.sigres.filepath)
return paths
@property
def nc_filepaths(self):
"""String with the absolute path of the netcdf file."""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.sigres.filepath)
return paths
@property
def sigres_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `SigresFile` have been read.
"""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.sigres.filepath)
return paths
def makeMenu(self):
"""Creates the main menu."""
# Base menu
menu_bar = super(SigresViewerFrame, self).makeMenu()
# Add mixin menus.
menu_bar.Append(self.CreateStructureMenu(), "Structure")
menu_bar.Append(self.CreateEbandsMenu(), "Ebands")
menu_bar.Append(self.CreateQpDataMenu(), "QP Data")
menu_bar.Append(self.CreateToolsMenu(), "Tools")
menu_bar.Append(self.CreateNetcdfMenu(), "Netcdf")
# Help menu
help_menu = self.makeHelpMenu()
menu_bar.Append(help_menu, "Help")
self.SetMenuBar(menu_bar)
def CreateQpDataMenu(self):
"""Build and return the QP menu."""
# Structure Menu ID's
self.ID_QPGAPS_COMPARE = wx.NewId()
self.ID_QPENES_COMPARE = wx.NewId()
menu = wx.Menu()
menu.Append(self.ID_QPGAPS_COMPARE, "Compare QP-gaps", "Compare QP gaps")
self.Bind(wx.EVT_MENU, self.OnQpGapsCompare, id=self.ID_QPGAPS_COMPARE)
menu.Append(self.ID_QPENES_COMPARE, "Compare QP-enes", "Compare QP energies")
self.Bind(wx.EVT_MENU, self.OnQpEnesCompare, id=self.ID_QPENES_COMPARE)
return menu
def OnQpGapsCompare(self, event):
"""Compare the QP gaps reported in the SIGRES files."""
# Instanciate the plotter and add the filepaths to the plotter.
plotter = SigresPlotter()
plotter.add_files(self.sigres_filepaths)
# Plot the convergence of the QP gaps.
plotter.plot_qpgaps(title="Convergence of QP gaps", hspan=0.05)
def OnQpEnesCompare(self, event):
"""Compare the QP energies reported in the SIGRES files."""
# Instanciate the plotter and add the filepaths to the plotter.
plotter = SigresPlotter()
plotter.add_files(self.sigres_filepaths)
# Plot the convergence of the QP energies.
plotter.plot_qpenes(title="Convergence of QP energies", hspan=0.05)
def makeToolBar(self):
"""Creates the toolbar."""
self.toolbar = toolbar = self.CreateToolBar()
toolbar.SetToolBitmapSize(wx.Size(48, 48))
def bitmap(path):
return wx.Bitmap(awx.path_img(path))
self.ID_SCISSORS = wx.NewId()
self.ID_PLOTQPSE0 = wx.NewId()
self.ID_PLOTKSWITHMARKS = wx.NewId()
artBmp = wx.ArtProvider.GetBitmap
#toolbar.AddSimpleTool(wx.ID_OPEN, artBmp(wx.ART_FILE_OPEN, wx.ART_TOOLBAR), "Open")
toolbar.AddSimpleTool(self.ID_PLOTQPSE0, bitmap("qpresults.png"), "Plot QPState Results.")
toolbar.AddSimpleTool(self.ID_PLOTKSWITHMARKS, bitmap("qpmarkers.png"), "Plot KS energies with QPState markers.")
toolbar.AddSimpleTool(self.ID_SCISSORS, bitmap("qpscissor.png"), "Build energy-dependent scissors from GW correction.")
# Associate menu/toolbar items with their handlers.
menu_handlers = [
(self.ID_PLOTQPSE0, self.OnPlotQpsE0),
(self.ID_PLOTKSWITHMARKS, self.OnPlotKSwithQPmarkers),
(self.ID_SCISSORS, self.OnScissors),
]
for combo in menu_handlers:
mid, handler = combo[:2]
self.Bind(wx.EVT_MENU, handler, id=mid)
self.toolbar.Realize()
def addFileTab(self, parent, filepath):
"""Open a SIGRES file and create a new tab in the notebook."""
gsr = abiopen(filepath)
tab = SigresFileTab(self.notebook, gsr)
self.notebook.AddPage(tab, os.path.basename(filepath))
def OnPlotQpsE0(self, event):
"""Plot QPState results as function of the KS energy."""
if self.active_sigres is None: return
self.active_sigres.plot_qps_vs_e0()
def OnPlotKSwithQPmarkers(self, event):
"""Plot KS energies with QPState markers."""
if self.active_sigres is None: return
sigres = self.active_sigres
band_range = (sigres.min_gwbstart, sigres.max_gwbstop)
try:
EbandsWithMarkersPlotFrame(self, sigres.ebands, band_range=band_range).Show()
except:
awx.showErrorMessage(self)
def OnScissors(self, event):
"""Build the scissors operator."""
if self.active_sigres is None: return
ScissorsBuilderFrame(self, self.active_sigres.filepath).Show()
class SigresFileTab(wx.Panel):
"""Tab showing information on a single SIGRES file."""
def __init__(self, parent, sigres, **kwargs):
"""
Args:
parent:
parent window.
sigres:
`SigresFile` object
"""
super(SigresFileTab, self).__init__(parent, -1, **kwargs)
self.sigres = sigres
splitter = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
splitter.SetSashGravity(0.95)
self.skb_panel = SpinKpointBandPanel(splitter, sigres.structure, sigres.nsppol, sigres.gwkpoints, sigres.max_gwbstop,
bstart=sigres.min_gwbstart)
# Set the callback for double click on k-point row..
self.Bind(self.skb_panel.MYEVT_SKB_ACTIVATED, self.onShowQPTable)
# Add Python shell
msg = "SIGRES_File object is accessible via the sigres variable. Use sigres.<TAB> to access the list of methods."
msg = marquee(msg, width=len(msg) + 8, mark="#")
msg = "#"*len(msg) + "\n" + msg + "\n" + "#"*len(msg) + "\n"
pyshell = Shell(splitter, introText=msg, locals={"sigres": sigres})
splitter.SplitHorizontally(self.skb_panel, pyshell)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(splitter, 1, wx.EXPAND, 5)
self.SetSizerAndFit(sizer)
@property
def statusbar(self):
return self.viewer_frame.statusbar
@property
def viewer_frame(self):
"""The parent frame `WfkViewerFrame`."""
try:
return self._viewer_frame
except AttributeError:
self._viewer_frame = self.getParentWithType(SigresViewerFrame)
return self._viewer_frame
def onShowQPTable(self, event):
"""Show a table with the QP results for the selected spin, kpoint, band."""
spin, kpoint, band = event.skb
qplist = self.sigres.get_qplist(spin, kpoint)
table = qplist.to_table()
title = "spin: %d, kpoint: %s" % (spin, kpoint)
awx.SimpleGridFrame(self, table, labels_from_table=True, title=title).Show()
class EbandsWithMarkersPlotFrame(awx.Frame):
def __init__(self, parent, ebands, **kwargs):
"""
Args:
parent:
Parent window
ebands:
`ElectronBands` object.
"""
self.band_range = kwargs.pop("band_range", None)
super(EbandsWithMarkersPlotFrame, self).__init__(parent, -1, **kwargs)
self.SetTitle("Select parameters")
self.ebands = ebands
if not ebands.markers:
raise awx.Error("Found empty markers dictionary in ebands %s" % repr(ebands))
self.BuildUi()
def BuildUi(self):
main_sizer = wx.BoxSizer(wx.VERTICAL)
hsizer1 = wx.BoxSizer( wx.HORIZONTAL )
marker_label = wx.StaticText(self, -1, "Available Markers:")
marker_label.Wrap(-1)
hsizer1.Add(marker_label, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
marker_choices = list(self.ebands.markers.keys())
self.marker_choice = wx.Choice( self, -1, wx.DefaultPosition, wx.DefaultSize, marker_choices, 0 )
self.marker_choice.SetSelection(0)
hsizer1.Add(self.marker_choice, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
scale_label = wx.StaticText(self, -1, "Scale Factor:")
scale_label.Wrap(-1)
hsizer1.Add(scale_label, 0, wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.BOTTOM|wx.LEFT, 5 )
self.scale_ctrl = wx.SpinCtrlDouble(self, id=-1, value=str(50), min=0.0, max=1.e+10, inc=50)
self.scale_ctrl.SetToolTipString("Multiplicative factor used to render the markers more visible.")
hsizer1.Add( self.scale_ctrl, 0, wx.ALL, 5 )
main_sizer.Add( hsizer1, 0, wx.ALIGN_CENTER_HORIZONTAL, 5 )
hsizer2 = wx.BoxSizer( wx.HORIZONTAL )
ok_button = wx.Button(self, wx.ID_OK, label='Ok')
cancel_button = wx.Button(self, wx.ID_CANCEL, label='Cancel')
ok_button.Bind(wx.EVT_BUTTON, self.OnOkButton)
cancel_button.Bind(wx.EVT_BUTTON, self.OnCloseButton)
hsizer2.Add(ok_button, 0, wx.ALL, 5 )
hsizer2.Add(cancel_button, 0, wx.ALL, 5 )
main_sizer.Add( hsizer2, 0, wx.ALIGN_CENTER_HORIZONTAL, 5 )
self.SetSizerAndFit(main_sizer)
def OnCloseButton(self, event):
self.Destroy()
def GetParams(self):
return AttrDict(
qpattr=self.marker_choice.GetStringSelection(),
fact=float(self.scale_ctrl.GetValue()))
def OnOkButton(self, event):
p = self.GetParams()
with_marker = p.qpattr + ":" + str(p.fact)
self.ebands.plot(marker=with_marker, band_range=self.band_range)
class SigresViewerApp(awx.App):
pass
def wxapp_sigresviewer(sigres_filepaths):
app = SigresViewerApp()
frame = SigresViewerFrame(None, filepaths=sigres_filepaths)
app.SetTopWindow(frame)
frame.Show()
return app

View File

@ -1,225 +0,0 @@
import os
import wx
import abipy.gui.awx as awx
from wx.py.shell import Shell
from monty.string import marquee
from abipy.abilab import abiopen
from abipy.iotools.visualizer import Visualizer
from abipy.gui import mixins as mix
from abipy.gui.kpoints import SpinKpointBandPanel
from abipy.gui.baseviewer import MultiViewerFrame
class WfkViewerFrame(MultiViewerFrame, mix.Has_Structure, mix.Has_MultipleEbands, mix.Has_Tools, mix.Has_NetcdfFiles):
VERSION = "0.1"
HELP_MSG = """Quick help:
Kpoint list:
Left-Click: to visualize u(r)^2 for the selected spin, k-point, band
Right-Click: display popup menu with choices.
Also, these key bindings can be used
(For Mac OSX, replace 'Ctrl' with 'Apple'):
Ctrl-Q: quit
"""
@property
def codename(self):
return "WfkViewer"
@property
def active_wfk(self):
"""The active WFK file i.e. the WFK associated to the active tab."""
return self.active_tab.wfk
@property
def structure(self):
"""`Structure` associated to the active tab."""
return self.active_wfk.structure
@property
def ebands(self):
"""`ElectronBands` associated to the active tab."""
return self.active_wfk.ebands
@property
def ebands_list(self):
"""List of `ElectronBands`."""
ebands_list = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
ebands_list.append(tab.wfk.ebands)
return ebands_list
@property
def ebands_filepaths(self):
"""
Return a list with the absolute paths of the files
from which the `ElectronBands` have been read.
"""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.wfk.filepath)
return paths
@property
def nc_filepaths(self):
"""String with the absolute path of the active netcdf file."""
paths = []
for page in range(self.notebook.GetPageCount()):
tab = self.notebook.GetPage(page)
paths.append(tab.wfk.filepath)
return paths
def makeMenu(self):
"""Creates the main menu."""
# Base menu.
menu_bar = super(WfkViewerFrame, self).makeMenu()
# Add Mixin menus.
menu_bar.Append(self.CreateStructureMenu(), "Structure")
menu_bar.Append(self.CreateEbandsMenu(), "Ebands")
menu_bar.Append(self.CreateToolsMenu(), "Tools")
menu_bar.Append(self.CreateNetcdfMenu(), "Netcdf")
# Help menu
help_menu = self.makeHelpMenu()
menu_bar.Append(help_menu, "Help")
#self.menu_bar = menu_bar
self.SetMenuBar(menu_bar)
def makeToolBar(self):
"""Creates the toolbar."""
self.toolbar = toolbar = self.CreateToolBar()
toolbar.SetToolBitmapSize(wx.Size(48, 48))
def bitmap(path):
return wx.Bitmap(awx.path_img(path))
artBmp = wx.ArtProvider.GetBitmap
toolbar.AddSimpleTool(wx.ID_OPEN, artBmp(wx.ART_FILE_OPEN, wx.ART_TOOLBAR), "Open")
toolbar.AddSeparator()
# Combo box with the list of visualizers
avail_visunames = [visu.name for visu in Visualizer.get_available()]
value = avail_visunames[0] if avail_visunames else "None"
self.visualizer_cbox = wx.ComboBox(toolbar, id=-1, name='visualizer', choices=avail_visunames, value=value, style=wx.CB_READONLY)
toolbar.AddControl(control=self.visualizer_cbox)
toolbar.Realize()
def addFileTab(self, parent, filepath):
wfk = abiopen(filepath)
tab = WfkFileTab(self.notebook, wfk)
self.notebook.AddPage(tab, os.path.basename(filepath))
def GetVisualizer(self):
"""Returns a string with the visualizer selected by the user."""
return self.visualizer_cbox.GetValue()
class WfkFileTab(awx.Panel):
"""Tab showing information on a single WFK file."""
def __init__(self, parent, wfk, **kwargs):
"""
Args:
parent:
parent window.
wfk:
"""
super(WfkFileTab, self).__init__(parent, -1, **kwargs)
self.wfk = wfk
splitter = wx.SplitterWindow(self, id=-1, style=wx.SP_3D)
splitter.SetSashGravity(0.95)
self.skb_panel = skb_panel = SpinKpointBandPanel(splitter, wfk.structure, wfk.nsppol, wfk.kpoints, wfk.mband)
# Set the callback for double click on k-point row..
self.Bind(skb_panel.MYEVT_SKB_ACTIVATED, self.onVisualizeSKB)
# Add Python shell
msg = "WFK_File object is accessible via the wfk variable. Use wfk.<TAB> to access the list of methods."
msg = marquee(msg, width=len(msg) + 8, mark="#")
msg = "#"*len(msg) + "\n" + msg + "\n" + "#"*len(msg) + "\n"
# FIXME <Error>: CGContextRestoreGState: invalid context 0x0
pyshell = Shell(splitter, introText=msg,locals={"wfk": self.wfk})
splitter.SplitHorizontally(self.skb_panel, pyshell)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(splitter, 1, wx.EXPAND, 5)
self.SetSizerAndFit(sizer)
@property
def statusbar(self):
return self.viewer_frame.statusbar
def GetVisualizer(self):
"""Returns a string with the visualizer selected by the user."""
return self.viewer_frame.GetVisualizer()
def onVisualizeSKB(self, event):
"""
Calls the visualizer to visualize the specified wavefunction.
Use the approach described in http://wiki.wxpython.org/LongRunningTasks
to make the Gui responsive one can use
"""
#print("in new" ,event.skb)
spin, kpoint, band = event.skb
appname = self.GetVisualizer()
if appname == "None": return
self.statusbar.PushStatusText("Visualizing wavefunction (spin=%d, kpoint=%s, band=%d)" % (spin, kpoint, band))
try:
visu = self.wfk.visualize_ur2(spin, kpoint, band, appname=appname)
thread = awx.WorkerThread(self, target=visu)
thread.start()
except:
awx.showErrorMessage(self)
#def _visualize_skb(self, spin, kpoint, band):
# """Calls the visualizer to visualize the specified wavefunction."""
# # To make the Gui responsive one can use the approach described in
# # http://wiki.wxpython.org/LongRunningTasks
# appname = self.GetVisualizer()
# if appname == "None": return
#
# self.statusbar.PushStatusText("Visualizing wavefunction (spin=%d, kpoint=%s, band=%d)" % (spin, kpoint, band))
# try:
# visu = self.wfk.visualize_ur2(spin, kpoint, band, appname=appname)
# thread = awx.WorkerThread(self, target=visu)
# thread.start()
#
# except:
# awx.showErrorMessage(self)
@property
def viewer_frame(self):
"""The parent frame `WfkViewerFrame`."""
try:
return self._viewer_frame
except AttributeError:
self._viewer_frame = self.getParentWithType(WfkViewerFrame)
return self._viewer_frame
class WfkViewerApp(awx.App):
pass
def wxapp_wfkviewer(wfk_filepaths):
app = WfkViewerApp()
frame = WfkViewerFrame(None, filepaths=wfk_filepaths)
app.SetTopWindow(frame)
frame.Show()
return app

View File

@ -1,464 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">MyProject1</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">MyPanel2</property>
<property name="pos"></property>
<property name="size">500,300</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">main_sizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property>
<property name="name">Files</property>
<property name="minimum_size"></property>
<property name="name">static_sizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<event name="OnUpdateUI"></event>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">1</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Entry1</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">checkbox1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCheckBox"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Entry2</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">checkbox2</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCheckBox"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">hsizer</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Select all</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">all_button</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Deselect all</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">empty_button</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -1,630 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">MyProject1</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">panel</property>
<property name="pos"></property>
<property name="size">500,300</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">main_sizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">hsz1</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">From:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">1</property>
<object class="wxTextCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">from_textctrl</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnTextMaxLen"></event>
<event name="OnTextURL"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">from_unit_choice</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnChoice"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">hsz2</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Unit type:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText2</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">unit_type_choiche</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnChoice"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">convert_button</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">button</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -1,620 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">MyProject2</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">panel</property>
<property name="pos"></property>
<property name="size">500,300</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer2</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">bSizer3</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">ndat:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">ndat</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxSpinCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="initial">4</property>
<property name="max">10</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_spinCtrl1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSP_ARROW_KEYS</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnSpinCtrl"></event>
<event name="OnSpinCtrlText"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">MyLabel</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText2</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxSpinCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="initial">0</property>
<property name="max">10</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_spinCtrl2</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSP_ARROW_KEYS</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnSpinCtrl"></event>
<event name="OnSpinCtrlText"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer5</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Task:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText4</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_choice3</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnChoice"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

File diff suppressed because it is too large Load Diff

View File

@ -1,626 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">MyProject1</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">MyPanel1</property>
<property name="pos"></property>
<property name="size">500,300</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">main_sizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">hsizer1</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Available Markers:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">marker_label</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">marker_choice</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnChoice"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Scale Factor:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">scale_label</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxSpinCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="initial">0</property>
<property name="max">10</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_spinCtrl1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSP_ARROW_KEYS</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnSpinCtrl"></event>
<event name="OnSpinCtrlText"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">hsizer2</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">OK</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">ok_button</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Cancel</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">cancel_button</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -1,942 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">MyProject1</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">MyPanel1</property>
<property name="pos"></property>
<property name="size">500,300</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">main_sizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="0">
<property name="id">wxID_ANY</property>
<property name="name">Domain #1</property>
<property name="minimum_size"></property>
<property name="name">static_boxsizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<event name="OnUpdateUI"></event>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">vsizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxFlexGridSizer" expanded="0">
<property name="cols">4</property>
<property name="flexible_direction">wxHORIZONTAL</property>
<property name="growablecols">1</property>
<property name="growablerows"></property>
<property name="hgap">0</property>
<property name="minimum_size"></property>
<property name="name">flexgrid_sizer1</property>
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
<property name="permission">none</property>
<property name="rows">0</property>
<property name="vgap">0</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Emin:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">stext1</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxSlider" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maxValue">100</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="minValue">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">min_slider</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSL_HORIZONTAL</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">50</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxSUNKEN_BORDER</property>
<event name="OnChar"></event>
<event name="OnCommandScroll"></event>
<event name="OnCommandScrollBottom"></event>
<event name="OnCommandScrollChanged"></event>
<event name="OnCommandScrollLineDown"></event>
<event name="OnCommandScrollLineUp"></event>
<event name="OnCommandScrollPageDown"></event>
<event name="OnCommandScrollPageUp"></event>
<event name="OnCommandScrollThumbRelease"></event>
<event name="OnCommandScrollThumbTrack"></event>
<event name="OnCommandScrollTop"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnScroll"></event>
<event name="OnScrollBottom"></event>
<event name="OnScrollChanged"></event>
<event name="OnScrollLineDown"></event>
<event name="OnScrollLineUp"></event>
<event name="OnScrollPageDown"></event>
<event name="OnScrollPageUp"></event>
<event name="OnScrollThumbRelease"></event>
<event name="OnScrollThumbTrack"></event>
<event name="OnScrollTop"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Bound_type:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">stext2</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">minbound_choice</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnChoice"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Emax:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">stext3</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxSlider" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maxValue">100</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="minValue">0</property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">max_slider</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxSL_HORIZONTAL</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">50</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxSUNKEN_BORDER</property>
<event name="OnChar"></event>
<event name="OnCommandScroll"></event>
<event name="OnCommandScrollBottom"></event>
<event name="OnCommandScrollChanged"></event>
<event name="OnCommandScrollLineDown"></event>
<event name="OnCommandScrollLineUp"></event>
<event name="OnCommandScrollPageDown"></event>
<event name="OnCommandScrollPageUp"></event>
<event name="OnCommandScrollThumbRelease"></event>
<event name="OnCommandScrollThumbTrack"></event>
<event name="OnCommandScrollTop"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnScroll"></event>
<event name="OnScrollBottom"></event>
<event name="OnScrollChanged"></event>
<event name="OnScrollLineDown"></event>
<event name="OnScrollLineUp"></event>
<event name="OnScrollPageDown"></event>
<event name="OnScrollPageUp"></event>
<event name="OnScrollThumbRelease"></event>
<event name="OnScrollThumbTrack"></event>
<event name="OnScrollTop"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Bound_type:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">stext4</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">maxbound_choice</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnChoice"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="name">Fit Data</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">fit_button</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnButtonClick"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -1,645 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="11" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file"></property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="internationalize">0</property>
<property name="name">MyProject2</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Panel" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size"></property>
<property name="name">MyPanel2</property>
<property name="pos"></property>
<property name="size">-1,-1</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
<event name="OnAuiFindManager"></event>
<event name="OnAuiPaneButton"></event>
<event name="OnAuiPaneClose"></event>
<event name="OnAuiPaneMaximize"></event>
<event name="OnAuiPaneRestore"></event>
<event name="OnAuiRender"></event>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnInitDialog"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">main_sizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">hsizer1</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Band Index:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">band_label</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxComboBox" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">band_cbox</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">-1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">Combo!</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCombobox"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Spin Index:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">spin_label</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxComboBox" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices"></property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">spin_cbox</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">-1</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value">Combo!</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnChar"></event>
<event name="OnCombobox"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnText"></event>
<event name="OnTextEnter"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="0">
<property name="minimum_size"></property>
<property name="name">hsizer2</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Kpoint:</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">kpoint_label</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
<object class="sizeritem" expanded="0">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">1</property>
<object class="wxListCtrl" expanded="0">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">kpoint_listctrl</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style">wxLC_ICON</property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxSUNKEN_BORDER</property>
<event name="OnChar"></event>
<event name="OnEnterWindow"></event>
<event name="OnEraseBackground"></event>
<event name="OnKeyDown"></event>
<event name="OnKeyUp"></event>
<event name="OnKillFocus"></event>
<event name="OnLeaveWindow"></event>
<event name="OnLeftDClick"></event>
<event name="OnLeftDown"></event>
<event name="OnLeftUp"></event>
<event name="OnListBeginDrag"></event>
<event name="OnListBeginLabelEdit"></event>
<event name="OnListBeginRDrag"></event>
<event name="OnListCacheHint"></event>
<event name="OnListColBeginDrag"></event>
<event name="OnListColClick"></event>
<event name="OnListColDragging"></event>
<event name="OnListColEndDrag"></event>
<event name="OnListColRightClick"></event>
<event name="OnListDeleteAllItems"></event>
<event name="OnListDeleteItem"></event>
<event name="OnListEndLabelEdit"></event>
<event name="OnListInsertItem"></event>
<event name="OnListItemActivated"></event>
<event name="OnListItemDeselected"></event>
<event name="OnListItemFocused"></event>
<event name="OnListItemMiddleClick"></event>
<event name="OnListItemRightClick"></event>
<event name="OnListItemSelected"></event>
<event name="OnListKeyDown"></event>
<event name="OnMiddleDClick"></event>
<event name="OnMiddleDown"></event>
<event name="OnMiddleUp"></event>
<event name="OnMotion"></event>
<event name="OnMouseEvents"></event>
<event name="OnMouseWheel"></event>
<event name="OnPaint"></event>
<event name="OnRightDClick"></event>
<event name="OnRightDown"></event>
<event name="OnRightUp"></event>
<event name="OnSetFocus"></event>
<event name="OnSize"></event>
<event name="OnUpdateUI"></event>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

View File

@ -1,51 +0,0 @@
"""This module import all WxWidgets applications provides by Abipy in a single namespace."""
from .events import wxapp_events
from .browser import wxapp_dirbrowser, wxapp_listbrowser
from .scissors import wxapp_scissors
from .wfkviewer import wxapp_wfkviewer
from .sigresviewer import wxapp_sigresviewer
from .comparison import wxapp_comparison
from .editor import wxapp_showfiles
from .converter import wxapp_converter
from .structure import wxapp_structure_converter
from .fftprof import wxapp_fftprof
from .flowviewer import wxapp_flow_viewer
from .gsrviewer import wxapp_gsrviewer
from .mdfviewer import wxapp_mdfviewer
from .wxncview import wxapp_ncview
#from .oncvgui import wxapp_oncvpsp
from .phbstviewer import wxapp_phbstviewer
# Map abinit file extensions to WX Applications.
_EXT2APP = {
"WFK-etsf.nc": wxapp_wfkviewer,
"SIGRES.nc": wxapp_sigresviewer,
"GSR.nc": wxapp_gsrviewer,
"MDF.nc": wxapp_mdfviewer,
"PHBST.nc": wxapp_phbstviewer,
#".abi": MyEditorApp,
#".abo": MyEditorApp,
#".log": MyEditorApp,
#".sh": MyEditorApp,
#".err": MyEditorApp,
#".files": MyEditorApp,
}
def file2appcls(filepath):
import os
ext = filepath.split("_")[-1]
try:
return _EXT2APP[ext]
except KeyError:
root, ext = os.path.splitext(filepath)
try:
return _EXT2APP[ext]
except KeyError:
# No frame registered for the file.
# Open NcViewer if we have a netcdf file else None
if filepath.endswith(".nc"): return wxapp_ncview
return None

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@ pygments
ipywidgets
networkx
scikit-image
python-graphviz #graphviz or python-graphviz if conda
#python-graphviz #graphviz or python-graphviz if conda
phonopy
ase

View File

@ -91,7 +91,6 @@ def find_package_data():
"sio2_screening/*",
"znse_phonons/*",
],
#'abipy.gui.awx': ['images/*'],
}
return package_data