**This is a large update which includes an overhaul of much of the `core` module.** Please note that not all of the features
have yet been re-implemented from ``v2.0.0-alpha.22``. The features which have been successfully tested in this new version are the following:
- Geometry load/save
- Object creation/deletion
- Constraint addition
- Param/``DesVar`` promotion/demotion
- XFOIL analysis
- MSES analysis
- XFOIL optimization
New installation method
- pymead is now available via ``pip`` (see [here](https://pypi.org/project/pymead/))
New functionality/API changes
- The ``pymead.core.point.Point`` is the now the fundamental object in pymead (rather than ``pymead.core.airfoil.Airfoil``)
- All the main objects in pymead now subclass ``pymead.core.pymead_obj.PymeadObj``, which stores both canvas (previously called AirfoilGraph) and tree GUI items, as well as sets the default behavior for renaming objects in pymead.
- All updates from the GUI (whether from the parameter tree or from the geometry canvas) first get passed to the API. Any updates to the underlying Python objects are then passed to both the tree and the canvas. Re-structuring the architecture this way makes the code more compact and easier to debug.
- A new abstract class called ``pymead.core.constraints.GeoCon`` now houses the equations for each type of geometric constraint
- A new class called ``pymead.core.constraint_graph.ConstraintGraph`` holds the logic for solving the non-linear system of equations describing each connected set of constraints. This system of equations is solved using numerical root-finding, with automatic-differentiation (Jacobian calculation) and just-in-time compilation used to enhance robustness and speed, respectively. A network analysis is used to create this system of equations, with "weak" constraints added as needed to make the geometric system fully constrained. Over-constraining the system causes an error to be raised. This network analysis is not yet fully complete, but it has been shown to work in a number of cases. The ``set_value`` method in ``pymead.core.param.Param`` no longer calls a recursive set of calls to ``set_value`` of all dependent parameters, but rather solves this equation set if necessary (and then updates the points)
- Airfoils can now be created as arbitrary combinations of Bezier curves and lines. The action to create an airfoil only requires the selection of the leading edge and trailing edge point, at a minimum
- In optimization, the main object now used to vary the geometric shapes is the ``pymead.core.param.DesVar``. Parameters can be promoted to these design variables in the GUI using the context menu. Promoting a parameter to a design variable automatically adds reasonable parameter bounds. These bounds are currently not modifiable, but they will be in the next pymead update
New features
- A show/hide action has been added to the "View" menu to show or hide all/selected pymead objects in the canvas
Aesthetic changes
- The default system title bar has been replaced with a custom, unified title bar to give the GUI a more modern feel
- The main font family used in pymead ([DejaVu](https://dejavu-fonts.github.io/)) has been added in most places to make the GUI more unified, as well as more consistent across platforms
Bug fixes
- Fixed HTML whitespace collapse in the console
- Fixed clicking on links in the console clearing all the console text