iCAx开思工具箱
标题:
【讨论】贴一下小弟正在写的OPEN api源程序
[打印本页]
作者:
vcreat
时间:
2004-8-23 06:46
标题:
【讨论】贴一下小弟正在写的OPEN api源程序
经常来这里,但是很少发帖,open api对我来说不是很好学,我连C++学的都不好,唉。。。不过还是很喜欢自己探索,经常来这里看大家的帖子,帮助很大,我正在写一个简单的程序,就是让用户定义数据自动生成一个阶梯轴,然后可以操作实现放大,缩小,平移,质量查询等功能。都是些很简单的函数,不过有时候却让一个简单的C++循环搞糊涂老半天。。。唉,都怪当时没学好c阿。希望能和各位在open API道路上奋战的朋友们共同交流:msn vcreat@hotmail.com
这是原程序,还差得很远,正好有几个问题问问大家
#include <stdio.h>
#include <uf.h>
#include <uf_modl.h>
#include <uf_ui.h>
#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 void get_data(void)
{
/*char *cp1_choose_step="Choose step";
int ip2_choose_step=5;
char cp3_choose_step[3][38]={"3 Steps", "4 Steps", "5 Steps"};
int return_choose_step;
int ip4=3;
return_choose_step=uc1603(cp1_choose_step, ip2_choose_step, cp3_choose_step,ip4);*/
char *cp1_get_data="Input data, 0 for end";
char cp2[][16]={"Basic Radius", "Length 1", "Radius 2", "Length 2", "Radius 3", "Length 3", "Radius 4", "Length 4"};
int ip3=8;
double data[8];
int ip5[8]={50,50,100,50,400,50,80,50};
int ir6;
ir6=uc1609(cp1_get_data,cp2,ip3,data,ip5);
/*if (data[0]==0)
{int ip2=1;
char *cp1="Data input error";
char cp3[][38]={"back"};
int ip4=1;
int ir66;
ir66=uc1603(cp1, ip2, cp3, ip4);
if (ir6=1) get_data();
}*/
UF_CURVE_line_t sline[10];
UF_CURVE_line_t end_line;
tag_t line[10];
tag_t line_end;
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])]
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])]
sline[2].start_point[0]=sline[1].end_point[0];
sline[2].start_point[1]=sline[1].end_point[1];
sline[2].start_point[2]=sline[1].end_point[2];
sline[2].end_point[0]=data[1];
sline[2].end_point[1]=data[2];
sline[2].end_point[2]=0.0;
UF_CURVE_create_line([$sline[2],&line[2])]
int line_number;
double sum_line;
for (line_number=3, sum_line=data[1]; line_number<8, 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];
}
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];
}
sline[line_number].end_point[2]=0.0;
UF_CURVE_create_line([$sline[line_number],&line[line_number])]
};
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)]
}
/*ARGSUSED*/
void ufusr(char *param, int *retcode, int paramLen)
{
if (!UF_CALL(UF_initialize()))
{
get_data();
UF_CALL(UF_terminate());
}
}
int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}
程序还差得很远。。。呵呵,见笑。。
请问大家,我在获取用户输入阶梯轴半径长度等参数的时候用了uc1609,
他的标准用法是ir6=uc1609(cp1_get_data,cp2,ip3,data,ip5);ug文档上说ip5是一个已经不用的参数,但是清华的书上说ip5可以设为输入的预设值,我把预设值都设好了,但是在调试程序的时候用户输入的地方每个栏都初始显示为-9.546e16, 好大的数。。。请问各位有什么办法吗?
作者:
vcreat
时间:
2004-8-23 06:56
还有一个问题,如何能动态的根据用户的选择定义阶梯轴的阶梯数?就是用户想生成几个阶梯程序就可以生成几个,我要订一个数组来存储每个阶梯的半径,但是不知道用户要生成几个阶梯,我就没办法定义数组的长度,因为c++不允许用变量定义数组长度,比如:
int i;
用户输入一个i
double a
;
这样就是违法的。
我现在是预先设定好一个长度为10的数组,用户不能创建阶梯大于10的轴,如果阶梯小于10,剩下的阶梯的半径都设为0,程序会自动判断出来。。
不过我还是希望能让用户指定生成的阶梯数。。如何办?
作者:
suye007
时间:
2004-8-23 08:18
这个要实用动态数组了
作者:
深夜摔键盘
时间:
2004-8-23 20:17
链表就可以。
应该学会C++,因为这是学好STL,MFC等等的基础。
许多东西不需要从头一点一点实现的,要学会利用现有的各种库与组件,这是节约开发时间的最好方法。
作者:
ccc
时间:
2004-8-27 20:04
用动态数组,小弟也是刚学c++,用.net编,ug api也是初学。
感觉ug二次开发,只是使用了vc中最简单的对话框而已,如楼上说的,复杂的就用控件完成。就像堆积木一样
作者:
fourwood
时间:
2004-8-31 22:39
楼主,你是用纯粹的C语言,何来C++之说?
作者:
vcreat
时间:
2004-9-2 07:17
都是照着open api帮助文档和范例做得,那里面都是c语言写的呀,我就照猫画虎了。。。。现在的关键问题是如何从UF_MODL_create_revolution()函数中获得新生成的旋转体的identifier,找不到这个新旋转体的identifier,剩下的工作都做不了呀。。。现在我唯一的办法就是用UF_UI_select函数让用户选择,但是导师说他用了20年的ug,不相信到现在open api的函数连个identifier都不能生成,找不到。 我想用遍历,但是遍历要么是找type,或者name,或者就是cycle_all, 新生成的旋转体我也不知道是什么type (UF_OBJ_solid_type?),更说不上名字了,至于cycle_objs_in_Part倒是都能找出来,也可以保存到数组里面去,但是我怎么知道到底哪个才是这个旋转体的?Open API函数有这么笨么?!!
欢迎光临 iCAx开思工具箱 (https://t.icax.org/)
Powered by Discuz! X3.3