채점기준표 곰픽항목 추가

This commit is contained in:
2025-03-20 17:13:54 +09:00
parent d97d1b2534
commit 77906aff1d
18 changed files with 2727 additions and 199 deletions

View File

@@ -12,11 +12,10 @@ const getToday = require('./getToday.js');
const todayDate = getToday();
// --------------------------------------------------------
// const scoringJson = require('./DIC_2502A.json');
const scoringJson = require('./DIC_2502A.json');
// const scoringJson = require('./DIC_2502B.json');
// const scoringJson = require('./DIC_2502C.json');
// const scoringJson = require('./DIC_2502D.json');
const scoringJson = require('./samples/DIC(gompic).json');
// TEST
// const scoringJson = require('./DIC_2502A_TEST.json');
@@ -28,9 +27,9 @@ const scoringJson = require('./samples/DIC(gompic).json');
// const answerFilesDir = './output/B/DIC';
// const answerFilesDir = './output/C/DIC';
// const answerFilesDir = './output/D/DIC';
const answerFilesDir = './samples/';
// TEST
// const answerFilesDir = './output/A/TEST';
const answerFilesDir = './output/A/TEST';
// const answerFilesDir = './output/B/TEST';
// const answerFilesDir = './output/C/TEST';
// const answerFilesDir = './output/D/TEST';
@@ -38,15 +37,14 @@ const answerFilesDir = './samples/';
// --------------------------------------------------------
// const outputExcelFile = './'+todayDate+'_DIC_2502A_채점결과.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502B_채점결과.xlsx';
// const outputExcelFile = './' + todayDate + '_DIC_2502C_채점결과.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502C_채점결과.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502D_채점결과.xlsx';
// TEST
// const outputExcelFile = './'+todayDate+'_DIC_2502A_TEST.xlsx';
const outputExcelFile = './'+todayDate+'_DIC_2502A_TEST.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502B_TEST.xlsx';
// const outputExcelFile = './' + todayDate + '_DIC_2502C_TEST.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502C_TEST.xlsx';
// const outputExcelFile = './'+todayDate+'_DIC_2502D_TEST.xlsx';
const outputExcelFile = './'+todayDate+'_gompic.xlsx';
// --------------------------------------------------------
@@ -73,7 +71,7 @@ studentDirs.forEach(student => {
);
// 곰픽 파일 gpdp 파일 이거나 xml 파일
const gpdpFile = fs.readdirSync(studentDir).filter(
const gpdpFiles = fs.readdirSync(studentDir).filter(
file => file.endsWith('.xml')
);
@@ -95,8 +93,8 @@ studentDirs.forEach(student => {
console.error(`Error reading PSD file: ${psdPath}`, error);
}
});
gpdpFile.forEach((gpdp, index) => {
const gpdpPath = path.join('./', studentDir, gpdp);
gpdpFiles.forEach((gpdpFile, index) => {
const gpdpPath = path.join('./', studentDir, gpdpFile);
console.log(`Reading ${gpdpPath}...`);
const xmlString = fs.readFileSync(gpdpPath, 'utf8');
@@ -128,8 +126,6 @@ const flattenedData = scoringResultList.map(student => {
// excel에 표시하지 않을 key값들
const exceptKeys = [
"0", // 학생 이름 항상 제외
"1", // 1번 PSD 파일 채점 결과
"2", // 2번 PSD 파일 채점 결과
]
const exceptSubkeys = [
"videoStartTime",
@@ -461,7 +457,7 @@ function getGmepScore(gmepData, scoringJson, index) {
const result3 = ele3 ? xpath.select(ele3, gmepXmlDoc) : [];
// 결과값이 배열이 아닌 경우 배열로 변환
// 예시) (2-9)는 xpath를 통해 클립(자막) 시작시간(number자료형)을 반환받으므로 배열로 변환하여 비교
// 예시) (2-9)는 xpath를 통해 클립(자막) 시작시간(number숫자자료형)을 반환받으므로 배열로 변환하여 비교
const resultValues = Array.isArray(result) ?
result.map(r => (typeof r === 'object' ? r.value : r)) : [result];
const resultValues2 = Array.isArray(result2) ?
@@ -473,16 +469,16 @@ function getGmepScore(gmepData, scoringJson, index) {
const allResults = [...[resultValues], ...[resultValues2], ...[resultValues3]];
console.log("🚀 ~ allResults:", allResults)
// 정답(rightAnswer)의 값이 단일값이 아닐 경우 값 비교를 위해 단일 배열로 변환
// (2-11) 자막의 위치 좌표값 비교를 위해 [x, y] 값을 가져오므로 배열로 변환하여 비교
// 정답(rightAnswer)의 값이 단일값이 아닐 경우 값 비교를 위해 배열로 변환
// 예시) (2-11) 자막의 위치 좌표값 비교를 위해 [x, y] 값을 가져오므로 배열로 변환하여 비교
const rightAnswerArray = Array.isArray(rightAnswer) ? rightAnswer : [rightAnswer];
// 결과값이 범위값인 경우 소수점 3자리까지 비교
const formattedResults = allResults.map(result => {
// result의 길이가 1이상인 조건은 result값이 [x, y] 좌표값인 경우를 말한다
// result의 길이가 1이상인 조건은 result값이 [x, y](좌표값, 두개 이상의 값)인 경우를 말한다
if (Array.isArray(result) && result.length > 1) {
return result.map(r => {
// xml파일에 저장된 곰믹스 좌표값 소수점 3자리 아래 버리는 형식이므로
// xml파일에 저장된 곰믹스 좌표값 소수점 3자리 아래 버리는 형식이므로
// 동일하게 결과값 소수점 3자리 아래 버린 후 반환
const parsedValue = parseFloat(r);
if (parsedValue >= 0 && parsedValue < 1) {
@@ -525,71 +521,6 @@ function getGmepScore(gmepData, scoringJson, index) {
scoringResult[key] = 0;
}
}
// else if (type == "video" || type == "opening") {
// const result = ele && xpath.select(ele, gmepXmlDoc);
// const result2 = ele2 && xpath.select(ele2, gmepXmlDoc);
// const result3 = ele3 && xpath.select(ele3, gmepXmlDoc);
// /**
// * 1. result가 배열이 아닌 경우 배열로 변환
// * (2-9)는 xpath구문을 통해 클립(자막) 시작시간(number자료형)을 반환받으므로 배열로 변환하여 비교
// * 2. result가 배열이고 배열의 요소가 객체인 경우 value값만 추출하여 배열로 변환
// * 3. result가 배열이고 배열의 요소가 객체가 아닌 문자열이나 숫자일 경우 그대로 배열로 변환
// */
// const resultValues = Array.isArray(result) ? result.map(r => (typeof r === 'object' ? r.value : r)) : [result];
// const resultValues2 = Array.isArray(result2) ? result2.map(r => (typeof r === 'object' ? r.value : r)) : [result2];
// const resultValues3 = Array.isArray(result3) ? result3.map(r => (typeof r === 'object' ? r.value : r)) : [result3];
// /**
// * 정답과 일치하는 답안이 있는지 비교를 위해 배열로 변환
// * 정답 rightAnswer의 값이 2개 이상인 경우 배열로 변환하여 비교
// */
// let allResults = [...[resultValues], ...[resultValues2], ...[resultValues3]];
// console.log("🚀 ~ getGmepScore ~ allResults:", allResults)
// // allResults.forEach((result, i) => {
// // if (result.length > 1) {
// // result.forEach((r, j) => {
// // if (Math.abs(r - rightAnswer[j]) <= 0.1) {
// // true;
// // } else {
// // scoringResult[key] = 0;
// // }
// // });
// // });
// // (2-11) 자막의 위치 좌표값 비교시 소수점 3자리까지 비교
// // rightAnswer값이 배열일 경우
// const rightAnswerArray = Array.isArray(rightAnswer) ? rightAnswer : [rightAnswer];
// console.log("🚀 ~ getGmepScore ~ rightAnswerArray:", rightAnswerArray);
// // 결과값이 범위값인 경우 소수점 3자리까지 비교
// allResults = allResults.map(result => {
// if (result.length > 1) {
// return result.map(r => {
// if (typeof r === 'string') {
// return parseFloat(r).toFixed(3);
// }
// return r;
// });
// }
// });
// console.log("🚀 ~ //allResults.forEach ~ allResults:", allResults)
// const isIncluded = allResults.some(arr =>
// arr.length === rightAnswerArray.length && arr.every((val, index) => val === rightAnswerArray[index])
// );
// if (isIncluded) {
// console.log("🚀 ~ getGmepScore ~ 정답:", rightAnswerArray);
// totalScore += point;
// scoringResult[key] = point;
// }
// else {
// console.log("🚀 ~ getGmepScore ~ 오답:");
// scoringResult[key] = 0;
// }
// }
else {
try {
console.log('Unknown type:', ele);