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.

437 lines
17 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 "kutil.h"
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include "libxl.h"
#include <io.h>
#include <direct.h>
#include <cfm/cfm.h>
#include <wchar.h>
#include <locale>
#include <codecvt>
#include <chrono>
#include <Windows.h>
#include <thread>
#include <regex>
#include <res\reservation.h>
#include "libxl.h"
#include <map>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <filesystem>
#include <sys/stat.h>
#include <iostream>
#include <random>
#include <windows.h>
#include <objbase.h>
#include <iostream>
#include <iomanip>
std::string getTimestamp() {
std::time_t now = std::time(nullptr);
char buf[100] = "";
std::strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S", std::localtime(&now));
return std::string(buf);
}
std::string getTempDirectory() {
const char* tempDir = getenv("TEMP");
return std::string(tempDir);
}
std::string generatePDFFileName() {
std::string timestamp = getTimestamp();
std::string tempDir = getTempDirectory();
return tempDir + "\\工艺合本_" + timestamp + ".pdf";
}
// 创建空的PDF文件
int createEmptyPDFFile(const std::string& pdfFilePath) {
// 创建空的PDF文件
std::ofstream pdfFile(pdfFilePath, std::ios::binary);
if (!pdfFile) {
std::cerr << "PDF文件创建失败: " << pdfFilePath << std::endl;
return -1;
}
// 关闭文件
pdfFile.close();
std::cout << "空PDF文件已创建: " << pdfFilePath << std::endl;
return 0;
}
/*
* 生成唯一时间戳
*/
std::string getUniqueTimestamp() {
// 获取当前时间点
auto now = std::chrono::system_clock::now();
// 将时间点转换为 time_t
std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);
// 获取纳秒部分
auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()).count() % 1000000000;
// 将 time_t 转换为本地时间
std::tm now_tm = *std::localtime(&now_time_t);
// 格式化时间字符串
std::ostringstream oss;
oss << std::put_time(&now_tm, "%Y%m%d%H%M%S") << "" << std::setw(9) << std::setfill('0') << nanoseconds;
return oss.str();
}
/**
*
* @HandlerName: F6_MEP_Merge
* @HandlerType: ActionHandler
* @Description: 工艺路线下工序的PDF工艺生成合本工艺
* @author: hcj
* @date: 2024年10月24日
*
*/
int F6_MEP_Merge(EPM_action_message_t msg) {
// Define error message
printf("Define error message\n");
string err = "";
// Check if folder and file exist, if not, create them
const char* directory_path = "D:\\log";
const char* file_path = "D:\\log\\F6_MEP_Merge.log";
printf("开始获取日志文件F6_MEP_Merge.log\n");
CreateDirectoryAndFile(directory_path, file_path);
// Open log file in append mode
printf("Open log file in append mode\n");
auto logFile = std::make_unique<std::ofstream>(file_path, std::ios::app);
if (!logFile->is_open()) {
return -1;
}
// Get current time
printf("Get current time\n");
auto now = std::chrono::system_clock::now();
std::time_t time1 = std::chrono::system_clock::to_time_t(now);
std::string timeStr = std::ctime(&time1);
timeStr = timeStr.substr(0, timeStr.size() - 1);
*logFile << "[" << timeStr << "] ";
*logFile << "=========================工艺路线下工序的PDF工艺生成合本工艺start===================" << std::endl;
tag_t rootTask = NULLTAG;
printf("Get task object\n");
// Get task object
EPM_ask_root_task(msg.task, &rootTask);
//获取参数
printf("获取参数\n");
char* argflag = NULL, * argvalue = NULL, * arg = NULL;
char checkType[1024] = "";
char itemChildType[1024] = "";
char topRelation[1024] = "";
char relation[1024] = "";
int arg_cnt = TC_number_of_arguments(msg.arguments);
if (arg_cnt > 0)
{
for (int i = 0; i < arg_cnt; i++)
{
//获取下一个参数从0开始
arg = TC_next_argument(msg.arguments);
//获取参数的名称和值
ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue);
if (strcmp(argflag, "itemType") == 0)
{
if (argvalue != NULL)
{
strcpy(checkType, argvalue);
*logFile << "[" << timeStr << "] " << "获取流程参数itemType:" << checkType << std::endl;
}
}
if (strcmp(argflag, "itemChildType") == 0)
{
if (argvalue != NULL)
{
strcpy(itemChildType, argvalue);
*logFile << "[" << timeStr << "] " << "获取流程参数itemChildType:" << checkType << std::endl;
}
}
if (strcmp(argflag, "topRelation") == 0)
{
if (argvalue != NULL)
{
strcpy(topRelation, argvalue);
*logFile << "[" << timeStr << "] " << "获取流程参数topRelation:" << topRelation << std::endl;
}
}
if (strcmp(argflag, "relation") == 0)
{
if (argvalue != NULL)
{
strcpy(relation, argvalue);
*logFile << "[" << timeStr << "] " << "获取流程参数relation:" << relation << std::endl;
}
}
}
}
printf("获取参数\n");
int attachments_num = 0;
tag_t* attachments = NULLTAG;
*logFile << "[" << timeStr << "] " << "开始获取流程目标下的bom对象" << std::endl;
EPM_ask_attachments(rootTask, EPM_target_attachment, &attachments_num, &attachments);
*logFile << "[" << timeStr << "] " << "目标下的对象个数:" << attachments_num << std::endl;
for (int i = 0; i < attachments_num; i++) {
tag_t compont = attachments[i];
//获取类型
char* type;
AOM_ask_value_string(compont, "object_type", &type);
printf("object_type:%s\n", type);
vector<string> types;
Split(checkType, ",", types);
*logFile << "[" << timeStr << "] " << "判断目标对象类型" << type << "是否包含在" << checkType << "里面" << std::endl;
if (std::find(types.begin(), types.end(), type) != types.end()) {
printf("yes\n");
*logFile << "[" << timeStr << "] " << "存在" << std::endl;
//开始遍历工艺BOM
//获取bom行数据 校验数据
tag_t top_line = NULLTAG, window = NULLTAG;
*logFile << "[" << timeStr << "] " << "开始创建 BOM 窗口" << std::endl;
ITKCALL(BOM_create_window(&window)); // 调用 BOM_create_window 创建 BOM 窗口
*logFile << "[" << timeStr << "] " << "BOM 窗口创建完成" << std::endl;
// 设置顶级 BOM
*logFile << "[" << timeStr << "] " << "开始设置顶级 BOM" << std::endl;
ITKCALL(BOM_set_window_top_line(window, NULLTAG, compont, NULLTAG, &top_line)); // 设置顶级 BOM 行
*logFile << "[" << timeStr << "] " << "顶级 BOM 设置完成" << std::endl;
//在当前的temp目录下创建一个空的pdf文件 准备合并工序pdf
std::string pdfFilePath = generatePDFFileName();
// 创建空的PDF文件
std::ofstream pdfFile(pdfFilePath, std::ios::binary);
if (!pdfFile) {
EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, "PDF文件创建失败");
return -1;
}
// 关闭文件
pdfFile.close();
createEmptyPDFFile(pdfFilePath);
int result = createEmptyPDFFile(pdfFilePath);
if (result == 0) {
std::cout << "PDF文件创建成功" << std::endl;
}
else {
std::cerr << "PDF文件创建失败" << std::endl;
}
*logFile << "[" << timeStr << "] " << "PDF文件已创建: " << pdfFilePath << std::endl;
char cmd[16384] = "";
strcpy(cmd, "java -jar D:\\Siemens\\Teamcenter13\\bin\\MERGEPDF.jar");
strcat(cmd, " \"");
strcat(cmd, pdfFilePath.c_str());
//获取工艺下的pdf文件
*logFile << "[" << timeStr << "] " << "获取工艺下的pdf文件" << std::endl;
vector<string> topr;
Split(topRelation, ",", topr);
for (int b = 0; b < topr.size(); b++) {
*logFile << "[" << timeStr << "] " << "获取" << topr[b] << "关系下的pdf数据集" << std::endl;
tag_t* gypdf_tags = NULLTAG;
int gypdf_num = NULL;
ITKCALL(AOM_ask_value_tags(compont, topr[b].c_str(), &gypdf_num, &gypdf_tags));
tag_t gypdf = NULLTAG;
for (int n = 0; n < gypdf_num; n++) {
char* pdftype = "";
char* pdfname = "";
ITKCALL(AOM_ask_value_string(gypdf_tags[n], "object_type", &pdftype));
char* name1 = NULL;
char* name2 = NULL;
if (strcmp(pdftype, "PDF") == 0) {
//获取文件地址
char* fileName = NULL;
ITKCALL(AOM_ask_value_string(gypdf_tags[n], "object_name", &fileName));
char* documType = "PDF_Reference";
printf("开始复制文件到file空间\n");
tag_t ref_object = NULLTAG;
AE_reference_type_t reference_type;
//char ref_name[WSO_name_size_c + 1] = "excel";
*logFile << "[" << timeStr << "] " << "documType" << documType << std::endl;
ITKCALL(AE_ask_dataset_named_ref2(gypdf_tags[n], documType, &reference_type, &ref_object));
if (reference_type == AE_PART_OF)
{
char sendname[SS_MAXPATHLEN] = "";
strcpy(sendname, getenv("TEMP"));
strcat(sendname, "\\");
strcat(sendname, getUniqueTimestamp().c_str());
strcat(sendname, "-");
strcat(sendname, fileName);
*logFile << "[" << timeStr << "] " << "sendname" << sendname << std::endl;
FILE* file = fopen(sendname, "r");
if (file) {
fclose(file); // 关闭文件
remove(sendname); // 删除文件
}
ITKCALL(IMF_export_file(ref_object, sendname));
strcat(cmd, "\" \"");
strcat(cmd, sendname);
}
}
}
}
//获取工序
int count;
tag_t* children_line;
ITKCALL(BOM_line_ask_all_child_lines(top_line, &count, &children_line));
*logFile << "[" << timeStr << "] " << "工序行数: " << count << std::endl;
*logFile << "[" << timeStr << "] " << "开始遍历工艺下的工序对象" << std::endl;
for (int j = 0; j < count; j++) {
tag_t revobj = NULL;
*logFile << "[" << timeStr << "] " << "获取工序的版本对象" << std::endl;
ITKCALL(AOM_ask_value_tag(children_line[j], "bl_line_object", &revobj)); // 获取版本对象
char* childtype;
AOM_ask_value_string(revobj, "object_type", &childtype);
vector<string> childtypes;
Split(itemChildType, ",", childtypes);
*logFile << "[" << timeStr << "] " << "判断子对象类型" << childtype << "是否包含在" << itemChildType << "里面" << std::endl;
if (std::find(childtypes.begin(), childtypes.end(), childtype) != childtypes.end()) {
*logFile << "[" << timeStr << "] " << "存在" << std::endl;
vector<string> real;
Split(relation, ",", real);
for (int b1 = 0; b1 < real.size(); b1++) {
//获取LY6_translatePDF关系下的pdf数据集
*logFile << "[" << timeStr << "] " << "获取" << real[b1] << "关系下的pdf数据集" << std::endl;
tag_t* pdf_tags = NULLTAG;
int pdf_num = NULL;
ITKCALL(AOM_ask_value_tags(revobj, real[b1].c_str(), &pdf_num, &pdf_tags));
tag_t pdf = NULLTAG;
for (int n = 0; n < pdf_num; n++) {
char* pdftype = "";
char* pdfname = "";
ITKCALL(AOM_ask_value_string(pdf_tags[n], "object_type", &pdftype));
char* name1 = NULL;
char* name2 = NULL;
if (strcmp(pdftype, "PDF") == 0) {
//获取文件地址
char* fileName = NULL;
ITKCALL(AOM_ask_value_string(pdf_tags[n], "object_name", &fileName));
char* documType = "PDF_Reference";
printf("开始复制文件到file空间\n");
tag_t ref_object = NULLTAG;
AE_reference_type_t reference_type;
//char ref_name[WSO_name_size_c + 1] = "excel";
*logFile << "[" << timeStr << "] " << "documType" << documType << std::endl;
ITKCALL(AE_ask_dataset_named_ref2(pdf_tags[n], documType, &reference_type, &ref_object));
if (reference_type == AE_PART_OF)
{
char sendname[SS_MAXPATHLEN] = "";
strcpy(sendname, getenv("TEMP"));
strcat(sendname, "\\");
strcat(sendname, getUniqueTimestamp().c_str());
strcat(sendname, "-");
strcat(sendname, fileName);
*logFile << "[" << timeStr << "] " << "sendname" << sendname << std::endl;
FILE* file = fopen(sendname, "r");
if (file) {
fclose(file); // 关闭文件
remove(sendname); // 删除文件
}
ITKCALL(IMF_export_file(ref_object, sendname));
strcat(cmd, "\" \"");
strcat(cmd, sendname);
}
}
}
}
}
}
strcat(cmd, "\"");
*logFile << "[" << timeStr << "] " << "cmd: " << cmd << std::endl;
system(cmd);
//挂载数据集
*logFile << "[" << timeStr << "] " << "查找工艺下LY6_mergePDF关系下是否存在pdf数据集" << std::endl;
tag_t* word_tags = NULLTAG;
int word_num = 0;
char* comName;
ITKCALL(AOM_ask_value_tags(compont, "LY6_mergePDF", &word_num, &word_tags));
ITKCALL(AOM_ask_value_string(compont, "item_id", &comName))
tag_t pdf = NULLTAG;
for (int n = 0; n < word_num; n++) {
char* type = "";
char* pdfname = "";
ITKCALL(AOM_ask_value_string(word_tags[n], "object_type", &type));
ITKCALL(AOM_ask_value_string(word_tags[n], "object_name", &pdfname));
if (strcmp(type, "PDF") == 0 && strcmp(comName, pdfname) == 0) {
pdf = word_tags[n];
break;
}
}
if (pdf == NULLTAG) {
*logFile << "[" << timeStr << "] " << "没有找到PDF数据集开始进行创建" << std::endl;
int rfCount;
tag_t pdfTypeTag = NULLTAG, tool = NULLTAG, relationTag, * rfTags, newrelation;
ITKCALL(AE_find_datasettype2("PDF", &pdfTypeTag));
ITKCALL(AE_create_dataset_with_id(pdfTypeTag, comName, "", "", "A", &pdf));
ITKCALL(AE_ask_datasettype_def_tool(pdfTypeTag, &tool));
AOM_lock(pdf);
ITKCALL(AE_set_dataset_tool(pdf, tool));
ITKCALL(AE_set_dataset_format2(pdf, "PDF_Reference"));
ITKCALL(AOM_save(pdf));
AOM_unlock(pdf);
if (pdf == NULLTAG) {
*logFile << "[" << timeStr << "] " << "创建失败" << std::endl;
}
else {
*logFile << "[" << timeStr << "] " << "创建成功" << std::endl;
ITKCALL(GRM_find_relation_type("LY6_mergePDF", &relationTag));
if (relationTag == NULLTAG) {
}
ITKCALL(GRM_list_secondary_objects_only(compont, relationTag, &rfCount, &rfTags));
ITKCALL(GRM_create_relation(compont, pdf, relationTag, NULLTAG, &newrelation));
ITKCALL(GRM_save_relation(newrelation));
}
}
if (pdf != NULL) {
char namefix[256] = "";
strcpy(namefix, comName);
strcat(namefix, ".pdf");
import_dataset_file_binary(pdf, "/temp/", "PDF_Reference", "pdf", (char*)pdfFilePath.c_str(), namefix);
}
}
else {
printf("no\n");
}
}
return ITK_ok;
}