# Cone Ply Piece Optimization Tool (`desicos.cppot`)¶

Please, refer to the CPPOT tutorial for more details about how to use this module.

## Cone Virtual Material Model (`desicos.cppot.core`)¶

### CPPOT-geometry (`desicos.cppot.core.geom`)¶

Classes and functions to help with 2D geometrical operations.

class `desicos.cppot.core.geom.``ConeGeometry`(H, rbot, alpharad, extra_height)[source]

ConeGeometry object

Carries all the information about the geometry of a cone, plus some read-only accessors to calculate often-needed cone properties. These are all calculated on-the-fly, so no rebuild()-ing is necessary.

Attribute

Description

`H`

`float`, height of the free area of the cone.

`rbot`

`float`, bottom radius of the cone

`alpharad`

`float`, semi-vertex angle of the cone, in radians. Must be between 0 and pi/2.

`extra_height`

`float`, extra (support) height. A section with this height is added along both the top and bottom edge of the free cone. This represents the extra material that is present during manufacturing.

Attributes
`L`

`cone_area`

Read-only property: Surface area of the free cone (supports excluded).

`cos_alpha`

Read-only property: Cosine of the semi-vertex angle.

`rtop`

`s1`

`s2`

Read-only property: Radius of top edge of the free cone in unfolded coordinates.

`s3`

Read-only property: Radius of bottom edge of the free cone in unfolded coordinates.

`s4`

`sin_alpha`

Read-only property: Sine of the semi-vertex angle.

`tan_alpha`

Read-only property: Tangent of the semi-vertex angle.

Methods

 `from_conecyl`(cc, extra_height) Construct a ConeGeometry object based on an existing ConeCyl
property `L`

property `cone_area`

Read-only property: Surface area of the free cone (supports excluded).

property `cos_alpha`

Read-only property: Cosine of the semi-vertex angle.

classmethod `from_conecyl`(cc, extra_height)[source]

Construct a ConeGeometry object based on an existing ConeCyl

Parameters
cc`ConeCyl`

Existing cone to use. Must be a cone, i.e. alpha > 0.

extra_heightfloat

Extra support height for this model.

Returns
cg`ConeGeometry`

The constructed ConeGeometry object

property `rtop`

property `s1`

property `s2`

Read-only property: Radius of top edge of the free cone in unfolded coordinates.

property `s3`

Read-only property: Radius of bottom edge of the free cone in unfolded coordinates.

property `s4`

property `sin_alpha`

Read-only property: Sine of the semi-vertex angle.

property `tan_alpha`

Read-only property: Tangent of the semi-vertex angle.

class `desicos.cppot.core.geom.``Line2D`(a, b, c)[source]

Class representing a line on a two-dimensional plane It is based on `namedtuple`, which allows both named attribute access (line.a) and iteration / indexing. Line2D instances are immutable after construction.

The line is defined based on two equations: a*x + b*y = c a**2 + b**2 = 1 The latter normalization constraint is enforced in `__new__`

Attribute

Description

`a`

`float`, Line parameter in equation (a*x + b*y = c)

`b`

`float`, Line parameter in equation (a*x + b*y = c)

`c`

`float`, Line parameter in equation (a*x + b*y = c)

Attributes
a

Alias for field number 0

b

Alias for field number 1

c

Alias for field number 2

Methods

 Get all intersection points of a line with a circle The center of the circle is presumed to be at the origin Calculate the angle of this line with respect to the x-axis `count`(value, /) Return number of occurrences of value. Obtain a point representing a unit direction vector parallel to the line. `distance_point`(point) Get the shortest Euclidean distance between this line and a point `from_point_angle`(point, angle) Class method, constructs a line based on a point and an angle `from_points`(point1, point2) Class method, constructs a line based on two points `index`(value[, start, stop]) Return first index of value. `intersection_circle_near`(radius, near_point) Get the intersection of a line with a circle If there is more than one intersection point, it returns the intersection closest to near_point. `intersection_line`(other) Get the intersection point of this line and another line `point_on_right`(point) Check on which side of this line a point lies `rotate`(angle) Created a new line, rotated with respect to the origin.
