.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "_examples/25-intermediate/01-queries.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download__examples_25-intermediate_01-queries.py>`
        to download the full example code

.. rst-class:: sphx-glr-example-title

.. _sphx_glr__examples_25-intermediate_01-queries.py:


.. _ref_queries_example:

Queries
=======

A query is basically a collection of x,y values. In addition to the raw
values, each point is potentially a location in 3D space and a notion of
"gaps" between values. In most cases, a query is drawn as a line on
an EnSight plotter object. It can also be drawn as points and,
using the "gaps", as a collection of independent line groups.

The X and Y values can be sampled variable values and the 'X' value
can be time or a distance along the line tool or a 1D part.  This example
makes time and line tool queries, and results are displayed
on plotter objects. The query values can be manipulated with tools
like NumPy.

.. GENERATED FROM PYTHON SOURCE LINES 22-26

Start an EnSight session
------------------------
Launch and connect to an instance of EnSight.
This example uses a local EnSight installation.

.. GENERATED FROM PYTHON SOURCE LINES 26-33

.. code-block:: default


    from ansys.pyensight.core import LocalLauncher
    import numpy as np

    session = LocalLauncher().start()



.. GENERATED FROM PYTHON SOURCE LINES 34-41

Load the data
-------------
This code uses a remote session to load a simple time-varying dataset of
waterflow over a break. It loads the data and displays the ``p`` variable
and element lines on the 3D part.

.. image:: /_static/01_queries_0.png

.. GENERATED FROM PYTHON SOURCE LINES 41-67

.. code-block:: default


    session.load_example("waterbreak.ens")
    # Get the core part and variable objects
    var = session.ensight.objs.core.VARIABLES["p"][0]
    part = session.ensight.objs.core.PARTS["default_region"][0]
    # Isolate the 3D part "default_region" and display it at
    # solution time 0.7, coloring it by the 'p' variable.
    session.ensight.objs.core.PARTS.set_attr("VISIBLE", False)
    part.VISIBLE = True
    part.ELTREPRESENTATION = session.ensight.objs.enums.BORD_FULL
    part.COLORBYPALETTE = var
    session.ensight.objs.core.SOLUTIONTIME = 0.7
    session.ensight.objs.core.HIDDENLINE_USE_RGB = True
    session.ensight.objs.core.HIDDENLINE = True
    # Rotate the view a bit
    session.ensight.view_transf.rotate(-66.5934067, 1.71428561, 0)
    session.ensight.view_transf.rotate(18.0219765, -31.6363659, 0)
    session.ensight.view_transf.rotate(-4.83516455, 9.5064888, 0)
    session.ensight.view_transf.zoom(0.740957975)
    session.ensight.view_transf.zoom(0.792766333)
    session.ensight.view_transf.translate(0.0719177574, 0.0678303316, 0)
    session.ensight.view_transf.rotate(4.83516455, 3.42857122, 0)
    # Display it
    session.show("image", width=800, height=600)



.. GENERATED FROM PYTHON SOURCE LINES 68-75

Create a query using the line tool
----------------------------------
Create a "Pressure vs Distance" query by sampling a line segment using
the :func:`line_loc<ansys.api.pyensight.ensight_api.query_ent_var.line_loc>`
method to set the endpoints. This is a "generated" query that samples the
selected variable on the selected part at 20 points over the length of the
line segment.

.. GENERATED FROM PYTHON SOURCE LINES 75-99

.. code-block:: default


    session.ensight.part.select_begin(part.PARTNUMBER)
    session.ensight.query_ent_var.begin()
    session.ensight.query_ent_var.description("Pressure vs Distance")
    session.ensight.query_ent_var.query_type("generated")
    session.ensight.query_ent_var.number_of_sample_pts(20)
    session.ensight.query_ent_var.constrain("line_tool")
    session.ensight.query_ent_var.line_loc(1, 0.00, 0.075, 0.0)
    session.ensight.query_ent_var.line_loc(2, 0.58, 0.075, 0.0)
    session.ensight.query_ent_var.distance("arc_length")
    session.ensight.query_ent_var.variable_1(var.DESCRIPTION)
    session.ensight.query_ent_var.generate_over("distance")
    session.ensight.query_ent_var.variable_2("DISTANCE")
    session.ensight.query_ent_var.end()
    session.ensight.query_ent_var.query()
    # This is an interesting trick.  The above code uses the
    # 'native' command bindings.  We would like to be able to
    # use the query object.  EnSight object 'values' are monotonically
    # increasing numbers. Thus, the 'max()' operation on a list
    # of EnSight objects will return the most recently created one.
    line_query = max(session.ensight.objs.core.QUERIES)
    print(line_query, line_query.QUERY_DATA["xydata"])



.. GENERATED FROM PYTHON SOURCE LINES 100-109

Display the query on a plotter
------------------------------
Queries can be shown on a "plotter". The plotter defines a set of axes
and various display features. This code creates a plotter is adds the query
to this plotter. It then override many of the plotter visual features.
For example, it sets the axes scaling explicitly, creates a background grid,
and adjusts the display of the axis text.

.. image:: /_static/01_queries_1.png

.. GENERATED FROM PYTHON SOURCE LINES 109-130

