Rm abipy.gui
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -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 *
|
|
@ -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
|
|
@ -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)
|
|
@ -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()
|
|
@ -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)
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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)
|
||||
|
|
@ -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()
|
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 772 B |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 1.5 KiB |
|
@ -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()
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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)
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
from abipy.gui.wxapps import wxapp_converter
|
||||
|
||||
wxapp_converter().MainLoop()
|
|
@ -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()
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
import abipy.gui.wxapps as wxapps
|
||||
|
||||
wxapps.wxapp_fftprof().MainLoop()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
||||
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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()
|
|
@ -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())
|
|
@ -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()
|
|
@ -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
|
|
@ -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()
|
|
@ -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()
|
|
@ -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)
|
|
@ -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()
|
|
@ -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
|
||||
|
|
@ -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()
|
2853
abipy/gui/oncvgui.py
|
@ -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)
|
|
@ -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]
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|