You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

867 lines
27 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "handlers.h"
#include <tc\tc_macros.h>
#include <tccore\method.h>
#include <tccore/workspaceobject.h>
#include <tccore/item.h>
#include <form\form.h>
#include <tccore\aom.h>
#include <tccore\aom_prop.h>
#include <tccore/grm.h>
#include <string>
#include <vector>
#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<string, Prop_Config> 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<string, Sign_Config>& 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<string, Prop_Config> prop_config_map;
vector<string> 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<string, Sign_Config> 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;
}