找回密码
 注册
Simdroid-非首页
查看: 147|回复: 5

[二次开发] A sample for UF_NCGROUP_cycle_members

[复制链接]
发表于 2010-10-5 13:14:24 | 显示全部楼层 |阅读模式 来自 北京
#include <uf_param.h>
#include <uf_param_indices.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uf.h>
#include <uf_defs.h>
#include <uf_assem.h>
#include <uf_ncgroup.h>
#include <uf_oper.h>
#include <uf_setup.h>
#include <uf_ui.h>


/* Error Display */
static void PrintErrorMessage( int errorCode );

/* Callback Function for Cycling members of a group */
static logical Cycle_Tag(tag_t tag, void *data);


logical Cycle_Tag(tag_t tag, void *data)
{
        int ecode;
        int iVvalue;
        char name[UF_OPER_MAX_NAME_LEN + 1];
        logical answer;
        double dVvalue1=0, dVvalue2=0;
        double eVvalue[2]= { 99, 98};
        char buff[132] = "";


        strcpy(name, "");
        ecode = UF_NCGROUP_is_group(tag, &answer);
        if( answer == 0 ){
                /* Ask the operation name */
                ecode = UF_OPER_ask_name_from_tag(tag, name);
                if( strcmp(name, (char *)data) == 0 ){
                                uc1601(name, 1);
                                /* Set the step over parameter */
                                dVvalue2 = .123;
ecode = UF_PARAM_set_double_value(tag, UF_PARAM_STEPOVER_DIST, dVvalue2);
ecode = UF_PARAM_set_double_value(tag, UF_PARAM_ENG_DIST, dVvalue2);
ecode = UF_PARAM_ask_int_value(tag,UF_PARAM_ENG_INIT_TYPE, &iVvalue);
printf("iVvalue is : %d  \n",iVvalue);
                                        if( ecode == 0 ){
                                }
                        return FALSE;        
                }
        }
        PrintErrorMessage(ecode);
        return TRUE;
}

/* Main */
void ufusr( char *parm, int *returnCode, int rlen )
{
        tag_t part_tag;
        int error = 0;
        tag_t setup_tag;
        tag_t program_root_tag;
        int errorCode;
    char opr_name[132];



        errorCode = UF_initialize();
        if ( errorCode == 0 ){
                part_tag = UF_ASSEM_ask_work_part();
                if( part_tag != NULL_TAG ){

                        error = UF_SETUP_ask_setup(&setup_tag);

                        error = UF_SETUP_ask_program_root(setup_tag,
&program_root_tag);

                        strcpy(opr_name, "PLANAR_MILL");
                        error = UF_NCGROUP_cycle_members(program_root_tag,
Cycle_Tag, (void
*)opr_name);



                }
                /* Terminate the API environment */
                errorCode = UF_terminate();
        }
        /* Print out any error messages */
        PrintErrorMessage( errorCode );
}

extern int ufusr_ask_unload( void )
{
        return( UF_UNLOAD_IMMEDIATELY );
}

/* PrintErrorMessage  */
static void PrintErrorMessage( int errorCode )
{
        if ( errorCode != 0 ){
                char message[133];
                UF_get_fail_message( errorCode, message );

                /* Print out the message */
                UF_UI_set_status( message );

                fprintf( stderr, "%s\n", message );
        }
}
发表于 2010-10-11 13:30:58 | 显示全部楼层 来自 广东东莞
Simdroid开发平台
楼主可否讲讲UF_NCGROUP_cycle_members函数的具体意思同用法?多谢!
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-11 18:55:41 | 显示全部楼层 来自 北京
本帖最后由 lirui0726 于 2010-10-16 01:37 编辑

如果你做过CAM的话,应该可以清楚下面的内容

这个函数的功能就是提取一个group的operation,然后将其存入一个链表/数组,供用户随时提取。

int UF_NCGROUP_cycle_members
(

tag_t group,
UF_NCGROUP_cycle_cb_f_t cb,
void * data

)


UF_NCGROUP_cycle_members的第一个入参是group的tag,第二个入参返回的是logic值,你可以自己写一个函数,它主要的功能是自定义循环行为。如果符合自定义循环条件,就存入链表/数组,最后返回True。第三个入参是一个链表或者数组。也就是说,在使用UF_NCGROUP_cycle_members循环GROUP所有operations过程中,只要第二个入参是TRUE,就将这个operation存入第三个入参定义的链表/数组中。最终的这个容器中的数据对我们很有用。NX的文档在此处对第三个参数的说明有个错误。

这个函数可以干些啥?
每个加工程序允许有若干个GROUP,所以首先要判断有多少GROUP,然后根据程序需要选择或者判断合适的group,找到目标group,提取该group中所有ops,存入链表/数组。得到这个链表/数组,我们可以做很多工作,例如实现ops加工参数的自动设置,判断operation type(TAP/thread/drill/mill)。在现代化程度较高的制造业公司,可以从这里一路干到机床NC程序生成,全自动化。

NX open的很多函数说明晦涩难懂,关键在于写这些帮助文档的人不参与具体函数的开发,不懂设计,不懂加工,不懂CAE,导致二次开发用户们看不懂这些函数。他们应该向CAE软件同行们看齐。
同时,西门子也不要太小气,可以开放部分GATC,公布一些很早就同其他公司合作开发出来的基于OPEN C 的lib库,这样有利于扩大NX Open 二次开发的用户群。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-16 00:17:15 | 显示全部楼层 来自 北京

PROGRAM----a group

MILL_ROUGH----operation
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-16 14:46:38 | 显示全部楼层 来自 北京
本帖最后由 lirui0726 于 2010-10-18 20:22 编辑

Before the work as follow,you should create a list and a list edit function.

static logical cb_GetObjectsFromProgramgroup(Entity tObj,void *lsOperations)
{
        
        if(OBJ_GetType(tObj)==UF_machining_operation_type)
                LLIST_Add(lsOperations,tObj);
        return TRUE;
}
//this is a cycle define,if ops 's type is UF_machining_operation_type,then put them into a list,and return TRUE

int CAMONT_GetObjectsFromProgramgroup(Entity tProgramRoot,LList lsOperations)
{
        int nStat;

        // cycle through all operations
        if((nStat = UF_NCGROUP_cycle_members(tProgramRoot,cb_GetObjectsFromProgramgroup,lsOperations))!=0){
                UI_ErrMessage(nStat,"Failed to get operations from the ONT!");
                return FALSE;
        }
        return TRUE;
}
//after this function's running,all of the opertions will put into the list wich match the condition defining in the cb_GetObjectsFromProgramgroup

After the work as above,we can fetch a list,in this list ,we can do the operation edit,parameter setting...
回复 不支持

使用道具 举报

发表于 2010-10-18 18:20:14 | 显示全部楼层 来自 广东东莞
再次感谢楼主的回答,很详细!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 21:36 , Processed in 0.039996 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表