iCAx开思工具箱

标题: 【求助】如何获得UF_MODL_create_revolution旋转体的tag [打印本页]

作者: vcreat    时间: 2004-8-27 06:59
标题: 【求助】如何获得UF_MODL_create_revolution旋转体的tag
我画了一个封闭的图形,并且成功地用UF_MODL_create_revolution旋转获得旋转体,现在我想用UF_MODL_ask_mass_property_3d计算这个旋转体的质量等特性,但是现在不知道新生成的选转体的tag,所以计算质量的函数找不到选转体的标签,程序无法进行。
  
我的设计大致是这样的:
  
static creat_revolution()
{画线。。。。
  
UF_MODL_create_revolution(线的数组等参数);
  
接下来就想在这里用return 把选转体的tag返回;
}
  
tag_t *revolution_part;
*revolution_part=create_revolution();
UF_MODL_ask_mass_property_3d(revolution_part,..........等参数);
  
这就是程序的大概,现在问题就是怎么找这个旋转体的tag,我一开始想用遍历,但是我对遍历不是很清楚:遍历之后所有的object的tag倒是都能被存储在定义的数组里面,但是到底数组的哪个单元保存的是这个旋转体的tag怎么查啊?小弟对遍历一直不是很清楚。
  
这是源程序,前几天贴过一次,现在又完善了一些,添加了一些功能:
  
#include <stdio.h>
#include <uf.h>
#include <uf_modl.h>
#include <uf_ui.h>
#include <uf_part.h>
  
#define def_step 5
  
#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\n", file, line, call);
        (UF_get_fail_message(irc, messg)) ?
            printf("    returned a %d\n", irc) :
            printf("    returned error %d:  %s\n", irc, messg);
    }
    return(irc);
}
  
static initial()
{
  char *cp1={"Welcome to Shaft Creation 1.0 alpha"};
  int ip2=1;
  char cp3[][38]={"Create New Part", "Input Data and Create Shaft...", "Rotation", "Scale",  
                "Transform", "save", "close", "About Shaft Creation 1.0 alpha"};
  int ip4=8;
  int initial_return;
  
  initial_return = uc1603(cp1, ip2, cp3, ip4);
  return initial_return;
}
  
static create_part()
{
  char file_name[133]={"d:\\part1.prt"};
  int units=UF_PART_METRIC;
  tag_t part;
  int ip2=1;
  UF_PART_new (file_name, units, [$part)]
  if(part==NULL_TAG)
        {char *cp_fail={"Operation failed!*Press OK to continue."};
            uc1601(cp_fail, ip2);
        }
    else
    {char *cp_success={"Create part1 successfully!*Press OK to contiune."};
      uc1601(cp_success, ip2);
  
    }
  return part;
  
}
  
