chpmould 发表于 2012-8-12 18:38

[Scmold]UG二次开发工具

本帖最后由 chpmould 于 2012-9-9 23:18 编辑

以前在UG中开发的模具BOM,标准件...等,先贴图片看看,如果需要的人多就上传... ...

邹锋 发表于 2013-6-20 23:22

高手,哈哈,正学习UG中,还不怎么会呢,学会后再用UG开发,跟你学,有没有QQ

303297160 发表于 2014-8-8 08:20

这个以后再学。

jslxt 发表于 2015-4-18 18:30

高手小弟学习了

wayne_myles 发表于 2015-6-7 15:39

好东西 啊希望用用看啊

pengfei2010 发表于 2017-10-11 17:36

回帖是一种美德!感谢楼主的无私分享 谢谢

邹锋 发表于 2019-12-26 10:16

#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[]={"统计顶针","统计螺丝"};
        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;
        int n = 0;
        tag_t face=null_tag;
        DWORD start, stop;//声明时间变量
        int type;
        double point ;
        double dir ;
        double box ;
        double radius;
        doublerad_data;
        intnorm_dir;
        double z;//声明长度
        int response=0;

        /////实体定义总长度数据,如果实体带斜度,侧不准
        double min_corner ;
        double directions ;
        double distances ;
        double min_corner1 ;
        double directions1 ;
        double distances1 ;
        ///改变算法,不用坐标系统,用圆柱面积算法
        //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={0,0,0};
        //tag_t csys_id ;
        ///改变算法,不用坐标系统,用圆柱面积算法

        ///////以下使用UGOPEN
        Session *theSession = Session::GetSession();
        Part *workPart(theSession->Parts()->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={0,0,0};//设置原点 ABS
        double matrix_values ={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={};//声明二维数组,数量有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=NULL;
                        tmp_lst=NULL;
                        tmp_lst=NULL;

                        UF_DISP_set_highlight(objects,0);//设置这个实体为不高亮显示
                        UF_MODL_ask_body_faces(objects,&face_list);//获取实体的面
                        UF_MODL_ask_list_count(face_list,&n);///查询表中有多少个面
                        if (ej==1 && sc==0)///如果是计算顶针长度,总长度为整体高度
                        {
                                UF_MODL_ask_bounding_box_exact(objects,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;///取得面的高度如果小于26(1分以下的螺丝头高度)就不算上他
                                        if (distances1<distances1 && distances1<distances1)//判断它是横着放还是竖着放,
                                        {
                                                hdist=distances1;///计算顶针长度
                                        }
                                        if (distances1<distances1 && distances1<distances1)
                                        {
                                                hdist=distances1;///计算顶针长度
                                        }
                                        if (distances1<distances1 && distances1<distances1)
                                        {
                                                hdist=distances1;///计算顶针长度
                                        }

                                }
                                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={edge_data.arc_center,edge_data.arc_center,edge_data.arc_center};//圆心
                                                //可用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;//Z为圆柱高度,圆柱长度


                                                radius = radius * 2;
                                                if (ej==1 && sc==0)////判断是否统计顶针
                                                {
                                                        if (distances<distances && distances<distances)
                                                        {
                                                                z=distances;///计算顶针长度
                                                        }
                                                        if (distances<distances && distances<distances)
                                                        {
                                                                z=distances;///计算顶针长度
                                                        }
                                                        if (distances<distances && distances<distances)
                                                        {
                                                                z=distances;///计算顶针长度
                                                        }
                                                        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 = dynamic_cast<Face *>(NXObjectManager::Get(face));//转换面
                                                        measureFaces1 = workPart->MeasureManager()->NewFaceProperties(unit1, unit2, 0.99, objects1);//取得面,相关的数据
                                                        area = measureFaces1->Area();//取得面积
                                                        perimeter = measureFaces1->Perimeter();//取得周长
                                                        //////////////////////////////////////////
                                                        z = area/perimeter*2;//螺丝比较有规则,可以用面积/周长*2就可以得到高度,它这周长是2条线的周长
                                                        z=z+0.6;//再加上倒角长度
                                                        //z=int(z/5+0.5)*5;////取得长度为5一级的数
                                                }
                                                if (k==0)//判断是否是第一个圆柱面,是就记录下来,保存好数据如果不是,则执行ELSE下面的
                                                {
                                                        tmp_lst=radius;
                                                        tmp_lst=z;
                                                        tmp_lst=hdist;
                                                }
                                                else
                                                {
                                                        if (radius<tmp_lst)//如果是第二次有记录了,则比较哪次记录的直径大小,
                                                        {
                                                                if (ej==1 && sc==0 && hdist>85)//判断统计顶针的时候,托长是否小于85,则不会记录它是一只顶针,取现在的直径与长度
                                                                {
                                                                        num=radius;
                                                                        num=z;
                                                                        aa=aa+1;
                                                                }
                                                                if (ej==0 && sc==1)//判断是统计螺丝的时候 ,,取现在的直径与长度
                                                                {
                                                                        if (qiucha(radius,4)<0.01 && qiucha(tmp_lst,8)<0.01 || qiucha(radius,5)<0.01 && qiucha(tmp_lst,10)<0.01 || qiucha(radius,6)<0.01 && qiucha(tmp_lst,12)<0.01 ||
                                                                                qiucha(radius,8)<0.01 && qiucha(tmp_lst,16)<0.01 || qiucha(radius,10)<0.01 && qiucha(tmp_lst,20)<0.01)
                                                                        {
                                                                                z=int(z/2+0.5)*2;
                                                                        }
                                                                        else
                                                                        {
                                                                                z=int(z/5+0.5)*5;
                                                                        }
                                                                        num=radius;
                                                                        num=z;
                                                                        aa=aa+1;
                                                                }
                                                        }
                                                        else
                                                        {
                                                                if (ej==1 && sc==0 &&tmp_lst>85)///判断统计顶针的时候,托长是否小于85,则不会记录它是一只顶针 ,取第一次记录的直径与长度
                                                                {
                                                                        num=tmp_lst;
                                                                        num=tmp_lst;
                                                                        aa=aa+1;
                                                                }
                                                                if (ej==0 && sc==1)//判断是统计螺丝的时候 ,取第一次记录的直径与长度
                                                                {

                                                                        if (qiucha(tmp_lst,4)<0.01 && qiucha(radius,8)<0.01 || qiucha(tmp_lst,5)<0.01 && qiucha(radius,10)<0.01 || qiucha(tmp_lst,6)<0.01 && qiucha(radius,12)<0.01 ||
                                                                                qiucha(tmp_lst,8)<0.01 && qiucha(radius,16)<0.01 || qiucha(tmp_lst,10)<0.01 && qiucha(radius,20)<0.01)
                                                                        {
                                                                                tmp_lst=int(tmp_lst/2+0.5)*2;
                                                                        }
                                                                        else
                                                                        {
                                                                                tmp_lst=int(tmp_lst/5+0.5)*5;
                                                                        }
                                                                        num=tmp_lst;
                                                                        num=tmp_lst;
                                                                        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={};//声明二维数组
                //num =22.2; //赋值第6个中的第一个数值
                //num =11.1;//赋值第6个中的第一个数值
                //double a1,a2;
                //a1=num ;//获取第6个中的第一个数值
                //a2=num ;//获取第6个中的第一个数值

                double num_list={};//声明二维数组
                int aaa=0;
                for (int uu = 0; uu<aa;uu++)
                {
                        double d1,l1,d2,l2;
                        d1=num;
                        l1=num;
                        int pcs = 1;

                        for (int r=0;r<aa;r++)
                        {
                                num=num;
                                num=num;
                        }

                        for (int kk = 0; kk<aa; kk++)
                        {
                                d2=num;
                                l2=num;
                                if (d1==d2 && l1==l2 && d1!=0.0)
                                {
                                        for (int u=kk;u<aa;u++)
                                        {
                                                num=num;
                                                num=num;
                                        }
                                        pcs= pcs+1;
                                        aa=aa-1;
                                        kk=kk-1;
                                }
                        }
                        num_list=d1;
                        num_list=l1;
                        num_list=pcs;
                        aaa=aaa+1;//生成种类的数量
                }
                //////////////////////排序,从小大到,
                int ac =aaa-1;
                double ci={};
                int i,j;

                for(j=0;j<ac;j++)   /* 气泡法要排序n次*/
                {
                        for(i=0;i<ac-j;i++)/* 值比较大的元素沉下去后,只把剩下的元素中的最大值再沉下去就可以啦 */
                        {
                                if(num_list>=num_list)/* 把值比较大的元素沉到底 */
                                {
                                        ci=num_list;
                                        ci=num_list;
                                        ci=num_list;

                                        num_list=num_list;
                                        num_list=num_list;
                                        num_list=num_list;

                                        num_list=ci;
                                        num_list=ci;
                                        num_list=ci;
                                }
                        }
                }
                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, lens,pcsstr;//定义字符变量

                char str1, str2,str3;//定义字符变量
                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);//转换变量成字符
                        sprintf(str2,"%0.0f",num_list);//转换变量成字符
                        sprintf(str3,"%0.0f\n",num_list);//转换变量成字符
                        strcat(str1,str2);//合成字符
                        strcat(str1,str3);//合成字符
                        fprintf(fp, str1);//写入字符到文本中的一行,

                        sprintf(radstr,"直径:Φ%0.2f", num_list);
                        sprintf(lens,"长度:%0.0fmm",num_list);
                        sprintf(pcsstr,"数量:%0.0f个",num_list);
                        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;
                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);
}

邹锋 发表于 2019-12-26 10:17

统计螺丝,顶针:lol 看了我13年还在学UG入门给你评轮的,,

1028882406@qq.c 发表于 2021-12-10 21:45

大佬上传个玩玩呢
页: [1]
查看完整版本: [Scmold]UG二次开发工具