• 偏置曲线代码


    #include <stdio.h>
    #include <uf.h>
    #include <uf_defs.h>
    #include <uf_modl.h>
    #include <uf_part.h>
    #include <uf_curve.h>
    #include <uf_csys.h>
    #include <uf_vec.h>
    #include <uf_ui.h>

    #define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))

    static int report( char *file, int line, char *call, int irc)
    {
        if (irc)
        {
            char    messg[133];
            printf("%s, line %d:  %s ", file, line, call);
            (UF_get_fail_message(irc, messg)) ?
                printf("    returned a %d ", irc) :
                printf("    returned error %d:  %s ", irc, messg);
        }
        return(irc);
    }

    static void do_ugopen_api(void)
    {
        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);
       
        /* Set up the structures to define an associative type of offset     */
        /* curve. This will use a distance and have a trim method of         */
        /* extended tangents.  (Only need to change the type, all other      */        
        /* parameters were set up previously.                                */        
       
        offset_data.offset_type = UF_CURVE_OFFSET_DISTANCE_TANGENT;
            
        /* Create the offset curve object. */
         
        UF_CALL(UF_CURVE_create_offset_object(&offset_data,
                                              &offset_tag));

        /* Get the tags to the output offset curves.  These will be used as */
        /* Input to create the next offset curve object.                    */

        UF_CALL(UF_CURVE_ask_offset_curves(offset_tag,
                                      &num_curves,
                                      &offset_curves));
          
        /* Modify the input string to pass in the offset curves as input. */

        input_string.string[0] = num_curves;
        for (i=0; i<num_curves; i++)
          input_string.id[i] = offset_curves[i];
          
        UF_free(offset_curves);

        /* Create the new offset curve object.  (This is the way to do  */
        /* multiple copies or multiple Applies interactively.)          */

        UF_CALL(UF_CURVE_create_offset_object(&offset_data,
                                              &offset_tag));

        /* Retrieve the parameter information for the last object created.  */

        UF_CALL(UF_CURVE_ask_offset_parms(offset_tag,
                                     &ask_offset_data));
          
        /* Change the offset type to have no extenstion/trim. */

        ask_offset_data.offset_type = UF_CURVE_OFFSET_DISTANCE_NO_TRIM;

        UF_CALL(UF_CURVE_edit_offset_object(&ask_offset_data,
                                            offset_tag));

        /* Free underlying structures. */
       
        UF_CALL(UF_CURVE_free_offset_parms(&ask_offset_data));
            
        UF_MODL_free_string_list(&input_string);

    }
    /*ARGSUSED*/
    void ufusr(char *param, int *retcode, int paramLen)
    {
        if (!UF_CALL(UF_initialize()))
        {
            do_ugopen_api();
            UF_CALL(UF_terminate());
        }
    }

    int ufusr_ask_unload(void)
    {
        return (UF_UNLOAD_IMMEDIATELY);
    }

  • 相关阅读:
    【Linux】VMware及VirtualBox网络配置
    【Linux】VirtualBox安装ubuntu排错LowGraphic
    【Hadoop】Win7上搭建Hadoop开发环境,方法一
    【JAVA】配置JAVA环境变量,安装Eclipse
    Eureka自我保护机制
    zookeeper代替eureka作为SpringCloud的服务注册中心
    mybatisplus代码生成器
    条件构造器 EntityWrapper (重要)
    idea 常用快捷键
    MybatisPlus的通用 CRUD
  • 原文地址:https://www.cnblogs.com/whiteIcrow/p/4078480.html
Copyright © 2020-2023  润新知