`all_intersections_circle`(radius)[source]

Get all intersection points of a line with a circle The center of the circle is presumed to be at the origin

Parameters

Returns
intersection_pointslist of `Point2D`

List containing either 0, 1 or 2 intersection points

Notes

`angle`()[source]

Calculate the angle of this line with respect to the x-axis

Returns
anglefloat

The counterclockwise angle (in radians) from the positive x-axis

`direction`()[source]

Obtain a point representing a unit direction vector parallel to the line.

Returns
direction`Point2D`

The requested unit direction vector

`distance_point`(point)[source]

Get the shortest Euclidean distance between this line and a point

Parameters
point`Point2D`

Point to find the distance to

Returns
distancefloat

The shortest distance from this line to the given point.

classmethod `from_point_angle`(point, angle)[source]

Class method, constructs a line based on a point and an angle

Parameters
point`Point2D`

Point that the line should go through

anglefloat

The counterclockwise angle (in radians) between the line and the positive x-axis

Returns
line`Line2D`

The constructed line

classmethod `from_points`(point1, point2)[source]

Class method, constructs a line based on two points

Parameters
point1`Point2D`

First point that the line should go through

point2`Point2D`

Second point that the line should go through

Returns
line`Line2D`

The constructed line

Notes

If no line can be constructed, a ValueError is raised. This happens when the points are identical.

`intersection_circle_near`(radius, near_point)[source]

Get the intersection of a line with a circle If there is more than one intersection point, it returns the intersection closest to near_point. If there is no intersection, a ValueError is raised.

Parameters

nearby_point`Point2D`

The intersection nearest to this point will be returned

Returns
intersection_point`Point2D`

The found intersection point

`intersection_line`(other)[source]

Get the intersection point of this line and another line

Parameters
other`Line2D`

Other line to find intersection point with

Returns
intersection_point`Point2D`

The found intersection point

Notes

If no intersection point could be found, a ValueError is raised. This can happen when the lines are parallel.

`point_on_right`(point)[source]

Check on which side of this line a point lies

Parameters
point`Point2D`

Point to check

Returns
on_right_sidebool

`True` if the point is on the right side of this line (looking into the direction of `self.direction()`), `False` otherwise.

`rotate`(angle)[source]

Created a new line, rotated with respect to the origin. The original line remains untouched.

Parameters
anglefloat

Angle (in radians) with which the line is to be rotated

Returns
new_line`Line2D`

The newly constructed rotated line

class `desicos.cppot.core.geom.``Point2D`(x, y)[source]

Class representing a point on a two-dimensional plane It is based on `namedtuple`, which allows both named attribute access (point.x) and iteration / indexing. Point2D instances are immutable after construction. Addition / subtraction operators are overloaded, as wel as pre-multiplying by a scalar.

Attribute

Description

`x`

`float`, Cartesian x-coordinate

`y`

`float`, Cartesian y-coordinate

Attributes
x

Alias for field number 0

y

Alias for field number 1

Methods

 Calculate the angle of this point in polar coordinates `count`(value, /) Return number of occurrences of value. `distance`(other) Calculate Euclidean distance between two points. `from_polar`(norm, angle) Class method, creates a point from polar coordinates `index`(value[, start, stop]) Return first index of value. Calculate distance of this point with respect to the origin. `rotate`(angle) Created a new point, rotated with respect to the origin.
`angle`()[source]

Calculate the angle of this point in polar coordinates

Returns
anglefloat

The counterclockwise angle (in radians) from the positive x-axis

`distance`(other)[source]

Calculate Euclidean distance between two points.

classmethod `from_polar`(norm, angle)[source]

Class method, creates a point from polar coordinates

