NX二次开发-NXOpen::Measurement::GetMinimumDistance获得两个对象之间的最小距离


  • 文章主题

NXOpen::Measurement::GetMinimumDistance 这个NXOpen方法是:获得两个对象之间的最小距离

与它相对应的UF函数是 UF_MODL_ask_minimum_dist ,有关它的用法,请查看 https://www.cnblogs.com/nxopen2018/p/10975886.html

  • NXOpen类和方法介绍

NXOpen::Measurement类 : 提供计算和显示测量信息的方法 

NX二次开发-NXOpen::Measurement::GetMinimumDistance获得两个对象之间的最小距离

 

 GetMinimumDistance 方法 : 计算并返回对象之间的“最小距离” ,这个方法有多个重载函数,按需选择。

NX二次开发-NXOpen::Measurement::GetMinimumDistance获得两个对象之间的最小距离

 

  • 代码例子

下面这个代码例子,来自一位网友,这是他在西门子官网上面下载的

//Sample NX Open C++ program : report minimum distance between selected objects interop

#include <stdio.h>
#include <string.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_disp.h>
#include <uf_modl.h>
#include <uf_obj.h>
#include <uf_object_types.h>

#include <stdarg.h>

static void ECHO(char *format, ...)
{
    char msg[UF_UI_MAX_STRING_LEN + 1];
    va_list args;
    va_start(args, format);
    vsprintf(msg, format, args);
    va_end(args);
    UF_UI_open_listing_window();
    UF_UI_write_listing_window(msg);
    UF_print_syslog(msg, 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];

        UF_get_fail_message(irc, err);
        ECHO("*** ERROR code %d at line %d in %s:/n",
            irc, line, file);
        ECHO("+++ %s/n", err);
        ECHO("%s;/n", call);
    }

    return(irc);
}

/*ARGSUSED*/
static int mask_add_faces_and_edges(UF_UI_selection_p_t select, void *type)
{
    UF_UI_mask_t
        mask[2] = { { UF_solid_type, 0, UF_UI_SEL_FEATURE_ANY_FACE },
        { UF_solid_type, 0, UF_UI_SEL_FEATURE_ANY_EDGE } };

    if (!UF_CALL(UF_UI_set_sel_mask(select,
        UF_UI_SEL_MASK_ENABLE_SPECIFIC, 2, mask)))
        return (UF_UI_SEL_SUCCESS);
    else
        return (UF_UI_SEL_FAILURE);
}

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

    UF_CALL(UF_UI_select_with_single_dialog("Select an object", prompt,
        UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY, mask_add_faces_and_edges, 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, FALSE));
        return object;
    }
    else return NULL_TAG;

}

#include <NXOpen/Session.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/NXObjectManager.hxx>
#include <NXOpen/Measurement.hxx>
using namespace NXOpen;

static double get_min_dist_interop(tag_t obj1, tag_t obj2)
{
    Session *theSession = Session::GetSession();
    Point3d *p1 = new Point3d;
    Point3d *p2 = new Point3d;
    double acc;
    return theSession->Measurement()->GetMinimumDistance(
        dynamic_cast<NXObject *>(NXObjectManager::Get(obj1)),
        dynamic_cast<NXObject *>(NXObjectManager::Get(obj2)),
        p1, p2, &acc);
}

static void do_it(void)
{
    tag_t
        object1,
        object2;
    double
        dist;

    while (((object1 = select_any_object("First object")) != NULL_TAG) &&
        ((object2 = select_any_object("Second object")) != NULL_TAG))
    {
        dist = get_min_dist_interop(object1, object2);
        ECHO("The minimum distance = %f/n", dist);
    }
}

/*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);
}
  • 演示

NX二次开发-NXOpen::Measurement::GetMinimumDistance获得两个对象之间的最小距离

 

阿飞

2022年4月16日

原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/244754.html

(0)
上一篇 2022年4月17日
下一篇 2022年4月17日

相关推荐

发表回复

登录后才能评论