:tocdepth: 2

############
Envision 3.0
############

November 14, 2024 - SHA: 4dfe82aa

Envision 3.0 is a major release which means it contains breaking changes. The main focus this release has
been to upgrade our toolkit to use TypeScript's strict mode, which enforces more rigorous type-checking and ensures 
higher code reliability and safety.

.. note::
    Breaking changes in this release only affects Envision Web. There are no breaking changes for Envision Desktop.

See `Breaking Changes`_ at the bottom for a full description of changes.


------------------------------------------------


|web| Envision for Web        |desktop| Envision for Desktop

*************
Fixed Bugs
*************

CAE-1415 VTU/VTM: Added support for "frequency" |web| |desktop|
===============================================================

Added support for PVD files containing the "frequency" attribute also. Earlier, only "timestep" was handled.


CAE-1425 QueryElementInfo: validate user's index against the valid index range |web|
====================================================================================

Fixed a crash with :js:class:`cee.ug.QueryElementInfo` when using index identification 

.. code-block:: ts

    elementIdentType = RemoteQueryInputIdentType.INDEX
    
and querying an invalid element index.


CAE-1432 Fixed crash when opening file using the OpenFoam Data Provider |web| |desktop|
=======================================================================================

Fixed issue with crash due to non-threadsafe code in OpenFoam data provider plugin.


CAE-1415 VTU: Improved file identification |web| |desktop|
==========================================================

