Skip to content

Instantly share code, notes, and snippets.

@ProjectEli
Created December 14, 2025 15:19
Show Gist options
  • Select an option

  • Save ProjectEli/1ed5647e3c3527fc42588e18e07d0727 to your computer and use it in GitHub Desktop.

Select an option

Save ProjectEli/1ed5647e3c3527fc42588e18e07d0727 to your computer and use it in GitHub Desktop.
Adobe illustrator quantize journal quality graph from Origin Pro
// 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