#include "handlers.h" #include #include #include #include #include #include #include #include #include #include #include "tc_util.h" #include "k_util.h" using namespace std; /** * 判断俩入参是否同源 */ bool isTypeOf1(tag_t objtag, const char* type_name) { tag_t type = NULLTAG; TCTYPE_ask_object_type(objtag, &type); //printf("isTypeOf1方法的type:%s\n", type); tag_t item_type = NULLTAG; TCTYPE_find_type(type_name, "", &item_type); bool is_type = false; if (item_type != NULLTAG) { logical isok = FALSE; TCTYPE_is_type_of(type, item_type, &isok); if (isok) { is_type = true; } } return is_type; } int get_last_release_rev(tag_t itemTag, tag_t* revTag) { int ifail = ITK_ok; //获取版本 //tag_t revTag = NULLTAG; int revisionNums = 0; tag_t* revisionTags = NULLTAG; ITKCALL(ifail = AOM_ask_value_tags(itemTag, "revision_list", &revisionNums, &revisionTags)); for (int k = revisionNums - 1; k >= 0; k--) { int releaseNums = 0; tag_t* releaseTags = NULLTAG; ITKCALL(ifail = AOM_ask_value_tags(revisionTags[k], "release_status_list", &releaseNums, &releaseTags)); if (releaseNums > 0) { *revTag = revisionTags[k]; } MEM_free(releaseTags); } MEM_free(revisionTags); return ifail; } /* * 将对象B关联/挂载到A的关系下 * @param productInfo 关联关系 * @param new_rev 关联对象A(物料) * @param newwlrev 被关联的对象B(图纸) * @param old_part_rev 旧的对象A(物料) * @return bool */ bool createAndSaveRelation(const char* productInfo, tag_t new_rev, tag_t newwlrev, tag_t old_part_rev) { printf("createAndSaveRelation```开始建立图物关系\n"); int ifail = ITK_ok; tag_t gx_gx_type = NULLTAG; tag_t relation = NULLTAG; tag_t old_relation = NULLTAG; char* design_object_name1 = NULL; char* design_object_name2 = NULL; char* design_object_name3 = NULL; ITKCALL(ifail = AOM_ask_value_string(new_rev, "object_string", &design_object_name1)); ITKCALL(ifail = AOM_ask_value_string(newwlrev, "object_string", &design_object_name2)); ITKCALL(ifail = AOM_ask_value_string(old_part_rev, "object_string", &design_object_name3)); printf("createAndSaveRelation方法开始绑定%s到%s的%s关系下···\n", design_object_name2, design_object_name1, productInfo); MEM_free(design_object_name2); MEM_free(design_object_name1); POM_AM__set_application_bypass(true); try { ITKCALL(ifail = GRM_find_relation_type(productInfo, &gx_gx_type)); // 查找关系类型 if (gx_gx_type == NULLTAG) { printf("未能找到关系类型:%s\n", productInfo); return false; // 如果查找关系类型失败,则返回false } //ITKCALL(ifail = GRM_find_relation(old_part_rev, newwlrev, gx_gx_type, &old_relation)); /*if (old_relation != NULLTAG) { ITKCALL(ifail = GRM_delete_relation(old_relation)); printf("删除【%s】与【%s】间的【%s】关系完毕\n", design_object_name2, design_object_name3, productInfo); }else{ printf("删除【%s】与【%s】间的【%s】关系不存在\n", design_object_name2, design_object_name3, productInfo); }*/ ITKCALL(ifail = GRM_create_relation(new_rev, newwlrev, gx_gx_type, NULLTAG, &relation)); // 创建关系 if (relation == NULLTAG) { printf("创建关系失败\n"); return false; // 如果创建关系失败,则返回false } // 保存关系 ITKCALL(ifail = GRM_save_relation(relation)); POM_AM__set_application_bypass(false); if (ifail == ITK_ok) { return true; // 所有操作成功完成 } else { return false; } } catch (...) { // 捕获所有异常,确保任何未预见的问题也能安全返回 return false; } } int Method(METHOD_message_t msg, va_list args) { int ifail = ITK_ok; int rfCount = 0; tag_t relation_tag = NULLTAG, * rfTags = NULL; tag_t new_rev = va_arg(args, tag_t); char* operation = va_arg(args, char*); char* prop = nullptr; prop = "ysr8_FinishedDate"; printf("这是清除属性值Method\n"); if (strcmp(operation, "Revise") != 0) { return ifail; } printf("升版\n"); ITKCALL(ifail = GRM_find_relation_type("IMAN_master_form", &relation_tag)); if (relation_tag == NULLTAG) { return ifail; } ITKCALL(ifail = GRM_list_secondary_objects_only(new_rev, relation_tag, &rfCount, &rfTags)); if (rfCount == 0) { return ifail; } AOM_lock(rfTags[0]); AOM_set_value_date(rfTags[0], prop, NULLDATE); AOM_save(rfTags[0]); AOM_unlock(rfTags[0]); AOM_refresh(rfTags[0], true); printf("属性%s清除\n", prop); return ITK_ok; } /* * 判断当前tag对象是否可以进行升版操作 * @param wl_tag tag * @return bool */ bool canUpgrade(tag_t wl_tag) { tag_t child_wl_item_tag = NULLTAG; tag_t last_wl_rev_tag = NULLTAG; date_t last_wl_rev_release_time = NULLDATE; int ifail = ITK_ok; // 获取当前待升版物料的item对象 ITKCALL(ifail = ITEM_ask_item_of_rev(wl_tag, &child_wl_item_tag)); if (ifail != ITK_ok) { return false; } // 获取item对象的最新版本对象 ITKCALL(ifail = ITEM_ask_latest_rev(child_wl_item_tag, &last_wl_rev_tag)); if (ifail != ITK_ok) { return false; } // 获取最新版本对象的发布日期 ITKCALL(ifail = AOM_ask_value_date(last_wl_rev_tag, "date_released", &last_wl_rev_release_time)); if (ifail != ITK_ok) { return false; } // 判断最新版本对象是否未发布(即working状态) if (last_wl_rev_release_time.year == 0) { return false; // 未发布 } else { return true; // 已发布 } } /* * 打印图纸版本对象在此时‘表示’- representation_for 关系下的的物料 * @param design_rev_tag 图纸版本对象 */ int show_parts(tag_t design_rev_tag) { int ifail = ITK_ok; int count = 0; tag_t* tags = NULL; char* designName = NULL, * partName = NULL; ITKCALL(ifail = AOM_ask_value_string(design_rev_tag, "object_string", &designName)); ITKCALL(ifail = AOM_ask_value_tags(design_rev_tag, "representation_for", &count, &tags)); if (count == 0) { printf("设计图纸【%s】的表示关系下没有对象!\n",designName); } else { printf("开始打印设计图纸【%s】的表示关系下的%d个对象!=======================================================\n",designName,count); for (size_t i = 0; i < count; i++) { //图纸版本对象的表示关系下的对象:tags[i] ITKCALL(ifail = AOM_ask_value_string(tags[i], "object_string", &partName)); printf("===>>>【%s】对象!\n", partName); } printf("end 打印完毕!===================================================================================================\n"); } MEM_free(partName); MEM_free(tags); MEM_free(designName); return ifail; } int delete_oldRelation(tag_t old_design_rev_tag,tag_t new_design_rev_tag) { //物料下的“提供者”关系-TC_Is_Represented_By下存放图纸 //图纸下的“表示”关系-representation_for下存放物料 char* relation = "TC_Is_Represented_By"; //char* relation = "representation_for"; int ifail = ITK_ok; int old_count = 0, new_count = 0; tag_t* old_tags = NULL, * new_tags = NULL; char* old_designName = NULL, * new_designName = NULL; char* new_design_uid = NULL, * old_design_uid = NULL; tag_t gx_gx_type = NULLTAG, old_relation = NULLTAG; ITKCALL(ifail = AOM_ask_value_tags(old_design_rev_tag, "representation_for", &old_count, &old_tags)); ITKCALL(ifail = AOM_ask_value_tags(new_design_rev_tag, "representation_for", &new_count, &new_tags)); ITKCALL(ifail = AOM_ask_value_string(old_design_rev_tag, "object_string", &old_designName)); ITKCALL(ifail = AOM_ask_value_string(new_design_rev_tag, "object_string", &new_designName)); printf("开始删除新图纸【%s】下的旧物料···\n", new_designName); if (old_count == 0) { printf("【%s】对象的表示关系下没有对象!\n", old_designName); } if (new_count == 0) { printf("【%s】对象的表示关系下没有对象!\n", new_designName); } if (old_count > 0 && new_count > 0) { POM_AM__set_application_bypass(true); //遍历升版后的新图纸对象关系下的对象uid for (int i = 0; i < new_count; i++) { ITK__convert_tag_to_uid(new_tags[i], &new_design_uid); char* n_part_name = NULL; ITKCALL(ifail = AOM_ask_value_string(new_tags[i], "object_string", &n_part_name)); //遍历升版前的旧图纸对象关系下的对象uid for (int t = 0; t < old_count; t++) { printf("1\n"); ITK__convert_tag_to_uid(old_tags[t], &old_design_uid); char* old_part_name = NULL; ITKCALL(ifail = AOM_ask_value_string(old_tags[t], "object_string", &old_part_name)); printf("开始比较新图纸下的物料【%s】(uid=%s)与旧图纸下的物料【%s】(uid=%s)是否为同一个对象\n", n_part_name, new_design_uid, old_part_name, old_design_uid); //如果升版后的新图纸对象关系下的对象uid与升版前的旧图纸对象关系下的对象uid相等,则删除该(旧物料与新图纸)关系TC_Is_Represented_By if (strcmp(new_design_uid, old_design_uid) == 0) { printf("2\n"); ITKCALL(ifail = GRM_find_relation_type(relation, &gx_gx_type));//未能找到关系类型:representation_for未能找到关系类型:representation_for // 查找关系类型 if (gx_gx_type == NULLTAG) { printf("未能找到关系类型:%s\n", relation); continue; } printf("3\n"); ITKCALL(ifail = GRM_find_relation(old_tags[t], new_design_rev_tag, gx_gx_type, &old_relation)); printf("开始获取图纸【%s】和物料【%s】间的【%s】关系!\n", new_designName, old_part_name,relation); //ITKCALL(ifail = GRM_find_relation(new_design_rev_tag, old_tags[t], gx_gx_type, &old_relation)); if (ifail != ITK_ok) { printf("未能找到【%s】与【%s】间的【%s】关系!\n", new_designName, old_part_name, relation); continue; } if (old_relation != NULLTAG) { ITKCALL(ifail = GRM_delete_relation(old_relation)); ITKCALL(ifail = GRM_save_relation(old_relation)); printf("end 删除【%s】与【%s】间的【%s】关系完毕\n", new_designName, old_part_name, relation); } else { printf("物料【%s】的【%s】关系下不存在图纸【%s】\n", old_part_name, new_designName, relation); } break; } MEM_free(old_part_name); } MEM_free(n_part_name); } POM_AM__set_application_bypass(false); } MEM_free(old_design_uid); MEM_free(new_design_uid); MEM_free(old_designName); MEM_free(new_tags); MEM_free(old_tags); return ifail; } /* * 升版二开:后操处理一图多物情况 */ int JD_RevUpgrade(METHOD_message_t* msg, va_list va) { printf("升版后操方法开始执行 \n"); int ifail = ITK_ok; tag_t check_tag = va_arg(va, tag_t);//获取操作的tag对象(升版前的对象) tag_t item = NULLTAG; //升版后的新物料版本对象 tag_t new_part_tag = NULLTAG; //升版的新图纸版本对象 tag_t new_design_tag = NULLTAG; //物料的最新版本对象 tag_t last_partRev_tag = NULLTAG; //(old)图纸版本对象 tag_t design_rev_tag = NULLTAG; //图纸对象 tag_t design_item_tag = NULLTAG; //(new)图纸的最新版本对象 tag_t last_designRev_tag = NULLTAG; char* type = NULL; char* name = NULL; char* design_object = NULL;//升版物料对应的图纸对象 char* design_object2 = NULL;//升版物料对应的图纸对象 char* part_object = NULL;//升版对象 //物料下的图纸主表示对象 tag_t* primary_tag = NULLTAG; //图纸下的物料版本对象 tag_t* wl_tags = NULL; int count = 0; int count_wl = 0; int primary_tag_count = 0; char* revString1 = NULL; char* revString2 = NULL; date_t release_time = NULLDATE; int fb_count = 0; tag_t* fb_tags = NULL; //后操物料对象的uid char* wl_uid = NULL; char* rev_type = NULL; ITKCALL(ifail = AOM_ask_value_string(check_tag, "object_type", &rev_type));//获取待保存信息的类型 ITKCALL(ifail = AOM_ask_value_string(check_tag, "object_string", &part_object));//获取待保存信息的类型 printf("升版对象[%s]的类型:rev_type=[%s] \n", part_object,rev_type); //TODO 判断对象类型:图纸or物料 ITKCALL(ifail = ITEM_ask_item_of_rev(check_tag, &item)); ITKCALL(ifail = ITEM_ask_latest_rev(item, &new_part_tag)); if (item != NULLTAG) { ITKCALL(ifail = AOM_ask_value_string(item, "object_type", &type));//获取待保存信息的类型 ITKCALL(ifail = AOM_ask_value_string(item, "object_name", &name));//获取待保存信息的名称 printf("操作对象的Item对象:【%s】的类型=【%s】\n", name, type); //如果升版对象为物料,则获取其关联的图纸进行升版 if (isTypeOf1(item, "Part")) { printf("升版对象:【%s】为物料,获取其关联图纸进行后续升版操作\n", part_object); //获取对应的物料版本对象关联的图纸 ITKCALL(ifail = AOM_ask_value_tags(check_tag, "TC_Primary_Design_Representation",&primary_tag_count, &primary_tag)); ITK__convert_tag_to_uid(check_tag, &wl_uid); if (primary_tag_count > 0){ printf("升版对象下的:主设计表示[primary_tag_count]属性存在%d个对象\n", primary_tag_count); //一图多物场景下,当前物料关联的图纸只有一个,因此默认取第一个对象为图纸对象 for (int t = 0; t < primary_tag_count; t++) { design_rev_tag = primary_tag[t]; //判断对应图纸是否升版? ITKCALL(ifail = ITEM_ask_item_of_rev(design_rev_tag, &design_item_tag)); //根据图纸item对象获取最新版本对象,与当前图纸版本对象比较。如果两者不相等,即:升版了 ITKCALL(ifail = ITEM_ask_latest_rev(design_item_tag, &last_designRev_tag)); //item_revision_id ITKCALL(ifail = AOM_ask_value_string(design_rev_tag, "item_revision_id", &revString1)); ITKCALL(ifail = AOM_ask_value_string(design_rev_tag, "object_string", &design_object)); printf("物料[%s]对应的图纸对象:%s\n", part_object,design_object); ITKCALL(ifail = AOM_ask_value_string(last_designRev_tag, "item_revision_id", &revString2)); ITKCALL(ifail = show_parts(design_rev_tag)); ITKCALL(ifail = show_parts(last_designRev_tag)); //手动解除升版后新图纸last_designRev_tag下关联的旧版物料 ITKCALL(ifail = delete_oldRelation(design_rev_tag, last_designRev_tag)); ITKCALL(ifail = show_parts(last_designRev_tag)); //TODO 判断对应图纸是否升版? if (strcmp(revString1, revString2) == 0) {//物料对应的图纸版本与最新图纸版本相同,则:未升版 printf("物料[%s]对应的图纸版本[%s]未升版,即将对图纸进行升版!\n", part_object, design_object); //对图纸升版 ITKCALL(ifail = ITEM_copy_rev(design_rev_tag, NULL, &new_design_tag)); if (new_design_tag != NULLTAG) { printf("图纸升版成功\n"); //对图纸下关联的多个物料进行升版 ITKCALL(ifail = AOM_ask_value_tags(design_rev_tag, "representation_for", &count_wl, &wl_tags)); if (count_wl > 0) { printf("原图纸版本对象=【%s】关联的物料数量为%d\n", design_object, count_wl); for (int i = 0; i < count_wl; i++) {//将图纸下的物料版本对象进行升版,并和新图纸重新绑定关系 char* wl_uid1 = NULL; char* wl_object_name = NULL; ITK__convert_tag_to_uid(wl_tags[i], &wl_uid1); tag_t new_part_tag_c = NULLTAG; ITKCALL(ifail = AOM_ask_value_string(wl_tags[i], "object_string", &wl_object_name)); printf("图纸[%s]下关联的当前物料对象 = 【%s】!\n", design_object,wl_object_name); MEM_free(wl_object_name); if (strcmp(wl_uid, wl_uid1) == 0)//如果当前图纸下的物料版本对象与当前操作升版的(原)物料版本对象相同,则跳过(已经升版过了) { if (new_part_tag == NULLTAG) { printf("new_part_tag is NULLTAG,此时还无法(通过升版对象)获取升版后的新对象!\n"); } else { new_part_tag_c = new_part_tag; } } else { ITKCALL(ifail = ITEM_copy_rev(wl_tags[i], NULL, &new_part_tag_c));//升版物料 } if (new_part_tag_c != NULLTAG) { char* new_part_object_string = NULL; char* new_design_object_string = NULL; ITKCALL(ifail = AOM_ask_value_string(new_part_tag_c, "object_string", &new_part_object_string)); ITKCALL(ifail = AOM_ask_value_string(new_design_tag, "object_string", &new_design_object_string)); printf("旧图纸[%s]下的物料[%s]升版成功!开始将升版后的新物料[%s]与新图纸[%s]绑定关系\n", design_object, wl_object_name, new_part_object_string, new_design_object_string); //;//挂载关系、 if (createAndSaveRelation("TC_Is_Represented_By", new_part_tag_c, new_design_tag, wl_tags[i])) { printf("a挂载关系成功\n"); } else { printf("a挂载关系失败\n"); } MEM_free(new_design_object_string); MEM_free(new_part_object_string); } MEM_free(wl_uid1); } } } MEM_free(wl_tags); } else {//物料对应的图纸版本已升版 ITKCALL(ifail = AOM_ask_value_string(last_designRev_tag, "object_string", &design_object2)); printf("物料[%s]对应的图纸版本[%s]已升版为【%s】,无需再升版!\n", part_object, design_object, design_object2); //获取升版后的新图纸版本对象last_designRev_tag,判断其是否发布 ITKCALL(ifail = AOM_ask_value_date(last_designRev_tag, "date_released", &release_time)); if (release_time.year != 0) { printf("当前物料关联的图纸已升版且发布,不进行后续操作。\n"); } else { printf("当前物料[%s]关联的图纸[%s]已升版后的对象且未发布,进行后续操作···\n", part_object, design_object2); //升版后的图纸对象last_designRev_tag关联的全部物料都升版(包括当前物料) ITKCALL(ifail = AOM_ask_value_tags(last_designRev_tag, "representation_for", &count_wl, &wl_tags)); printf("当前物料[%s]关联的图纸[%s]关联的物料有%d个,进行后续操作···\n", part_object, design_object2, count_wl); if (count_wl > 0) { printf("开始遍历关联图纸下的物料对象···\n"); for (int i = 0; i < count_wl; i++) {//将图纸下的物料版本对象进行升版,并和新图纸重新绑定关系 char* wl_uid1 = NULL; char* wl_object_name = NULL; tag_t new_part_tag_c = NULLTAG; ITK__convert_tag_to_uid(wl_tags[i], &wl_uid1); if (strcmp(wl_uid, wl_uid1) == 0) { ITKCALL(ifail = AOM_ask_value_string(wl_tags[i], "object_string", &wl_object_name)); printf("图纸[%s]下关联的当前物料对象 = 【%s】,为升版操作对象,无需升版!\n", design_object2, wl_object_name); MEM_free(wl_object_name); if (new_part_tag == NULLTAG) { printf("new_part_tag is NULLTAG,此时还无法(通过升版对象)获取升版后的新对象!\n"); } else { new_part_tag_c = new_part_tag; } //continue;//如果当前图纸下的物料版本对象与当前图纸的物料版本对象相同,则跳过(已经升版过了) } else { if (canUpgrade(wl_tags[i])) { ITKCALL(ifail = AOM_ask_value_string(wl_tags[i], "object_string", &wl_object_name)); printf("图纸[%s]下关联的当前物料对象 = 【%s】,非升版操作对象,即将对当前物料进行升版!\n", design_object2, wl_object_name); MEM_free(wl_object_name); ITKCALL(ifail = ITEM_copy_rev(wl_tags[i], NULL, &new_part_tag_c));//升版物料 printf("图纸[%s]下关联的当前物料对象 = 【%s】升版后,打印图纸对象的表示关系下的对象:\n", design_object2, wl_object_name); } else { printf("当前物料 %s 存在未发布的版本对象,无法进行升版!\n", wl_object_name); } } if (new_part_tag_c != NULLTAG) { char* new_part_object_string = NULL; ITKCALL(ifail = AOM_ask_value_string(new_part_tag_c, "object_string", &new_part_object_string)); printf("(已升版)图纸【%s】下的物料【%s】升版成功!开始将升版后的新物料【%s】与图纸【%s】绑定关系\n", design_object2, wl_object_name, new_part_object_string,design_object2); if (createAndSaveRelation("TC_Is_Represented_By", new_part_tag_c, last_designRev_tag, wl_tags[i])) { printf("n挂载关系成功\n"); ITKCALL(ifail = show_parts(last_designRev_tag)); } else { printf("n挂载关系失败\n"); ITKCALL(ifail = show_parts(last_designRev_tag)); } MEM_free(new_part_object_string); } MEM_free(wl_uid1); } } else { printf("没有在设计图纸的‘representation_for’关系下找到符合要求的物料!\n"); } } //MEM_free(fb_tags); } MEM_free(revString2); MEM_free(design_object); MEM_free(revString1); } } else { printf("获取物料下关联的图纸主表示失败!\n"); } MEM_free(wl_uid); MEM_free(primary_tag); } else { printf("操作对象:【%s】的类型=【%s】,非物料对象不触发升版二开后操函数。\n", name, type); } MEM_free(name); MEM_free(type); } MEM_free(part_object); MEM_free(rev_type); return ifail; } /* * userservice方法 - 更改单位 */ int USERSERVICE_changeUnit(void* returnValue) { int ifail = ITK_ok; tag_t tag = NULL_TAG; char* uomName = NULL; tag_t* release_objs = NULL; USERARG_get_tag_argument(&tag); USERARG_get_string_argument(&uomName); int num_could = 0; tag_t* uoms = NULL, uom = NULLTAG; ITKCALL(UOM_extent(&num_could, &uoms)); for (int i = 0; i < num_could; i++) { char* name = NULL; UOM_ask_name(uoms[i], &name); if (strcmp(name, uomName) == 0) { uom = uoms[i]; break; } } char* class_id = NULL; tag_t attr_id = NULLTAG, class_tag = NULLTAG, tag_instance = NULLTAG; ITKCALL(AOM_lock(tag));//加锁 ITKCALL(POM_class_of_instance(tag, &class_tag));//获取入参对象的类对象 ITKCALL(POM_name_of_class(class_tag, &class_id));//获取类对象的属性id ITKCALL(POM_attr_id_of_attr("uom_tag", class_id, &attr_id));//获取uom_tag属性id ITKCALL(POM_refresh_instances_any_class(1, &tag, POM_modify_lock)); ITKCALL(POM_set_attr_tag(1, &tag, attr_id, uom)); ITKCALL(POM_save_instances(1, &tag, true)); ITKCALL(AOM_unlock(tag));//解锁 ITKCALL(AOM_refresh(tag, false)); return ITK_ok; } typedef struct { string prop_location; string prop_name; } Prop_Config; typedef struct { string rev_type; string title_block_names; map prop_config_map; } Sign_Config; #define PROP_LOCATION_ITEM "item" #define PROP_LOCATION_REV "rev" #define PROP_LOCATION_ITEMMASTER "itemmaster" #define PROP_LOCATION_REVMASTER "revmaster" #define PREF_SIGNATURE "Connor_MCAD_Signature" #define ITK_err 919011 /** * 从偏好设置中解析签名配置 * * 此函数通过查询偏好设置来获取签名配置信息,并将其解析到一个映射表中 * 每个签名类型对应一个配置对象,包含标题块名称和属性配置映射 * * @param sign_config_map 用于存储解析后的签名配置的映射表 * @return 返回执行结果,0表示成功,非0表示失败 */ int ParseConfigFromPreference(map& sign_config_map) { int ifail = ITK_ok, pref_cnt = 0; char** pref_values = NULL; // 调用偏好设置接口获取签名相关的偏好值 ITKCALL(ifail = PREF_ask_char_values(PREF_SIGNATURE, &pref_cnt, &pref_values)); if (ifail != ITK_ok) { goto end; } for (int i = 0; i < pref_cnt; i++) { string value, rev_type, title_block_names; map prop_config_map; vector prop_configs; value.assign(pref_values[i]); printf("1111\n"); // 解析偏好值字符串,首先获取修订类型 int ind = value.find(":"); if (ind == string::npos || ind == 0) { continue; } printf("2222\n"); rev_type = value.substr(0, ind); printf("rev_type:%s\n", rev_type.c_str()); // 如果修订类型已存在,则跳过当前配置 if (sign_config_map.count(rev_type) > 0) { continue; } printf("3333\n"); // 继续解析标题块名称和属性配置 value = value.substr(ind + 1); ind = value.find(":"); if (ind == string::npos || ind == 0) { continue; } printf("4444\n"); title_block_names = value.substr(0, ind); value = value.substr(ind + 1); // 分割属性配置字符串,并逐个解析 Splits(value, ";", prop_configs); int size = prop_configs.size(); for (int j = 0; j < size; j++) { string cad_prop_name, prop_location, prop_name; value = prop_configs[j]; // 解析每个属性配置,获取CAD属性名称、属性位置和属性名称 ind = value.find("="); if (ind == string::npos || ind == 0) { continue; } cad_prop_name = value.substr(0, ind); if (prop_config_map.count(cad_prop_name) > 0) { continue; } value = value.substr(ind + 1); ind = value.find("."); if (ind == string::npos || ind == 0) { continue; } prop_location = value.substr(0, ind); prop_name = value.substr(ind + 1); if (prop_name.empty()) { continue; } // 将属性位置转换为小写,以便后续比较 transform(prop_location.begin(), prop_location.end(), prop_location.begin(), ::tolower); // 根据属性位置判断是否为有效的配置,并创建属性配置对象 if (prop_location == PROP_LOCATION_ITEM || prop_location == PROP_LOCATION_REV || prop_location == PROP_LOCATION_ITEMMASTER || prop_location == PROP_LOCATION_REVMASTER) { Prop_Config prop_config; prop_config.prop_location = prop_location; prop_config.prop_name = prop_name; prop_config_map[cad_prop_name] = prop_config; // 或使用 insert 方法,但直接使用下标操作更简洁 } } // 如果属性配置映射不为空,则创建签名配置对象,并添加到签名配置映射中 if (prop_config_map.size() > 0) { Sign_Config sign_config; sign_config.rev_type = rev_type; sign_config.title_block_names = title_block_names; sign_config.prop_config_map = prop_config_map; sign_config_map.insert(make_pair(rev_type, sign_config)); printf("次数%d\n", i); } } // 如果签名配置映射为空,则存储错误信息并返回错误代码 if (sign_config_map.size() < 1) { ITKCALL(ifail = EMH_store_error_s2(EMH_severity_error, ITK_err, ("首选项配置错误"), PREF_SIGNATURE)); ifail = ITK_err; } end: DOFREE(pref_values); return ifail; } #define PREF_REMOVE_FILE "Connor_MCAD_RemoveTempFile" #define PREF_UPLOAD_FILE "Connor_MCAD_UploadFile" /** * actionHandler:调用exe程序启动cad同步数据集 */ int SynchronizeDataSet(EPM_action_message_t msg) { int ifail = ITK_ok, att_cnt = 0, pref_cnt = 0; tag_t root_task = NULLTAG, * attachments = NULL; map sign_config_map; char* object_string = NULL, * object_type = NULL, ** pref_values = NULL; string dataset_rel, dataset_type, dataset_ref; bool has_err = false; logical remove_file = true; // 获取当前任务标签,并根据当前任务获取根任务标签。 tag_t current_task = msg.task; ITKCALL(ifail = EPM_ask_root_task(current_task, &root_task)); if (ifail != ITK_ok) { goto end; } // 日志输出,标志着函数开始执行。 Log("====================================================="); Log("Connor_CAD_Signature 开始执行"); Log("====================================================="); // 官方API:查询根任务的附件(数据集),获取附件数量和附件标签数组。 ITKCALL(ifail = EPM_ask_attachments(root_task, EPM_target_attachment, &att_cnt, &attachments)); if (att_cnt == 0) { Log("目标下无引用对象"); goto end; } // 设置绕过某些检查的标志。 set_bypass(true); // 官方API:查询是否需要删除临时文件的偏好设置。 ITKCALL(ifail = PREF_ask_logical_value(PREF_REMOVE_FILE, 0, &remove_file)); if (ifail != ITK_ok) { EMH_clear_last_error(ifail); } if (remove_file) { Log("不保留临时文件"); } else { Log("保留临时文件"); } // 官方API:解析上传配置,包括数据集的相关信息。 ITKCALL(ifail = PREF_ask_char_values(PREF_UPLOAD_FILE, &pref_cnt, &pref_values)); if (ifail != ITK_ok) { goto end; } if (pref_cnt < 3) { //ITKCALL(ifail = EMH_store_error_s2(EMH_severity_error, ITK_err, ("首选项配置错误"), PREF_SIGNATURE)); ifail = ITK_err; goto end; } dataset_rel.assign(pref_values[0]); dataset_type.assign(pref_values[1]); dataset_ref.assign(pref_values[2]); Log("数据集配置: [%s][%s][%s]", dataset_rel.c_str(), dataset_type.c_str(), dataset_ref.c_str()); DOFREE(pref_values); // 解析签名配置,从偏好设置中读取并解析签名配置信息。 ITKCALL(ifail = ParseConfigFromPreference(sign_config_map)); if (ifail != ITK_ok) { goto end; } end: // 日志输出,标志着函数执行结束。 Log("====================================================="); Log("Connor_CAD_Signature 执行结束"); Log("====================================================="); // 清理标志,恢复某些检查的执行。 set_bypass(false); // 如果有错误发生,则返回错误代码。 if (has_err) { ifail = ITK_err; } // 释放分配的内存。 DOFREE(pref_values); DOFREE(object_string); DOFREE(object_type); DOFREE(attachments); // 返回执行结果。 return ifail; }