iCAx开思工具箱

标题: 求助:偏移曲线 [打印本页]

作者: xpl2005    时间: 2006-9-12 16:04
标题: 求助:偏移曲线
请问斑竹和各位同仁,谁知道UF_CURVE_create_offset_object (
UF_CURVE_offset_data_p_t offset_data_pointer,
tag_t * offset_curve_object );这个函数怎么用啊?也就是如何得到一条偏移的曲线?
作者: mizzle    时间: 2006-9-13 19:19
double tol[3]={0.1,0.1,0.1};
    double value[6], base_point[3];
    double direction_vector[3],draft_direction_vector[3],dot = 1;
    double x_direction[3]={-1,0,0};
    double step = 1.0;

    char   *part_name="sample";
    char   distance_str[] = {"0.25"};
    char   neg_distance_str[] = {"-0.25"};

    int    units = UF_PART_ENGLISH,num_curves,i;
    int    align =1,end_point=0,body_type=0, edge_type;

    tag_t  part_tag,arc1_tag,arc2_tag,face_tag,
           sheet_tag,offset_tag,*offset_curves;
    tag_t  wcs;
   

    UF_STRING_t   guide,spine,input_string;
   
    UF_CURVE_arc_t arc_coords;

    uf_list_p_t edge_list,face_list;
        
    UF_CURVE_offset_data_t offset_data, ask_offset_data;

    UF_CURVE_offset_distance_data_t offset_distance1;   

    /* Open a new part */
   
    UF_CALL(UF_PART_new(part_name, units, &part_tag));
   
    /* Create 2 arcs for guide strings for ruled surface */
   
    UF_CALL(UF_CSYS_ask_wcs(&wcs));
    UF_CALL(UF_CSYS_ask_matrix_of_object(wcs, &arc_coords.matrix_tag));
    arc_coords.start_angle = 78.0 * (PI/180);
    arc_coords.end_angle = 101.0 * (PI/180);
    arc_coords.arc_center[0] = 0.5;
    arc_coords.arc_center[1] = -2.4750;
    arc_coords.arc_center[2] = 0.0;
    arc_coords.radius = 2.525;
   
    UF_CALL(UF_CURVE_create_arc(&arc_coords,&arc1_tag));   
  
    arc_coords.arc_center[0] = 0.5;
    arc_coords.arc_center[1] = -1.9750;
    arc_coords.arc_center[2] = 0.0;

    UF_CALL(UF_CURVE_create_arc(&arc_coords,&arc2_tag));

    UF_MODL_create_string_list(2,2,&guide);

    guide.num = 2;
    guide.string[0] = 1;
    guide.dir[0] = 1;
    guide.id[0] = arc1_tag;
    guide.string[1] = 1;
    guide.dir[1] = 1;
    guide.id[1] = arc2_tag;
    spine.num = 0;
   
    /* Create ruled surface */
   
    UF_CALL(UF_MODL_create_ruled(&guide,
                                 &spine,
                                 &align,
                                 value,
                                 &end_point,
                                 &body_type,
                                 UF_NULLSIGN,
                                 tol,
                                 &sheet_tag));

    UF_MODL_free_string_list(&guide);

    /* Get the tag to the face */
   
    UF_CALL(UF_MODL_ask_body_faces(sheet_tag,
                                       &face_list));
   
    UF_CALL(UF_MODL_ask_list_item(face_list,
                                  0,
                                  &face_tag));

    UF_CALL(UF_MODL_delete_list(&face_list));
                          
    /* Get the edges of the face */
   
    UF_CALL(UF_MODL_ask_face_edges(face_tag,
                           &edge_list));
                           
    /* Set up a string for the input curves. Find the two linear edges */
    /* opposite the guide strings of the ruled surface to use in the string. */
   
    UF_MODL_create_string_list(1,8,&input_string);
   
    input_string.num = 1;
    input_string.string[0] = 4;
    input_string.dir[0] = 1;
    input_string.id[0] = arc1_tag;
    input_string.id[1] = arc2_tag;
    num_curves = 2;
    for(i = 0; i < 4; i++)
    {
      UF_MODL_ask_list_item(edge_list,
                            i,
                            &input_string.id[num_curves]);
      
      UF_MODL_ask_edge_type(input_string.id[num_curves],
                            &edge_type);
      if(edge_type == UF_MODL_LINEAR_EDGE)
         num_curves++;
    }

    UF_MODL_delete_list(&edge_list);

    /* Compute the direction vectors of the string */

    UF_CALL(UF_CURVE_ask_offset_direction(&input_string,
                                          direction_vector,
                                          draft_direction_vector,
                                          base_point));
     
    /* Compute the dot product between the direction vector and the +X vector */
    /* This will be used later to determine if we will use a positive or
       negative    */
    /* offset distance. */
   
    UF_VEC3_dot(direction_vector,
                x_direction,
                &dot);
                       
   
    /* Set up the structures to define a non-associative type of offset  */
    /* curve. This will use a distance and have a trim method of fillet. */
   
    offset_data.offset_type = UF_CURVE_OFFSET_DISTANCE_FILLET;
    offset_data.input_curves = &input_string;
    offset_data.approximation_tolerance = step;

    UF_MODL_ask_distance_tolerance(&offset_data.string_tolerance);

    offset_data.offset_def.distance_type1 = &offset_distance1;
    offset_distance1.distance = distance_str;

    if (dot >= 0)
    {
      offset_distance1.distance = distance_str;
    }
    else
    {
      offset_distance1.distance = neg_distance_str;
    }
        
    /* Create the offset curves. */
   
     
    UF_CALL(UF_CURVE_create_offset_curve(&offset_data,
                                         &num_curves,
                                         &offset_curves));
   
    UF_free(offset_curves);
作者: xpl2005    时间: 2007-1-18 20:53
多谢!




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3