Created
December 14, 2025 15:19
-
-
Save ProjectEli/1ed5647e3c3527fc42588e18e07d0727 to your computer and use it in GitHub Desktop.
Adobe illustrator quantize journal quality graph from Origin Pro
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Origin Graph Fixer for Illustrator (Combined) | |
| // 1. 클리핑 마스크 자동 해제 | |
| // 2. 투명한 유령 박스 자동 삭제 | |
| // 3. 선 두께를 0.25pt 단위로 양자화 (Quantize Stroke) | |
| // 4. 글자 크기를 지정된 목록 중 가장 가까운 값으로 매핑 (Snap Font Size) | |
| /* | |
| ============================================================================ | |
| [스크립트 설치 및 단축키(액션) 설정 가이드] | |
| 1. 파일 저장 (스크립트 폴더로 이동) | |
| 이 파일을 아래 경로에 'FixOriginGraph.jsx' 이름으로 저장 또는 이동합니다. | |
| (폴더 이동 시 관리자 권한이 필요할 수 있습니다.) | |
| - Windows: C:\Program Files\Adobe\Adobe Illustrator [버전]\Presets\ko_KR\스크립트 | |
| - Mac: /Applications/Adobe Illustrator [버전]/Presets/ko_KR/Scripts | |
| 2. 일러스트레이터 재시작 | |
| 파일을 넣은 후 반드시 일러스트레이터를 껐다가 다시 켜야 메뉴에 인식됩니다. | |
| (확인: 상단 메뉴 [파일] > [스크립트] 목록에 'FixOriginGraph'가 보여야 함) | |
| 3. 액션(Action)에 단축키 등록하기 (★중요: 녹화 버튼 사용 X) | |
| 녹화 버튼을 누르면 인식이 안 될 수 있으므로 '메뉴 항목 삽입' 기능을 사용합니다. | |
| A. [창] > [액션] 패널을 엽니다. | |
| B. 새 액션을 만들고 단축키(예: F2)를 설정합니다. (이때 '기록' 버튼 누르지 마세요!) | |
| C. 액션 패널 우측 상단 햄버거 메뉴(≡) 클릭 > [메뉴 항목 삽입...] 선택. | |
| D. 검색창에 스크립트 이름 'FixOriginGraph'를 정확히 입력하고 [찾기] -> [확인]. | |
| E. 액션 이름 아래에 해당 명령이 추가되었는지 확인합니다. | |
| 4. 사용 방법 | |
| A. Origin에서 복사한 그래프를 선택 도구(V)로 '선택'합니다. (선택 안 하면 작동 안 함!) | |
| B. 등록한 단축키(F2)를 누릅니다. | |
| C. 선 두께와 글자 크기가 규격대로 자동 변환됩니다. | |
| ============================================================================ | |
| */ | |
| // ★ 설정 영역 ★ | |
| var strokeStep = 0.25; // 선 두께 단위 (pt) | |
| var targetFontSizes = [4.55, 7, 7.8]; // 글자 크기 목록 (pt) | |
| // 메인 로직 | |
| var doc = app.activeDocument; | |
| var sel = doc.selection; | |
| // 삭제된 항목 카운터 | |
| var removedCount = 0; | |
| if (sel.length > 0) { | |
| for (var i = sel.length - 1; i >= 0; i--) { | |
| processItem(sel[i]); | |
| } | |
| // (선택사항) 완료 메시지 필요 시 주석 해제 | |
| // alert("정리 완료! (삭제된 유령 박스: " + removedCount + "개)"); | |
| } else { | |
| alert("정리할 그래프를 먼저 '선택'해주세요."); | |
| } | |
| // 재귀적 처리 함수 | |
| function processItem(item) { | |
| // ----------------------------------------------------- | |
| // Case 1: 그룹 (Group) - 마스크 해제 및 파고들기 | |
| // ----------------------------------------------------- | |
| if (item.typename == "GroupItem") { | |
| // 1. 클리핑 마스크 해제 (Release Mask) | |
| if (item.clipped) { | |
| item.clipped = false; | |
| } | |
| // 2. 내부 아이템 순회 (삭제를 위해 뒤에서부터 반복) | |
| for (var j = item.pageItems.length - 1; j >= 0; j--) { | |
| processItem(item.pageItems[j]); | |
| } | |
| } | |
| // ----------------------------------------------------- | |
| // Case 2: 선/도형 (Path) - 유령 박스 삭제 & 두께 보정 | |
| // ----------------------------------------------------- | |
| else if (item.typename == "PathItem" || item.typename == "CompoundPathItem") { | |
| // [유령 박스 삭제 로직] | |
| // 색상도 없고(No Fill), 선도 없는(No Stroke) 투명 박스면 삭제 | |
| if (!item.filled && !item.stroked) { | |
| item.remove(); | |
| removedCount++; | |
| return; // 삭제했으니 처리 중단 | |
| } | |
| // [선 두께 보정 로직] | |
| if (item.stroked) { | |
| var oldWeight = item.strokeWidth; | |
| var newWeight = Math.round(oldWeight / strokeStep) * strokeStep; | |
| if (newWeight < strokeStep) newWeight = strokeStep; | |
| item.strokeWidth = newWeight; | |
| } | |
| } | |
| // ----------------------------------------------------- | |
| // Case 3: 텍스트 (Text) - 크기 보정 | |
| // ----------------------------------------------------- | |
| else if (item.typename == "TextFrame") { | |
| // 간혹 텍스트가 마스크로 쓰이는 경우가 있어 체크 | |
| if (item.typename == "GroupItem" && item.clipped) item.clipped = false; | |
| try { | |
| var currentSize = item.textRange.characterAttributes.size; | |
| var newSize = findClosest(currentSize, targetFontSizes); | |
| item.textRange.characterAttributes.size = newSize; | |
| } catch(e) { | |
| // 빈 텍스트 프레임 등 오류 무시 | |
| } | |
| } | |
| } | |
| // 근사값 찾기 헬퍼 함수 | |
| function findClosest(num, arr) { | |
| var curr = arr[0]; | |
| var diff = Math.abs(num - curr); | |
| for (var val = 0; val < arr.length; val++) { | |
| var newdiff = Math.abs(num - arr[val]); | |
| if (newdiff < diff) { | |
| diff = newdiff; | |
| curr = arr[val]; | |
| } | |
| } | |
| return curr; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment