from warnings import warn
from .geometry.subspaces import subspace_to_smooth_net
from .geometry.quadrics import quadric_to_smooth_net
from .geometry.spheres import sphere_to_smooth_net
from ddg.datastructures.nets.domain import SmoothDomain
import ddg.datastructures.nets.utils as nutils
from ddg.geometry.subspaces import Subspace
from ddg.geometry.quadrics import Quadric
from ddg.geometry.spheres import Sphere
from ddg.geometry.intersection import Intersection, Join
__all__ = ["to_smooth_net"]
[docs]def to_smooth_net(object_, domain=None, **kwargs):
"""Convert an object to a smooth net.
Parameters
----------
object_ : Subspace, Point, Quadric, Intersection or Join
Object to be converted. Currently supported:
* :py:class:`~.subspaces.Subspace` and :py:class:`~.subspaces.Point` in
any ambient space,
* :py:class:`~.quadrics.Quadric` contained in 1D,
2D and 3D subspaces in any ambient space,
* :py:class:`~.Intersection` and :py:class:`~.Join`. These will be
resolved and converted if resolving produces an object of a
different, supported type.
domain : list or SmoothDomain (default=None)
Optionally a domain to assign to the net. If `domain` is not contained
in the default domain, they are intersected and a warning is raised.
Uses :py:func:`ddg.datastructures.nets.utils.create_subdomain`.
**kwargs : dict
Keyword arguments to be passed to the type-specific conversion. See
submodules for available options.
Returns
-------
SmoothNet, SmoothCurve, PointNet or EmptyNet
Warns
-----
RuntimeWarning
If `domain` is not contained in the default domain of the object.
Raises
------
TypeError
If object has a type for which conversion is not possible.
"""
if isinstance(object_, (Intersection, Join)):
object_ = object_.resolve()
if isinstance(object_, Subspace):
net = subspace_to_smooth_net(object_, **kwargs)
elif isinstance(object_, Quadric):
net = quadric_to_smooth_net(object_, **kwargs)
elif isinstance(object_, Sphere):
net = sphere_to_smooth_net(object_, **kwargs)
else:
raise TypeError(
f"Object of type {type(object_)} could not be converted to smooth "
f"net."
)
if domain is not None:
restricted_net = nutils.create_subdomain(net, domain)
if isinstance(domain, list):
domain = SmoothDomain(domain)
if (domain.intervals != net.domain.intervals
or domain.periodicity != restricted_net.domain.periodicity):
warn("The domain given to to_smooth_net was not a subdomain. The "
"default domain and the given domain were intersected.",
category=RuntimeWarning)
return restricted_net
else:
return net