Expand file identification to validate VTU files with attributes in both single(') and double(") quotes.


 
*************
New Features
*************

CAE-1396 Viridis Color Scheme |web| |desktop|
=============================================

This feature adds the popular Viridis color scheme to the list of available built-in color schemes within Envision.

.. image:: ../images/release-notes/cae1396.png


CAE-1426 Support interpolated node results for QueryNodeInfo |web|
==================================================================

:js:class:`cee.ug.QueryNodeInfo` now retrieves the node averaged scalar results when these are available, unifying the 
logic with the node result from picking.

Added a new property :js:attr:`~cee.ug.QueryNodeInfoData.scalarResultIsInterpolated` to 
:js:class:`cee.ug.QueryNodeInfoData`.


CAE-871 Relative displacement scaling |web| |desktop|
=====================================================

Added an option to scale displacement results with a factor relative to the size of the model. A relative scaling 
factor of 1 means that the length of the largest currently loaded displacement will be equal to the maximum bounding 
box extent of the model.

In Envision Desktop:

.. code-block:: cpp

    void        DisplacementSettings::setScaleFactor(double scaleFactor, ScaleMode mode):
    ScaleMode   DisplacementSettings::scaleMode() const;

where ``mode`` is ``ABSOLUTE_SCALING`` or ``RELATIVE_SCALING``.

In Envision Web (an accessor):

.. code-block:: ts

    get scaleMode(): DisplacementScaleMode
    set scaleMode(scaleMode: DisplacementScaleMode)

where mode is ``DisplacementScaleMode.ABSOLUTE_SCALING`` or ``DisplacementScaleMode.RELATIVE_SCALING``.

------------------------------------------------


****************
Breaking Changes
****************

CAE-1370 Operators are the new default for handling user input |web|
====================================================================

We are deprecating the older user input handling and fully embracing Operators for all user interaction with the viewer. 
We are still keeping backwards compatibility for the time being, but in practice, the use of Operators is now opt-out, 
that means they are turned on by default. In case you are not ready to make the transition yet, you can disable the use 
of operators. We strongly recommend the use of Operators as it is the cleaner, more sustainable and modular approach to 
user-input handling in the viewer. Read more about Operator integration here: 
https://docs.techsoft3d.com/hoops/latest/envision-web/operators.html.


CAE-1397 Strict mode in TypeScript |web|
========================================

With this release, our toolkit has been upgraded to use TypeScript's strict mode, which enforces more rigorous 
type-checking and ensures higher code reliability and safety. In turn, this will help with catching potential bugs 
early in development and prevent many common errors, like using variables before they are defined or failing to handle 
null and undefined cases. Adopting strict mode was for us essential to improve code robustness, encourage best 
practices, and provide you with a more reliable and efficient toolkit in the long run.

We have clarified many scenarios where nullish values occur and unified the use of null and undefined across the board. 
As a general rule of thumb, we have adopted the usage of null for objects and undefined for value types.

What does that mean for you? If your application is not using strict mode, you can safely ignore the "Typing changes 
clarifying current behavior" section, as those changes are adding nullish types purely for clarifying how the 
method/member worked before. On the other hand if you were using strict mode already, you might see some errors pop up 
with regards to null and undefined types. We have clarified the documentation in the effort to explain the reason why 
those falsy values occur in that place.

In all cases, be sure to check out the "Possibly breaking behavioral changes" sections to see the changes that do not 
necessarily have to show up in the output of the TypeScript transpiler. 


Global (cee)
------------

**Possibly breaking behavioral changes**

- :js:class:`~cee.Camera`
    - :js:func:`~cee.Camera.project`: changed failure return value from ``undefined`` to ``null``
    - :js:func:`~cee.Camera.unproject`: now returns ``null`` instead of crashing if coordinate cannot be unprojected
- :js:class:`~cee.Plane`
    - :js:func:`~cee.Plane.projectVector`: changed failure return value from ``undefined`` to ``null``
- :js:class:`~cee.ScalarMapperContinuousDomain`
    - :js:attr:`~cee.ScalarMapperContinuousDomain.aboveRangeColor`: now accepts and returns ``null`` instead of 
      ``undefined``
    - :js:attr:`~cee.ScalarMapperContinuousDomain.belowRangeColor`: now accepts and returns ``null`` instead of 
      ``undefined``
- :js:class:`~cee.Viewer`
    - :js:func:`~cee.Viewer.rayFromCssCoordinate`: now returns ``null`` on failure instead of returning a defunct 
      :js:class:`~cee.Ray` object

**Typing changes clarifying current behavior:**

- :js:class:`~cee.Background`
    - :js:attr:`~cee.Background.image`: added ``null`` to return type
- :js:class:`~cee.Camera`
    - :js:attr:`~cee.Camera.fieldOfViewYDeg`: added ``undefined`` to return type
- :js:class:`~cee.CloudSession`
    - :js:func:`~cee.CloudSession.addViewer`: added ``null`` to return type
- :js:class:`~cee.NavigationOperator`
    - :js:attr:`~cee.NavigationOperator.rotationAxis`: added ``null`` to return type
    - :js:attr:`~cee.NavigationOperator.minWalkTargetDistance`: added ``undefined`` to input and output type
- :js:class:`~cee.Navigation`
    - :js:func:`~cee.Navigation.minWalkTargetDistance`: added ``undefined`` to input and output type
- :js:class:`~cee.Operator`
    - :js:func:`~cee.Operator.ownerView`: added ``null`` to return type
- :js:class:`~cee.OperatorStack`
    - :js:func:`~cee.OperatorStack.hotKeyOperator`: added ``null`` to return type
    - :js:func:`~cee.OperatorStack.get`: added ``null`` to return type
- :js:class:`~cee.ScalarMapperContinuous`
    - :js:func:`~cee.ScalarMapperContinuous.rangeMinimum`: added ``undefined`` to return type
    - :js:func:`~cee.ScalarMapperContinuous.rangeMaximum`: added ``undefined`` to return type
- :js:class:`~cee.ScalarMapperContinuousPiecewise`
    - :js:func:`~cee.ScalarMapperContinuousPiecewise.rangeMinimum`: added ``undefined`` to return type
    - :js:func:`~cee.ScalarMapperContinuousPiecewise.rangeMaximum`: added ``undefined`` to return type
- :js:class:`~cee.ScalarMapperFilledContours`
    - :js:func:`~cee.ScalarMapperFilledContours.rangeMinimum`: added ``undefined`` to return type
    - :js:func:`~cee.ScalarMapperFilledContours.rangeMaximum`: added ``undefined`` to return type
- :js:class:`~cee.ScalarMapperFilledContoursUniform`
    - :js:func:`~cee.ScalarMapperFilledContoursUniform.rangeMinimum`: added ``undefined`` to return type
    - :js:func:`~cee.ScalarMapperFilledContoursUniform.rangeMaximum`: added ``undefined`` to return type
- :js:class:`~cee.View`
    - :js:func:`~cee.View.rayIntersect`: added ``null`` to return type
    - :js:func:`~cee.View.getRayThroughPoint`: added ``null`` to return type

------------------------------------------------


Remote Model (cee.ug)
---------------------

**Possibly breaking behavioral changes**

- :js:class:`~cee.ug.ClientSideHitItem` 
    - use ``null`` instead ``undefined`` if the :js:attr:`~cee.ug.ClientSideHitItem.intersectionPoint` property is invalid
- :js:class:`~cee.ug.LegendColorMarker`
    - now an interface (previously was a class)
- :js:class:`~cee.ug.QueryAllElementResultsForFramePartData` 
    - :js:attr:`~cee.ug.QueryAllElementResultsForFramePartData.elementIds`: is now ``null`` when id's are not available 
      (previously ``undefined``)
    - :js:attr:`~cee.ug.QueryAllElementResultsForFramePartData.nodeIds`: is now ``null`` when id's are not available 
      (previously ``undefined``)
- :js:class:`~cee.ug.QueryBulkCalculationValues`
    - :js:attr:`~cee.ug.QueryBulkCalculationValues.regionTriangleVertices` is now ``null`` when not including region 
      triangles in the query (previously ``undefined``)
- :js:class:`~cee.ug.RemoteModel`
    - :js:attr:`~cee.ug.RemoteModel.modelSpec` and :js:attr:`~cee.ug.RemoteModel.modelDirectory` are now always 
      non-null, even before opening a model. Accessing the setters of :js:attr:`~cee.ug.RemoteModel.modelSpec` before 
      the model is opened, will result in an error being thrown. Also please note that the references of the two objects 
      will change after opening the model. This requires no change in your code if 
      :js:func:`~cee.ug.RemoteModel.modelSpec` and :js:attr:`~cee.ug.RemoteModel.modelDirectory` is accessed in the 
      usual way, inside or after the callback of the :js:func:`~cee.ug.RemoteModel.openModel` method. A new method 
      :js:func:`~cee.ug.RemoteModel.isOpen` has been introduced to check whether the model has been opened. 
    - :js:func:`~cee.ug.RemoteModel.createVisibleObjectPicker`: now returns ``null`` instead of a partially created 
      picker on failure
    - :js:func:`~cee.ug.RemoteModel.createTrianglePicker`: now returns ``null`` instead of a partially created picker 
      on failure
- :js:class:`~cee.ug.ScalarSettings`
    - :js:attr:`~cee.ug.ScalarSettings.aboveRangeColor` and :js:attr:`~cee.ug.ScalarSettings.belowRangeColor` changed 
      their unset type to ``null`` (previously ``undefined``)
- :js:class:`~cee.ug.VectorSettings`
    - :js:attr:`~cee.ug.VectorSettings.anisotropicScaleFactor`: unset type changed to ``null`` (previously ``undefined``)


**Server callback changes**

We have clarified the typing when it comes to server callbacks. In practice, all the ``error`` arguments in the callback 
functions now add ``null`` to their types. Additionally, the type of the main data argument in callbacks is never 
defined as possibly falsy, but in case there is an error, the user of the function is responsible for handling it and 
not accessing the data. In such case, *the data argument will be falsy, even though the type contract is not specifying 
falsy values*. This is not a change in the current behavior and requires, besides updating the error typings, no further 
changes.  

Example: 

.. code-block:: ts

    const query = new ug.ElementInfoQuery();
    query.executeQuery(/* arguments */, (error: Error | null, data: QueryElementInfoData[]) => {
        if (error) {
            console.error(error);
            return;
        }
        // If there is an error and we would decide not to return after the error, data will be null here, 
        // even though it is not typed as such.
        console.log(data);
    });

List of callbacks where we added ``null`` to the type of the ``error`` argument:

- :js:class:`~cee.ug.ServerUpdateCompletedCallback`
- :js:class:`~cee.ug.PollForDataSourceChangesCallback`
- :js:class:`~cee.ug.DataSourceRequestCallback`
- :js:class:`~cee.ug.SendToCloudCallback`
- :js:class:`~cee.ug.CreateResultCalculatorCallback`
- :js:class:`~cee.ug.QueryBulkCalculationCallback`
- :js:class:`~cee.ug.QueryElementInfoCallback`
- :js:class:`~cee.ug.QueryPartResultsCallback`


**Typing changes clarifying current behavior:**

- :js:class:`~cee.ug.CuttingPlane` 
    - :js:attr:`~cee.ug.CuttingPlane.filterScalarRangeMinimum`: added ``undefined`` to the return type
    - :js:attr:`~cee.ug.CuttingPlane.filterScalarRangeMaximum`: added ``undefined`` to the return type
- :js:class:`~cee.ug.CuttingPlaneProperties`
    - :js:attr:`~cee.ug.CuttingPlaneProperties.filterScalarRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.CuttingPlaneProperties.filterScalarRangeMaximum`: added ``undefined`` to the type
- :js:class:`~cee.ug.ModelDirectory`
    - :js:func:`~cee.ug.ModelDirectory.getStateNameById`: added ``null`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getStateReferenceValueById`: added ``undefined`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getScalarNameById`: added ``null`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getVectorNameById`: added ``null`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getDisplacementNameById`: added ``null`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getSetNameById`: added ``null`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getPartNameById`: added ``null`` to the return type
    - :js:func:`~cee.ug.ModelDirectory.getResultInfoByIdString`: changed the "not found" type on return from ``undefined`` to ``null``
    - :js:func:`~cee.ug.ModelDirectory.getResultIdStringById`: changed the "not found" type on return from ``undefined`` to ``null``
- :js:class:`~cee.ug.ModelSettingsProperties`
    - :js:attr:`~cee.ug.ModelSettingsProperties.transformationMatrix`: added ``null`` to the type
- :js:class:`~cee.ug.ProgressData`
    - :js:attr:`~cee.ug.ProgressData.debugMessage`: added ``null`` to the type
- :js:class:`~cee.ug.QueryElementInfoData`
    - :js:attr:`~cee.ug.QueryElementInfoData.scalarResult`: added ``undefined`` to the type
    - :js:attr:`elementNodes.scalarResult <cee.ug.QueryElementInfoData.elementNodes>`: added ``undefined`` to the type
- :js:class:`~cee.ug.QueryNodeInfoData`
    - :js:attr:`~cee.ug.QueryNodeInfoData.scalarResult`: added ``undefined`` to the type
- :js:class:`~cee.ug.RemoteModel`
    - :js:func:`~cee.ug.RemoteModel.getScalarResultMinimumValue`: added ``undefined`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getScalarResultMaximumValue`: added ``undefined`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getVectorResultMinimumLength`: added ``undefined`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getDisplacementResultMinimumLength`: added ``undefined`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getDisplacementResultMaximumLength`: added ``undefined`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getPartSettingsById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getScalarSettingsById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getVectorSettingsById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getDisplacementSettingsById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getCuttingPlaneById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.addIsosurface`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getIsosurfaceById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.addIsovolume`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getIsovolumeById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.getParticleTraceGroupById`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.clientSideRayIntersect`: added ``null`` to the return type
    - :js:func:`~cee.ug.RemoteModel.setResultRangeChangedHandler`: added null to the type of the callback argument to allow for a cleanup of the 
      callback
- :js:class:`~cee.ug.ScalarSettings`
    - :js:attr:`~cee.ug.ScalarSettings.filteringRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.ScalarSettings.filteringRangeMaximum`: added ``undefined`` to the type
- :js:class:`~cee.ug.ScalarSettingsProperties`
    - :js:attr:`~cee.ug.ScalarSettingsProperties.filteringRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.ScalarSettingsProperties.filteringRangeMaximum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.ScalarSettingsProperties.aboveRangeColor`: added ``null`` to the type 
    - :js:attr:`~cee.ug.ScalarSettingsProperties.belowRangeColor`: added ``null`` to the type 
- :js:class:`~cee.ug.VectorSettings`
    - :js:attr:`~cee.ug.VectorSettings.scaleFactor`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettings.clampingRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettings.clampingRangeMaximum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettings.filteringRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettings.filteringRangeMaximum`: added ``undefined`` to the type
- :js:class:`~cee.ug.VectorSettingsProperties`
    - :js:attr:`~cee.ug.VectorSettingsProperties.scaleFactor`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettingsProperties.anisotropicScaleFactor`: added ``null`` to the type
    - :js:attr:`~cee.ug.VectorSettingsProperties.clampingRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettingsProperties.clampingRangeMaximum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettingsProperties.filteringRangeMinimum`: added ``undefined`` to the type
    - :js:attr:`~cee.ug.VectorSettingsProperties.filteringRangeMaximum`: added ``undefined`` to the type

------------------------------------------------


Constant Remote Model (cee.cug)
-------------------------------

**Possibly breaking behavioral changes:**

- :js:class:`~cee.cug.ConstantRemoteModel`
    - :js:func:`~cee.cug.ConstantRemoteModel.getBoundingBoxForPart`: now returns an invalid bounding box instead of undefined if no bounding box is found
- :js:class:`~cee.cug.ColorLegend`
    - Removed from the public API of the cug module


**Typing changes clarifying current behavior:**

- :js:class:`~cee.cug.InitializationCompleteCallback`
    - added ``null`` to typing for ``err`` parameter
- :js:class:`~cee.cug.RayIntersectCallback`
    - added ``null`` to typing for the ``hitItem`` parameter to the callback function
- :js:class:`~cee.cug.ConstantRemoteModel`
    - :js:attr:`~cee.cug.ConstantRemoteModel.simulationInfo`: added ``null`` to return type
    - :js:attr:`~cee.cug.ConstantRemoteModel.modelSpec`: added ``null`` to return type
    - :js:attr:`~cee.cug.ConstantRemoteModel.animation`: added ``null`` to return type
    - :js:func:`~cee.cug.ConstantRemoteModel.getResultInfo`: added ``null`` to return type
    - :js:func:`~cee.cug.ConstantRemoteModel.rayIntersect`: added ``null`` to return type
    - :js:func:`~cee.cug.ConstantRemoteModel.setMasterModelForSyncAnimation`: added ``null`` to parameter typing
- :js:class:`~cee.cug.FrameInfo`
    - added ``undefined`` to return type for :js:attr:`~cee.cug.FrameInfo.referenceValue`, :js:attr:`~cee.cug.FrameInfo.fringesMinimumValue` and :js:attr:`~cee.cug.FrameInfo.fringesMaximumValue`
- :js:class:`~cee.cug.HitItem`
    - now exposed as an interface instead of a class
    - added ``null`` to typing for the :js:attr:`~cee.cug.HitItem.nodePosition` and :js:attr:`~cee.cug.HitItem.intersectionPointNormal` properties
    - added ``undefined`` to typing for the :js:attr:`~cee.cug.HitItem.nodeScalarResult` and :js:attr:`~cee.cug.HitItem.elementScalarResult` properties

------------------------------------------------


Unstruct Surface Grid (cee.usg)
-------------------------------

**Possibly breaking behavioral changes:**

- :js:class:`~cee.usg.HitItem` 
    - now an interface
- :js:class:`~cee.usg.PartScalars`
    - :js:func:`getValueRange` now has the range min: ``Number.MAX_VALUE`` and max: ``-Number.MAX_VALUE`` 
      when no meaningful values can be determined from the supplied value array.
- :js:class:`~cee.usg.PartVectors`
    - :js:func:`getVectorLengthRange` now has the range min: ``Number.MAX_VALUE`` and 
      max: ``-Number.MAX_VALUE`` when no meaningful values can be determined from the supplied vectors array.

**Typing changes clarifying current behavior:**

- :js:class:`~cee.usg.HitItem` 
    - added ``undefined`` to the typing of the properties :js:attr:`~cee.usg.HitItem.elementId` and :js:attr:`~cee.usg.HitItem.closestNodeId`
- :js:class:`~cee.usg.Mesh`
    - added ``null`` to the typing of :js:attr:`~cee.usg.Mesh.elementTypeArray` property
- :js:class:`~cee.usg.Part`
    - added ``null`` to the typing of :js:attr:`~cee.usg.Part.mesh` property
- :js:class:`~cee.usg.ScalarSettings`
    - added ``null`` to the typing of :js:attr:`~cee.usg.ScalarSettings.scalarMapper` property
- :js:class:`~cee.usg.State` 
    - added ``undefined`` to the typing of :js:attr:`~cee.usg.State.referenceValue` property
    - added ``null`` to the typing of :js:attr:`~cee.usg.State.geometry` property
    - added ``null`` to the typing of the return type of the :js:func:`~cee.usg.State.getPartFringesAt` method
    - added ``null`` to the typing of the return type of the :js:func:`~cee.usg.State.getPartDisplacementsAt` method
    - added ``null`` to the typing of the return type of the :js:func:`~cee.usg.State.getPartTransformationAt` method
    - setters for Fringes, Vectors, Displacements and Transforms are now typed so that they accept ``null``
- :js:class:`~cee.usg.UnstructGridModel`
    - added ``null`` to the typing of :js:attr:`~cee.usg.UnstructGridModel.currentState` property
    - added ``null`` to the typing of the return type of the :js:func:`~cee.usg.UnstructGridModel.rayIntersect` method


------------------------------------------------


Geometry (cee.geo)
------------------

**Typing changes clarifying current behavior:**

- :js:class:`~cee.geo.GeometryModel`
    - :js:attr:`~cee.geo.GeometryModel.transformationMatrix`: added ``null`` to typing
    - :js:func:`~cee.geo.GeometryModel.rayIntersect`: added ``null`` to return type
- :js:class:`~cee.geo.HitItem`
    - :js:attr:`~cee.geo.HitItem.intersectionPoint`: added ``null`` to typing
- :js:class:`~cee.geo.MeshHitItem`
    - :js:attr:`~cee.geo.MeshHitItem.intersectionPoint`: added ``null`` to typing
- :js:class:`~cee.geo.MeshIndexedLines`
    - :js:attr:`~cee.geo.MeshIndexedLines.textureCoordinates`: added ``null`` to typing
- :js:class:`~cee.geo.MeshIndexedTriangles`
    - :js:func:`~cee.geo.MeshIndexedTriangles.constructor`: added ``null`` to constructor parameter ``optionalVertexData`` input type
    - :js:attr:`~cee.geo.MeshIndexedTriangles.textureCoordinates`: added ``null`` to typing
- :js:class:`~cee.geo.Part`
    - :js:attr:`~cee.geo.Part.mesh`: added ``null`` to typing
    - :js:attr:`~cee.geo.Part.transformationMatrix`: added ``null`` to typing
- :js:class:`~cee.geo.PartSettings`
    - :js:attr:`~cee.geo.PartSettings.specularIntensity`: added ``undefined`` to typing
    - :js:attr:`~cee.geo.PartSettings.texture`: added ``null`` to typing

------------------------------------------------


Markup Model (cee.mrk)
----------------------

**Possibly breaking behavioral changes:**

- :js:class:`~cee.mrk.PartLabels`
    - :js:func:`~cee.mrk.PartLabels.getLabelOffsetPosition`: now returns ``null`` instead of ``undefined`` if no offset position is set
    - :js:func:`~cee.mrk.PartLabels.getLabelOffsetDirection`: now returns ``null`` instead of ``undefined`` if no offset position is set

**Typing changes clarifying current behavior:**

- :js:class:`~cee.mrk.PartHitItem`
    - added ``null`` to typing for :js:attr:`~cee.mrk.PartHitItem.intersectionPoint` property
- :js:class:`~cee.mrk.PartPoints`
    - :js:attr:`~cee.mrk.PartPoints.colorArray`: added ``null`` to return type

------------------------------------------------


Utilities (cee.utils)
---------------------

**Possibly breaking behavioral changes:**

- :js:class:`~cee.utils.PathGenerator`
    - :js:func:`~cee.utils.PathGenerator.generateVerticesForCircleThrough3Points()`: changed error return value from ``undefined`` to ``null``
    - :js:func:`~cee.utils.PathGenerator.generateVerticesForCircularSegmentBetween2Lines()`: changed error return value from ``undefined`` to ``null``


**Typing changes clarifying current behavior:**

- :js:class:`~cee.utils.ManipulatorTrackball`
    - :js:func:`~cee.utils.ManipulatorTrackball.setRotationAxis()`: added ``null`` to input type

------------------------------------------------

*******
Patches
*******

Envision 3.0.1
==============

November 25, 2024 - SHA: ada9deda


CAE-1438 Fix ViewerPickHandler errors in example apps |web|
-----------------------------------------------------------

Examples which are based on a front end framework were not working, due to the version 3.0 operator 
changes. This patch fixes the `ViewerPickHandler` imports and related errors everywhere.
