From 6fe41f783e261fef9bf200ba715f4f41b5766848 Mon Sep 17 00:00:00 2001 From: dragdra Date: Fri, 21 Mar 2025 21:42:09 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=B0=ED=94=BD=20=EB=AC=B8=EC=A0=9C1?= =?UTF-8?q?=EB=B2=88=20=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EC=B1=84=EC=A0=90=EA=B8=B0=EC=A4=80=ED=91=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 250321_DIC_2502A_TEST.xlsx | Bin 22499 -> 19695 bytes DIC_2502A.json | 81 +++ gpdpScoring.js | 523 ++++++++++-------- psdExport_2.js | 12 +- z.xbook | 2 +- .../2502/excel_채점기준표/DIC_2502C.xlsx | Bin 20335 -> 14859 bytes 6 files changed, 376 insertions(+), 242 deletions(-) diff --git a/250321_DIC_2502A_TEST.xlsx b/250321_DIC_2502A_TEST.xlsx index 637ebbf3fe7ed244ed0370e84445056946a12bcd..a6fcf88809ee63f9edf500d3ceec9d57015fcaf2 100644 GIT binary patch delta 1039 zcmZvbOK1~O6oz}Jv}!G6CJ!u9Z4zwAYbG;OGfCS?nrXF!fewKOx^9 z5b!eKfEKXed%%iOqCIHE8Df}tjhH4rCQcJS()_DI9u+|W4~ZV)J7Nd%FYzdGwpy)PkzY1Bm!>c_I|tr;k}$zZ+%X{cm!xKOlss}ZyJw26#~Q4O?XPkHiOGVIBy)y8J(L;;B+R&)wE(IQ(t)~Sw`PK)lxAL delta 2191 zcmZveUuauZ9LIZ4s<^IeldyEHuH!b?ndaZky}3y`mPSt3Ce8nUZQ4|@!k&g3YAy9a zp~dM_6_sBZ_%K2655CyK98MUU_>cLxmklQPGQrs>!$(2U-?_gOdk;5|-{;=%?|070 z?|V*e^6-7-{*JQy&iKH$w}&r&|3puZcn|kLrT92}IsSk(%_|?C+*05|;3%9947!XJ z9V&s*4P(VfYwMY`b~ckftFBJ@%er4(oASTBw(8HM*E7aS+@7zAd z;$E3hq>BWcr;8-KO&2NnJahv5p=0oK$ODCt8~#N;k5t1Rcq`;qYH&HEDs{LKQsE8M z9%Akjq&w_}TVanf2|tBZ{D}XA$6yV$Xv7PbkTv8rQSojTXYOtIIN9f3lWSBsA6owOWFlEqMw96wXmQv3y1XpWMgzUC+>#x zhIN|doi2bL^C?A9qLi#ywg&gy0hGHmYdG<{6VAO zn0}ls&?jnHcxI7?Nj)q%s%=Mg*-_=(n%~9AY!@fDU7YN8aq`>6$#54Z$6cH(ckz68 ze8FOY7ik%J4|s|6xYPkJlP>)%aomWpxQ|r{H4`=r-$>VKd5Q)VH3{_sk(hL?1&x1kervbVC5m5I`>k&jn@S-uI2z?R2(hVL#~u&7mM&_X^Qoi;k(lKqm6|geEkOmv0DQG diff --git a/DIC_2502A.json b/DIC_2502A.json index fcbb4ca..9c0d716 100644 --- a/DIC_2502A.json +++ b/DIC_2502A.json @@ -411,6 +411,87 @@ } }, "4": { + "1": { + "type": "multi", + "ele": "//Document/Width/@value | //Document/Height/@value", + "value": [ + "650", + "350" + ], + "point": 5, + "desc": "캔버스 사이즈 650*350" + }, + "2": { + "ele": "none", + "point": 5, + "desc": "자유 변형 문항은 채점 불가" + }, + "3": { + "type" : "isExist", + "ele": "//Layer/Name/@value", + "value": "Germs", + "point": 5, + "desc": "Germs 레이어가 있는지 여부 체크" + }, + "4": { + "type" : "multiValue", + "ele": "//Layer[Name[@value='Germs']]/Effects/Item/Name/@value | //Layer[Name[@value='Germs']]/Effects/Item/EffectData/amount/@value", + "value" : [ + "12", + "선명하게" + ], + "point": 5, + "desc": "Germs 레이어의 효과 체크" + }, + "5": { + "ele": "none", + "point": 6, + "desc": "올가미 도구/이미지 제거 문항은 채점 불가" + }, + "6": { + "type" : "isExist", + "ele": "//Layer/Effects/Item/Name/@value", + "value" : "세피아", + "point": 6, + "desc": "세피아 효과가 있는지 여부 체크" + }, + "7": { + "type": "exact", + "ele": "//Layer/Shapes/Shape/shape_type/@value", + "value": "ELLIPSE", + "point": 3, + "desc": "레이어 쉐이프 타입이 타원인지 체크" + }, + "8": { + "type": "size", + "posX": "//Layer//op_points[Item]/Item[last()]/X/@value - //Layer//op_points[Item]/Item[1]/X/@value", + "posY": "//Layer//op_points[Item]/Item[last()]/Y/@value - //Layer//op_points[Item]/Item[1]/Y/@value", + "value": { + "width": 130, + "height": 80 + }, + "point": 3, + "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" + }, + "9": { + "type": "color", + "ele": "//Layer//Shape[contains(draw_type/@value, 'Interior')]/secondary_color/@value", + "value": "000555", + "point": 6, + "desc": "색상 코드 비교 시 소문자로 입력할 것" + }, + "10": { + "type" : "multiValue", + "ele": "//Layer/BlendOp/@value | //Layer/Opacity/@value", + "value" : [ + "중첩", + "75" + ], + "point": 5, + "desc": "혼합모드(중첩, 불투명도 : 75) 체크" + } + }, + "5": { "1": { "type": "multi", "ele": "//Document/Width/@value | //Document/Height/@value", diff --git a/gpdpScoring.js b/gpdpScoring.js index 1f5d7f4..17ee7c7 100644 --- a/gpdpScoring.js +++ b/gpdpScoring.js @@ -24,249 +24,300 @@ function parseColorToHex(colorString) { } module.exports = getGpdpScore; +/** + * /Document/Layers/Layer/Shapes/Shape/draw_type 속성값 + * > Interior: 내부 채우기 / Outline: 외곽선 + * /Document/Layers/Layer/Shapes/Shape/interior_type 속성값 + * > Fill: 채우기 / Gradient: 그라데이션 + * @param {*} gpdpData + * @param {*} scoringJson + * @param {*} index + * @returns + */ + + + // xml 형식의 GPDP 파일을 읽어서 점수를 계산 // scoring.json 파일 내에 있는 ele 요소는 xpath 형식으로 접근하여 요소를 탐색하고 나오는 값을 value와 비교하여 점수를 계산 // scoring.json 파일 내에 있는 type은 비교할 값의 타입을 의미하며, boolean, array 등이 있음 // scoring.json 파일 내에 있는 type에 따라 비교하는 방식이 달라짐 // 채점 결과를 scoringResultList 배열에 저장 function getGpdpScore(gpdpData, scoringJson, index) { - const gpdpXmlDoc = gpdpData; - const scoringResult = {}; - - const scoringData = scoringJson[index]; - // console.log(scoringData); - - let totalScore = 0; - - // 채점기준표 문항별 분류 - for (const key in scoringData) { - let ele = scoringData[key].ele; - let ele2 = scoringData[key].ele2; - let existEle = scoringData[key].existEle; - let rightAnswer = scoringData[key].value; - let point = scoringData[key].point; - let type = scoringData[key].type; - let search = scoringData[key].search; - - // search 값이 undefined 아니면 ele의 {search}부분을 search로 치환 - /** - * JSON파일 곰믹스 5번문항/22번 문항 - * type : "subtitle" 인 항목들 - * GPString태그 VID7속성 찾는 xpath구문 - * CRCUnitArr태그 Name속성 찾는 구문으로 변환 - * > 멀티라인 텍스트 유사도 판별하기 어려움 - */ - if (search !== undefined) { - let result = findSimilarString(gpdpXmlDoc, search, 0.8) - // xpath 내부 "(큰따옴표) 필터링 - if (result !== null) { - result = result.replace(/"/g, "'"); - } - ele = ele.replace(/{search}/g, result); - if (existEle !== undefined) { - existEle = existEle.replace(/{search}/g, result); - } + const gpdpXmlDoc = gpdpData; + const scoringResult = {}; + + const scoringData = scoringJson[index]; + // console.log(scoringData); + + let totalScore = 0; + + // 채점기준표 문항별 분류 + for (const key in scoringData) { + let ele = scoringData[key].ele; + let ele2 = scoringData[key].ele2; + let existEle = scoringData[key].existEle; + let rightAnswer = scoringData[key].value; + let point = scoringData[key].point; + let type = scoringData[key].type; + let search = scoringData[key].search; + + if (search !== undefined) { + let result = findSimilarString(gpdpXmlDoc, search, 0.8) + // xpath 내부 "(큰따옴표) 필터링 + if (result !== null) { + result = result.replace(/"/g, "'"); } - console.log(`example number: ${key}`) - if (type == "exact") { - let result = xpath.select(ele, gpdpXmlDoc); - if (result.length == 0) { - scoringResult[key] = 0; - console.log('ele not found'); - continue; - } - if (result[0].value === rightAnswer) { - totalScore += point; - scoringResult[key] = point; - } else { - scoringResult[key] = 0; - console.log('ele not matched, ' + result[0].value); - } - } - else if (type == "color") { - let result = xpath.select(ele, gpdpXmlDoc); - if (result.length == 0) { - scoringResult[key] = 0; - console.log('ele not found'); - continue; - } - const hexColor = parseColorToHex(result[0].value); - - if (hexColor === rightAnswer) { - totalScore += point; - scoringResult[key] = point; - console.log('color matched, ' + hexColor); - } else { - scoringResult[key] = 0; - console.log('color not matched, ' + hexColor); - } - } - else if (type == "multi") { - try { - const result = xpath.select(ele, gpdpXmlDoc); - let isSame = true; - // console.log(`ele: ${ele}, value: ${value} result: ${result}`); - - if (result.length == 0) { - console.log('result length 0'); - scoringResult[key] = 0; - continue; - } - - result.forEach((v, i) => { - // value[i] 값이 정수형인 경우에는 float로 변환하여 비교 - // 정수형 v값을 float 형으로 변환하고 소수점 3자리까지 버림 - let temp = v.value; - let answer = rightAnswer[i]; - - if (Number.isFinite(rightAnswer[i]) && !Number.isInteger(rightAnswer[i])) { - temp = parseFloat(v.value); - answer = parseFloat(rightAnswer[i]); - // 소수점 3자리까지 버림 - temp = Math.floor(temp * 1000) / 1000; - } - // answer 문자열 중 : 가 포함되어 있다면 각각 분리하고 그 값의 차이를 구함 - if (typeof answer == "string" && answer.indexOf(':') > -1) { - const [answerStart, answerEnd] = answer.split(':').map(Number); - const [tempStart, tempEnd] = temp.split(':').map(Number); - answer = answerEnd - answerStart; - temp = tempEnd - tempStart; - } - - console.log(`temp: ${temp} answer: ${answer}`); - if (answer !== temp) { - console.log(`answer !== temp`); - isSame = false; - } - }); - totalScore += isSame ? point : 0; - scoringResult[key] = isSame ? point : 0; - } catch (e) { - console.log('err :', e); - scoringResult[key] = 0; - } - } - else if (type == "size") { - let posX = scoringData[key].posX; - let posY = scoringData[key].posY; - - let answerWidth = rightAnswer["width"]; - let answerHeight = rightAnswer["height"]; - - let width = xpath.select(posX, gpdpXmlDoc); - let height = xpath.select(posY, gpdpXmlDoc); - width = Math.round(width); - height = Math.round(height); - - console.log(`width:${answerWidth},${width}, height: ${answerHeight},${height}`); - if (answerWidth === width && answerHeight === height) { - totalScore += point; - scoringResult[key] = point; - console.log("same size"); - } - else { - scoringResult[key] = 0; - console.log("different size"); - } - } - else if (type == "gradient") { - let startColor = scoringData[key].startColor; - let endColor = scoringData[key].endColor; - - let answerStartColor = rightAnswer["startColor"]; - let answerEndColor = rightAnswer["endColor"]; - - let start = xpath.select(startColor, gpdpXmlDoc); - let end = xpath.select(endColor, gpdpXmlDoc); - - // console.log(start[0].value, end[0].value); - if (start.length == 0 || end.length == 0) { - console.log("gradient color not found"); - scoringResult[key] = 0; - continue; - } - - const startHexColor = parseColorToHex(start[0].value); - const endHexColor = parseColorToHex(end[0].value); - console.log(startHexColor + ":" + answerStartColor, endHexColor + ":" + answerEndColor); - - if (startHexColor === answerStartColor && endHexColor === answerEndColor) { - totalScore += point; - scoringResult[key] = point; - console.log("same color"); - } - else { - scoringResult[key] = 0; - console.log("different color"); - } - } - // 그림자 속성이 있는지 여부 파악해서 그림자 속성 별로 점수 1 점씩 부여 - else if(type == "shadow"){ - - let result = xpath.select(ele["shadow"], gpdpXmlDoc); - let shadowScore = 0; - if (result.length == 0) { - scoringResult[key] = 0; - console.log('shadow not found'); - continue; - } - - shadowScore += 1; - let width = xpath.select(ele["width"], gpdpXmlDoc); - let distance = xpath.select(ele["distance"], gpdpXmlDoc); - let blur = xpath.select(ele["blur"], gpdpXmlDoc); - let angle = xpath.select(ele["angle"], gpdpXmlDoc); - - if(width.length !== 0 && width[0].value == rightAnswer["width"]){ - shadowScore += 1; - console.log('width matched'); - } - if(distance.length !== 0 && distance[0].value == rightAnswer["distance"]){ - shadowScore += 1; - console.log('distance matched'); - } - if(blur.length !== 0 && blur[0].value == rightAnswer["blur"]){ - shadowScore += 1; - console.log('blur matched'); - } - if(angle.length !== 0 && angle[0].value == rightAnswer["angle"]){ - shadowScore += 1; - console.log('angle matched'); - } - totalScore += shadowScore; - scoringResult[key] = shadowScore; - } - else { - let result = xpath.select(ele, gpdpXmlDoc); - let result2 = null; - let isCheck = false; - - if (ele === 'none') { - scoringResult[key] = "확인필요"; - continue; - } - - if (result.length == 0) { - isCheck = true; - } - if (isCheck && ele2) { - result2 = xpath.select(ele2, gpdpXmlDoc); - - if (result2.length == 0) { - scoringResult[key] = 0; - continue; - } - result = result2; - // console.log(`1st isChecked: ${isCheck}, result: ${result}`) - } - // value와 result[0].value를 비교하여 같으면 점수 point 부여 - // console.log(`${(value === result[0].value)}, ${result.length > 0 && value === result[0].value} `) - // console.log(`2nd isChecked: ${isCheck}, result: ${result}`) - totalScore += result.length > 0 ? point : 0; - scoringResult[key] = result.length > 0 ? point : 0; + ele = ele.replace(/{search}/g, result); + if (existEle !== undefined) { + existEle = existEle.replace(/{search}/g, result); } } - scoringResult['총점'] = totalScore; - return scoringResult; + console.log(`example number: ${key}`) + + if (type == "multiValue") { + if (Array.isArray(rightAnswer)) { + const result = ele ? xpath.select(ele, gpdpXmlDoc) : []; + const resultValues = Array.isArray(result) ? result.map(r => (typeof r === 'object' ? r.value : r)) : [result]; + console.log("🚀 ~ getGpdpScore ~ resultValues:", resultValues) + + const groupSize = rightAnswer.length; + const groupedResult = []; + for (let i = 0; i < resultValues.length; i += groupSize) { + groupedResult.push(resultValues.slice(i, i + groupSize)); + } + console.log("🚀 ~ getGpdpScore ~ groupedResult:", groupedResult) + + // 배열 비교 함수 + function arraysEqual(arr1, arr2) { + if (arr1.length !== arr2.length) return false; + return arr1.every((value, index) => value === arr2[index]); + } + + // groupedResult 내부 배열에서 rightAnswer와 일치하는 배열이 있는지 확인 + const isMatch = groupedResult.some(group => arraysEqual(group, rightAnswer)); + + if (isMatch) { + totalScore += point; + scoringResult[key] = point; + console.log("🚀 ~ 정답 포함"); + } else { + scoringResult[key] = 0; + console.log("🚀 ~ 오답"); + } + } + } + else if (type == "isExist" ) { + const result = xpath.select(ele, gpdpXmlDoc); + result.forEach((v, i) => { + if ( v.value === rightAnswer ) { + totalScore += point; + scoringResult[key] = point; + console.log("🚀 ~ result.forEach ~ 정답 일치:", rightAnswer) + return; + } else { + scoringResult[key] = 0; + } + }); + } + + else if (type == "exact") { + let result = xpath.select(ele, gpdpXmlDoc); + if (result.length == 0) { + scoringResult[key] = 0; + console.log('ele not found'); + continue; + } + if (result[0].value === rightAnswer) { + totalScore += point; + scoringResult[key] = point; + } else { + scoringResult[key] = 0; + console.log('ele not matched, ' + result[0].value); + } + } + else if (type == "color") { + let result = xpath.select(ele, gpdpXmlDoc); + if (result.length == 0) { + scoringResult[key] = 0; + console.log('ele not found'); + continue; + } + const hexColor = parseColorToHex(result[0].value); + + if (hexColor === rightAnswer) { + totalScore += point; + scoringResult[key] = point; + console.log('color matched, ' + hexColor); + } else { + scoringResult[key] = 0; + console.log('color not matched, ' + hexColor); + } + } + else if (type == "multi") { + try { + const result = xpath.select(ele, gpdpXmlDoc); + let isSame = true; + // console.log(`ele: ${ele}, value: ${value} result: ${result}`); + + if (result.length == 0) { + console.log('result length 0'); + scoringResult[key] = 0; + continue; + } + + result.forEach((v, i) => { + // value[i] 값이 정수형인 경우에는 float로 변환하여 비교 + // 정수형 v값을 float 형으로 변환하고 소수점 3자리까지 버림 + let temp = v.value; + let answer = rightAnswer[i]; + + if (Number.isFinite(rightAnswer[i]) && !Number.isInteger(rightAnswer[i])) { + temp = parseFloat(v.value); + answer = parseFloat(rightAnswer[i]); + // 소수점 3자리까지 버림 + temp = Math.floor(temp * 1000) / 1000; + } + // answer 문자열 중 : 가 포함되어 있다면 각각 분리하고 그 값의 차이를 구함 + if (typeof answer == "string" && answer.indexOf(':') > -1) { + const [answerStart, answerEnd] = answer.split(':').map(Number); + const [tempStart, tempEnd] = temp.split(':').map(Number); + answer = answerEnd - answerStart; + temp = tempEnd - tempStart; + } + + console.log(`temp: ${temp} answer: ${answer}`); + if (answer !== temp) { + console.log(`answer !== temp`); + isSame = false; + } + }); + totalScore += isSame ? point : 0; + scoringResult[key] = isSame ? point : 0; + } catch (e) { + console.log('err :', e); + scoringResult[key] = 0; + } + } + else if (type == "size") { + let posX = scoringData[key].posX; + let posY = scoringData[key].posY; + + let answerWidth = rightAnswer["width"]; + let answerHeight = rightAnswer["height"]; + + let width = xpath.select(posX, gpdpXmlDoc); + let height = xpath.select(posY, gpdpXmlDoc); + width = Math.round(width); + height = Math.round(height); + + console.log(`width:${answerWidth},${width}, height: ${answerHeight},${height}`); + if (answerWidth === width && answerHeight === height) { + totalScore += point; + scoringResult[key] = point; + console.log("same size"); + } + else { + scoringResult[key] = 0; + console.log("different size"); + } + } + else if (type == "gradient") { + let startColor = scoringData[key].startColor; + let endColor = scoringData[key].endColor; + + let answerStartColor = rightAnswer["startColor"]; + let answerEndColor = rightAnswer["endColor"]; + + let start = xpath.select(startColor, gpdpXmlDoc); + let end = xpath.select(endColor, gpdpXmlDoc); + + // console.log(start[0].value, end[0].value); + if (start.length == 0 || end.length == 0) { + console.log("gradient color not found"); + scoringResult[key] = 0; + continue; + } + + const startHexColor = parseColorToHex(start[0].value); + const endHexColor = parseColorToHex(end[0].value); + console.log(startHexColor + ":" + answerStartColor, endHexColor + ":" + answerEndColor); + + if (startHexColor === answerStartColor && endHexColor === answerEndColor) { + totalScore += point; + scoringResult[key] = point; + console.log("same color"); + } + else { + scoringResult[key] = 0; + console.log("different color"); + } + } + // 그림자 속성이 있는지 여부 파악해서 그림자 속성 별로 점수 1 점씩 부여 + else if (type == "shadow") { + + let result = xpath.select(ele["shadow"], gpdpXmlDoc); + let shadowScore = 0; + if (result.length == 0) { + scoringResult[key] = 0; + console.log('shadow not found'); + continue; + } + + shadowScore += 1; + let width = xpath.select(ele["width"], gpdpXmlDoc); + let distance = xpath.select(ele["distance"], gpdpXmlDoc); + let blur = xpath.select(ele["blur"], gpdpXmlDoc); + let angle = xpath.select(ele["angle"], gpdpXmlDoc); + + if (width.length !== 0 && width[0].value == rightAnswer["width"]) { + shadowScore += 1; + console.log('width matched'); + } + if (distance.length !== 0 && distance[0].value == rightAnswer["distance"]) { + shadowScore += 1; + console.log('distance matched'); + } + if (blur.length !== 0 && blur[0].value == rightAnswer["blur"]) { + shadowScore += 1; + console.log('blur matched'); + } + if (angle.length !== 0 && angle[0].value == rightAnswer["angle"]) { + shadowScore += 1; + console.log('angle matched'); + } + totalScore += shadowScore; + scoringResult[key] = shadowScore; + } + else { + let result = xpath.select(ele, gpdpXmlDoc); + let result2 = null; + let isCheck = false; + + if (ele === 'none') { + scoringResult[key] = "확인필요"; + continue; + } + + if (result.length == 0) { + isCheck = true; + } + if (isCheck && ele2) { + result2 = xpath.select(ele2, gpdpXmlDoc); + + if (result2.length == 0) { + scoringResult[key] = 0; + continue; + } + result = result2; + // console.log(`1st isChecked: ${isCheck}, result: ${result}`) + } + // value와 result[0].value를 비교하여 같으면 점수 point 부여 + // console.log(`${(value === result[0].value)}, ${result.length > 0 && value === result[0].value} `) + // console.log(`2nd isChecked: ${isCheck}, result: ${result}`) + totalScore += result.length > 0 ? point : 0; + scoringResult[key] = result.length > 0 ? point : 0; + } } - \ No newline at end of file + scoringResult['총점'] = totalScore; + return scoringResult; +} diff --git a/psdExport_2.js b/psdExport_2.js index 75bf232..c6e501d 100644 --- a/psdExport_2.js +++ b/psdExport_2.js @@ -102,7 +102,7 @@ studentDirs.forEach(student => { const xmlDocument = new DOMParser().parseFromString(xmlString, 'application/xml'); // console.log('xmlDocument:', xmlDocument); - scoringResult[index + 1] = getGpdpScore(xmlDocument, scoringJson, index + 3); + scoringResult[index + 1] = getGpdpScore(xmlDocument, scoringJson, index + 4); }); gmepFile.forEach((gmep, index) => { const gmepPath = path.join('./', studentDir, gmep); @@ -260,9 +260,9 @@ function getGmepScore(gmepData, scoringJson, index) { } } - console.log("🚀 ~ getGmepScore ~ ele:", ele) - console.log("🚀 ~ getGmepScore ~ ele2:", ele2) - console.log("🚀 ~ getGmepScore ~ ele3:", ele3) + // console.log("🚀 ~ getGmepScore ~ ele:", ele) + // console.log("🚀 ~ getGmepScore ~ ele2:", ele2) + // console.log("🚀 ~ getGmepScore ~ ele3:", ele3) // xpath if (ele === 'none') { @@ -525,7 +525,9 @@ function getGmepScore(gmepData, scoringJson, index) { } else if (arr2.length > 1) { for (let i = 0; i < arr1.length; i++) { - if (Math.abs(arr1[i] - arr2[i]) > 0.1) return false; + // 좌표값 범위 비교 + const errorRange = 0.1; + if (Math.abs(arr1[i] - arr2[i]) > errorRange) return false; } return true; } diff --git a/z.xbook b/z.xbook index 8f91250..6528a7b 100644 --- a/z.xbook +++ b/z.xbook @@ -1 +1 @@ -[{"kind":2,"language":"xpath","value":"//CROwneUnit[position() = (//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = 170]/@ClipIndex) + 1]/CRCUnitArr/@VID600 | //CROwneUnit[position() = (//CRTrackList[@Name='텍스트']/CRTrackClip[sum(preceding-sibling::CRTrackClip/@Length) = 170]/@ClipIndex) + 1]/CRCUnitArr/@VID601"},{"kind":2,"language":"xpath","value":"//CRCUnitArr[@Name='대룡산의 아름다움']/@*[name()='VID600' or name()='VID601']"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='나무기차']]/preceding-sibling::CROwneUnit)]/preceding-sibling::CRTrackClip/@Length)"},{"kind":2,"language":"xpath","value":"//CROwneUnit[CRCUnitArr[@Name='나무 기차']]"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][{subtitleOrder}]/preceding-sibling::CRTrackClip/@Length)\r\nsum(//CRTrackList[@Name='텍스트']/CRTrackClip[]/preceding-sibling::CRTrackClip/@Length)"},{"kind":2,"language":"xpath","value":"count(//CROwneUnit[CRCUnitArr[@Name='나무 기차']]/preceding-sibling::CROwneUnit)"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=count(//CROwneUnit[CRCUnitArr[@Name='나무 기차']]/preceding-sibling::CROwneUnit)]"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[@ClipIndex=1]"},{"kind":2,"language":"xpath","value":"sum(//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex=0]/preceding-sibling::CRTrackClip/@Length)"},{"kind":2,"language":"xpath","value":"//CRTrackList[@Name='텍스트']/CRTrackClip[not(@ClipIndex='-1')][@ClipIndex=1]/@Length"}] \ No newline at end of file +[{"kind":2,"language":"xpath","value":"//Layer/Name/@value = 'Germs'"},{"kind":2,"language":"xpath","value":"//Layer[Name[@value='Germs']]/Effects/Item[Name[@value='선명하게'] and EffectData[amount[@value=\"12\"]]]"},{"kind":2,"language":"xpath","value":"//Layer[Name[@value='Germs']]/Effects/Item/(Name/@value | EffectData/amount/@value)"},{"kind":2,"language":"xpath","value":"//CRCUnitArr[@Name='{search}']//GCUnitPool/GCUnit[@Type='2']/@*[name()='VID100' or name()='VID101']"},{"kind":2,"language":"xpath","value":"//Layer//op_points[Item]/Item[last()]/X/@value"},{"kind":2,"language":"xpath","value":"//Layer//op_points[Item]/Item[1]/X/@value"},{"kind":2,"language":"xpath","value":"//Layer//Shape[contains(draw_type/@value, 'Interior')]/secondary_color/@value"},{"kind":2,"language":"xpath","value":"//Layer//Shape[contains(draw_type/@value, 'Interior')]/secondary_color/@value"},{"kind":2,"language":"xpath","value":"//Layer/BlendOp/@value | //Layer/Opacity/@value"}] \ No newline at end of file diff --git a/회차별채점자료/2502/excel_채점기준표/DIC_2502C.xlsx b/회차별채점자료/2502/excel_채점기준표/DIC_2502C.xlsx index 17b87173089b0bf7f232ab4a7cab4598d1764431..9f06dde03521e4b496c278def5bea4fca5cca923 100644 GIT binary patch literal 14859 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 CE+-`b literal 20335 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