iCAx开思工具箱

标题: UF_MODL_ask_bounding_box能不能得到多个选择对象的轮廓大小? [打印本页]

作者: endiaons    时间: 2005-7-20 11:06
标题: UF_MODL_ask_bounding_box能不能得到多个选择对象的轮廓大小?
UF_MODL_ask_bounding_box能不能得到多个选择对象的轮廓大小?
是不是UF_MODL_ask_bounding_box(object, box)只能用
UF_UI_select_with_class_dialog得到一个目标?
而不能用UF_UI_select_with_class_dialog得到多个目标?
我想实现的是选择多个目标然后得到多个目标的轮廓大小。
作者: chen_fuxing2003    时间: 2005-7-20 18:39
UF_UI_select_with_class_dialog这个函数可以实现多个目标的选取,
可以实现的!!!
作者: endiaons    时间: 2005-7-21 10:44
UF_UI_select_with_class_dialog是可以选择多个object
但是我最后要返回的是多个object的轮廓大小呀
作者: jjf1120    时间: 2005-7-21 17:35
可以用UF_UI_select_with_class_dialog选多个,然后成链就可以了
作者: ljbest    时间: 2005-7-22 00:47
能说的再详细点么?,我也要用到这个功能。谢谢了!!
作者: endiaons    时间: 2005-7-22 08:17
怎么样成链?谢谢!成链后是不是得到多个目标的轮廓大小?
UF_MODL_ask_bounding_box 怎样得到成链后得坐标值?
作者: Tyrael    时间: 2005-7-22 09:42
UF_UI_select_with_class_dialog是可以实现多个目标的选取
但是这样只能得到每个目标的bounding box
怎样能得到一个bounding box把它们全包含呢?
作者: endiaons    时间: 2005-7-22 14:07
成链可以做到吗?
成链以后的轮廓数据存到哪了?
如何调用?
作者: Tyrael    时间: 2005-7-22 15:27
难道是对链对象调用uf_modl_ask_bounding_box?
作者: endiaons    时间: 2005-7-25 08:42
看来这个问题很难得到解答呀。不知道“键盘”兄弟能否解答一下?万分感激!
作者: 深夜摔键盘    时间: 2005-7-25 11:21
每个对象的bounding box的信息你都获取到了。这些bounding box的边都是平行与绝对坐标系的,你只需要从这些bounding box的顶点中穷举出一个最小顶点和一个最大顶点就可以了。
作者: jjf1120    时间: 2005-7-25 11:45
将取得的tag_t,用UF_CURVE_auto_join_curves成链,得到成链曲线轮廓的tag_t,然后带入你的函数
作者: 深夜摔键盘    时间: 2005-7-25 11:56
晕啊,楼上di,他的对象不仅仅限于曲线
作者: tsingtsang    时间: 2005-7-25 13:24
深夜摔键盘 wrote:
每个对象的bounding box的信息你都获取到了。这些bounding box的边都是平行与绝对坐标系的,你只需要从这些bounding box的顶点中穷举出一个最小顶点和一个最大顶点就可以了。

  
如果对象与绝对坐标系成角度怎么办?不会得到真实值!
作者: 深夜摔键盘    时间: 2005-7-25 15:32
UG自身计算出的几何对象包围盒就不是最小体积的,它计算出来的box的各边完全平行于绝对坐标系。
  
最小体积的外包盒子,目前的CAD软件中应该是谁都没有做到。计算量太大。
  
如果要想根据每个对象的box,求出包围所有对象的最小box,那么得多所有对象的box顶点构造凸包,然后根据凸包近乎是穷举出最小的box。
作者: endiaons    时间: 2005-7-26 08:28
UF_UI_select_with_single_dialog每次只能得到一个对象的数据
能否用UF_UI_select_with_class_dialog同时得到多个对象,然后再穷举出一个最小顶点和一个最大顶点?如何实现穷举?对得到的数据进行比较?
作者: 深夜摔键盘    时间: 2005-7-26 08:40
UF_UI_select_with_class_dialog可以得到多个对象。
  
穷举,就是求坐标的最大值和最小值,最后得到(xmin, ymin , zmin)和(xmax,ymax,zmax); 将其视为BOX的两个对角顶点就可以了。
  