.. code-block:: default


    line_plot = session.ensight.objs.core.defaultplot[0].createplotter()
    line_query.addtoplot(line_plot)
    line_plot.rescale()
    line_plot.PLOTTITLE = f"{var.DESCRIPTION} vs Distance"
    line_plot.AXISXTITLE = "Distance"
    line_plot.AXISYTITLE = var.DESCRIPTION
    line_plot.LEGENDVISIBLE = False
    line_plot.AXISXAUTOSCALE = False
    line_plot.AXISXMIN = 0.0
    line_plot.AXISXMAX = 0.6
    line_plot.AXISXLABELFORMAT = "%.2f"
    line_plot.AXISXGRIDTYPE = 1
    line_plot.AXISYGRIDTYPE = 1
    line_plot.TIMEMARKER = False
    line_plot.AXISYAUTOSCALE = False
    line_plot.AXISYMIN = -200.0
    line_plot.AXISYMAX = 2200.0
    session.show("image", width=800, height=600)



.. GENERATED FROM PYTHON SOURCE LINES 131-139

Query element values over time
------------------------------
EnSight can query specific points, nodes, and elements over all timesteps.
The result is a query with ``time`` as the X axis. This code select three elements
at the start of the break and then generates three probes (so the specific
sampling points can be seen). While these probes are not strictly needed,
they help make the location of the query more obvious. Lastly, the code
generate three queries.

.. GENERATED FROM PYTHON SOURCE LINES 139-177

.. code-block:: default


    elem_ids = [134, 398, 662]
    session.ensight.part.select_begin(part.PARTNUMBER)
    session.ensight.query_interact.search("exact")
    session.ensight.query_interact.query("element")
    session.ensight.query_interact.number_displayed(3)
    # Create three element probes using preselected element numbers
    for id in elem_ids:
        session.ensight.query_interact.create(id)
    # Make the probe locations a bit more visible
    session.ensight.objs.core.PROBES[0].LABELALWAYSONTOP = True

    # Make three queries. Again, a generated query but with
    # "time" as "variable 2" and specific simulation start and
    # end times specified
    session.ensight.part.select_begin(part.PARTNUMBER)
    elem_queries = []
    for id in elem_ids:
        session.ensight.query_ent_var.begin()
        session.ensight.query_ent_var.description(f"{id}")
        session.ensight.query_ent_var.query_type("generated")
        session.ensight.query_ent_var.number_of_sample_pts(20)
        session.ensight.query_ent_var.begin_simtime(0)
        session.ensight.query_ent_var.end_simtime(1)
        session.ensight.query_ent_var.constrain("element")
        session.ensight.query_ent_var.sample_by("value")
        session.ensight.query_ent_var.variable_1(var.DESCRIPTION)
        session.ensight.query_ent_var.elem_id(id)
        session.ensight.query_ent_var.generate_over("time")
        session.ensight.query_ent_var.variable_2("TIME")
        session.ensight.query_ent_var.update_with_newtimesteps("ON")
        session.ensight.query_ent_var.end()
        session.ensight.query_ent_var.query()
        # Just like before, grab the query objects.
        elem_queries.append(max(session.ensight.objs.core.QUERIES))
    print(elem_queries)



.. GENERATED FROM PYTHON SOURCE LINES 178-184

Plot the element queries
------------------------
This code creates another plotter and adds each query to this new plotter.
It then plays back the result as an MPEG4 animation.

.. image:: /_static/01_queries_2.png

.. GENERATED FROM PYTHON SOURCE LINES 184-198

.. code-block:: default


    elem_plot = session.ensight.objs.core.defaultplot[0].createplotter(
        xtitle="Time", ytitle=var.DESCRIPTION
    )
    for query in elem_queries:
        query.addtoplot(elem_plot)
    elem_plot.rescale()
    elem_plot.PLOTTITLE = "Elements vs Time"
    elem_plot.AXISXLABELFORMAT = "%.1f"
    elem_plot.AXISXGRIDTYPE = 1
    elem_plot.AXISYGRIDTYPE = 1
    session.show("animation", width=800, height=600, fps=5)



.. GENERATED FROM PYTHON SOURCE LINES 199-208

Manipulate a query using NumPy
------------------------------
The ``QUERY_DATA`` attribute provides access to the raw query data. This code
accesses the raw data and uses the NumPy polynomial curve-fitting
functions to approximate the data. It then creates a "data" query
(not generated) that is filled in with the newly created query. Lastly, it
gets the query object and adds it to the existing plot.

.. image:: /_static/01_queries_3.png

.. GENERATED FROM PYTHON SOURCE LINES 208-220

.. code-block:: default


    session.ensight.objs.core.SOLUTIONTIME = 0.7
    data = np.array(line_query.QUERY_DATA["xydata"])
    fit = np.polyfit(data[:, 0], data[:, 1], 6)
    new_y = np.polyval(fit, data[:, 0])
    data[:, 1] = new_y
    session.ensight.query_xy_create("curvefit", "fit", "Distance", data.tolist())
    fit_query = max(session.ensight.objs.core.QUERIES)
    fit_query.addtoplot(line_plot)
    session.show("remote")



.. GENERATED FROM PYTHON SOURCE LINES 221-224

Close the session
-----------------
Close the connection and shut down the EnSight instance.

.. GENERATED FROM PYTHON SOURCE LINES 224-227

.. code-block:: default


    # sphinx_gallery_thumbnail_path = '_static/01_queries_3.png'
    session.close()


.. rst-class:: sphx-glr-timing

   **Total running time of the script:** ( 0 minutes  0.000 seconds)


.. _sphx_glr_download__examples_25-intermediate_01-queries.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example




    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: 01-queries.py <01-queries.py>`

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: 01-queries.ipynb <01-queries.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_