iCAx开思工具箱
标题:
高手们帮偶看看这个UG API程序吧~~~ 感激涕零啊~~~
[打印本页]
作者:
MIRRO_LEE
时间:
2009-2-27 20:19
标题:
高手们帮偶看看这个UG API程序吧~~~ 感激涕零啊~~~
本人刚开始接触UG开发,想要绘制一条螺旋线,程序编译通过,可到UG里运行之后,却没有生成任何曲线,请各位高手大侠们帮偶看看吧~~~
本人不胜感激!!!
static void
do_my_Program
(double PARA[])
{
int i;
double my_dLead = PARA[0]; // 螺距
double my_dRad = PARA[1]; // 半径
double my_dZhuanNumber = PARA[2]; // 圈数
// 放置位置
double luowen_orig[3];
luowen_orig[0] = PARA[3];
luowen_orig[1] = PARA[4];
luowen_orig[2] = PARA[5];
CString str[3];
for (i=0 ; i<3 ; i++)
{
str.Format("%f", PARA);
}
char *LEAD = (char*)(LPCTSTR)str[0]; // 螺距
char *RAD = (char*)(LPCTSTR)str[1]; // 半径
char *numbers = (char*)(LPCTSTR)str[2]; // 转数
double direction_cyl[3]; // 矢量方向
direction_cyl[0] = 0.0;
direction_cyl[1] = 0.0;
direction_cyl[2] = 1.0;
int rec;
int degree = 3; // 样条次数
int periodicity = 1; // 0:非周期样条 1:周期样条
int save_def_data = 1; // 1则和创建的样条曲线一起保持输入数据,否则不保持
tag_t spline_tag; // 创建的样条曲线指针——输出
double start_pt[3], end_pt[3];
// 起点坐标
for (i=0 ; i<3 ; i++)
{
start_pt = luowen_orig;
}
start_pt[0] += my_dRad;
// 终点坐标
double min_num, integer;
double tem_pt[3]; // 上端面中心点
for (i=0 ; i<3 ; i++)
{
tem_pt = luowen_orig;
}
tem_pt[2] += PARA[0]*PARA[2];
min_num = modf(my_dZhuanNumber, &integer);
get_another_point(tem_pt, my_dRad, min_num, end_pt);
// 中间控制点
int all_ctrlpt_numbers;
int tem_ctrlpt; // 一个导程的中间控制点数
get_ctrlpt_number(my_dRad, tem_ctrlpt);
all_ctrlpt_numbers = integer * tem_ctrlpt + (int)(360*min_num/(360/tem_ctrlpt)); // 中控点的总个数
double **ctrl_pts;
ctrl_pts =(double **)malloc((2+all_ctrlpt_numbers)*sizeof(double *));
for(i=0 ; i<(2+all_ctrlpt_numbers) ; i++)
{
ctrl_pts=(double *)malloc(sizeof(double)*3);
}
//double ctrl_pts[all_ctrlpt_numbers][3];
getData_ctrl_Pts(luowen_orig, 2+all_ctrlpt_numbers, my_dRad, my_dLead, ctrl_pts, start_pt, end_pt);
// 参数定义
int num_points = all_ctrlpt_numbers + 2; // (所有控制点的数目=起控点+中控点+终控点)point_data[]数组中点和参数的数目
//UF_CURVE_pt_slope_crvatr_t point_data[all_ctrlpt_numbers]; // 定义样条上的点和斜率控制的数组
UF_CURVE_pt_slope_crvatr_t *point_data;
point_data = (UF_CURVE_pt_slope_crvatr_t *)malloc(num_points*sizeof(UF_CURVE_pt_slope_crvatr_t));
double *slopeVecs;
slopeVecs = (double *)malloc(num_points*sizeof(double));
get_slope_point(luowen_orig, num_points, my_dRad, my_dLead, slopeVecs);
double *crvatrVecs;
crvatrVecs = (double *)malloc(num_points*sizeof(double));
get_crvatr_point(luowen_orig, num_points, my_dRad, my_dLead, crvatrVecs);
for (i= 0; i<num_points; i++)
{
point_data.point[0] = ctrl_pts[0];
point_data.point[1] = ctrl_pts[1];
point_data.point[2] = ctrl_pts[2];
point_data.slope_type = UF_CURVE_SLOPE_AUTO;
point_data.slope[0] = slopeVecs[3*i];
point_data.slope[1] = slopeVecs[3*i+1];
point_data.slope[2] = slopeVecs[3*i+2];
point_data.crvatr_type = UF_CURVE_CRVATR_NONE;
point_data.crvatr[0] = crvatrVecs[3*i];
point_data.crvatr[1] = crvatrVecs[3*i+1];
point_data.crvatr[2] = crvatrVecs[3*i+2];
}
// 节点
double *parameters; // 输入点参数
parameters = (double *)malloc((num_points + 4)*sizeof(double));
getData_node(degree, num_points, parameters);
rec =
UF_CURVE_create_spline_thru_pts
(degree, periodicity, num_points, point_data, parameters, save_def_data, &spline_tag);
for(i=0 ; i<all_ctrlpt_numbers ; i++)
{
free(ctrl_pts);
}
free(ctrl_pts);
free(point_data);
free(parameters);
free(slopeVecs);
free(crvatrVecs);
}
// 已知半径和圈数,求旋转后点的XY坐标
static void
get_another_point
(double pt[], double rad, double angle, double new_point[3])
{
double radian = angle * 2*PI;
new_point[0] = rad*cos(radian) + pt[0];
new_point[1] = rad*sin(radian) + pt[1];
new_point[2] = pt[2];
}
// 由螺旋线半径确定一个导程里的中间控制点数目
static void
get_ctrlpt_number
(double rad, int &ctrlpt_number)
{
if (rad>=1 && rad<15)
{
ctrlpt_number = 8;
}
else
{
if (rad>=15 && rad<205)
{
ctrlpt_number = 16;
}
else
{
if (rad>=205 && rad<3285)
{
ctrlpt_number = 32;
}
else
{
ctrlpt_number = 64;
}
}
}
}
// 由放置点、控点个数、半径、导程,确定各个中控点坐标
static void
getData_ctrl_Pts
(double org_pt[3], int pt_number, double rad, double lead, double **ctrl_pts, double stpoint[3], double edpoint[3])
{
double angle;
double tem_pt[3], tem_ctrlPt[3];
int i, j;
for (i=0 ; i<3 ; i++)
{
tem_pt = org_pt;
}
int tem_ctrlpt_num; // 一个导程中的控制点数
get_ctrlpt_number(rad, tem_ctrlpt_num);
double length_add_perPt = lead/tem_ctrlpt_num; // 每增加一个控制点,在Z方向上的增量
for (i=0 ; i<pt_number; i++)
{
if (i==0 || i==pt_number-1)
{
if (i==0)
{
for (j=0 ; j<3 ; j++)
{
ctrl_pts[j] = stpoint[j];
}
}
else
{
for (j=0 ; j<3 ; j++)
{
ctrl_pts[j] = edpoint[j];
}
}
}
else
{
tem_pt[2] += length_add_perPt;
angle = i/(double)tem_ctrlpt_num;
get_another_point(tem_pt, rad, angle, tem_ctrlPt);
for (j=0 ; j<3 ; j++)
{
ctrl_pts[j] = tem_ctrlPt[j];
}
}
}
}
// 由阶数和控制点数目,获得节点
static void
getData_node
(int degree, int ctrl_number, double *DATA_node_number)
{
// 总节点数
int node_number = ctrl_number + 8 - degree;
int i;
for (i=0 ; i<node_number ; i++)
{
if (i<4)
{
DATA_node_number = 0;
}
else
{
if (i<(ctrl_number+4-degree))
{
DATA_node_number = (ctrl_number-degree-3)/(double)(ctrl_number-degree+1);
}
else
{
DATA_node_number = 1;
}
}
}
}
// 获得曲线上一点的斜率
static void
get_slope_point
(double org_pt[3], int pt_number, double rad, double lead, double *slope_pts)
{
double angle;
double tem_pt[3], tem_ctrlPt[3];
double radian;
int i, j;
for (i=0 ; i<3 ; i++)
{
tem_pt = org_pt;
}
int tem_ctrlpt_num; // 一个导程中的控制点数
get_ctrlpt_number(rad, tem_ctrlpt_num);
double length_add_perPt = lead/tem_ctrlpt_num; // 每增加一个控制点,在Z方向上的增量
for (i=0 ; i<pt_number; i++)
{
tem_pt[2] = tem_pt[2] + i*length_add_perPt;
angle = i/(double)tem_ctrlpt_num;
radian = angle * 2 * PI;
tem_ctrlPt[0] = -rad*sin(radian);
tem_ctrlPt[1] = rad*cos(radian);
tem_ctrlPt[2] = lead/2/PI;
for (j=0 ; j<3 ; j++)
{
slope_pts[3*i+j] = tem_ctrlPt[j];
}
}
}
// 获得曲线上一点的曲率
static void
get_crvatr_point
(double org_pt[3], int pt_number, double rad, double lead, double *crvatrVecs)
{
double angle;
double tem_pt[3], tem_ctrlPt[3];
double radian;
int i, j;
for (i=0 ; i<3 ; i++)
{
tem_pt = org_pt;
}
int tem_ctrlpt_num; // 一个导程中的控制点数
get_ctrlpt_number(rad, tem_ctrlpt_num);
double length_add_perPt = lead/tem_ctrlpt_num; // 每增加一个控制点,在Z方向上的增量
for (i=0 ; i<pt_number; i++)
{
tem_pt[2] += i*length_add_perPt;
angle = i/(double)tem_ctrlpt_num;
// 转数转化成弧度
radian = angle * 2 * PI;
tem_ctrlPt[0] = -rad*cos(radian);
tem_ctrlPt[1] = -rad*sin(radian);
tem_ctrlPt[2] = 0;
for (j=0 ; j<3 ; j++)
{
crvatrVecs[3*i+j] = tem_ctrlPt[j];
}
}
}
作者:
look_tfq
时间:
2009-3-3 19:50
加上调试语句看一下,画不出来一般会返回一个非0值,交给UG去判断好了
作者:
look_tfq
时间:
2009-3-3 19:52
即书上讲的UG_CALL(statement)
我一般就是这样解决的
作者:
look_tfq
时间:
2009-3-3 19:52
即书上讲的UG_CALL(statement)
我一般就是这样解决的
作者:
MIRRO_LEE
时间:
2009-3-4 17:11
4#
没太听懂楼上的意思。。。
能详细说明一下么?
作者:
3242005
时间:
2009-3-4 20:20
不是UG_CALL
是这个东西UF_CALL
把下面代码加到工程里就可以用了
代码如下
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
static int report_error( char *file, int line, char *call, int irc)
{
if (irc)
{
char err[133],
msg[133];
sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
irc, line, file);
UF_get_fail_message(irc, err);
UF_print_syslog(msg, FALSE);
UF_print_syslog(err, FALSE);
UF_print_syslog("\n", FALSE);
UF_print_syslog(call, FALSE);
UF_print_syslog(";\n", FALSE);
if (!UF_UI_open_listing_window())
{
UF_UI_write_listing_window(msg);
UF_UI_write_listing_window(err);
UF_UI_write_listing_window("\n");
UF_UI_write_listing_window(call);
UF_UI_write_listing_window(";\n");
}
}
return(irc);
}
作者:
ffhi
时间:
2009-3-4 22:37
编译通过不等于你的程序就没有问题,最好自己调试,加些断点,看看问题出现在什么地方。
作者:
MIRRO_LEE
时间:
2009-3-9 10:28
本人编程时间尚短。。。
所以,嫩得很啊。。。
改了很久,调试了很久。。。还是不晓得问题出在哪里。。。
作者:
catry
时间:
2009-3-9 13:53
也可以这样的比如
rec = UF_CURVE_create_spline_thru_pts(degree, periodicity, num_points, point_data, parameters, save_def_data, spline_tag);
如果你怀疑这句话有问题,那你就在下面加上
char message[133];
uf_get_fail_message(rec,message);
uc1601(message,1);
这样再运行程序,ug就会弹出对话框告诉你这个函数执行的问题了,有可能他会告诉你没问题,那你再找找其他的函数,总之这样自己调调就好了。
欢迎光临 iCAx开思工具箱 (https://t.icax.org/)
Powered by Discuz! X3.3