From 23b6d7f1cc146e6b0da0805c38442ef099fa71a3 Mon Sep 17 00:00:00 2001 From: Martyn Gigg <martyn.gigg@stfc.ac.uk> Date: Thu, 19 Jan 2012 16:11:25 +0000 Subject: [PATCH] Refs #4411. Something now resembling documentation. The API bits need a some tidy up but they are at least there and can be searched. --- Code/Mantid/MantidPlot/CMakeLists.txt | 5 + Code/Mantid/MantidPlot/docs/CMakeLists.txt | 4 + .../MantidPlot/docs/python/CMakeLists.txt | 49 ++++++---- .../MantidPlot/docs/python/autogen_api.py.in | 92 +++++++++++++++--- .../MantidPlot/docs/python/runsphinx.py.in | 21 ++++ .../docs/python/source/_static/Mantid.png | Bin 0 -> 6783 bytes .../_static/Mantid_Logo_Transparent.png | Bin 0 -> 12070 bytes .../source/_templates/indexcontent.html | 45 +++++++++ .../source/_templates/indexsidebar.html | 6 ++ .../docs/python/source/_templates/layout.html | 10 ++ .../docs/python/source/api/mantid.rst | 12 +-- .../docs/python/source/api/mantidplot.rst | 9 ++ .../MantidPlot/docs/python/source/conf.py.in | 15 ++- .../MantidPlot/docs/python/source/index.rst | 1 + Code/Mantid/MantidPlot/mantidplot.py | 38 +++----- .../MantidPlot/src/ApplicationWindow.cpp | 26 ++++- .../Mantid/MantidPlot/src/ApplicationWindow.h | 2 +- Code/Mantid/MantidPlot/src/PythonScript.cpp | 7 ++ .../Mantid/MantidPlot/src/PythonScripting.cpp | 11 ++- .../MantidPlot/src/ScriptManagerWidget.cpp | 21 ++-- .../MantidPlot/src/ScriptManagerWidget.h | 5 +- .../Mantid/MantidPlot/src/ScriptingWindow.cpp | 7 +- Code/Mantid/MantidPlot/src/ScriptingWindow.h | 5 +- 23 files changed, 295 insertions(+), 96 deletions(-) create mode 100644 Code/Mantid/MantidPlot/docs/CMakeLists.txt create mode 100644 Code/Mantid/MantidPlot/docs/python/runsphinx.py.in create mode 100644 Code/Mantid/MantidPlot/docs/python/source/_static/Mantid.png create mode 100644 Code/Mantid/MantidPlot/docs/python/source/_static/Mantid_Logo_Transparent.png create mode 100644 Code/Mantid/MantidPlot/docs/python/source/_templates/indexcontent.html create mode 100644 Code/Mantid/MantidPlot/docs/python/source/_templates/indexsidebar.html create mode 100644 Code/Mantid/MantidPlot/docs/python/source/_templates/layout.html create mode 100644 Code/Mantid/MantidPlot/docs/python/source/api/mantidplot.rst diff --git a/Code/Mantid/MantidPlot/CMakeLists.txt b/Code/Mantid/MantidPlot/CMakeLists.txt index 8195878f55a..579a47f0ddb 100644 --- a/Code/Mantid/MantidPlot/CMakeLists.txt +++ b/Code/Mantid/MantidPlot/CMakeLists.txt @@ -810,6 +810,11 @@ add_custom_command ( TARGET MantidPlot POST_BUILD ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/ipython_plugin ) +########################################################################### +# Documentation targets +########################################################################### +add_subdirectory( docs ) + ########################################################################### # MantidPlot Python Unit Tests ########################################################################### diff --git a/Code/Mantid/MantidPlot/docs/CMakeLists.txt b/Code/Mantid/MantidPlot/docs/CMakeLists.txt new file mode 100644 index 00000000000..f14056d397c --- /dev/null +++ b/Code/Mantid/MantidPlot/docs/CMakeLists.txt @@ -0,0 +1,4 @@ +########################################################################### +# Add each directory +########################################################################### +add_subdirectory( python ) diff --git a/Code/Mantid/MantidPlot/docs/python/CMakeLists.txt b/Code/Mantid/MantidPlot/docs/python/CMakeLists.txt index 203801a22be..97f43948600 100644 --- a/Code/Mantid/MantidPlot/docs/python/CMakeLists.txt +++ b/Code/Mantid/MantidPlot/docs/python/CMakeLists.txt @@ -6,30 +6,41 @@ find_package ( Sphinx ) if ( SPHINX_FOUND ) - # Fill in the config file and autogen file - configure_file ( conf.py.in conf.py @ONLY ) + # Fill in the config file and autogen file with build information + configure_file ( source/conf.py.in source/conf.py @ONLY ) configure_file ( autogen_api.py.in autogen_api.py @ONLY ) - - # These files need to be relative to the conf.py file - add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/index.rst - COMMAND ${CMAKE_COMMAND} ARGS -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/index.rst ${CMAKE_CURRENT_BINARY_DIR}/index.rst - COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/api ${CMAKE_CURRENT_BINARY_DIR}/api - COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/_static ${CMAKE_CURRENT_BINARY_DIR}/_static - COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/_templates ${CMAKE_CURRENT_BINARY_DIR}/_templates - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/conf.py + configure_file ( runsphinx.py.in runsphinx.py @ONLY ) + + # Sphinx seems to require the config file to be next to the rest of the source + # files meaning we need to copy everything over to the build directory + set ( SPHINX_SOURCE + source/index.rst + source/api/mantid.rst + source/api/mantidplot.rst + source/_templates/indexcontent.html + source/_templates/indexsidebar.html + source/_templates/layout.html ) + + # The destination for the copied files + set ( SPHINX_CONF_DIR ${CMAKE_CURRENT_BINARY_DIR} ) + set ( SPHINX_CONF_FILES ) + foreach( file ${SPHINX_SOURCE} ) + set ( out_file ${SPHINX_CONF_DIR}/${file} ) + add_custom_command ( OUTPUT ${out_file} + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${out_file} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} + ) + set ( SPHINX_CONF_FILES ${SPHINX_CONF_FILES} ${out_file} ) + endforeach() + set ( SPHINX_HTML_BUILD ${CMAKE_CURRENT_BINARY_DIR}/../../../python-sphinx/html ) # Sphinx is run as '${SPHINX_EXECUTABLE} -b sourcedir builddir' - set ( OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/../../../python-sphinx/html ) add_custom_target ( python-sphinx - COMMAND python autogen_api.py - COMMAND ${SPHINX_EXECUTABLE} -b html ${CMAKE_CURRENT_BINARY_DIR} ${OUTPUT_DIR} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/index.rst + COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/MantidPlot -xq autogen_api.py + COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/MantidPlot -xq runsphinx.py + DEPENDS ${SPHINX_CONF_FILES} COMMENT "Build Python Sphinx API documentation" - ) + ) endif () diff --git a/Code/Mantid/MantidPlot/docs/python/autogen_api.py.in b/Code/Mantid/MantidPlot/docs/python/autogen_api.py.in index fdb134dfe36..5a7857910f2 100755 --- a/Code/Mantid/MantidPlot/docs/python/autogen_api.py.in +++ b/Code/Mantid/MantidPlot/docs/python/autogen_api.py.in @@ -5,9 +5,8 @@ import sys import os import inspect -# Append the path to the mantid library +# Append the path to the mantid/mantidplot library sys.path.append("@CMAKE_RUNTIME_OUTPUT_DIRECTORY@") -import mantid #------------------------------------------------------------------------------ @@ -27,7 +26,6 @@ class ClassAPIWriter(object): :inherited-members: """ - def __init__(self, cls, outputdir, extension): if not inspect.isclass(cls): raise TypeError("Expected class type, found %s" % str(type(cls))) @@ -41,6 +39,11 @@ class ClassAPIWriter(object): # FQL name could contain '_cmodule' aswell, strip this off modname = self._cls.__module__ + + # Hack for replaceing qti reference with mantidplot ref + if 'qti' in modname: + modname = modname.replace('_qti','mantidplot') + # Build up the module name and don't reference the "private" modules pieces = modname.split('.') fqlmod = '' for p in pieces: @@ -55,26 +58,89 @@ class ClassAPIWriter(object): def filename(self): return self._filename + +class FunctionAPIWriter(object): + """Writes a Sphinx documentation file + for a given function + """ + + _doc_template = \ +"""%(title)s +%(underline)s -if __name__ == '__main__': - extension = '.rst' - apidir = os.path.join(os.path.dirname(__file__), 'api') - output_dir = os.path.join(apidir,'generated') - if not os.path.exists(output_dir): - os.mkdir(output_dir) +.. module:`%(modulename)s` + +.. autofunction:: %(modulename)s.%(function)s + +""" + + def __init__(self, func, outputdir, extension): + if not inspect.isfunction(func): + raise TypeError("Expected function type, found %s" % str(type(cls))) + self._filename = os.path.join(outputdir, func.__name__ + extension) + self._func = func + + def write(self): + rstfile = open(self._filename, 'w') + funcname = self._func.__name__ + underline = '='*len(funcname) # Sphinx doesn't like the title underline being incorrect + # FQL name could contain '_cmodule' aswell, strip this off + modname = self._func.__module__ + # Hack for replaceing qti reference with mantidplot ref + if 'qti' in modname: + modname = modname.replace('_qti','mantidplot') + + # Write the file + rstfile.write(self._doc_template % {'title':funcname, 'underline':underline,\ + 'modulename':modname,'function':funcname}) + rstfile.close() + + def filename(self): + return self._filename + + +def generate_api_doc(module, indexfilename): + """Write the sphinx doc files for a given module + + @param module - The module object + @param indexfilename - A file that will contain an index list of the given files + """ - indexfilename = os.path.join(apidir, 'autogen.txt') indexfile = open(indexfilename, 'w') indexfile.write(".. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n") indexfile.write(".. toctree::\n\n") - print "Generating API docs" - for name, member in inspect.getmembers(mantid): + print "Generating %s API docs" % module.__name__ + for name, member in inspect.getmembers(module): + if name.startswith("_"): continue if inspect.isclass(member): apiwriter = ClassAPIWriter(member, output_dir, extension) + elif inspect.isfunction(member): + apiwriter = FunctionAPIWriter(member, output_dir, extension) else: continue apiwriter.write() indexfile.write(" generated/" + os.path.basename(apiwriter.filename()) + "\n") indexfile.close() - print "Completed autogenerating API docs" + print "Done generating API %s docs" % module.__name__ + +if __name__ == '__main__': + extension = '.rst' + apidir = os.path.join(os.path.dirname(__file__), 'source','api') + output_dir = os.path.join(apidir,'generated') + if not os.path.exists(output_dir): + os.mkdir(output_dir) + + import mantid + indexfilename = os.path.join(apidir, 'automantid.txt') + generate_api_doc(mantid, indexfilename) + try: + import mantidplot + indexfilename = os.path.join(apidir, 'automantidplot.txt') + generate_api_doc(mantidplot, indexfilename) + except: + import warnings + warnings.warn("Unable to import mantidplot. No api documentation will be generated for MantidPlot") + + + diff --git a/Code/Mantid/MantidPlot/docs/python/runsphinx.py.in b/Code/Mantid/MantidPlot/docs/python/runsphinx.py.in new file mode 100644 index 00000000000..228a0545d8d --- /dev/null +++ b/Code/Mantid/MantidPlot/docs/python/runsphinx.py.in @@ -0,0 +1,21 @@ +"""We need to run Sphinx inside MantidPlot to document the internal + module. This script calls the sphinx entry point with the necessary + arguments +""" + +__requires__ = 'Sphinx==1.1.2' +import sys +import os +from pkg_resources import load_entry_point + +mantidplot = "@CMAKE_RUNTIME_OUTPUT_DIRECTORY@/MantidPlot" +builder = "html" +src_dir = "@CMAKE_CURRENT_BINARY_DIR@/source" +output_dir = "@CMAKE_CURRENT_BINARY_DIR@/../../../python-sphinx/" + builder +argv = [mantidplot,'-b', builder, src_dir, output_dir] + +if __name__ == '__main__': + sys.exit( + load_entry_point('Sphinx==1.1.2', 'console_scripts', 'sphinx-build')(argv) + ) + diff --git a/Code/Mantid/MantidPlot/docs/python/source/_static/Mantid.png b/Code/Mantid/MantidPlot/docs/python/source/_static/Mantid.png new file mode 100644 index 0000000000000000000000000000000000000000..4423c49d05e87efedd4c75432e0aaae44d84b01c GIT binary patch literal 6783 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 literal 0 HcmV?d00001 diff --git a/Code/Mantid/MantidPlot/docs/python/source/_static/Mantid_Logo_Transparent.png b/Code/Mantid/MantidPlot/docs/python/source/_static/Mantid_Logo_Transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..247578ebf7aded4b1ea8ff48ab198cfb4224c1c8 GIT binary patch literal 12070 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 R{GZ>ta?(mt)e^?R{{;ihw0Hmj literal 0 HcmV?d00001 diff --git a/Code/Mantid/MantidPlot/docs/python/source/_templates/indexcontent.html b/Code/Mantid/MantidPlot/docs/python/source/_templates/indexcontent.html new file mode 100644 index 00000000000..f2322b6fd65 --- /dev/null +++ b/Code/Mantid/MantidPlot/docs/python/source/_templates/indexcontent.html @@ -0,0 +1,45 @@ +{% extends "defindex.html" %} +{% block tables %} + + <p><strong>Contents:</strong></p> + <table class="contentstable" align="center"><tr> + <td width="50%"> + <p class="biglink"><a class="biglink" href="http://www.mantidproject.org/Python_in_Mantid_Training">Introductary training</a><br/> + <span class="linkdescr">An introduction to Python in Mantid</span></p> + </td><td width="50%"> + <p class="biglink"><a class="biglink" href="{{ pathto("api/mantid") }}">Mantid Framework Reference</a><br/> + <span class="linkdescr">Documents the classes and functions of the Mantid framework</span></p> + <p class="biglink"><a class="biglink" href="{{ pathto("api/mantidplot") }}">MantidPlot Reference</a><br/> + <span class="linkdescr">Documents the classes and functions of MantidPlot</span></p> + </td></tr> + </table> + + <p><strong>Indices and tables:</strong></p> + <table class="contentstable" align="center"><tr> + <td width="50%"> + <p class="biglink"><a class="biglink" href="{{ pathto("py-modindex") }}">Module Index</a><br/> + <span class="linkdescr">quick access to all modules</span></p> + <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">General Index</a><br/> + <span class="linkdescr">all functions, classes, terms</span></p> + <p class="biglink"><a class="biglink" href="{{ pathto("glossary") }}">Glossary</a><br/> + <span class="linkdescr">the most important terms explained</span></p> + </td><td width="50%"> + <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">Search page</a><br/> + <span class="linkdescr">search this documentation</span></p> + <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">Complete Table of Contents</a><br/> + <span class="linkdescr">lists all sections and subsections</span></p> + </td></tr> + </table> + + <p><strong>Useful links:</strong></p> + <table class="contentstable" align="center"><tr> + <td width="50%"> + <p class="biglink"><a class="biglink" href="http://www.mantidproject.org" }}">Mantid project wiki</a><br/> + <span class="linkdescr">Mantid wiki</span></p> + </td><td width="50%"> + <p class="biglink"><a class="biglink" href="http://docs.scipy.org/doc/numpy-1.5.x/user/" }}">Numpy Tutorial</a><br/> + <span class="linkdescr">An introduction to numpy</span></p> + </td></tr> + </table> + +{% endblock %} diff --git a/Code/Mantid/MantidPlot/docs/python/source/_templates/indexsidebar.html b/Code/Mantid/MantidPlot/docs/python/source/_templates/indexsidebar.html new file mode 100644 index 00000000000..309b5904044 --- /dev/null +++ b/Code/Mantid/MantidPlot/docs/python/source/_templates/indexsidebar.html @@ -0,0 +1,6 @@ + <h3>Resources</h3> + <ul> + <li><a href="http://www.mantidproject.org/">Mantid wiki</a></li> + <li> </li> + <li><a href="http://docs.python.org/">Python manual</a></li> + </ul> diff --git a/Code/Mantid/MantidPlot/docs/python/source/_templates/layout.html b/Code/Mantid/MantidPlot/docs/python/source/_templates/layout.html new file mode 100644 index 00000000000..6240cc9016f --- /dev/null +++ b/Code/Mantid/MantidPlot/docs/python/source/_templates/layout.html @@ -0,0 +1,10 @@ +{% extends "default/layout.html" %} + +{%- block sidebarlogo %} +{%- if logo %} + <p class="logo"><a href="{{ pathto(master_doc) }}"> + <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo" width=220 height=110/> + </a></p> +{%- endif %} +{%- endblock %} + diff --git a/Code/Mantid/MantidPlot/docs/python/source/api/mantid.rst b/Code/Mantid/MantidPlot/docs/python/source/api/mantid.rst index 9c5886d1e2b..0d8ad2910ee 100644 --- a/Code/Mantid/MantidPlot/docs/python/source/api/mantid.rst +++ b/Code/Mantid/MantidPlot/docs/python/source/api/mantid.rst @@ -1,13 +1,9 @@ .. _mantid: -################################# - Mantid Python Class Reference -################################# +################################## + Mantid Framework class reference +################################## .. module:: mantid -Some lovely wording here... - -and probably more structure - -.. include:: autogen.txt +.. include:: automantid.txt diff --git a/Code/Mantid/MantidPlot/docs/python/source/api/mantidplot.rst b/Code/Mantid/MantidPlot/docs/python/source/api/mantidplot.rst new file mode 100644 index 00000000000..65d22abaf5b --- /dev/null +++ b/Code/Mantid/MantidPlot/docs/python/source/api/mantidplot.rst @@ -0,0 +1,9 @@ +.. _mantidplot: + +########################## + MantidPlot API reference +########################## + +.. module:: mantidplot + +.. include:: automantidplot.txt diff --git a/Code/Mantid/MantidPlot/docs/python/source/conf.py.in b/Code/Mantid/MantidPlot/docs/python/source/conf.py.in index a3d52ad8d12..b88a2f3af52 100644 --- a/Code/Mantid/MantidPlot/docs/python/source/conf.py.in +++ b/Code/Mantid/MantidPlot/docs/python/source/conf.py.in @@ -107,14 +107,15 @@ html_theme = 'default' # The name for this set of Sphinx documents. If None, it defaults to # "<project> v<release> documentation". -#html_title = None +html_title = "%s v%s Python Manual" % ("Mantid", version) # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None + +html_logo = os.path.relpath('@CMAKE_HOME_DIRECTORY@/Images/Mantid_Logo_Transparent.png') # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 @@ -135,11 +136,15 @@ html_static_path = ['_static'] #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +html_sidebars = { + 'index':'indexsidebar.html' +} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +html_additional_pages = { + 'index':'indexcontent.html' +} # If false, no module index is generated. #html_domain_indices = True @@ -168,7 +173,7 @@ html_use_index = True #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'Mantiddoc' +htmlhelp_basename = 'mantid' # -- Options for LaTeX output -------------------------------------------------- diff --git a/Code/Mantid/MantidPlot/docs/python/source/index.rst b/Code/Mantid/MantidPlot/docs/python/source/index.rst index 03da8571917..4b858d036e5 100644 --- a/Code/Mantid/MantidPlot/docs/python/source/index.rst +++ b/Code/Mantid/MantidPlot/docs/python/source/index.rst @@ -16,6 +16,7 @@ Contents :maxdepth: 1 api/mantid.rst + api/mantidplot.rst Indices and tables ================== diff --git a/Code/Mantid/MantidPlot/mantidplot.py b/Code/Mantid/MantidPlot/mantidplot.py index 0ca9973f9a1..0177ed9f7a0 100644 --- a/Code/Mantid/MantidPlot/mantidplot.py +++ b/Code/Mantid/MantidPlot/mantidplot.py @@ -21,7 +21,7 @@ from _qti import PlotSymbol, ImageSymbol, ArrowMarker, ImageMarker #-------------------------- Mantid Python access functions---------------- # Grab a few Mantid things so that we can recognise workspace variables # While we have 2 APIs we need to figure out which to use so add a little bit of indirection -def get_analysis_data_service(): +def _get_analysis_data_service(): """Returns an object that can be used to get a workspace by name from Mantid Returns: @@ -44,7 +44,7 @@ def workspace(name): Args: name: The name of the workspace in the Analysis Data Service. """ - return get_analysis_data_service()[name] + return _get_analysis_data_service()[name] def table(name): """Get a handle on a table. @@ -217,8 +217,7 @@ def stemPlot(source, index, power=None, startPoint=None, endPoint=None): Args: source: A reference to a workspace or a table. index: For a table, the column number or name. For a workspace, the workspace index. - power: The stem unit as a power of 10. If not provided, a dialog will appear with a - suggested value. + power: The stem unit as a power of 10. If not provided, a dialog will appear with a suggested value. startPoint: The first point (row or bin) to use (Default: the first one). endPoint: The last point (row or bin) to use (Default: the last one). @@ -457,26 +456,17 @@ def plotSlice(source, label="", xydim=None, slicepoint=None, Optional Keyword Args: label :: label for the window title - xydim :: indexes or names of the dimensions to plot, - as an (X,Y) list or tuple. - See SliceViewer::setXYDim() - slicepoint :: list with the slice point in each dimension. Must be the - same length as the number of dimensions of the workspace. - See SliceViewer::setSlicePoint() - colormin :: value of the minimum color in the scale - See SliceViewer::setColorScaleMin() - colormax :: value of the maximum color in the scale - See SliceViewer::setColorScaleMax() - colorscalelog :: value of the maximum color in the scale - See SliceViewer::setColorScaleLog() - limits :: list with the (xleft, xright, ybottom, ytop) limits - to the view to show. - See SliceViewer::setXYLimits() + xydim :: indexes or names of the dimensions to plot, as an (X,Y) list or tuple. See SliceViewer::setXYDim() + slicepoint :: list with the slice point in each dimension. Must be the same length as the number of dimensions of the workspace. See SliceViewer::setSlicePoint() + colormin :: value of the minimum color in the scale. See SliceViewer::setColorScaleMin() + colormax :: value of the maximum color in the scale. See SliceViewer::setColorScaleMax() + colorscalelog :: value of the maximum color in the scale. See SliceViewer::setColorScaleLog() + limits :: list with the (xleft, xright, ybottom, ytop) limits to the view to show. See SliceViewer::setXYLimits() Returns: a (list of) handle(s) to the SliceViewerWindow widgets that were open. - Use SliceViewerWindow.getSlicer() to get access to the functions of the - SliceViewer, e.g. setting the view and slice point. + Use SliceViewerWindow.getSlicer() to get access to the functions of the + SliceViewer, e.g. setting the view and slice point. """ workspace_names = __getWorkspaceNames(source) try: @@ -563,10 +553,6 @@ Layer.Right = _qti.GraphOptions.Right Layer.Bottom = _qti.GraphOptions.Bottom Layer.Top = _qti.GraphOptions.Top - - - - #----------------------------------------------------------------------------- #--------------------------- "Private" functions ----------------------------- #----------------------------------------------------------------------------- @@ -604,7 +590,7 @@ def __getWorkspaceNames(source): else: ws_names.append(wspace.getName()) elif isinstance(source,str): - w = get_analysis_data_service()[source] + w = _get_analysis_data_service()[source] if w != None: names = __getWorkspaceNames(w) for n in names: diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp index f74e11d1f66..8e85e4513d4 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp @@ -10008,7 +10008,7 @@ void ApplicationWindow::addFunctionCurve() Graph* g = plot->activeGraph(); if ( g ) { - FunctionDialog* fd = functionDialog(g); + functionDialog(g); } } @@ -14445,6 +14445,8 @@ void ApplicationWindow::parseCommandLineArguments(const QStringList& args) { exec = true; quit = true; + // Minimize ourselves + this->showMinimized(); } else if (str.startsWith("-") || str.startsWith("--")) { @@ -15935,13 +15937,20 @@ void ApplicationWindow::goToColumn() } } -void ApplicationWindow::showScriptWindow(bool forceVisible) +/** + * Show the script window, creating it if necessary + * @param forceVisible - If true the window is forced to visible rather than toggling + * @param quitting - If true then it is assumed MantidPlot will exit automatically so stdout redirect + * from scripts is disabled. + */ +void ApplicationWindow::showScriptWindow(bool forceVisible, bool quitting) { if( !scriptingWindow ) { // MG 09/02/2010 : Removed parent from scripting window. If it has one then it doesn't respect the always on top // flag, it is treated as a sub window of its parent - scriptingWindow = new ScriptingWindow(scriptingEnv(), NULL); + const bool capturePrint = !quitting; + scriptingWindow = new ScriptingWindow(scriptingEnv(),capturePrint, NULL); scriptingWindow->setObjectName("ScriptingWindow"); scriptingWindow->setAttribute(Qt::WA_DeleteOnClose, false); connect(scriptingWindow, SIGNAL(closeMe()), this, SLOT(saveScriptWindowGeometry())); @@ -15954,7 +15963,14 @@ void ApplicationWindow::showScriptWindow(bool forceVisible) { scriptingWindow->resize(d_script_win_size); scriptingWindow->move(d_script_win_pos); - scriptingWindow->show(); + if( quitting ) + { + scriptingWindow->showMinimized(); + } + else + { + scriptingWindow->show(); + } scriptingWindow->setFocus(); } else @@ -16121,7 +16137,7 @@ ApplicationWindow * ApplicationWindow::loadScript(const QString& fn, bool execut QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); setScriptingLanguage("Python"); restoreApplicationGeometry(); - showScriptWindow(); + showScriptWindow(false, quit); scriptingWindow->open(fn, false); QApplication::restoreOverrideCursor(); if (execute) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.h b/Code/Mantid/MantidPlot/src/ApplicationWindow.h index 66c1d722f84..67270d924aa 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.h +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.h @@ -728,7 +728,7 @@ public slots: //! Connected to the context menu signal from lv; it's called when there are no items selected in the list void showListViewPopupMenu(const QPoint &p); - void showScriptWindow(bool forceVisible = false); + void showScriptWindow(bool forceVisible = false, bool quitting = false); void saveScriptWindowGeometry(); void showScriptInterpreter(); bool testForIPython(); diff --git a/Code/Mantid/MantidPlot/src/PythonScript.cpp b/Code/Mantid/MantidPlot/src/PythonScript.cpp index 86ab6dc7ff6..36613b596f5 100644 --- a/Code/Mantid/MantidPlot/src/PythonScript.cpp +++ b/Code/Mantid/MantidPlot/src/PythonScript.cpp @@ -96,6 +96,12 @@ PythonScript::PythonScript(PythonScripting *env, const QString &code, QObject *c GILHolder gil; PyObject *pymodule = PyImport_AddModule("__main__"); localDict = PyDict_Copy(PyModule_GetDict(pymodule)); + if( QFileInfo(Name).exists() ) + { + QString scriptPath = QFileInfo(Name).absoluteFilePath(); + // Make sure the __file__ variable is set + PyDict_SetItem(localDict,PyString_FromString("__file__"), PyString_FromString(scriptPath.toAscii().data())); + } setQObject(Context, "self"); updatePath(Name, true); @@ -675,6 +681,7 @@ void PythonScript::beginStdoutRedirect() */ void PythonScript::endStdoutRedirect() { + GILHolder gil; // Aqcuire the GIL PyDict_SetItemString(env()->sysDict(), "stdout", stdoutSave); Py_XDECREF(stdoutSave); diff --git a/Code/Mantid/MantidPlot/src/PythonScripting.cpp b/Code/Mantid/MantidPlot/src/PythonScripting.cpp index b81ab369906..a34667d66c8 100644 --- a/Code/Mantid/MantidPlot/src/PythonScripting.cpp +++ b/Code/Mantid/MantidPlot/src/PythonScripting.cpp @@ -184,7 +184,6 @@ bool PythonScripting::start() //Get the refresh protection flag Mantid::Kernel::ConfigService::Instance().getValue("pythonalgorithms.refresh.allowed", refresh_allowed); - if( loadInitFile(mantidbin.absoluteFilePath("mantidplotrc.py")) ) { d_initialized = true; @@ -193,18 +192,22 @@ bool PythonScripting::start() { d_initialized = false; } - return d_initialized; } catch(std::exception & ex) { std::cerr << "Exception in PythonScripting.cpp: " << ex.what() << std::endl; - return false; + d_initialized = false; } catch(...) { std::cerr << "Exception in PythonScripting.cpp" << std::endl; - return false; + d_initialized = false; } + // Reset the stdout/err printers + PyDict_SetItemString(m_sys, "stdout",PyDict_GetItemString(m_sys, "__stdout__")); + PyDict_SetItemString(m_sys, "stderr",PyDict_GetItemString(m_sys, "__stderr__")); + + return d_initialized; } /** diff --git a/Code/Mantid/MantidPlot/src/ScriptManagerWidget.cpp b/Code/Mantid/MantidPlot/src/ScriptManagerWidget.cpp index 051c9635e1d..b4722275e3f 100644 --- a/Code/Mantid/MantidPlot/src/ScriptManagerWidget.cpp +++ b/Code/Mantid/MantidPlot/src/ScriptManagerWidget.cpp @@ -40,10 +40,10 @@ /** * Constructor */ -ScriptManagerWidget::ScriptManagerWidget(ScriptingEnv *env, QWidget *parent, bool interpreter_mode) +ScriptManagerWidget::ScriptManagerWidget(ScriptingEnv *env, QWidget *parent, bool interpreter_mode, bool capturePrint) : QTabWidget(parent), Scripted(env), m_last_dir(""), m_script_runners(), m_cursor_pos(), m_findrep_dlg(NULL), - m_interpreter_mode(interpreter_mode) + m_interpreter_mode(interpreter_mode), m_recentScriptList(), m_capturePrint(capturePrint) { //Create actions for this widget initActions(); @@ -1062,11 +1062,18 @@ void ScriptManagerWidget::open(bool newtab, const QString & filename) Script * ScriptManagerWidget::createScriptRunner(ScriptEditor *editor) { Script *script = scriptingEnv()->newScript("", this, editor->fileName(), true, - m_toggle_progress->isChecked()); - // Connect the signals that print output and error messages to the formatting functions - connect(script, SIGNAL(print(const QString &)), this, SLOT(displayOutput(const QString &))); - connect(script, SIGNAL(error(const QString &, const QString&, int)), this, - SLOT(displayError(const QString &))); + m_toggle_progress->isChecked()); + if( m_capturePrint ) + { + // Connect the signals that print output and error messages to the formatting functions + connect(script, SIGNAL(print(const QString &)), this, SLOT(displayOutput(const QString &))); + connect(script, SIGNAL(error(const QString &, const QString&, int)), this, + SLOT(displayError(const QString &))); + } + else + { + script->redirectStdOut(false); + } if( editor ) { connect(script, SIGNAL(keywordsChanged(const QStringList&)), editor, diff --git a/Code/Mantid/MantidPlot/src/ScriptManagerWidget.h b/Code/Mantid/MantidPlot/src/ScriptManagerWidget.h index d03912a6695..8f1409f9d1a 100644 --- a/Code/Mantid/MantidPlot/src/ScriptManagerWidget.h +++ b/Code/Mantid/MantidPlot/src/ScriptManagerWidget.h @@ -62,7 +62,7 @@ class ScriptManagerWidget : public QTabWidget, Scripted public: /// Constructor - ScriptManagerWidget(ScriptingEnv *env, QWidget *parent, bool interpreter_mode = false); + ScriptManagerWidget(ScriptingEnv *env, QWidget *parent, bool interpreter_mode = false, bool capturePrint = true); ///Destructor ~ScriptManagerWidget(); ///Save settings applicable to the manager @@ -244,6 +244,8 @@ private: bool m_interpreter_mode; ///list storing the recent scripts QStringList m_recentScriptList; + /// Flag to indicate whether stdout should be redirected + bool m_capturePrint; /// enum used for maximum of recent scripts size enum {MaxRecentScripts = 5}; }; @@ -314,7 +316,6 @@ private: /// If a find is in progress bool m_find_inprogress; - }; diff --git a/Code/Mantid/MantidPlot/src/ScriptingWindow.cpp b/Code/Mantid/MantidPlot/src/ScriptingWindow.cpp index bab4640a463..3fec164e2f0 100755 --- a/Code/Mantid/MantidPlot/src/ScriptingWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ScriptingWindow.cpp @@ -257,12 +257,13 @@ void ScriptOutputDock::resetFont() * @param parent :: The parent widget * @param flags :: Window flags passed to the base class */ -ScriptingWindow::ScriptingWindow(ScriptingEnv *env,QWidget *parent, Qt::WindowFlags flags) : +ScriptingWindow::ScriptingWindow(ScriptingEnv *env, bool capturePrint, QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), m_acceptClose(false) { setObjectName("MantidScriptWindow"); // Sub-widgets - m_manager = new ScriptManagerWidget(env, this); + const bool interpreterMode(false); + m_manager = new ScriptManagerWidget(env, this, interpreterMode, capturePrint); setCentralWidget(m_manager); m_output_dock = new ScriptOutputDock(QString(), m_manager, this); m_output_dock->setScriptIsRunning(false); @@ -279,7 +280,7 @@ ScriptingWindow::ScriptingWindow(ScriptingEnv *env,QWidget *parent, Qt::WindowFl QSettings settings; settings.beginGroup("/ScriptWindow"); QString lastdir = settings.value("LastDirectoryVisited", "").toString(); - // If nothgin, set the last directory to the Mantid scripts directory (if present) + // If nothing, set the last directory to the Mantid scripts directory (if present) if( lastdir.isEmpty() ) { lastdir = QString::fromStdString(Mantid::Kernel::ConfigService::Instance().getString("pythonscripts.directory")); diff --git a/Code/Mantid/MantidPlot/src/ScriptingWindow.h b/Code/Mantid/MantidPlot/src/ScriptingWindow.h index 4856996a442..454279341ab 100755 --- a/Code/Mantid/MantidPlot/src/ScriptingWindow.h +++ b/Code/Mantid/MantidPlot/src/ScriptingWindow.h @@ -107,13 +107,13 @@ class ScriptingWindow : public QMainWindow public: ///Constructor - ScriptingWindow(ScriptingEnv *env,QWidget *parent = 0, Qt::WindowFlags flags = 0); + ScriptingWindow(ScriptingEnv *env,bool capturePrint = true,QWidget *parent = 0, Qt::WindowFlags flags = 0); ///Destructor ~ScriptingWindow(); /// Override the closeEvent void closeEvent(QCloseEvent *event); /// Override the showEvent - void showEvent(QShowEvent *event); + void showEvent(QShowEvent *event); /// Is a script running? bool isScriptRunning() const; ///Save the current state of the script window for next time @@ -177,7 +177,6 @@ private: QAction *m_scripting_lang; /// Flag to define whether we should accept a close event bool m_acceptClose; - }; #endif //SCRIPTINGWINDOW_H_ -- GitLab