PK_ERROR_code_t PK_BODY_make_lofted_body ( --- received arguments --- int n_profiles, --- number of profiles const PK_BODY_t profiles[], --- profiles to loft const PK_VERTEX_t start_vertices[],--- start vertices const PK_BODY_make_lofted_body_o_t *options, --- options on lofting --- returned arguments --- PK_BODY_tracked_loft_r_t *const lofted_body --- result lofted body ) This function creates a sheet or solid body based on surfaces created by lofting through a set of sheet, wire or minimum body profiles. Specific Errors: PK_ERROR_bad_type One of the profiles in the list is of the incorrect type. PK_ERROR_bad_value Incorrect number of profiles provided for lofting, or one of the profiles has unsuitable geometric properties. This may also indicate an unsuitable value has been specified for the simplification flag. PK_ERROR_bad_profile_matching The vertex matching information couldn't be incorporated into a non-intersecting collection of curves interpolating vertices along the loft direction. This is also used to indicate a guide wire mismatch with the profiles due to a conflict with the vertex matching or the guide wire not being oriented. PK_ERROR_bad_end_conditions The derivative conditions on at least one end of the loft did not provide a clear or complete description of the derivatives required. PK_ERROR_loft_failed PK_BODY_make_lofted_body suffered an internal algorithmic failure Introduction This function receives an array of profiles and constructs a body through them. The shape and structure of the lofted body can be modified via the following controls within the option structure : o End conditions o Intermediate conditions o Guide wires o Vertex matching o Geometry simplification o Topological structure The user is informed of the result of the loft operation via a returned results structure which contains the resultant lofted body, tracking and error information. Profile Specification Profiles for the lofting operation may be specified as a combination of minimum, wire and sheet bodies. The following points need to be considered when specifying the different types of profiles : Minimum or Degenerate Point Profiles o Minimum body profiles are used to represent degenerate point profiles. o Degenerate point profiles may only be specified as start and/or end lofting profiles. o At least one of the profiles must not be a degenerate point profile. Wire Profiles o Wire profiles must be oriented (PK_EDGE_propagate_orientation may be used to achieve this). o Wire profiles must only represent a single wire; disjoint wire profiles are not permitted. o Wire profiles must have at least one vertex. o Wire profiles may be open or closed profiles : o The start vertex on an open profile is assumed to be the first vertex of the profile. o The start for a closed profile must be specified in the corresponding entry of the array passed in the start_vertices argument. Sheet Profiles The following restrictions are imposed on sheet profiles : o The sheet profile must only have one loop of laminar edges. o The normals of the faces of the sheet profile must be oriented in the same direction as the loft direction. A sheet profile body can be "reversed" via the function, PK_BODY_reverse_orientation. o A sheet profile is considered to be a closed profile. o There is a limit to the number of sheet profiles that can be specified for a lofting operation : o For non-periodic lofts, only two sheet profiles may be specified. The two sheet profiles must form the start and end profiles of the loft. o For periodic lofts, only one sheet profile may be specified. The single sheet profile must be the first profile. o The laminar boundary of the sheet profile must have at least one vertex. Open and Closed Profiles The following restrictions apply to the open/closed nature of the input profiles : o The profiles must be either all open, or all closed. o A degenerate point profile will be considered to be open or closed depending on the closure of the non-degenerate profiles in the input array. Periodic Loft Where the loft is intended to return periodically to the start profile this will be indicated by setting the periodicity flag in the end conditions rather than repeating the start profile at the end of the array of profiles. Resultant Lofted Body The type of the resultant lofted body depends on the type and combination of profiles input to the function. The resultant body may be either a sheet or solid body. Resultant Sheet Body A sheet body will be created by the lofting operation in the following situations : o All the profiles are open wire and degenerate point profiles. o All the profiles are closed wire profiles. o The start profile of a periodic loft is a wire profile. The faces of the resultant sheet body will be constructed so that the outward normal is aligned with the cross product of : o The tangent in the direction of the profile orientation. o The loft direction. Resultant Solid Body A solid body will be created by the lofting operation in the following situations : o The end profiles are either sheet or degenerate point profiles and the intermediate profiles are closed wire profiles. o The start profile of a periodic loft is a sheet profile. In both cases, sheet and solid body, none of the received profile topology or geometry is incorporated into the body that is the result of the loft. However end profiles that are sheets will be copied, and appropriate parts of these copies will form part of the resultant body. Loft Shape Controls The shape of the resultant loft body can be modified via the shape controls within the function's option structure. Loft End Conditions The end conditions of the loft can be specified via the end_conditions field within the options structure. These conditions provide constraints on the derivatives of the loft surface in the loft direction. The constraints are in three parts: o A periodicity flag held in the periodic field which is set to PK_PARAM_periodic_yes_c if and only if the loft is to produce surfaces which are periodic at the start profile. o Constraints on the derivatives at the start profile provided in the start field. o Constraints on the derivatives at the end profile provided in the end field, if the loft is not periodic. If the loft is periodic, these constraints are ignored. Details of the derivative contraints that may be applied are to be found in the documentation of the PK_BODY_loft_deriv_conds_t structure. Intermediate Loft Conditions For any profile other than the start or end, the derivative conditions may be specified by a paired array. o n_intermediate_derivs specifies the number of intermediate profiles that are to have derivative constraints specified. Note that this may be less than the total number of intermediate profiles (n_profiles-2 for non-periodic lofting, or n_profiles-1 for periodic lofting). o intermediate_derivs and intermediate_profiles are arrays of length n_intermediate_derivs. Each entry in intermediate_derivs specifies a constraint on the derivative at the profile indexed by the corresponding entry in intermediate_profiles (the first intermediate profile will be 1, so each entry must be an int between 1 and n_profiles-2 for non-periodic lofting, or n_profiles-1 for periodic lofting). Any intermediate profile that is not specified in this array will have no derivative constraints applied there. intermediate_derivs and intermediate_profiles may be set to NULL, only if n_intermediate_derivs equals 0. Guide Wires By specifying guide wires in the options structure, you can constrain the loft geometry across profiles, resulting in a lofted body that follows the shape described by the guide wires at the relevant points. Guide wires must be G1-continuous, and must intersect every profile once only at corresponding vertices. Derivative constraints may also be specified on a guide wire, which constrain the derivatives across the loft surface. o n_guide_wires specifies the number of guide wires. o guide_wires specifies the guide wires, and must be an array of length n_guide_wires. It may be set to NULL only if n_guide_wires equals 0. o n_guide_derivs specifies the number of guide wires with derivative constraints. It must be between 0 and n_guide_wires inclusive. o guide_derivs and guide_indices are arrays of length n_guide_derivs. Each entry in guide_derivs specifies a constraint on the derivative at the guide wire indexed by the corresponding entry in guide_indices (so each entry must be an int between 0 and n_guide_wires-1). Any guide wire that is not specified in this array will have no derivative constraints applied there. guide_derivs and guide_indices may be set to NULL, only if n_guide_derivs equals 0. Profile Vertex Matching The profiles need to be matched to their neighbouring profiles in order to fully define the loft. By default, the function will attempt to match the profiles. If all the profiles contain the same number of vertices, the vertices will be mapped one-to-one across the profiles. All the start vertices will be matched with each other, then subsequent vertices on each profile will be matched in order. If the profiles contain different number of vertices, then either: o extra vertices must be added to some of the profiles using PK_EDGE_imprint_point to ensure the profiles contain the same number of vertices, or o a mapping between vertices across the profiles must be provided using the structures provided in the 'matches' field of the PK_BODY_loft_matches_t structure. The mapping information is specified as a collection of vertex mappings between pairs of neighbouring profiles. If matching information is specified, then the following should be noted: o All matching information must be specified. I.e. all vertices on all the loft profiles must be matched. o The matching information can be specified in any order. o For a periodic loft, the first profile's vertices must be matched with two sets of profile's vertices : the second profile and the last profile. o Vertices that appear more than once are taken to indicate what amounts to the insertion of a degenerate section at that vertex into the profile in which they lie. Details of the representation of the map can be found in the documentation on: PK_BODY_loft_matches_t, PK_BODY_profile_match_t, and PK_BODY_loft_one_match_t For more information on matching profiles, see "Matching" in the "Advanced Surfacing" chapter of the Functional Description Lofted Body Structure Controls The structure of the resultant loft body can be modified via controls within the function's option structure. Topological Structure of Lofted Body The topological structure of the resultant loft body may be controlled via the topology_form field within the option structure. The field may be set to one of the following values : o PK_BODY_topology_minimal_c: (default) The lofted body will have the minimum number of faces possible. Profile edges which meet smoothly may be lofted into a single face. o PK_BODY_topology_columns_c: The lofted body will have one set of faces for each edge in the profile regardless of whether they are smoothly connected. o PK_BODY_topology_grid_c: The lofted body will have n_profiles - 1 faces (and n_profiles faces for a periodic loft) for each set of corresponding profile edges. All edges in the profiles will correspond to edges on the resultant lofted body. Geometry Simplification The simplification of the geometry of individual lofted faces may be attempted, depending on the value of the simplify field within the option structure. The field may be set to one of the following values : o PK_BODY_simplify_no_c: B-spline geometry will be used to represent the loft of all sections of the profiles. o PK_BODY_simplify_yes_c (default): The lofted surfaces may be replaced where the combination of loft profile geometries produces an analytic simplification of the loft. If the surface of a face is simplified, the edges of the face may be simplified as well. Nominal Geometry on the Lofted Body The resultant lofted body will always have nominal geometry enabled. The state of the nominal geometry flag on the resultant lofted body can be enquired and set via PK_BODY_ask_curve_nmnl_state and PK_BODY_set_curve_nmnl_state respectively. The edges in the resultant loft body which are copied from the input profiles will have nominal geometry associated with them. The edges formed as a result of the lofting operation (lateral edges) may have nominal geometry associated with them. The nominal geometry for an edge may be acquired via the functions, PK_EDGE_ask_curve_nmnl and PK_EDGE_ask_geometry_nmnl. Returned Tracking and Error Information The resultant lofted body is returned in lofted_body as a structure that packages it with associated status and tracking information. The status information, in the status field of the returned structure, is itself a structure that contains information on any failure to create the lofted body. The type of fault occurred is indicated by the fault field. The location of the error is given by a point and topology in the fault_location and fault_topol fields respectively. The tracking information relates topology prior to the operation, to topology after it. Details of the structure of this information is given in the documentation on PK_TOPOL_track_r_t. This information will relate the geometric dependency of faces in the result upon edges or faces in the received profiles. The tracking records contain : o for each lateral face generated by lofting across edges : product_topols is an array holding just that lateral face original_topols is the set of edges in the profiles that if modified would alter its geometry. o for each face in an end cap generated for a sheet profile product_topols is an array holding just that end face original_topols is an array holding the single face in the original profile for which it is a transformed copy. Topologies involved in many topological operations may appear in several tracking records.