Parameters
normfloat

Distance from the origin

anglefloat

The counterclockwise angle (in radians) from the positive x-axis

Returns
point`Point2D`

The newly constructed point

`norm`()[source]

Calculate distance of this point with respect to the origin.

`rotate`(angle)[source]

Created a new point, rotated with respect to the origin. The original point remains untouched.

Parameters
anglefloat

Angle (in radians) with which the point is to be rotated

Returns
new_point`Point2D`

The newly constructed rotated point

class `desicos.cppot.core.geom.``Polygon2D`(iterable=(), /)[source]

Class representing a polygon on a two-dimensional plane. It is assumed that polygons do not self-intersect

Pass an iterable of `Point2D`-objects to the constructor. Polygon2D instances are immutable after construction.

Notes

Even though this object if (currently) a tuple of its points, it is recommended to not rely on this. This to allow possible future changes to the underlying implementation.

Methods

 Calculate the area enclosed by this polygon. `contains_point`(point) Determine if a point is inside or outside the polygon `count`(value, /) Return number of occurrences of value. `get_closed_line`([num_points]) Get a closed line that can be used to plot this polygon. `index`(value[, start, stop]) Return first index of value. Get an iterator over all corner points in this polygon `rotate`(rotate_angle) Create a new polygon, idential to this one but rotated around the origin by a certain angle. `slice_line`(line) Slice this polygon, returning only the section on the right side of the given line.
`area`()[source]

Calculate the area enclosed by this polygon.

`contains_point`(point)[source]

Determine if a point is inside or outside the polygon

Parameters
point`Point2D`

Point to test

Returns
inside_polygonbool

`True` if the point is inside the polygon, `False` otherwise

Notes

The ‘Ray casting’ algorithm is used, since the ‘interior angle’ algorithm was found to be very slow.

This method has not been verified to work correctly for special cases, such as the point being (almost) exactly on a vertex or line.

`get_closed_line`(num_points=1)[source]

Get a closed line that can be used to plot this polygon.

Parameters
num_pointsint

The number of points to use per edge. Default value is 1.

Returns
outtuple

out[0] contains a numpy array of x-coordinates, out[1] an array of y-coordinates. The first point in the polygon is repeated, such that plot(x, y) results in a closed polygon.

`points`()[source]

Get an iterator over all corner points in this polygon

`rotate`(rotate_angle)[source]

Create a new polygon, idential to this one but rotated around the origin by a certain angle.

Parameters
rotate_anglefloat

Rotation angle to use, in radians

Returns
new_poly`Polygon2D`

The (newly created) rotated polygon.

`slice_line`(line)[source]

Slice this polygon, returning only the section on the right side of the given line.

Parameters
line`Line2D`

Line to be used for slicing.

Returns
new_poly`Polygon2D`

The (newly created) sliced polygon.

`desicos.cppot.core.geom.``angle_in_range`(angle, angle_min, angle_max)[source]

Check if an angle is within the specified range (min..max) While taking care of all the (mod 2pi)-issues.

Parameters
anglefloat

The angle to check

min_anglefloat

The lower limit of the range

max_anglefloat

The upper limit of the range

Returns
in_rangebool

True iff the given angle is in range min_angle…max_angle

`desicos.cppot.core.geom.``circle_segment_area`(radius, angle)[source]

Calculate the area of a circle segment, which is a region bound by an arc (less than 180 deg) and a straight line connecting the end points of that arc.

Parameters

anglefloat

Angle (in radians) of the arc

Returns
areafloat

The calculated area

Notes

`desicos.cppot.core.geom.``wrap_to_pi`(angle)[source]

Wrap an angle to within the range [-pi, pi), by adding multiples of 2*pi

Parameters
anglefloat

The angle to wrap

Returns
new_anglefloat

Wrapped angle within the range [-pi, pi)

### Virtual Ply Model (`desicos.cppot.core.ply_model`)¶