static create_shaft()
{
  char *cp1_get_data="Input data, 0 for end";
  
  char cp2[][16]={"Radius 1", "Length 1", "Radius 2", "Length 2", "Radius 3", "Length 3", "Radius 4", "Length 4", "radius5", "length5"};
  int ip3=(def_step)*2;
  double data[(def_step)*2];
  int ip5[(def_step)*2]={50,50,100,50,400,50,80,50,60,60};
  int ir6;
  ir6=uc1609(cp1_get_data,cp2,ip3,data,ip5);
  
  
  int line_number;
  double sum_line;
  
  uf_list_t *line_list;
  
  UF_CURVE_line_t sline[(def_step)*2];
  UF_CURVE_line_t end_line;
  UF_CURVE_line_t central_line;
  
  tag_t line[(def_step)*2];
  tag_t line_end;
  tag_t line_central;
  
  UF_MODL_create_list([$line_list)]
  
  sline[0].start_point[0]=0.0;
  sline[0].start_point[1]=0.0;
  sline[0].start_point[2]=0.0;
  sline[0].end_point[0]=0.0;
  sline[0].end_point[1]=data[0];
  sline[0].end_point[2]=0.0;
  UF_CURVE_create_line([$sline[0],&line[0])]
  UF_MODL_put_list_item (line_list, line[0]);
  
  sline[1].start_point[0]=sline[0].end_point[0];
  sline[1].start_point[1]=sline[0].end_point[1];
  sline[1].start_point[2]=sline[0].end_point[2];
  sline[1].end_point[0]=data[1];
  sline[1].end_point[1]=data[0];
  sline[1].end_point[2]=0.0;
  UF_CURVE_create_line([$sline[1],&line[1])]
  UF_MODL_put_list_item (line_list, line[1]);
  
  
for (line_number=2, sum_line=data[1]; (line_number<=9)[$&(data[line_number]!=0)]line_number++)
{
  
  sline[line_number].start_point[0]=sline[line_number-1].end_point[0];
  sline[line_number].start_point[1]=sline[line_number-1].end_point[1];
  sline[line_number].start_point[2]=sline[line_number-1].end_point[2];
  
  if ((line_number%2)==0)
  {  
    
      
    sline[line_number].end_point[0]=sum_line;
    
    
    sline[line_number].end_point[1]=data[line_number];
  
    UF_MODL_put_list_item (line_list, line[line_number]);
  
    
  
  
  }
  else  
  {
  
    sum_line=sum_line+data[line_number];
  
    sline[line_number].end_point[0]=sum_line;
    sline[line_number].end_point[1]=data[line_number-1];
    UF_MODL_put_list_item (line_list, line[line_number]);
    
  }
  
  
  sline[line_number].end_point[2]=0.0;
    
  UF_CURVE_create_line([$sline[line_number],&line[line_number])]
};
  
  central_line.start_point[0]=0.0;
  central_line.start_point[1]=0.0;
  central_line.start_point[2]=0.0;
  central_line.end_point[0]=sum_line;
  central_line.end_point[1]=0.0;
  central_line.end_point[2]=0.0;
  
  UF_CURVE_create_line([$central_line,&line_central)]
  UF_MODL_put_list_item (line_list, line_central);
  
  end_line.start_point[0]=sline[line_number-1].end_point[0];
  end_line.start_point[1]=sline[line_number-1].end_point[1];
  end_line.start_point[2]=sline[line_number-1].end_point[2];
  end_line.end_point[0]=sum_line;
  end_line.end_point[1]=0.0;
  end_line.end_point[2]=0.0;
  UF_CURVE_create_line([$end_line,&line_end)]
  UF_MODL_put_list_item (line_list, line_end);
  
  char *angle[2]={"0.0", "360.0"};
  UF_FEATURE_SIGN sign = UF_NULLSIGN;
  double origin[3]={0.0,0.0,0.0,};
  double direction[3]={1.0,0.0,0.0};
  UF_MODL_SWEEP_TRIM_object_p_t trim_data =NULL;
  char *offset[2]={"0.0","0.0"};
  UF_FEATURE_SIGN boolean_sign = UF_NULLSIGN;
  tag_t *revolution;
  int revolution_length;
  
  UF_MODL_create_revolution(line, line_number, trim_data, angle, offset, origin, false, true, origin, direction,  
                        boolean_sign, [$revolution, &revolution_length)]
  
  return *revolution;
/*就是这里!我一开始以为UF_MODL_create_revolution里面的倒数第二个这个revolution就是新生成的旋转体的tag,但是从程序运行来看,不像,程序运行到这里就会弹出一个什么memory access error的错误,然后ug就会关闭。从帮助文档里面查,这个应该是所有参与旋转的object的数组。所以看来我最后这句return *revolution是错误的(还有阿,这里应该返回revolution还是*revolution,现在对这个*已经有点晕头转响了。。。哎,C++要好好学阿)*/
  
  
  
  /*UF_MODL_create_revolved(line_list, angle, origin, direction, sign, [$line_feature_list)]*/
  
/*还有这里,UF_MODL_create_revolved和UF_MODL_create_revolution有什么区别?我只看到revolved需要的是链表,我的链表应该没有错误,每画完一条线就put 到list里面去,但是用UF_MODL_create_revolved无法生成旋转体,ug也不给出任何错误,就是没有反应*/
  
}
  
