// CONTENT OF THE FILE DEVELOP.H

 

#ifndef DEVELOP_H

#define DEVELOP_H

 

extern "C"{  // extern directive because I want to work with C++

                   //   since Pro/TOOLKIT stuff is all written in C it

                   // must be designated as C code

      #include <ProToolkit.h>

      #include <ProUtil.h>

      #include <ProMenu.h>

      #include <ProMenuBar.h>

      #include <ProMessage.h>

 

      #include <ProWindows.h>

      #include <ProSurface.h>

      #include <ProSelection.h>

      #include <ProGeomitem.h>

      #include <ProGraphic.h>

      #include <ProGeomitemdata.h>

      #include <UtilCollect.h>

      #include <ProUdf.h>

 

      // these 2 function must always be decreated and

      // defined in your Pro/TOOLKIT dll application

      int user_initialize(int argc,char ** argv);

      void user_terminate();

}

 

 

static ProName dev_msg;

// this macro will be a time saver

#define MSGFILE  ProStringToWstring(dev_msg,"develop_msg.txt")

 

//udf function

void user_place_udf();

 

#endif

 

 

// CONTENT OF THE FILE UDF.CPP

#include "develop.h"

#include <string>

#include <vector>

using namespace std;

 

 

ProError add_ref(ProMdl handle,int item_id,

                         ProType item_type,

                         ProBoolean ref_bool,

                         char * c_prompt,

                         ProUdfdata udf_data){

 

      ProModelitem modelitem;

      ProSelection selection;

      ProLine prompt;

      ProUdfreference reference;

      ProError err;

 

      err=ProModelitemInit(handle,item_id,item_type,&modelitem);

      if(PRO_TK_NO_ERROR != err) goto error;

      err=ProSelectionAlloc(NULL,&modelitem,&selection);

      if(PRO_TK_NO_ERROR != err) goto error;

      ProStringToWstring(prompt,c_prompt);

      err=ProUdfreferenceAlloc(prompt,selection,ref_bool,&reference);

      if(PRO_TK_NO_ERROR != err) goto error;

      err=ProUdfdataReferenceAdd(udf_data,reference);

      if(PRO_TK_NO_ERROR != err) goto error;

      err=ProSelectionFree(&selection);

error:

      return err;

}

 

 

void user_place_udf(){

 

      ProError err_acomps,err,err_csys;

      ProAsmcomp *asm_comps;

      int n_asm_comps,plate_feat_id,n_csys;

      ProFamilyName mdl_name;

      char c_mdl_name[PRO_FAMILY_NAME_SIZE],c_name[PRO_FAMILY_NAME_SIZE];

      ProMdl asmbly,plate;

      ProMdlType mdl_type;

      ProUdfdata udf_data;

      char prof_name[]="bos";

      ProLine w_name,w_string;

      ProUdfvardim vardim;

      ProFeature f_top_plane;

      ProGeomitem g_top_plane;

      ProIdTable comp_id_table;

      ProAsmcomppath comp_path;

      ProGroup udf;

      ProCsys     *p_csys;

      vector<int> csys_ids;

 

      ProMdlCurrentGet(&asmbly);  // the main assembly handle

      err_acomps = ProUtilCollectAsmcomp((ProAssembly) asmbly,&asm_comps);

      ProArraySizeGet ((ProArray)asm_comps, &n_asm_comps);

    for (int i=0; i<n_asm_comps; i++)

    {

        ProAsmcompMdlNameGet (& (asm_comps[i]), &mdl_type, mdl_name);

            ProWstringToString(c_mdl_name,mdl_name);

            string stl_mdl_name(c_mdl_name);

            string::size_type pos = stl_mdl_name.find("PLATE");

 

            if(pos != string::npos){ //found

                  ProMessageDisplay(MSGFILE, "DEVUSER %0s", c_mdl_name);

                  ProMessageClear();

                  ProAsmcompMdlGet((ProAsmcomp *) &(asm_comps[i]), &plate);  // our plate

                  plate_feat_id = asm_comps[i].id;

                  break;

            }

      }

 

      err = ProUtilFindFeatureByName((ProSolid)plate,ProStringToWstring(w_string,"TOP"),&f_top_plane);

      err = ProUtilFindFeatureGeomitemByName(&f_top_plane,PRO_SURFACE ,ProStringToWstring(w_string,"TOP"),&g_top_plane);

 

      err_csys = ProUtilCollectSolidCsys((ProSolid)asmbly,&p_csys);

      ProArraySizeGet ((ProArray)p_csys, &n_csys);

      for (int i=0; i<n_csys; i++)

    {

            ProModelitem mitem;

            ProFeature feature;

            string::size_type pos;

 

            ProCsysToGeomitem((ProSolid)asmbly,p_csys[i],&mitem);

            ProGeomitemFeatureGet(&mitem,&feature);

            ProModelitemNameGet(&feature,w_name);

            ProWstringToString(c_name,w_name);

            string stl_name(c_name);

 

            pos = stl_name.find("ACS");

 

            if(pos != string::npos){  // FOUND

                  csys_ids.push_back(mitem.id);

            }

 

      }

 

      double Yradius = .2, Xradius = .4;

 

      for (unsigned int i = 0; i<csys_ids.size(); i++){

 

            err = ProUdfdataAlloc(&udf_data);

            err = ProUdfdataNameSet(udf_data,ProStringToWstring(w_string,prof_name),NULL);

            err = ProUdfdataDependencySet(udf_data,PROUDFDEPENDENCY_INDEPENDENT);

            err = ProUdfdataScaleSet(udf_data,PROUDFSCALETYPE_SAME_DIMS,0);

            err = ProUdfdataDimdisplaySet(udf_data,PROUDFDIMDISP_NORMAL);

 

            add_ref(asmbly,csys_ids[i],PRO_CSYS,PRO_B_TRUE,"coordinate system",udf_data);

            add_ref(plate,g_top_plane.id,PRO_SURFACE,PRO_B_FALSE,"top plane",udf_data);

 

            ProUdfvardimAlloc(ProStringToWstring(w_string,"Yradius"),Yradius,PROUDFVARTYPE_DIM,&vardim);

            ProUdfdataUdfvardimAdd(udf_data,vardim);

            ProUdfvardimAlloc(ProStringToWstring(w_string,"Xradius"),Xradius,PROUDFVARTYPE_DIM,&vardim);

            ProUdfdataUdfvardimAdd(udf_data,vardim);

 

            for (int j=0; j<4; j++)

                  err=ProUdfdataOrientationAdd(udf_data,PROUDFORIENT_NO_FLIP);

 

            comp_id_table[0]=plate_feat_id;

            ProAsmcomppathInit( (ProSolid) plate, comp_id_table, 1, &comp_path);

 

            err=ProUdfCreate((ProSolid)plate,udf_data,&comp_path,NULL,0,&udf);

            err=ProUdfdataFree(udf_data);

      }

      ProWindowRepaint(PRO_VALUE_UNUSED);

 

      // clean up

      if (PRO_TK_NO_ERROR == err_acomps) ProArrayFree ((ProArray*)&asm_comps);

      if (PRO_TK_NO_ERROR == err_csys ) ProArrayFree ((ProArray*)&p_csys);

 

}