Classes to create a virtual model of the ply pieces on an actual cone.

class `desicos.cppot.core.ply_model.``PlyPiece`(polygon, phi_nom, phi_nom_min, phi_nom_max, phi_limit_min=None, phi_limit_max=None)[source]

PlyPiece object

Carries all the information about a single piece of ply in the layup of a cone, with a defined size and orientation.

Attributes

Description

`polygon`

`Polygon2D`, containing the geometry of the ply piece.

`phi_nom`

`float`, angle at which the origin line (L0) of the ply piece intersects the circle with radius `starting_position`

`phi_nom_min`

`float`, smallest angle phi that is contained within this ply piece at radius `starting_position`

`phi_nom_max`

`float`, largest angle phi that is contained within this ply piece at radius `starting_position`

`phi_limit_min`

`float`, minimum value of phi for any of the points in `polygon`. Optional, will be calculated if not supplied to the constructor.

`phi_limit_max`

`float`, minimum value of phi for any of the points in `polygon`. Optional, will be calculated if not supplied to the constructor.

Notes

On the nominal circle (radius `starting_position`), this ply piece occupies the range `phi_nom_min`…``phi_nom_max``.

For all points in this ply piece, the inequality `phi_limit_min <= phi <= phi_limit_max` should hold.

Methods

 `angle_deviation`(point) Get the deviation between the local and nominal fiber angle at a certain point `contains_point`(point[, phi]) Check if a point is contained in this ply piece `copy_rotated`(rotate_angle) Create a copy of this ply piece, which is rotated by a certain angle.
`angle_deviation`(point)[source]

Get the deviation between the local and nominal fiber angle at a certain point

Parameters
pointPoint2D

Cartesian coordinates of the point. These are in the coordinate system of the unfolded cone, so (eta, zeta) (as floats).

Returns
angle_difffloat

Local minus nominal fiber angle at this point, in degrees

`contains_point`(point, phi=None)[source]

Check if a point is contained in this ply piece

Parameters
pointPoint2D

The point to check. This is in the coordinate system of the unfolded cone, so (eta, zeta).

phifloat

Angle corresponding to `point`. Parameter is optional, but passing it from the caller can help performance.

Returns
cointains_pointbool

True if the point is in this ply piece, false otherwise. For points exactly on the edge of the ply piece, resuls are undefined.

`copy_rotated`(rotate_angle)[source]

Create a copy of this ply piece, which is rotated by a certain angle.

Parameters
rotate_anglefloat

Angle of new ply piece with respect to this one, in radians

Returns
new_piece`PlyPiece`

Rotated ply piece

class `desicos.cppot.core.ply_model.``PlyPieceModel`(cg, fiber_angle, starting_position, max_width, rel_ang_offset=0.0, eccentricity=None)[source]

Abstract base class for all ply piece models

This class encapsulates all functionality to create a virtual ply model based on the given parameters. Various methods are available to subsequently extract information about this virtual ply model.

For the different ply piece shapes, subclasses should be made that define at least the method `construct_single_ply_piece` and possibly others.

Methods

 `all_local_orientations`(eta, zeta) Determine the local fiber orientations of all plies at a point. `construct_single_ply_piece`([fraction]) Construct a single ply piece. Get the fiber orientations at all corners of the useful area, which is the area between radii s2 and s3. Get the lengths of the edges of the (base) ply piece. `effective_area`([ply_piece, max_angle_dev]) Get the effective area of a single ply piece. `local_num_pieces`(eta, zeta) Determine the local number of overlapping pieces at a given point. `local_orientation`(eta, zeta) Determine the local fiber orientation at a given point. Determine the total number of pieces needed to fully cover the cone. Get the area of a single ply piece that is on the free cone area, i.e. Get the ratio of continuous fibers, i.e. Rebuild the model, actually constructing all ply pieces
`all_local_orientations`(eta, zeta)[source]