static void rotation(void)
{
/*这里想做一个可以旋转试图的功能,就和ug里的rotate一样,请问应该用到什么函数,或者哪一类函数?谢谢*/
  
}
  
/*static void scale (void)
{
extern int UF_MODL_edit_scale (
UF_SCALE_TYPE_t type,  
tag_t tag,  
tag_t so_point,  
tag_t so_dir,  
tag_t so_csys,  
char factors[ 3 ][ 256 ] );
/*这块还没完,也是卡在无法获得旋转体的tag,不能放大缩小了*/
  
}*/
  
static void transform(void)
{
  
/*这里也要做一个transform的功能,就是移动object,请问应该用什么函数?*/
  
}
  
static mass_property(tag_t *object)/*这里就是要从上面旋转体的函数中把旋转体的tag传递过来*/
{
  
int num_objs=1;  
  
int type=1;  
  
int units=3;
  
double density=78;  
  
int accuracy=1;  
  
double  acc_val[11] = {.01,0,0,0,0,0,0,0,0,0,0};  
  
double mass_props[ 47 ];  
  
double statistics[ 13 ];
  
  UF_MODL_ask_mass_props_3d (object, num_objs, type, units, density, accuracy, acc_val,
                  mass_props, statistics );
  
for (int i=0; i<47; i++)
     {
       printf("[%d] = %f\n",i,mass_props);
     }
     
}
  
static void save_part(void)
{
UF_PART_save();
  
}
  
static void close_part(tag_t part_tag_tmp)
{
  int scope=0;
  int mode=0;
  
  UF_PART_close (part_tag_tmp, scope, mode);
  
}
  
static void about(void)
{
  
  UF_UI_write_listing_window(" Shaft Creation 1.0 alpha\n Supervisor   Mr. C P McMahon\n Accessor   Dr. G Mullineux\n");
  
/*这里想做一个类似windows程序的about的功能,就是用UF_UI_write_listing_window显示一下开发者的信息,纯属好玩而已,但是后面主程序里面却无法显示,没有反应,请问是怎么回事呀?*/
  
}
  
/*ARGSUSED*/
void ufusr(char *param, int *retcode, int paramLen)/*主程序开始*/
{
  
  int user_choice;
  tag_t new_part;
  tag_t *new_revolution;
  
  UF_initialize();
  /*if (!UF_CALL(UF_initialize()))
  {*/
     new_part=create_part();
   if (new_part==UF_NULLSIGN)
     UF_terminate();
  
  while (1)/*反复显示前面initial子程序里面用uc1603创建的单选菜单*/
  {
      user_choice=initial();
  
    if (user_choice == 1 || user_choice == 2)  
      {
        UF_terminate();
      }
  
      user_choice=user_choice-4;
    
  
  switch (user_choice)
  {  
  
  case 1: create_part();break;
  case 2: *new_revolution=create_shaft();break;/*这里就是想先获得旋转体的tag*/
  case 3: rotation();break;
  /*case 4: scale ();break;*/
  case 5: transform(); break;
  case 6: mass_property(new_revolution);break;/*这里就是要把选转体的tag传递给mass_property子函数,然后计算旋转体的质量特性*/
  case 7: save_part();break;
  case 8: close_part(new_part); break;
  case 9: about();break;
  default: UF_terminate();
  return;
  }
  
  }
     
     
     
    /*create();
    create_shaft();*/
  
     
  
}
  
int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}
  
问题都在程序里面了,恳请高手解答,我现在就是在开发这个创建阶梯轴的open api程序。程序大体框架就是这样了,如果大家对此程序还有什么建议,欢迎一起指出,我保证在最后程序创建好之后,把源代码和详细解释贴出来和大家共同讨论,这是我一步步摸索着写出来的程序,稍后把解释一起贴出来,希望能给新手些帮助,不过首先还是要靠大家帮忙解决问题,呵呵,行礼啦
作者: tari    时间: 2004-8-27 09:17
使用renturn revolution试试,我想tag_t 可能是*revolution吧




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