结果得到的box不是最能逼近对象的,如果你的目的只是粗略的求box,应该没什么问题吧。先试试,再说。如果想精确,就得用凸包。
作者: endiaons    时间: 2005-7-26 13:10
static tag_t select_anything(char *prompt)
{
    double
        cp[3];
    int
        resp;
    tag_t
        view;
  tag_t
    object;
  
    UF_CALL(UF_UI_select_with_single_dialog(  
    prompt,
    "Asset Create Box",
        UF_UI_SEL_SCOPE_WORK_PART,
    NULL,
    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 void display_bounding_box(tag_t object)
{
  
    double
        box[6],
        end[3],
        start[3];
  
    UF_OBJ_disp_props_t
        props = { 1, UF_OBJ_WHITE, UF_OBJ_NOT_BLANKED, UF_OBJ_WIDTH_NORMAL,
            UF_OBJ_FONT_SOLID, FALSE};
  
    UF_MODL_ask_bounding_box(object, box);
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[1];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[1];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[1];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[1];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[4];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[4];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[4];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[4];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
     
  
}
  
void do_it1(void)
{   
    tag_t
        object1,object2;
  
    object1 = select_anything("Select an object");
    display_bounding_box(object1);
  
    object2 = select_anything("Select an object");
    display_bounding_box(object2);
}
  
extern "C" DllExport void ufusr (char *param,int *returnCode, int rlen)
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  if(!UF_CALL(UF_initialize()))
  {
      do_it1();
    UF_CALL(UF_terminate());
  }
  
}
  
int ufusr_ask_unload(void)
{
  return (UF_UNLOAD_SEL_DIALOG);
}
如何把object1 = select_anything("Select an object");
    display_bounding_box(object1);
执行的数据box[6]存下来?
object2 = select_anything("Select an object");
    display_bounding_box(object2);
呢?
作者: endiaons    时间: 2005-7-26 14:44
大家帮看看
有什么毛病?新手,勿笑。
#include "stdafx.h"
#include "Create_Box.h"
#include "ug.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
  
BEGIN_MESSAGE_MAP(CCreate_BoxApp, CWinApp)
END_MESSAGE_MAP()
  
CCreate_BoxAppCreate_BoxApp()
{
  // TODO: add construction code here,
  // Place all significant initialization in InitInstance
}
  
// The one and only CCreate_BoxApp object
  
CCreate_BoxApp theApp;
  
// CCreate_BoxApp initialization
  
BOOL CCreate_BoxApp:nitInstance()
{
  CWinApp:nitInstance();
  
  return TRUE;
}
  
static double cc[6];
  
static tag_t select_anything(char *prompt)
{
  
    double
        cp[3];
    int
        resp;
    tag_t
        view;
  tag_t
    object;
  
    UF_CALL(UF_UI_select_with_single_dialog(  
    prompt,
    "Asset Create Box",
        UF_UI_SEL_SCOPE_WORK_PART,
    NULL,
    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 void display_bounding_box(tag_t object)
{
  
    double
        box[6],
        end[3],
        start[3];
  
    UF_OBJ_disp_props_t
        props = { 1, UF_OBJ_WHITE, UF_OBJ_NOT_BLANKED, UF_OBJ_WIDTH_NORMAL,
            UF_OBJ_FONT_SOLID, FALSE};
  
    UF_MODL_ask_bounding_box(object, box);
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[1];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[1];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[1];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[1];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[1];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[4];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[4];
    start[2] = box[2];
    end[0] = box[3];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[3];
    start[1] = box[4];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[5];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
  
    start[0] = box[0];
    start[1] = box[4];
    start[2] = box[5];
    end[0] = box[0];
    end[1] = box[4];
    end[2] = box[2];
    UF_CALL(UF_DISP_display_temporary_line(NULL_TAG, UF_DISP_USE_WORK_VIEW,
        start, end, [$props))]
     
  cc[0] = box[0];
    cc[1] = box[1];
  cc[2] = box[2];
  cc[3] = box[3];
  cc[4] = box[4];
  cc[5] = box[5];
    
}
  
static double aa[6];
static double bb[6];
void do_it1(void)
{   
  
    tag_t
        object1,object2;
  
    object1 = select_anything("Select an object");
    display_bounding_box(object1);
  aa[0] = cc[0];
  aa[1] = cc[1];
  aa[2] = cc[2];
  aa[3] = cc[3];
  aa[4] = cc[4];
  aa[5] = cc[5];
    object2 = select_anything("Select an object");
    display_bounding_box(object2);
  bb[0] = cc[0];
  bb[1] = cc[1];
  bb[2] = cc[2];
  bb[3] = cc[3];
  bb[4] = cc[4];
  bb[5] = cc[5];
}
void show_it()
{
  //下面是求最大轮廓
  double dd[3] = {0,0,0};
   for( int i= 0;i<3;i++)
   {
  if( aa < bb)
    dd = aa;
  else dd = bb;
   }
   double ee[3] = {0,0,0};
      for( int i= 3;i<6;i++)
   {
  if( aa > bb)
    ee = aa;
  else ee = bb;
   }
   double ff[6]= {0,0,0,0,0,0};
   ff[0] = dd[0];
   ff[1] = dd[1];
   ff[2] = dd[2];
   ff[3] = ee[0];
   ff[4] = ee[1];
   ff[5] = ee[2];
  //画最大轮廓线
   UF_CURVE_line_t sline1;  
    tag_t line1;  
    sline1.start_point[0] =ff[0];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[2];  
    sline1.end_point[0] = ff[3];  
    sline1.end_point[1] = ff[1];  
    sline1.end_point[2] = ff[2];
    UF_CURVE_create_line([$sline1,&line1)]
   UF_CURVE_line_t sline2;  
    tag_t line2;  
    sline1.start_point[0] =ff[3];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[2];  
    sline1.end_point[0] = ff[3];  
    sline1.end_point[1] = ff[1];  
    sline1.end_point[2] = ff[5];
    UF_CURVE_create_line([$sline2,&line2)]
  
    UF_CURVE_line_t sline3;  
    tag_t line3;  
    sline1.start_point[0] =ff[3];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[5];  
    sline1.end_point[0] = ff[0];  
    sline1.end_point[1] = ff[1];  
    sline1.end_point[2] = ff[5];
    UF_CURVE_create_line([$sline3,&line3)]
  
    UF_CURVE_line_t sline4;  
    tag_t line4;  
    sline1.start_point[0] =ff[0];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[5];  
    sline1.end_point[0] = ff[0];  
    sline1.end_point[1] = ff[1];  
    sline1.end_point[2] = ff[2];
    UF_CURVE_create_line([$sline4,&line4)]
  
  UF_CURVE_line_t sline5;  
    tag_t line5;  
    sline1.start_point[0] =ff[0];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[2];  
    sline1.end_point[0] = ff[0];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[2];
    UF_CURVE_create_line([$sline5,&line5)]
  
  UF_CURVE_line_t sline6;  
    tag_t line6;  
    sline1.start_point[0] =ff[3];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[2];  
    sline1.end_point[0] = ff[3];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[2];
    UF_CURVE_create_line([$sline6,&line6)]
  
  UF_CURVE_line_t sline7;  
    tag_t line7;  
    sline1.start_point[0] =ff[3];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[5];  
    sline1.end_point[0] = ff[3];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[5];
    UF_CURVE_create_line([$sline7,&line7)]
  
  UF_CURVE_line_t sline8;  
    tag_t line8;  
    sline1.start_point[0] =ff[0];  
    sline1.start_point[1] =ff[1];  
    sline1.start_point[2] =ff[5];  
    sline1.end_point[0] = ff[0];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[5];
    UF_CURVE_create_line([$sline8,&line8)]
  
  UF_CURVE_line_t sline9;  
    tag_t line9;  
    sline1.start_point[0] =ff[0];  
    sline1.start_point[1] =ff[4];  
    sline1.start_point[2] =ff[2];  
    sline1.end_point[0] = ff[3];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[2];
    UF_CURVE_create_line([$sline9,&line9)]
  
  UF_CURVE_line_t sline10;  
    tag_t line10;  
    sline1.start_point[0] =ff[3];  
    sline1.start_point[1] =ff[4];  
    sline1.start_point[2] =ff[2];  
    sline1.end_point[0] = ff[3];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[5];
    UF_CURVE_create_line([$sline10,&line10)]
  
  UF_CURVE_line_t sline11;  
    tag_t line11;  
    sline1.start_point[0] =ff[3];  
    sline1.start_point[1] =ff[4];  
    sline1.start_point[2] =ff[5];  
    sline1.end_point[0] = ff[0];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[5];
    UF_CURVE_create_line([$sline11,&line11)]
  
  UF_CURVE_line_t sline12;  
    tag_t line12;  
    sline1.start_point[0] =ff[0];  
    sline1.start_point[1] =ff[4];  
    sline1.start_point[2] =ff[5];  
    sline1.end_point[0] = ff[0];  
    sline1.end_point[1] = ff[4];  
    sline1.end_point[2] = ff[2];
    UF_CURVE_create_line([$sline12,&line12)]
  
}
  
extern "C" DllExport void ufusr (char *param,int *returnCode, int rlen)
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  if(!UF_CALL(UF_initialize()))
  {
      do_it1();
    show_it();
    UF_CALL(UF_terminate());
  }
  
}
  
int ufusr_ask_unload(void)
{
  return (UF_UNLOAD_SEL_DIALOG);
}
作者: zhongbing79    时间: 2005-8-2 11:15
应该可以通过获取所有选择的图元对象,遍历计算每个图元的BoundingBox,然后比较计算最终的BoundingBox就可以了。




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