找回密码
 注册
Simdroid-非首页
查看: 125|回复: 1

[二次开发] Sample Open C API program : export parasolid text files

[复制链接]
发表于 2011-5-28 14:07:26 | 显示全部楼层 |阅读模式 来自 上海嘉定区
#include <stdio.h>
#include <string.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_obj.h>
#include <uf_object_types.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_assem.h>
#include <uf_ps.h>

#define ECHO(X) { UF_UI_open_listing_window(); \
    UF_UI_write_listing_window(X); \
    UF_print_syslog(X, FALSE); }

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

static int report_error( char *file, int line, char *call, int irc)
{
    if (irc)
    {
        char err[133],
             msg[UF_UI_MAX_STRING_LEN];

        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
            irc, line, file);
        UF_get_fail_message(irc, err);

        ECHO(msg);
        ECHO(err);
        ECHO("\n");
        ECHO(call);
        ECHO(";\n");
    }

    return(irc);
}

static tag_t ask_next_solid_body(tag_t part, tag_t body)
{
    int
        subtype,
        type;

    while (!UF_CALL(UF_OBJ_cycle_objs_in_part(part, UF_solid_type, &body))
        && (body != NULL_TAG))
    {
        UF_CALL(UF_OBJ_ask_type_and_subtype(body, &type, &subtype));
        if (subtype == UF_solid_body_subtype)
        {
            UF_CALL(UF_MODL_ask_body_type(body, &type));
            if (type == UF_MODL_SOLID_BODY) return body;
        }
    }

    return NULL_TAG;
}

static int allocate_memory(unsigned int nbytes, void **where)
{
    int
        resp;

    *where = UF_allocate_memory(nbytes, &resp);

    return resp;
}

static int make_an_array(uf_list_p_t *object_list, tag_t **objects)
{
    int
        ii,
        n;
    uf_list_p_t
        temp;

    UF_CALL(UF_MODL_ask_list_count(*object_list, &n));

    UF_CALL(allocate_memory(n * sizeof(tag_t), (void **)objects));

    for (ii = 0, temp = *object_list; ii < n; temp = temp->next, ii++)
        (*objects)[ii] = temp->eid;

    UF_CALL(UF_MODL_delete_list(object_list));

    return n;
}

static int ask_all_prototype_solids(tag_t part, tag_t **solids)
{
    tag_t
        solid = NULL_TAG;
    uf_list_p_t
        solid_list;

    UF_CALL(UF_MODL_create_list(&solid_list));

    while ((solid = ask_next_solid_body(part, solid)) != NULL_TAG)
    {
        if (UF_ASSEM_is_occurrence(solid))
            UF_CALL(UF_MODL_put_list_item(solid_list,
                UF_ASSEM_ask_prototype_of_occ(solid)));
        else
            UF_CALL(UF_MODL_put_list_item(solid_list, solid));
    }

    return (make_an_array(&solid_list, solids));
}

#define WRITE_D(X) (write_integer_to_listing_window(#X, X))

static void write_integer_to_listing_window(char *title, int n)
{
    char
        msg[UF_UI_MAX_STRING_LEN+1];

    sprintf(msg, "%s = %d\n", title, n);
    ECHO(msg);
}

#define WRITE_S(X) (write_string_to_listing_window(#X, X))

void write_string_to_listing_window(char *title, char *string)
{
    char
        msg[UF_UI_MAX_STRING_LEN+1];

    if (string != NULL)
        sprintf(msg, "%s = \"%s\"\n", title, string);
    else
        sprintf(msg, "%s = NULL\n", title);

    ECHO(msg);
}

static void build_unique_temp_name(char *fspec, int ftype)
{
    char
        *tmp_dir,
        unique[UF_CFI_MAX_FILE_NAME_SIZE];

    UF_CALL(UF_translate_variable("UGII_TMP_DIR", &tmp_dir));
    UF_CALL(uc4577(unique));
    UF_CALL(uc4575(tmp_dir, ftype, unique, fspec));
}

static uf_list_p_t make_a_list(int count, tag_t *item_array)
{
    int
        ii;
    uf_list_p_t
        list;

    UF_CALL(UF_MODL_create_list(&list));

    for (ii = 0; ii < count; ii++)
        UF_CALL(UF_MODL_put_list_item(list, item_array[ii]));

    return (list);
}

static void do_it(void)
{
    int
        ii,
        n;
    tag_t
        part = UF_PART_ask_display_part(),
        *proto_solids;
    char
        exported_to[MAX_FSPEC_SIZE+1],
        *handle;
    uf_list_p_t
        body_list;

    n = ask_all_prototype_solids(part, &proto_solids);

    for (ii = 0; ii < n; ii++)
    {
        WRITE_D(ii);
        WRITE_D(proto_solids[ii]);
        handle = UF_TAG_ask_handle_of_tag(proto_solids[ii]);
        WRITE_S(handle);
        UF_free(handle);
        build_unique_temp_name(exported_to, 0);
        strcat(exported_to, ".x_t");

        body_list = make_a_list(1, &proto_solids[ii]);
        UF_CALL(UF_PS_export_data(body_list, exported_to));
        UF_CALL(UF_MODL_delete_list(&body_list));

        WRITE_S(exported_to);
    }
    if (n > 0) UF_free(proto_solids);
}

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

int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}
发表于 2013-8-15 13:39:07 | 显示全部楼层 来自 广西柳州
Simdroid开发平台
多谢楼主分享
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 17:24 , Processed in 0.033774 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表