|
马上注册,结交更多同行朋友,交流,分享,学习。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我画了一个封闭的图形,并且成功地用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程序。程序大体框架就是这样了,如果大家对此程序还有什么建议,欢迎一起指出,我保证在最后程序创建好之后,把源代码和详细解释贴出来和大家共同讨论,这是我一步步摸索着写出来的程序,稍后把解释一起贴出来,希望能给新手些帮助,不过首先还是要靠大家帮忙解决问题,呵呵,行礼啦 |
|