Source code for aerocaps.iges.surfaces

import typing

import numpy as np
from numpy.ma.core import inner

from aerocaps.iges.curves import BoundaryCurveIGES, CurveOnParametricSurfaceIGES
from aerocaps.units.angle import Angle
from aerocaps.iges.entity import IGESEntity
from aerocaps.iges.iges_param import IGESParam


[docs] class SurfaceOfRevolutionIGES(IGESEntity):
[docs] def __init__(self, axis_of_revolution: IGESEntity, curve: IGESEntity, start_angle: Angle, end_angle: Angle, **entity_kwargs): parameter_data = [ IGESParam(axis_of_revolution, "pointer"), IGESParam(curve, "pointer"), IGESParam(start_angle.rad, "real"), IGESParam(end_angle.rad, "real") ] super().__init__(120, parameter_data, **entity_kwargs)
[docs] class RuledSurfaceIGES(IGESEntity):
[docs] def __init__(self, curve_1: IGESEntity, curve_2: IGESEntity, **entity_kwargs): parameter_data = [ IGESParam(curve_1, "pointer"), IGESParam(curve_2, "pointer"), IGESParam(0, "int"), IGESParam(1, "int") ] super().__init__(118, parameter_data, **entity_kwargs)
[docs] class BoundedSurfaceIGES(IGESEntity):
[docs] def __init__(self, untrimmed_surface: IGESEntity, boundary_curves: typing.List[BoundaryCurveIGES], **entity_kwargs): """ IGES Type 143 Parameters ---------- untrimmed_surface: IGESEntity Surface in which the boundary curves reside boundary_curves: typing.List[BoundaryCurveIGES] Closed loop of boundary curves that lie on the surface specified by ``untrimmed_surface`` entity_kwargs Additional keyword arguments to pass to the ``IGESEntity`` constructor """ parameter_data = [ IGESParam(int(any( [boundary_curve.parameter_data[0].value == 1 for boundary_curve in boundary_curves])), "int" ), IGESParam(untrimmed_surface, "pointer"), IGESParam(len(boundary_curves), "int"), *[IGESParam(boundary_curve, "pointer") for boundary_curve in boundary_curves] ] super().__init__(143, parameter_data, **entity_kwargs)
[docs] class TrimmedSurfaceIGES(IGESEntity):
[docs] def __init__(self, untrimmed_surface: IGESEntity, outer_boundary: CurveOnParametricSurfaceIGES, inner_boundaries: typing.List[CurveOnParametricSurfaceIGES] = None, outer_boundary_is_boundary_of_surface: bool = False, **entity_kwargs ): """ Trimmed Surface, IGES type 144. Parameters ---------- untrimmed_surface: IGESEntity Surface in which the boundary curves reside outer_boundary: CurveOnParametricSurfaceIGES Curve on a parametric surface representing the outer boundary for the trimmed surface inner_boundaries: typing.List[CurveOnParametricSurfaceIGES] List of inner boundary curves outer_boundary_is_boundary_of_surface: bool Whether the outer boundary represents the actual outer boundary of the untrimmed surface. Default: ``False`` entity_kwargs Additional keyword arguments to pass to the ``IGESEntity`` constructor """ inner_boundaries = [] if inner_boundaries is None else inner_boundaries parameter_data = [ IGESParam(untrimmed_surface, "pointer"), IGESParam(int(outer_boundary_is_boundary_of_surface), "int"), IGESParam(len(inner_boundaries), "int"), IGESParam(outer_boundary, "pointer"), *[IGESParam(inner_boundary, "pointer") for inner_boundary in inner_boundaries] ] super().__init__(144, parameter_data, **entity_kwargs)
[docs] class RationalBSplineSurfaceIGES(IGESEntity):
[docs] def __init__(self, control_points: np.ndarray, knots_u: np.ndarray, knots_v: np.ndarray, weights: np.ndarray, degree_u: int, degree_v: int, closed_u: bool = True, closed_v: bool = True, rational: bool = True, periodic_u: bool = False, periodic_v: bool = False, start_u: float = 0.0, end_u: float = 1.0, start_v: float = 0.0, end_v: float = 1.0, **entity_kwargs ): assert control_points.ndim == 3 assert knots_u.ndim == 1 assert knots_v.ndim == 1 assert weights.ndim == 2 self.control_points = control_points self.knots_u = knots_u self.knots_v = knots_v self.weights = weights parameter_data = [ IGESParam(control_points.shape[0] - 1, "int"), IGESParam(control_points.shape[1] - 1, "int"), IGESParam(degree_u, "int"), IGESParam(degree_v, "int"), IGESParam(int(closed_u), "int"), IGESParam(int(closed_v), "int"), IGESParam(int(not rational), "int"), IGESParam(int(periodic_u), "int"), IGESParam(int(periodic_v), "int"), *[IGESParam(k, "real") for k in self.knots_u], *[IGESParam(k, "real") for k in self.knots_v], *self._flatten_weights(), *self._flatten_control_points(), IGESParam(start_u, "real"), IGESParam(end_u, "real"), IGESParam(start_v, "real"), IGESParam(end_v, "real") ] super().__init__(128, parameter_data, **entity_kwargs)
def _flatten_control_points(self): control_point_params_flattened = [] for j in range(self.control_points.shape[1]): for i in range(self.control_points.shape[0]): for k in range(self.control_points.shape[2]): control_point_params_flattened.append(IGESParam(self.control_points[i, j, k], "real")) return control_point_params_flattened def _flatten_weights(self): weights_flattened = [] for j in range(self.weights.shape[1]): for i in range(self.weights.shape[0]): weights_flattened.append(IGESParam(self.weights[i, j], "real")) return weights_flattened
[docs] class BezierSurfaceIGES(RationalBSplineSurfaceIGES):
[docs] def __init__(self, control_points: np.ndarray, **entity_kwargs): order_u = control_points.shape[0] order_v = control_points.shape[1] degree_u = order_u - 1 degree_v = order_v - 1 knots_u = np.concatenate((np.zeros(order_u), np.ones(order_u))) knots_v = np.concatenate((np.zeros(order_v), np.ones(order_v))) weights = np.ones(shape=(order_u, order_v)) super().__init__(control_points=control_points, knots_u=knots_u, knots_v=knots_v, weights=weights, degree_u=degree_u, degree_v=degree_v, **entity_kwargs)