Determine the local fiber orientations of all plies at a point.

Parameters
etafloat

Horizontal coordinate of point, in the coordinate system of the unfolded cone.

zetafloat

Vertical coordinate of point, in the coordinate system of the unfolded cone.

Returns
local_angleslist

Lists of floats representing the local fiber angle of each (possibly overlapping) ply piece at this point, in degrees.

`construct_single_ply_piece`(fraction=1.0)[source]

Construct a single ply piece.

Parameters
fractionfloat

Optional, range (0, 1], default is 1. The newly constructed ply piece will normally span an angle `delta_phi` on the nominal circle (radius `s_theta_nom`) from `phi_nom_min` to `phi_nom_max`. When this parameter is set unequal to 1, `delta_phi` of the resulting ply piece will be the indicated fraction of the value it would normally have. This functionality is used to construct rest-pieces.

Returns
ply_piece`PlyPiece`

The newly constructed ply piece.

Notes

This method is just to define the interface, implementation should be provided by a derived class.

`corner_orientations`()[source]

Get the fiber orientations at all corners of the useful area, which is the area between radii s2 and s3.

Returns
corner_orientationslist

Fiber angles (in degrees) at the four useful corner points of the base ply piece. The order of values matches P1, P2, P3, P4.

`edge_lengths`()[source]

Get the lengths of the edges of the (base) ply piece.

Returns
edge_lengthslist

List of edge lengths (L1 to L4)

`effective_area`(ply_piece=None, max_angle_dev=2.0)[source]

Get the effective area of a single ply piece. This is the area on useful section of the cone, where the deviation of the fiber angle is less than a given maximum.

Parameters
ply_piece`PlyPiece`, optional

Ply piece to get the effective area for. If not set, the base piece is used.

max_angle_devfloat, optional

Maximum deviation from the nominal fiber angle to consider the material ‘effective’. In degrees.

Returns
outtuple

2-tuple, where `out[0]` is the effective surface area and `out[1]` is the corresponding polygon.

Notes

Note that the polygon has straight edges, while the calculation of the effective area takes into account that some edges of the effective area may be arc sections.

`local_num_pieces`(eta, zeta)[source]

Determine the local number of overlapping pieces at a given point.

Parameters
etafloat

Horizontal coordinate of point, in the coordinate system of the unfolded cone.

zetafloat

Vertical coordinate of point, in the coordinate system of the unfolded cone.

Returns
num_piecesint

Number of overlapping pieces at the given point in the ply

`local_orientation`(eta, zeta)[source]

Determine the local fiber orientation at a given point. If the given point is not inside any ply piece, NaN is returned. If there are multiple overlapping ply pieces, the orientation belonging to one of them (the first in the ply piece list) is returned.

Parameters
etafloat

Horizontal coordinate of point, in the coordinate system of the unfolded cone.

zetafloat

Vertical coordinate of point, in the coordinate system of the unfolded cone.

Returns
local_anglefloat

Local fiber angle at the given point in the given ply, in degrees.

`num_pieces`()[source]

Determine the total number of pieces needed to fully cover the cone.

Returns
num_piecesfloat

The number of needed pieces, as a float. The fractional part indicates the size of the ‘rest piece’ that is needed.

`ply_piece_area`()[source]

Get the area of a single ply piece that is on the free cone area, i.e. between radii s2 and s3.

Returns
areafloat

The aforementioned area

`ratio_continuous_fibers`()[source]

Get the ratio of continuous fibers, i.e. the fraction of the fibers at the bottom edge (radius s3) that reach the top edge (radius s2).

Returns
ratiofloat

The ratio of continuous fibers

`rebuild`()[source]

Rebuild the model, actually constructing all ply pieces

class `desicos.cppot.core.ply_model.``RectPlyPieceModel`(cg, fiber_angle, starting_position, max_width, rel_ang_offset=0.0, eccentricity=None)[source]

