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