PK_BODY_hollow   


PK_ERROR_code_t     PK_BODY_hollow
(
--- received arguments ---
PK_BODY_t           body,              --- body to be hollowed
double              offset,            --- offset distance
double              tolerance,         --- tolerance
PK_LOGICAL_t        face_face_check,   --- do face face checks

--- returned arguments ---
int          *const n_faces,           --- number of faces
PK_FACE_t   **const old_faces,         --- faces in original body (optional)
PK_FACE_t   **const new_faces          --- new faces corresponding to
                                       --- old faces              (optional)
)


This function hollows a solid body by offsetting all faces of the body
by the given offset distance


Specific Errors:
    PK_ERROR_cant_hollow           hollowing failure
    PK_ERROR_bad_tolerance         proposed edge tolerance is too small
    PK_ERROR_not_sheet             body is not a sheet body
    PK_ERROR_bad_thickness         total thickness is zero
    PK_ERROR_cant_get_point        failed to find vertex geometry
    PK_ERROR_cant_get_curve        failed to find edge geometry
    PK_ERROR_cant_offset           surf failed to offset or face could not
                                   be deleted
    PK_ERROR_cant_get_side_surf    failed to find side surface
    PK_ERROR_cant_get_side_curve   failed to find side curve



Introduction
The body is hollowed. The offset argument gives the default offset of the
hollowing - the thickness of the skin of the resulting body. A positive
offset will offset the body outwards (i.e. in the direction of the face
normals) and a negative value inwards.

The result of hollowing a body will be to generate a body containing a void.

Under some circumstances the function may need to replace exact geometry by
tolerant geometry. For instance, a four-edge vertex in general will offset
to two three-edge vertices and a connecting edge. If this new edge is smaller
than the supplied tolerance then the vertex becomes tolerant and no new edge
is introduced. In all situations where approximation is required the new
geometry will have a tolerance less than or equal to the tolerance supplied
through the tolerance argument.

Many circumstances can give rise to changes in topology. Amongst them are :

    1) Dealing with geometry which fails to offset. If it is known that the
       offset surface of a face would be self-intersecting an attempt is made
       to either remove the offset face or split it into faces with good
       regions of the failing surface. For example, a blend may be removed
       from an edge. The investigation of self-intersection is not exhaustive,
       however, and it can occur that instances are not trapped.

    2) Dealing with configurations which can be repaired. For instance,
       an edge can offset to a point or a face can become absorbed into
       the body.


Checking options
The extent to which checking is applied to the body is specified by the
face_face_check argument. If face_face_check is true then
face-face checks are done on the body in addition to default checks.
For most applications setting face_face_check false will give an
adequate level of checking.


Old_faces and new_faces returns arguments
The tag of a face in the original body will remain on the exterior of the
resulting body and will retain the same sense.

Each face to be offset will have a partner created in the final body which is
an offset of the original face. The pairs of original and new faces are
returned in the old_faces and new_faces arguments. Both old_faces and
new_faces can contain null tags. This will occur when faces are removed for
the reasons given above.

When a face has been split, so a single face in one array corresponds to two or
more faces in the other array, then the single face is repeated to correspond
to each of the split faces.  If the split face is on the outside of the
resultant body then the first face in 'old_faces' corresponding to a repeated
face in 'new_faces' will retain the tag of the original face that was split.

Error handling
When an error occurs, the function will, where possible, make extra
information regarding the error available to the application
by means of a GROUP.
This GROUP is accessible from the standard form of the error.  Note that,
while the members of the GROUP will be objects which existed before the
call (and so will survive rollback), the GROUP itself will be destroyed by
rollback.  The members of the GROUP will be as follows:

    PK_ERROR_cant_get_point         1 VERTEX   Failed to find new geometry for
                                               existing vertex
                                    n FACEs    Failed to find geometry for
                                               new vertex.

    PK_ERROR_cant_get_curve         1 EDGE     Failed to find new geometry for
                                               existing edge
                                    n FACEs    Failed to find geometry for
                                               new edge

    PK_ERROR_cant_get_surf          n FACEs    Unable to produce offset
                                               surfaces for these faces.
                                               No surface replacement is
                                               performed.

    PK_ERROR_edge_didnt_vanish      1 EDGE     An existing edge should have
                                               disappeared
                                    n FACEs    A transient edge should have
                                               disappeared

    PK_ERROR_face_check_fails       1 FACE     Face which failed check

    PK_ERROR_face_face_check_fails  2 FACEs    Pair of faces where
                                               inconsistency found.

    PK_ERROR_cant_offset            1 FACE     Failed to offset or face could
                                               not be deleted

This function is not supported for general bodies.