Sub-class of `PlyPieceModel`, for shape C (rectangle)

Methods

 `all_local_orientations`(eta, zeta) Determine the local fiber orientations of all plies at a point. `construct_single_ply_piece`([fraction]) Construct a ply piece for shape C (rectangle) `corner_orientations`() Get the fiber orientations at all corners of the useful area, which is the area between radii s2 and s3. `edge_lengths`() Get the lengths of the edges of the (base) ply piece. `effective_area`([ply_piece, max_angle_dev]) Get the effective area of a single ply piece. `local_num_pieces`(eta, zeta) Determine the local number of overlapping pieces at a given point. `local_orientation`(eta, zeta) Determine the local fiber orientation at a given point. `num_pieces`() Determine the total number of pieces needed to fully cover the cone. `ply_piece_area`() Get the area of a single ply piece that is on the free cone area, i.e. `ratio_continuous_fibers`() Get the ratio of continuous fibers, i.e. `rebuild`() Rebuild the model, actually constructing all ply pieces
`construct_single_ply_piece`(fraction=1.0)[source]

Construct a ply piece for shape C (rectangle)

class `desicos.cppot.core.ply_model.``Trapez2PlyPieceModel`(cg, fiber_angle, starting_position, max_width, rel_ang_offset=0.0, eccentricity=None)[source]

Sub-class of `PlyPieceModel`, for shape B (trapezium with one overlap)

Methods

 `all_local_orientations`(eta, zeta) Determine the local fiber orientations of all plies at a point. `construct_single_ply_piece`([fraction]) Construct a ply piece for shape A (trapezium) `corner_orientations`() Get the fiber orientations at all corners of the useful area, which is the area between radii s2 and s3. `edge_lengths`() Get the lengths of the edges of the (base) ply piece. `effective_area`([ply_piece, max_angle_dev]) Get the effective area of a single ply piece. `local_num_pieces`(eta, zeta) Determine the local number of overlapping pieces at a given point. `local_orientation`(eta, zeta) Determine the local fiber orientation at a given point. `num_pieces`() Determine the total number of pieces needed to fully cover the cone. `ply_piece_area`() Get the area of a single ply piece that is on the free cone area, i.e. `ratio_continuous_fibers`() Get the ratio of continuous fibers, i.e. `rebuild`() Rebuild the model, actually constructing all ply pieces
`construct_single_ply_piece`(fraction=1.0)[source]

Construct a ply piece for shape A (trapezium)

class `desicos.cppot.core.ply_model.``TrapezPlyPieceModel`(cg, fiber_angle, starting_position, max_width, rel_ang_offset=0.0, eccentricity=None)[source]

Sub-class of `PlyPieceModel`, for shape A (trapezium)

Methods

 `all_local_orientations`(eta, zeta) Determine the local fiber orientations of all plies at a point. `construct_single_ply_piece`([fraction]) Construct a ply piece for shape A (trapezium) `corner_orientations`() Get the fiber orientations at all corners of the useful area, which is the area between radii s2 and s3. `edge_lengths`() Get the lengths of the edges of the (base) ply piece. `effective_area`([ply_piece, max_angle_dev]) Get the effective area of a single ply piece. `local_num_pieces`(eta, zeta) Determine the local number of overlapping pieces at a given point. `local_orientation`(eta, zeta) Determine the local fiber orientation at a given point. `num_pieces`() Determine the total number of pieces needed to fully cover the cone. `ply_piece_area`() Get the area of a single ply piece that is on the free cone area, i.e. `ratio_continuous_fibers`() Get the ratio of continuous fibers, i.e. `rebuild`() Rebuild the model, actually constructing all ply pieces
`construct_single_ply_piece`(fraction=1.0)[source]

Construct a ply piece for shape A (trapezium)

## CPPOT GUI (`desicos.cppot.gui`)¶

All the functionalities of the Graphic User Interface will be started by clicking on the `Click_me.pyw` file.