- 积分
- 11389
- 明经币
- 个
- 注册时间
- 2011-10-13
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2019-12-26 10:16:43
|
显示全部楼层
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
# include <strstream>
# include <iostream>
using std::ostrstream;
using std::endl;
using std::ends;
using std::cerr;
#else
# include <strstream.h>
# include <iostream.h>
#endif
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>
#include <uf_modl_utilities.h>
#include <uf_modl.h>
#include <uf_obj_types.h>
#include <uf_obj.h>
#include <uf_part.h>
#include<windows.h>
#include <uf_vec.h>
#include <uf_mtx.h>
#include <uf_csys.h>
#include <math.h>
#include <zf.h>
#include <math.h>
////////////////////以下使用UGOPEN..
#include <NXOpen/Session.hxx>
#include <NXOpen/ParTCollection.hxx>
#include <NXOpen/MeasureFaces.hxx>
#include <NXOpen/NXObjectManager.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Unit.hxx>
#include <NXOpen/UnitCollection.hxx>
using namespace NXOpen;
/////////////////
static double qiucha(double num,double num1)
{
double shuzhi;
shuzhi=(fabs (num-num1));
return(shuzhi);
}
static void getscej(void)
{
char ti[]="选择统计类型:";
int def=2;
char items[][38]={"统计顶针","统计螺丝"};
int ej=0,sc=0;
int ret=uc1603(ti,def,items,2);
switch (ret)
{
case 1:
//uc1601("Back",1);
return;//按回退退出程序
case 2:
//uc1601("Cancel",1);
return;//按取消退出程序
case 5:
ej=1;
break;//跳出
case 6:
sc=1;
break;//跳出
}
char cue[] = "选择对象";
char title[] = "对象选择对话框";
tag_p_t objects;
int count=0;
int i=0;
uf_list_p_t face_list;
double tmp_lst[3];
int n = 0;
tag_t face=null_tag;
DWORD start, stop;//声明时间变量
int type;
double point [3] ;
double dir [3] ;
double box [6] ;
double radius;
double rad_data;
int norm_dir;
double z;//声明长度
int response=0;
/////实体定义总长度数据,如果实体带斜度,侧不准
double min_corner [3];
double directions [3][3];
double distances [3];
double min_corner1 [3];
double directions1 [3][3];
double distances1 [3];
///改变算法,不用坐标系统,用圆柱面积算法
//uf_list_p_t edge_list;
//UF_MODL_create_list(&edge_list);
//tag_t edge;
//UF_CURVE_arc_t edge_data;
//double len=0.0;
//tag_t wcs_id ;
//UF_CSYS_ask_wcs(&wcs_id);
//double csys_origin[3]={0,0,0};
//tag_t csys_id ;
///改变算法,不用坐标系统,用圆柱面积算法
///////以下使用UGOPEN
Session *theSession = Session::GetSession();
Part *workPart(theSession->arts()->Work());//取得当前工作部件
Unit *unit1(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("SquareMilliMeter")));//取得单位1
Unit *unit2(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("MilliMeter")));//取得单位2
std::vector<IParameterizedSurface *> objects1(1);
MeasureFaces *measureFaces1;
double area;
double perimeter;
////////////
//L10:
tag_t mat_id,csys_id;
double pt[3]={0,0,0};//设置原点 ABS
double matrix_values [9]={1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0};//原点MAT
UF_CSYS_create_matrix(matrix_values,&mat_id);//生成MAT
UF_CSYS_create_temp_csys(pt,mat_id,&csys_id);//建立一个临时的ABS工作坐标系
UF_CSYS_set_wcs(csys_id);//设置刚建立的ABS坐标系统
UF_UI_select_with_class_dialog(cue,title,0, init_proc_body, NULL,&response,&count, &objects); //选择对象 object需要定义为tag_p_t
start = GetTickCount();///计时开始
int aa=0;
double num[1500][2]={};//声明二维数组,数量有500个
UF_MODL_create_list(&face_list);
if (response == UF_UI_OK&&count>0)
{
for(i=0;i<count;i++)
{
int k = 0;
tmp_lst[0]=NULL;
tmp_lst[1]=NULL;
tmp_lst[2]=NULL;
UF_DISP_set_highlight(objects[i],0);//设置这个实体为不高亮显示
UF_MODL_ask_body_faces(objects[i],&face_list);//获取实体的面
UF_MODL_ask_list_count(face_list,&n);///查询表中有多少个面
if (ej==1 && sc==0)///如果是计算顶针长度,总长度为整体高度
{
UF_MODL_ask_bounding_box_exact(objects[i],NULL_TAG,min_corner,directions,distances);
}
for (int a = 0; a<n;a++)
{
UF_MODL_ask_list_item(face_list,a,&face);///查询面链表中的 第 A 个面
UF_MODL_ask_face_data(face,&type,point,dir,box,&radius,&rad_data,&norm_dir);///取得面的资料
double hdist=0.0;
if (ej==1 && sc==0)///如果是计算顶针长度,总长度为整体高度
{
UF_MODL_ask_bounding_box_exact(face,NULL_TAG,min_corner1,directions1,distances1);///取得面的高度
//hdist=distances1[2];///取得面的高度如果小于26(1分以下的螺丝头高度)就不算上他
if (distances1[0]<distances1[2] && distances1[1]<distances1[2])//判断它是横着放还是竖着放,
{
hdist=distances1[2];///计算顶针长度
}
if (distances1[1]<distances1[0] && distances1[2]<distances1[0])
{
hdist=distances1[0];///计算顶针长度
}
if (distances1[0]<distances1[1] && distances1[2]<distances1[1])
{
hdist=distances1[1];///计算顶针长度
}
}
if(type==16)//“22”代表有界平面 ///16代表圆柱面
{
////////////////转换半径为两位小数
////scanf("%lf", &radius );
//radius *= 100 ;
//radius += 0.5 ;
//radius =floor(radius);
//radius/= 100;
//printf("d=%.2f\n", radius );
//////////
if (qiucha(radius,1.5)<0.01 || qiucha(radius,2.75)<0.01 || qiucha(radius,2)<0.01 || qiucha(radius,3.5)<0.01 || qiucha(radius,2.5)<0.01 ||
qiucha(radius,4.5)<0.01 || qiucha(radius,3)<0.01 || qiucha(radius,5)<0.01 || qiucha(radius,4)<0.01 || qiucha(radius,6.5)<0.01 || qiucha(radius,5)<0.01 ||
qiucha(radius,7)<0.01 || qiucha(radius,10.5)<0.01 || qiucha(radius,8)<0.01 || qiucha(radius,6)<0.01 || qiucha(radius,9)<0.01 || qiucha(radius,13.5)<0.01 ||
qiucha(radius,10)<0.01 || qiucha(radius,12)<0.01 || qiucha(radius,15)<0.01 || qiucha(radius,18)<0.01 || qiucha(radius,22.5)<0.01 || qiucha(radius,2.09)<0.01 ||
qiucha(radius,0.79)<0.01 ||qiucha(radius,1.19)<0.01 ||qiucha(radius,1.58)<0.01 ||qiucha(radius,1.98)<0.01 ||qiucha(radius,2.78)<0.01 ||
qiucha(radius,2.38)<0.01 || qiucha(radius,3.18)<0.01 || qiucha(radius,3.97)<0.01 || qiucha(radius,4.76)<0.01 || qiucha(radius,5.56)<0.01 || qiucha(radius,6.35)<0.01 ||
qiucha(radius,7.94)<0.01 || qiucha(radius,9.525)<0.01 || qiucha(radius,11.11)<0.01 || qiucha(radius,12.7)<0.01 ||
qiucha(radius,0.5)<0.01 || qiucha(radius,0.75)<0.01 || qiucha(radius,1)<0.01 || qiucha(radius,1.25)<0.01 || qiucha(radius,1.75)<0.01 || qiucha(radius,2.25)<0.01 ||
qiucha(radius,2.75)<0.01 || qiucha(radius,3.25)<0.01 || qiucha(radius,3.75)<0.01 || qiucha(radius,4.25)<0.01 || qiucha(radius,4.75)<0.01 || qiucha(radius,5.25)<0.01 ||
qiucha(radius,6.25)<0.01 || qiucha(radius,6.75)<0.01 || qiucha(radius,7.25)<0.01 || qiucha(radius,7.5)<0.01 || qiucha(radius,11)<0.01 || qiucha(radius,12.5)<0.01 || qiucha(radius,4.83)<0.01 || qiucha(radius,4.17)<0.01 || qiucha(radius,6.86)<0.01
)
{
//UF_OBJ_set_color(face,186);//设置面的颜色
//UF_MODL_ask_face_edges(face,&edge_list);///取得面上所有的边
//UF_MODL_ask_list_item(edge_list,0,&edge);//取得第1条边的标识
//UF_CURVE_ask_arc_data(edge,&edge_data);//取得第1条边的数据
//double point0[3]={edge_data.arc_center[0],edge_data.arc_center[1],edge_data.arc_center[2]};//圆心
//可用UF_CSYS_ask_matrix_of_object 函数查到对象的MATRIX
//UF_CSYS_create_temp_csys(csys_origin,edge_data.matrix_tag,&csys_id);//生成圆柱边的坐标系
//UF_CSYS_set_wcs(csys_id);//设置用户坐标系为圆柱边
//UF_MODL_ask_bounding_box_exact(face,NULL_TAG,min_corner,directions,distances);//取得面的大小
//z = distances[2];//Z为圆柱高度,圆柱长度
radius = radius * 2;
if (ej==1 && sc==0)////判断是否统计顶针
{
if (distances[0]<distances[2] && distances[1]<distances[2])
{
z=distances[2];///计算顶针长度
}
if (distances[1]<distances[0] && distances[2]<distances[0])
{
z=distances[0];///计算顶针长度
}
if (distances[0]<distances[1] && distances[2]<distances[1])
{
z=distances[1];///计算顶针长度
}
z=z+5;///计算顶针长度+5MM 预多5mm
//z=int(z/10+0.5)*10;//顶针长度做成10的整数
if (z>300)
{
z=z+20;
}
if (z<=300 && z>=250)
{
z=300;
}
if (z<=250 && z>=200)
{
z=250;
}
if (z<=200 && z>=150)
{
z=200;
}
if (z<=150 && z>=100)
{
z=150;
}
if (z<=100 && z>=50)
{
z=100;
}
if (z<=50 && z>=26)
{
z=50;
}
}
else
{
/////以下使用UGOPEN求面积
objects1[0] = dynamic_cast<Face *>(NXObjectManager::Get(face));//转换面
measureFaces1 = workPart->MeasureManager()->NewFaceProperties(unit1, unit2, 0.99, objects1);//取得面,相关的数据
area = measureFaces1->Area();//取得面积
perimeter = measureFaces1->erimeter();//取得周长
//////////////////////////////////////////
z = area/perimeter*2;//螺丝比较有规则,可以用面积/周长*2就可以得到高度,它这周长是2条线的周长
z=z+0.6;//再加上倒角长度
//z=int(z/5+0.5)*5;////取得长度为5一级的数
}
if (k==0)//判断是否是第一个圆柱面,是就记录下来,保存好数据如果不是,则执行ELSE下面的
{
tmp_lst[0]=radius;
tmp_lst[1]=z;
tmp_lst[2]=hdist;
}
else
{
if (radius<tmp_lst[0])//如果是第二次有记录了,则比较哪次记录的直径大小,
{
if (ej==1 && sc==0 && hdist>85)//判断统计顶针的时候,托长是否小于85,则不会记录它是一只顶针,取现在的直径与长度
{
num[aa][0]=radius;
num[aa][1]=z;
aa=aa+1;
}
if (ej==0 && sc==1)//判断是统计螺丝的时候 ,,取现在的直径与长度
{
if (qiucha(radius,4)<0.01 && qiucha(tmp_lst[0],8)<0.01 || qiucha(radius,5)<0.01 && qiucha(tmp_lst[0],10)<0.01 || qiucha(radius,6)<0.01 && qiucha(tmp_lst[0],12)<0.01 ||
qiucha(radius,8)<0.01 && qiucha(tmp_lst[0],16)<0.01 || qiucha(radius,10)<0.01 && qiucha(tmp_lst[0],20)<0.01)
{
z=int(z/2+0.5)*2;
}
else
{
z=int(z/5+0.5)*5;
}
num[aa][0]=radius;
num[aa][1]=z;
aa=aa+1;
}
}
else
{
if (ej==1 && sc==0 && tmp_lst[2]>85)///判断统计顶针的时候,托长是否小于85,则不会记录它是一只顶针 ,取第一次记录的直径与长度
{
num[aa][0]=tmp_lst[0];
num[aa][1]=tmp_lst[1];
aa=aa+1;
}
if (ej==0 && sc==1)//判断是统计螺丝的时候 ,取第一次记录的直径与长度
{
if (qiucha(tmp_lst[0],4)<0.01 && qiucha(radius,8)<0.01 || qiucha(tmp_lst[0],5)<0.01 && qiucha(radius,10)<0.01 || qiucha(tmp_lst[0],6)<0.01 && qiucha(radius,12)<0.01 ||
qiucha(tmp_lst[0],8)<0.01 && qiucha(radius,16)<0.01 || qiucha(tmp_lst[0],10)<0.01 && qiucha(radius,20)<0.01)
{
tmp_lst[1]=int(tmp_lst[1]/2+0.5)*2;
}
else
{
tmp_lst[1]=int(tmp_lst[1]/5+0.5)*5;
}
num[aa][0]=tmp_lst[0];
num[aa][1]=tmp_lst[1];
aa=aa+1;
}
}
}
k=k+1;
}
}
}
}
UF_MODL_delete_list(&face_list);
UF_free(objects);
//UF_CSYS_set_wcs(wcs_id);
//UF_MODL_delete_list(&edge_list);
//double num[100][2]={};//声明二维数组
//num [5][0]=22.2; //赋值第6个中的第一个数值
//num [5][1]=11.1;//赋值第6个中的第一个数值
//double a1,a2;
//a1=num [5][0];//获取第6个中的第一个数值
//a2=num [5][1];//获取第6个中的第一个数值
double num_list[1500][3]={};//声明二维数组
int aaa=0;
for (int uu = 0; uu<aa;uu++)
{
double d1,l1,d2,l2;
d1=num[0][0];
l1=num[0][1];
int pcs = 1;
for (int r=0;r<aa;r++)
{
num[r][0]=num[r+1][0];
num[r][1]=num[r+1][1];
}
for (int kk = 0; kk<aa; kk++)
{
d2=num[kk][0];
l2=num[kk][1];
if (d1==d2 && l1==l2 && d1!=0.0)
{
for (int u=kk;u<aa;u++)
{
num[u][0]=num[u+1][0];
num[u][1]=num[u+1][1];
}
pcs= pcs+1;
aa=aa-1;
kk=kk-1;
}
}
num_list[uu][0]=d1;
num_list[uu][1]=l1;
num_list[uu][2]=pcs;
aaa=aaa+1;//生成种类的数量
}
//////////////////////排序,从小大到,
int ac =aaa-1;
double ci[1][3]={};
int i,j;
for(j=0;j<ac;j++) /* 气泡法要排序n次*/
{
for(i=0;i<ac-j;i++) /* 值比较大的元素沉下去后,只把剩下的元素中的最大值再沉下去就可以啦 */
{
if(num_list[i][0]>=num_list[i+1][0]) /* 把值比较大的元素沉到底 */
{
ci[0][0]=num_list[i][0];
ci[0][1]=num_list[i][1];
ci[0][2]=num_list[i][2];
num_list[i][0]=num_list[i+1][0];
num_list[i][1]=num_list[i+1][1];
num_list[i][2]=num_list[i+1][2];
num_list[i+1][0]=ci[0][0];
num_list[i+1][1]=ci[0][1];
num_list[i+1][2]=ci[0][2];
}
}
}
UF_UI_open_listing_window();
UF_UI_write_listing_window(" 本程序制作:深圳_邹锋");
UF_UI_write_listing_window("\n 联系方式:QQ609719845");
UF_UI_write_listing_window("\n");
char radstr[100], lens[100],pcsstr[100];//定义字符变量
char str1[100], str2[100],str3[100];//定义字符变量
char file_name[] = "d:\\1.txt";//声明文件名
FILE *fp;//声明文本路径
fp= fopen(file_name,"w");//以写的方式打开文本
for(i=0;i<aaa;i++)
{
sprintf(str1,"%0.2f ", num_list[i][0]);//转换变量成字符
sprintf(str2,"%0.0f ",num_list[i][1]);//转换变量成字符
sprintf(str3,"%0.0f\n",num_list[i][2]);//转换变量成字符
strcat(str1,str2);//合成字符
strcat(str1,str3);//合成字符
fprintf(fp, str1);//写入字符到文本中的一行,
sprintf(radstr,"直径:Φ%0.2f ", num_list[i][0]);
sprintf(lens,"长度:%0.0fmm ",num_list[i][1]);
sprintf(pcsstr,"数量:%0.0f个 ",num_list[i][2]);
UF_UI_write_listing_window(radstr);
UF_UI_write_listing_window(lens);
UF_UI_write_listing_window(pcsstr);
UF_UI_write_listing_window("\n");
}
fclose (fp);//关闭文本
stop = GetTickCount();///计时结束
char sdd[200];
sprintf(sdd,"用时:%lld毫秒。\n", stop - start);
UF_UI_write_listing_window(sdd);
//goto L10;
}
}
/*ARGSUSED*/
void ufusr(char *param, int *retcode, int param_len)
{
if (!UF_CALL(UF_initialize()))
{
getscej();
UF_CALL(UF_terminate());
}
}
int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}
|
|