PK_BODY_create_solid_topology   


PK_ERROR_code_t         PK_BODY_create_solid_topology
(
--- received arguments ---
int                     n_topols,    --- number of topols
const PK_CLASS_t        classes[],   --- class of each topol
int                     n_relations, --- number of relations
const int               parents[],   --- parents
const int               children[],  --- children
const PK_TOPOL_sense_t  senses[],    --- sense in which child used by parent

--- returned arguments ---
PK_BODY_t        *const body,        --- created body
PK_TOPOL_t       *const topols,      --- created topols
PK_BODY_fault_t  *const fault,       --- fault indicator
int              *const fault_index  --- index of fault topol
)


This function creates the topology of a solid body.


Specific Errors:
    PK_ERROR_bad_class             bad class in classes array
    PK_ERROR_bad_value             a value in parents or children array
                                   is not a valid index to classes array


The array classes specifies the class of each topological entity.
Currently the only allowed values are:

    PK_CLASS_body
    PK_CLASS_shell
    PK_CLASS_face
    PK_CLASS_loop
    PK_CLASS_edge
    PK_CLASS_vertex

Each topological entity is referred to by its index in this array.

The arrays `parents, children and senses are all the same length which
is n_relations.
`parents[i]', `children[i]' and `senses[i]' define one relation between
two topological entities.  The values put into parents and children
are indices of the classes array.

It is optional whether a topological entity of class PK_CLASS_body appears
in the classes array.  If it does appear then it must be the first entry
and its relations with its children must all be defined.  If no
PK_CLASS_body appears in classes then the body's children are all the
topological entities which have no defined parent.  Such orphans may
currently only be shells, and if there is more than one, then the first
shell in classes must be the outer shell.

The following rules apply to the order of the relations:

 - the child relations to a common parent need not be contiguous.

 - when a body has more than one (shell) child defined then the outer shell
   must appear first.

 - edge children of a loop must appear in order around the loop.

 - vertex children of an edge must appear in the order of the direction of
   the edge.

senses indicate the manner in which a child is used by its parent.  This is
currently only meaningful for edge children where the sense should be set to:

    PK_TOPOL_sense_positive_c   the edge is in the same direction as its
                                parent loop

    PK_TOPOL_sense_negative_c   the edge is in the opposite direction to its
                                parent loop.

All other senses should be set to PK_TOPOL_sense_none_c.

The permitted classes and numbers of children and parents are as follows:

--------------------------------------------------------------------
Entity    Children      No. of children   Parents     No. of parents
--------------------------------------------------------------------
Body      Shells              >=1           -             -
Shell     Faces               >=1         Body            1
Face      Loops               >=0         Shell           1
Loop      Edges               >=1         Face            1
          or single vertex    1
Edge      Vertices            <=2         Loops           2
Vertex    None                0           Edges           >=1
                                          or single loop  1
--------------------------------------------------------------------

NB: - Each edge must be used twice as a child, once with each sense (this
      may be in the same loop).
    - A loop must have either a number of edges (with senses) as children,
      or a single vertex; it cannot have a mixture of edges and vertices, or
      more than one vertex.
    - A vertex must have a number of edges as parents, or a single loop; it
      cannot have both edges and loops, or more than one loop.

Success of the function is indicated by there being no PK error returned
and by fault being set to PK_BODY_fault_no_fault_c.

If the creation is successful:

 -  the created body is returned in body
 -  the entities corresponding to the entries in the classes array are
    returned in the topols array.  (Note that if a PK_CLASS_body appears
    in the classes array then the created body will appear in topols
    as well as in body.

If the creation is unsuccessful but no PK error is returned:

 -  no body is created
 -  a fault indicator is returned in fault
    (see documentation for PK_BODY_fault_t)
 -  the index (in the classes array) of the faulty item is returned if
    possible