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

[二次开发] 干涉的例子Sample Open C API program : create interference solid

[复制链接]
发表于 2009-6-3 20:57:00 | 显示全部楼层 |阅读模式 来自 山西太原
#include <stdio.h>
#include <string.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_assem.h>
#include <uf_obj.h>
#include <uf_wave.h>
#include <uf_so.h>

#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[133];

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

    /*  NOTE:  UF_print_syslog is new in V18 */

        UF_print_syslog(msg, FALSE);
        UF_print_syslog(err, FALSE);
        UF_print_syslog("\n", FALSE);
        UF_print_syslog(call, FALSE);
        UF_print_syslog(";\n", FALSE);

        if (!UF_UI_open_listing_window())
        {
            UF_UI_write_listing_window(msg);
            UF_UI_write_listing_window(err);
            UF_UI_write_listing_window("\n");
            UF_UI_write_listing_window(call);
            UF_UI_write_listing_window(";\n");
        }
    }

    return(irc);
}

/*ARGSUSED*/
static int mask_for_solid_bodies( UF_UI_selection_p_t select, void *type)
{
    UF_UI_mask_t
        mask = { UF_solid_type, 0, UF_UI_SEL_FEATURE_SOLID_BODY };

    if (!UF_CALL(UF_UI_set_sel_mask(select,
            UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, 1, &mask)))
        return (UF_UI_SEL_SUCCESS);
    else
        return (UF_UI_SEL_FAILURE);
}

static tag_t select_a_solid(char *prompt)
{
    double
        cp[3];
    int
        resp;
    tag_t
        object,
        view;

    UF_CALL(UF_UI_select_with_single_dialog( "Select a solid", prompt,
        UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY, mask_for_solid_bodies, NULL, &resp,
        &object, cp, &view));

    if (resp == UF_UI_OBJECT_SELECTED || resp == UF_UI_OBJECT_SELECTED_BY_NAME)
    {
        UF_CALL(UF_DISP_set_highlight(object, 0));
        return object;
    }
    else return NULL_TAG;

}

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 tag_t ask_part_occ_of_prom_occ(tag_t prom_object)
{
    tag_t
        owning_part,
        part_occ = prom_object,
        proto;

    proto = UF_ASSEM_ask_prototype_of_occ(prom_object);

    UF_CALL(UF_OBJ_ask_owning_part(proto, &owning_part));

    while (!UF_CALL(UF_ASSEM_ask_parent_component(part_occ, &part_occ))
        && (UF_ASSEM_ask_prototype_of_occ(part_occ) != owning_part));

    return part_occ;
}

static tag_t create_dumb_body_copy(tag_t body)
{
    tag_t
        feat,
        part_occ,
        proto,
        xform,
        dumb_body;
    uf_list_p_t
        list;

    if (UF_ASSEM_is_occurrence(body))
        proto = UF_ASSEM_ask_prototype_of_occ(body);
    else
        proto = body;

    if (UF_OBJ_is_object_a_promotion(proto))
        part_occ = ask_part_occ_of_prom_occ(body);
    else
        part_occ = UF_ASSEM_ask_part_occurrence(body);

    if (part_occ == NULL_TAG)
        UF_CALL(UF_WAVE_create_linked_body(proto,NULL_TAG,body,FALSE,&feat));
    else
    {
        UF_CALL(UF_SO_create_xform_assy_ctxt(body, part_occ, NULL_TAG, &xform));
        UF_CALL(UF_WAVE_create_linked_body(proto, xform, body, FALSE, &feat));
    }

    UF_CALL(UF_MODL_ask_feat_body(feat, &dumb_body));

    if (dumb_body != NULL_TAG)
    {
        list = make_a_list(1, &dumb_body);
        UF_CALL(UF_MODL_delete_object_parms(list));
        UF_CALL(UF_MODL_delete_list(&list));
    }

    return dumb_body;
}

static void do_it(void)
{
    int
        flag,
        n_results;
    tag_t
        body1,
        body2,
        *results;
    uf_list_p_t
        list;

    while (((body1 = select_a_solid("Select Body 1")) != NULL_TAG) &&
           ((body2 = select_a_solid("Select Body 2")) != NULL_TAG))
    {
        UF_CALL(UF_MODL_check_interference(body1, 1, &body2, &flag));
        if (flag == 1)
        {
            body1 = create_dumb_body_copy(body1);
            body2 = create_dumb_body_copy(body2);
            UF_CALL(UF_MODL_intersect_bodies(body1, body2, &n_results,
                &results));
            if (n_results > 0)
            {
                list = make_a_list(n_results, results);
                UF_CALL(UF_MODL_delete_object_parms(list));
                UF_CALL(UF_MODL_delete_list(&list));
                UF_free(results);
            }
        }
    }
}

/*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);
}
发表于 2010-7-19 11:39:57 | 显示全部楼层 来自 大连理工大学
Simdroid开发平台
谢谢斑竹
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-9-21 17:27 , Processed in 0.038271 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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