#include "epm_handler_common.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(disable : 4996) #include //日志输出 #include "common_itk_util.h" extern "C" int POM_AM__set_application_bypass(logical bypass); using namespace std; int setTarget2(tag_t tag_task, tag_t tag_a) { int ifail = ITK_ok; int master_count = 0, count = 0; int attachment_types = 0; if (tag_a != NULL) { //AOM_unlock(tag_a); attachment_types = EPM_target_attachment; //attachment_types = EPM_reference_attachment; printf("开始将版本放入目标\n"); EPM_add_attachments(tag_task, 1, &(tag_a), &attachment_types); printf("结束将版本放入目标\n"); //AOM_lock(tag_a); return ITK_ok; } } //分割字符串函数 void split_img(char* src, const char* separator, char** dest, int* num) { /* src 源字符串的首地址(buf的地址) separator 指定的分割字符 dest 接收子字符串的数组 num 分割后子字符串的个数 */ char* pNext; int count = 0; if (src == NULL || strlen(src) == 0) //如果传入的地址为空或长度为0,直接终止 return; if (separator == NULL || strlen(separator) == 0) //如未指定分割的字符串,直接终止 return; pNext = (char*)strtok(src, separator); //必须使用(char *)进行强制类型转换(虽然不写有的编译器中不会出现指针错误) while (pNext != NULL) { *dest++ = pNext; ++count; pNext = (char*)strtok(NULL, separator); //必须使用(char *)进行强制类型转换 } *num = count; } /** *传入数据集,就下载数据集,调用JAVA程序插入图片(pdf) * */ int insert_pdf(tag_t dataset, char *ext,char *second_tag_type, tag_t rootTask_tag) { int ifail = ITK_ok; printf("insert_pdf \r\n"); tag_t spec_dataset_rev = NULLTAG, ref_object = NULLTAG; AE_reference_type_t reference_type; ITKCALL(ifail = AE_ask_dataset_latest_rev(dataset, &spec_dataset_rev)); char ref_name[WSO_name_size_c + 1] = ""; if (strcmp(second_tag_type, "PDF") == 0) { strcpy(ref_name,"PDF_Reference"); ITKCALL(ifail = AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object)); } else { strcpy(ref_name, "CAEAnalysisData"); ITKCALL(ifail = AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object)); } if (reference_type == AE_PART_OF) { char pathname[SS_MAXPATHLEN] = ""; //返回磁盘上与给定TcFile关联的物理文件的完整路径名。路径名的格式将取决于机器类型的值 ITKCALL(ifail = IMF_ask_file_pathname(ref_object, SS_WNT_MACHINE, pathname)); char origin_file_name[IMF_filename_size_c + 1] = ""; ITKCALL(ifail = IMF_ask_original_file_name(ref_object, origin_file_name)); char new_ds_name[WSO_name_size_c + 1] = ""; char *new_file_name = USER_new_file_name(new_ds_name, ref_name, ext, 0);//方法为数据集生成文件名。 //char *new_file_name = USER_new_file_name(new_ds_name, ref_name, "pdf", 0); char *temp_dir = getenv("temp"); //C:\Windows\temp char * tc_root_dir = getenv("tc_root"); //C:\Siemens\Teamcenter11 char img_file[SS_MAXPATHLEN] = ""; char temp_file[SS_MAXPATHLEN] = ""; char temp_file2[SS_MAXPATHLEN] = ""; char jar_file[SS_MAXPATHLEN] = ""; //----------------------------- strcpy(temp_file, temp_dir); strcat(temp_file, "\\"); strcat(temp_file, new_file_name); //C:\Windows\temp\\new_ds_name.pdf 输入路径 //printf("输入的pdf路径名字: %s\n",temp_file); //-------------------------- strcpy(temp_file2, temp_dir); strcat(temp_file2, "\\"); strcat(temp_file2, new_file_name); strcat(temp_file2, ".pdf"); //C:\Windows\temp\\new_ds_name.pdf.pdf 输出路径 //printf("输出的pdf路径名字: %s\n", temp_file); //-----------------------------4 strcpy(img_file, tc_root_dir); //strcat(img_file, "\\bin\\"); strcat(img_file, "\\"); strcat(img_file, "sign.jpg"); //C:\Siemens\Teamcenter11\\bin //----------------------------- strcpy(jar_file, tc_root_dir); strcat(jar_file, "\\bin\\"); strcat(jar_file, "insert_pdf.jar"); //将TcFile放入操作系统中的输入路径名。路径名可以相对于当前工作目录。(file_tag,pathname) ITKCALL(ifail = IMF_export_file(ref_object, temp_file)); ITKCALL(ifail = IMF_export_file(ref_object, temp_file2)); int iCnt; char *user_lib_env, pTempStr[500]; char local_path[MAX_PATH] = ""; char cmd[256] = ""; strcpy(cmd, "java -jar \""); strcat(cmd, jar_file); strcat(cmd, "\" \""); strcat(cmd, temp_file2); strcat(cmd, "\" \""); strcat(cmd, temp_file); strcat(cmd, "\""); printf("\n%s\n", cmd); system(cmd); tag_t new_file_tag = NULLTAG; IMF_file_t file_descriptor; ITKCALL(ifail = IMF_import_file(temp_file, new_file_name, SS_BINARY, &new_file_tag, &file_descriptor)); AOM_lock(new_file_tag); ITKCALL(ifail = IMF_set_original_file_name(new_file_tag, origin_file_name)); ITKCALL(ifail = IMF_close_file(file_descriptor)); ITKCALL(ifail = AOM_save(new_file_tag)); AOM_unlock(new_file_tag); AOM_refresh(new_file_tag,TRUE); AOM_lock(spec_dataset_rev); AE_remove_dataset_named_ref_by_tag(spec_dataset_rev, ref_name, ref_object); AE_add_dataset_named_ref(spec_dataset_rev, ref_name, AE_PART_OF, new_file_tag); AOM_save(spec_dataset_rev); AOM_unlock(spec_dataset_rev); AOM_refresh(spec_dataset_rev,TRUE); } return ITK_ok; } /** 给word添加水印 */ int insert_word(tag_t dataset, char* ext,char *type,tag_t rev,tag_t rootTask_tag,char* folder_name) { printf("word添加水印开始转换pdf开始 \r\n"); tag_t spec_dataset_rev = NULLTAG, ref_object = NULLTAG, ref_object2 = NULLTAG; char* object_name = NULL; AE_reference_type_t reference_type; AE_reference_type_t reference_type2; //ITKCALL(AE_ask_dataset_latest_rev(dataset, &spec_dataset_rev)); AE_ask_dataset_latest_rev(dataset, &spec_dataset_rev); char ref_name[WSO_name_size_c + 1] = "word"; char ref_name2[WSO_name_size_c + 1] = "PDF_Reference"; //ITKCALL(AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object)); AE_ask_dataset_named_ref(spec_dataset_rev, ref_name, &reference_type, &ref_object); AOM_ask_value_string(dataset,"object_name",&object_name); //原来word数据集的object_name printf("word的原来名称为:%s",object_name); //如果存在名字相同的pdf,不继续执行 tag_t relation_type , *second_tags; int second_tags_count = 0; char *other_name = NULL,*other_type = NULL ,self_name[WSO_name_size_c + 1] = "",self_new_name[WSO_name_size_c + 1] = "";//去掉后缀之后的word名称 int self_num = 0; char* revbuf_test[8] = { }; //存放分割后的子字符串 strcpy(self_name,object_name); printf("word的原来名称为:%s\n",self_name); if(strstr(self_name,".") > 0){ split_img(self_name,".", revbuf_test, &self_num); for(int i=0;i 0){ split_img(object_name, ".", revbuf, &tc_num); for(int m=0;m 0){ split_img(self_name,".", revbuf_test, &self_num); for(int i=0;i 0){ split_img(object_name, ".", revbuf, &tc_num); for(int m=0;m %s \r\n", second_tag_type);// second_tag_type => MSWordX if(second_tag_type == NULL){ return; } if (strcmp(second_tag_type, "PDF") == 0 || strcmp(second_tag_type, "CAEAnalysisDS") == 0) { insert_pdf(second_tags, "pdf",second_tag_type, rootTask_tag); printf("%s\n", "pdf水印添加成功"); //setTarget2(rootTask_tag, tag_tags[m]);//将版本带入目标 } else if (strcmp(second_tag_type, "MSWordX") == 0) { insert_word(second_tags, "word",".docx", rev, rootTask_tag,folder_name); printf("word水印添加成功\n"); } else if (strcmp(second_tag_type, "MSWord") == 0) { insert_word(second_tags, "word", ".doc", rev, rootTask_tag,folder_name); printf("word水印添加成功\n"); } else if (strcmp(second_tag_type, "MSExcelX") == 0 ) { insert_excel(second_tags, "excel",".xlsx", rev, rootTask_tag,folder_name); printf("excel水印添加成功\n"); } else if (strcmp(second_tag_type, "MSExcel") == 0) { insert_excel(second_tags, "excel", ".xls", rev, rootTask_tag,folder_name); printf("excel水印添加成功\n"); } if (second_tag_type != NULL) { MEM_free(second_tag_type); second_tag_type = NULL; } } /** *在PDF中插入图片handler * */ int jl_insert_img_pdf(EPM_action_message_t msg) { char* log_file = NULL; char log_path[128] = "C:\\Temp\\jl_insert_img_pdf_LOG.txt"; CreateLogFile(log_path, &log_file); //printf("%s\n","pdf插入图片开始"); WriteLog("》》》pdf插入图片开始"); //变量定义 POM_AM__set_application_bypass(true); int ifail = ITK_ok, att_cnt = 0, i = 0; tag_t task_tag = NULLTAG, rootTask_tag = NULLTAG, *attachments = NULL, relation_type = NULLTAG, relation_type1 = NULLTAG, relation_type2 = NULLTAG, relation_type3 = NULLTAG, relation_type4 = NULLTAG, relation_type5 = NULLTAG, type_tag = NULLTAG; char tgt_type[WSO_name_size_c + 1] = "", type_class[TCTYPE_class_name_size_c + 1] = "", rev_type[ITEM_type_size_c + 1] = ""; map rev_map; //获取流程 task_tag = msg.task; WriteLog("》》》开始获取根流程"); //获取根流程 ITKCALL(ifail = EPM_ask_root_task(task_tag, &rootTask_tag)); //获取流程目标对象 WriteLog("》》》开始遍历流程目标下的对象"); ITKCALL(ifail = EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &att_cnt, &attachments)); for (i = 0; i < att_cnt; i++) { WriteLog("》》》获取对象类型"); ITKCALL(ifail = TCTYPE_ask_object_type(attachments[i], &type_tag)); ITKCALL(ifail = TCTYPE_ask_class_name(type_tag, type_class)); printf("type_class : %s \r\n", type_class); //过滤掉非版本对象 WriteLog("》》》开始过滤掉非版本对象"); if (((strstr(type_class, "Revision") != NULL) || (strstr(type_class, "revision") != NULL)) && (strstr(type_class, "Master") == NULL) && (strstr(type_class, "master") == NULL) && (strstr(type_class, "BOM") == NULL) && (strstr(type_class, "bom") == NULL) && (strstr(type_class, "Bom") == NULL)) { printf("coming"); //将版本对象写入到缓存 WriteLog("》》》将过滤后的版本对象写入到缓存"); rev_map.insert(pair(attachments[i], "")); } } WriteLog("》》》开始检索给定关系类型"); ITKCALL(ifail = GRM_find_relation_type(TC_attaches_rtype, &relation_type)); ITKCALL(ifail = GRM_find_relation_type(TC_specification_rtype, &relation_type1)); ITKCALL(ifail = GRM_find_relation_type("catia_auxiliaryLink", &relation_type2)); ITKCALL(ifail = GRM_find_relation_type("Gd6_CPYQ1", &relation_type3)); ITKCALL(ifail = GRM_find_relation_type("Gd6_KHSR", &relation_type4)); //开始遍历缓存中的版本对象 WriteLog("》》》开始遍历缓存中的版本对象"); map::iterator rev_it; for (rev_it = rev_map.begin(); rev_it != rev_map.end(); rev_it++) { WriteLog("》》》遍历缓存中的版本对象beginning···\n"); //ITKCALL(ITEM_ask_rev_type(rev_it->first, rev_type)); ITEM_ask_rev_type(rev_it->first, rev_type); tag_t * second_tagsAll = (tag_t *)MEM_alloc(sizeof(tag_t)); tag_t * second_tags = NULLTAG; tag_t * second_tags1 = NULLTAG; tag_t * second_tags2 = NULLTAG; tag_t* second_tags3 = NULLTAG; tag_t* second_tags4 = NULLTAG; int second_tags_countAll = 0; int second_tags_count = 0; int second_tags_count1 = 0; int second_tags_count2 = 0; int second_tags_count3 = 0; int second_tags_count4 = 0; //添加数据集下载逻辑 ITKCALL(ifail = GRM_list_secondary_objects_only(rev_it->first, relation_type, &second_tags_count, &second_tags)); ITKCALL(ifail = GRM_list_secondary_objects_only(rev_it->first, relation_type1, &second_tags_count1, &second_tags1)); ITKCALL(ifail = GRM_list_secondary_objects_only(rev_it->first, relation_type2, &second_tags_count2, &second_tags2)); second_tags_countAll = second_tags_count + second_tags_count1 + second_tags_count2; printf("%s\n", "111111111"); WriteLog("》》》开始添加数据到second_tagsAll \n"); for (int i = 0; i < second_tags_count; i++) { WriteLog("》》》second_tagsAll[i] = second_tagsAll[%d]",i); second_tagsAll[i] = second_tags[i]; } for (int i = 0; i < second_tags_count1; i++) { WriteLog("》》》second_tagsAll[i+second_tags_count] = second_tagsAll[%d]", i+second_tags_count); second_tagsAll[i+second_tags_count] = second_tags1[i]; } for (int i = 0; i < second_tags_count2; i++) { WriteLog("》》》second_tagsAll[i+second_tags_count+second_tags_count1] = second_tagsAll[%d]", i+second_tags_count+second_tags_count1); second_tagsAll[i+second_tags_count+second_tags_count1] = second_tags2[i]; } printf("%s\n", "111111111"); printf("second_tags_countAll的数量为:%d\n", second_tags_countAll); WriteLog("》》》second_tags_countAll的数量为:%d\n", second_tags_countAll); char * carModel = NULL; ITKCALL(ifail = AOM_ask_value_string(rev_it->first, "item_id", &carModel)); printf("item_id=%s \n", carModel); MEM_free(carModel); for (i = 0; i < second_tags_countAll; i++) { char * second_tag_type = NULL; ITKCALL(ifail = AOM_ask_value_string(second_tagsAll[i], "object_type", &second_tag_type)); printf(" second_tag_type 类型 => %s \r\n", second_tag_type);// second_tag_type => MSWordX WriteLog("》》》second_tag_type 类型 => %s \r\n", second_tag_type); MEM_free(second_tag_type); } for (i = 0; i < second_tags_countAll; i++) { if(second_tagsAll[i]!=0&&second_tagsAll[i]!=NULL){ changePdf(rev_it->first,rootTask_tag,second_tagsAll[i],""); } } if(strcmp(rev_type,"Gd6_CPYQRevision")==0){ WriteLog("》》》类型rev_type==Gd6_CPYQRevision \n 产品要求开始》》》\n"); cout<<"产品要求开始"<first, relation_type3, &second_tags_count3, &second_tags3)); for (int i = 0; i < second_tags_count3; i++) { changePdf(rev_it->first,rootTask_tag,second_tags3[i],"Gd6_CPYQ1"); WriteLog("》》》Gd6_CPYQ1》》》\n"); } WriteLog("》》》类型rev_type==Gd6_CPYQRevision \n 客户输入开始》》》\n"); cout<<"客户输入开始"<first, relation_type4, &second_tags_count4, &second_tags4)); for (int i = 0; i < second_tags_count4; i++) { WriteLog("》》》Gd6_KHSR》》》\n"); changePdf(rev_it->first,rootTask_tag,second_tags4[i],"Gd6_KHSR"); } } printf("kkk\n"); WriteLog("》》》执行结束前释放对象\n"); if (second_tags) { WriteLog("》》》释放second_tags\n"); MEM_free(second_tags); second_tags = NULL; } if (second_tags1) { WriteLog("》》》释放second_tags1\n"); MEM_free(second_tags1); second_tags1 = NULL; } if (second_tags2) { WriteLog("》》》释放second_tags2\n"); MEM_free(second_tags2); second_tags2 = NULL; } if (second_tags3) { WriteLog("》》》释放second_tags3\n"); MEM_free(second_tags3); second_tags3 = NULL; } if (second_tags4) { WriteLog("》》》释放second_tags4\n"); MEM_free(second_tags4); second_tags4 = NULL; } } printf("ksaskk\n"); if (attachments != NULL) { WriteLog("》》》释放attachments\n"); MEM_free(attachments); attachments = NULL; } POM_AM__set_application_bypass(false); printf("水映结束\n"); WriteLog("》》》执行结束\n"); CloseLog(); return ifail; }