illustrator-mcp-server 1.2.4 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +527 -107
- package/README.md +512 -89
- package/dist/executor/jsx-runner.d.ts +1 -0
- package/dist/executor/jsx-runner.d.ts.map +1 -1
- package/dist/executor/jsx-runner.js +33 -19
- package/dist/executor/jsx-runner.js.map +1 -1
- package/dist/jsx/helpers/common.jsx +192 -7
- package/dist/prompts/print-preflight-workflow.d.ts +3 -0
- package/dist/prompts/print-preflight-workflow.d.ts.map +1 -0
- package/dist/prompts/print-preflight-workflow.js +45 -0
- package/dist/prompts/print-preflight-workflow.js.map +1 -0
- package/dist/prompts/quick-layout.d.ts +3 -0
- package/dist/prompts/quick-layout.d.ts.map +1 -0
- package/dist/prompts/quick-layout.js +42 -0
- package/dist/prompts/quick-layout.js.map +1 -0
- package/dist/prompts/registry.d.ts +3 -0
- package/dist/prompts/registry.d.ts.map +1 -0
- package/dist/prompts/registry.js +7 -0
- package/dist/prompts/registry.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/export/export-pdf.d.ts.map +1 -1
- package/dist/tools/export/export-pdf.js +48 -18
- package/dist/tools/export/export-pdf.js.map +1 -1
- package/dist/tools/export/export.d.ts.map +1 -1
- package/dist/tools/export/export.js +41 -49
- package/dist/tools/export/export.js.map +1 -1
- package/dist/tools/modify/align-objects.d.ts +3 -0
- package/dist/tools/modify/align-objects.d.ts.map +1 -0
- package/dist/tools/modify/align-objects.js +202 -0
- package/dist/tools/modify/align-objects.js.map +1 -0
- package/dist/tools/modify/apply-color-profile.d.ts.map +1 -1
- package/dist/tools/modify/apply-color-profile.js +16 -11
- package/dist/tools/modify/apply-color-profile.js.map +1 -1
- package/dist/tools/modify/apply-graphic-style.d.ts +3 -0
- package/dist/tools/modify/apply-graphic-style.d.ts.map +1 -0
- package/dist/tools/modify/apply-graphic-style.js +106 -0
- package/dist/tools/modify/apply-graphic-style.js.map +1 -0
- package/dist/tools/modify/apply-text-style.d.ts +3 -0
- package/dist/tools/modify/apply-text-style.d.ts.map +1 -0
- package/dist/tools/modify/apply-text-style.js +118 -0
- package/dist/tools/modify/apply-text-style.js.map +1 -0
- package/dist/tools/modify/close-document.d.ts.map +1 -1
- package/dist/tools/modify/close-document.js +9 -9
- package/dist/tools/modify/close-document.js.map +1 -1
- package/dist/tools/modify/convert-to-outlines.d.ts.map +1 -1
- package/dist/tools/modify/convert-to-outlines.js +8 -30
- package/dist/tools/modify/convert-to-outlines.js.map +1 -1
- package/dist/tools/modify/create-document.d.ts.map +1 -1
- package/dist/tools/modify/create-document.js +8 -6
- package/dist/tools/modify/create-document.js.map +1 -1
- package/dist/tools/modify/create-ellipse.d.ts.map +1 -1
- package/dist/tools/modify/create-ellipse.js +16 -33
- package/dist/tools/modify/create-ellipse.js.map +1 -1
- package/dist/tools/modify/create-gradient.d.ts +3 -0
- package/dist/tools/modify/create-gradient.d.ts.map +1 -0
- package/dist/tools/modify/create-gradient.js +119 -0
- package/dist/tools/modify/create-gradient.js.map +1 -0
- package/dist/tools/modify/create-line.d.ts.map +1 -1
- package/dist/tools/modify/create-line.js +17 -37
- package/dist/tools/modify/create-line.js.map +1 -1
- package/dist/tools/modify/create-path-text.d.ts +3 -0
- package/dist/tools/modify/create-path-text.d.ts.map +1 -0
- package/dist/tools/modify/create-path-text.js +85 -0
- package/dist/tools/modify/create-path-text.js.map +1 -0
- package/dist/tools/modify/create-path.d.ts.map +1 -1
- package/dist/tools/modify/create-path.js +19 -39
- package/dist/tools/modify/create-path.js.map +1 -1
- package/dist/tools/modify/create-rectangle.d.ts.map +1 -1
- package/dist/tools/modify/create-rectangle.js +17 -33
- package/dist/tools/modify/create-rectangle.js.map +1 -1
- package/dist/tools/modify/create-text-frame.d.ts.map +1 -1
- package/dist/tools/modify/create-text-frame.js +28 -41
- package/dist/tools/modify/create-text-frame.js.map +1 -1
- package/dist/tools/modify/duplicate-objects.d.ts +3 -0
- package/dist/tools/modify/duplicate-objects.d.ts.map +1 -0
- package/dist/tools/modify/duplicate-objects.js +97 -0
- package/dist/tools/modify/duplicate-objects.js.map +1 -0
- package/dist/tools/modify/group-objects.d.ts +3 -0
- package/dist/tools/modify/group-objects.d.ts.map +1 -0
- package/dist/tools/modify/group-objects.js +80 -0
- package/dist/tools/modify/group-objects.js.map +1 -0
- package/dist/tools/modify/manage-artboards.d.ts +3 -0
- package/dist/tools/modify/manage-artboards.d.ts.map +1 -0
- package/dist/tools/modify/manage-artboards.js +152 -0
- package/dist/tools/modify/manage-artboards.js.map +1 -0
- package/dist/tools/modify/manage-datasets.d.ts +3 -0
- package/dist/tools/modify/manage-datasets.d.ts.map +1 -0
- package/dist/tools/modify/manage-datasets.js +345 -0
- package/dist/tools/modify/manage-datasets.js.map +1 -0
- package/dist/tools/modify/manage-layers.d.ts +3 -0
- package/dist/tools/modify/manage-layers.d.ts.map +1 -0
- package/dist/tools/modify/manage-layers.js +147 -0
- package/dist/tools/modify/manage-layers.js.map +1 -0
- package/dist/tools/modify/manage-linked-images.d.ts +3 -0
- package/dist/tools/modify/manage-linked-images.d.ts.map +1 -0
- package/dist/tools/modify/manage-linked-images.js +105 -0
- package/dist/tools/modify/manage-linked-images.js.map +1 -0
- package/dist/tools/modify/manage-swatches.d.ts +3 -0
- package/dist/tools/modify/manage-swatches.d.ts.map +1 -0
- package/dist/tools/modify/manage-swatches.js +78 -0
- package/dist/tools/modify/manage-swatches.js.map +1 -0
- package/dist/tools/modify/modify-object.d.ts.map +1 -1
- package/dist/tools/modify/modify-object.js +34 -49
- package/dist/tools/modify/modify-object.js.map +1 -1
- package/dist/tools/modify/move-to-layer.d.ts +3 -0
- package/dist/tools/modify/move-to-layer.d.ts.map +1 -0
- package/dist/tools/modify/move-to-layer.js +79 -0
- package/dist/tools/modify/move-to-layer.js.map +1 -0
- package/dist/tools/modify/open-document.d.ts +3 -0
- package/dist/tools/modify/open-document.d.ts.map +1 -0
- package/dist/tools/modify/open-document.js +74 -0
- package/dist/tools/modify/open-document.js.map +1 -0
- package/dist/tools/modify/place-color-chips.d.ts +3 -0
- package/dist/tools/modify/place-color-chips.d.ts.map +1 -0
- package/dist/tools/modify/place-color-chips.js +224 -0
- package/dist/tools/modify/place-color-chips.js.map +1 -0
- package/dist/tools/modify/place-image.d.ts.map +1 -1
- package/dist/tools/modify/place-image.js +28 -36
- package/dist/tools/modify/place-image.js.map +1 -1
- package/dist/tools/modify/place-style-guide.d.ts +3 -0
- package/dist/tools/modify/place-style-guide.d.ts.map +1 -0
- package/dist/tools/modify/place-style-guide.js +822 -0
- package/dist/tools/modify/place-style-guide.js.map +1 -0
- package/dist/tools/modify/place-symbol.d.ts +3 -0
- package/dist/tools/modify/place-symbol.d.ts.map +1 -0
- package/dist/tools/modify/place-symbol.js +96 -0
- package/dist/tools/modify/place-symbol.js.map +1 -0
- package/dist/tools/modify/replace-color.d.ts +3 -0
- package/dist/tools/modify/replace-color.d.ts.map +1 -0
- package/dist/tools/modify/replace-color.js +137 -0
- package/dist/tools/modify/replace-color.js.map +1 -0
- package/dist/tools/modify/resize-for-variation.d.ts +3 -0
- package/dist/tools/modify/resize-for-variation.d.ts.map +1 -0
- package/dist/tools/modify/resize-for-variation.js +177 -0
- package/dist/tools/modify/resize-for-variation.js.map +1 -0
- package/dist/tools/modify/save-document.d.ts +3 -0
- package/dist/tools/modify/save-document.d.ts.map +1 -0
- package/dist/tools/modify/save-document.js +63 -0
- package/dist/tools/modify/save-document.js.map +1 -0
- package/dist/tools/modify/select-objects.d.ts +3 -0
- package/dist/tools/modify/select-objects.d.ts.map +1 -0
- package/dist/tools/modify/select-objects.js +78 -0
- package/dist/tools/modify/select-objects.js.map +1 -0
- package/dist/tools/modify/set-z-order.d.ts +3 -0
- package/dist/tools/modify/set-z-order.d.ts.map +1 -0
- package/dist/tools/modify/set-z-order.js +61 -0
- package/dist/tools/modify/set-z-order.js.map +1 -0
- package/dist/tools/modify/shared.d.ts +49 -1
- package/dist/tools/modify/shared.d.ts.map +1 -1
- package/dist/tools/modify/shared.js +48 -4
- package/dist/tools/modify/shared.js.map +1 -1
- package/dist/tools/modify/undo.d.ts +3 -0
- package/dist/tools/modify/undo.d.ts.map +1 -0
- package/dist/tools/modify/undo.js +64 -0
- package/dist/tools/modify/undo.js.map +1 -0
- package/dist/tools/modify/ungroup-objects.d.ts +3 -0
- package/dist/tools/modify/ungroup-objects.d.ts.map +1 -0
- package/dist/tools/modify/ungroup-objects.js +72 -0
- package/dist/tools/modify/ungroup-objects.js.map +1 -0
- package/dist/tools/read/check-contrast.d.ts +3 -0
- package/dist/tools/read/check-contrast.d.ts.map +1 -0
- package/dist/tools/read/check-contrast.js +239 -0
- package/dist/tools/read/check-contrast.js.map +1 -0
- package/dist/tools/read/convert-coordinate.d.ts +3 -0
- package/dist/tools/read/convert-coordinate.d.ts.map +1 -0
- package/dist/tools/read/convert-coordinate.js +74 -0
- package/dist/tools/read/convert-coordinate.js.map +1 -0
- package/dist/tools/read/extract-design-tokens.d.ts +3 -0
- package/dist/tools/read/extract-design-tokens.d.ts.map +1 -0
- package/dist/tools/read/extract-design-tokens.js +280 -0
- package/dist/tools/read/extract-design-tokens.js.map +1 -0
- package/dist/tools/read/find-objects.d.ts.map +1 -1
- package/dist/tools/read/find-objects.js +16 -37
- package/dist/tools/read/find-objects.js.map +1 -1
- package/dist/tools/read/get-artboards.d.ts.map +1 -1
- package/dist/tools/read/get-artboards.js +15 -13
- package/dist/tools/read/get-artboards.js.map +1 -1
- package/dist/tools/read/get-colors.d.ts.map +1 -1
- package/dist/tools/read/get-colors.js +93 -15
- package/dist/tools/read/get-colors.js.map +1 -1
- package/dist/tools/read/get-document-info.d.ts.map +1 -1
- package/dist/tools/read/get-document-info.js +47 -19
- package/dist/tools/read/get-document-info.js.map +1 -1
- package/dist/tools/read/get-document-structure.d.ts.map +1 -1
- package/dist/tools/read/get-document-structure.js +16 -24
- package/dist/tools/read/get-document-structure.js.map +1 -1
- package/dist/tools/read/get-effects.d.ts.map +1 -1
- package/dist/tools/read/get-effects.js +32 -43
- package/dist/tools/read/get-effects.js.map +1 -1
- package/dist/tools/read/get-groups.d.ts.map +1 -1
- package/dist/tools/read/get-groups.js +22 -26
- package/dist/tools/read/get-groups.js.map +1 -1
- package/dist/tools/read/get-guidelines.d.ts.map +1 -1
- package/dist/tools/read/get-guidelines.js +13 -16
- package/dist/tools/read/get-guidelines.js.map +1 -1
- package/dist/tools/read/get-images.d.ts.map +1 -1
- package/dist/tools/read/get-images.js +43 -25
- package/dist/tools/read/get-images.js.map +1 -1
- package/dist/tools/read/get-layers.d.ts.map +1 -1
- package/dist/tools/read/get-layers.js +14 -15
- package/dist/tools/read/get-layers.js.map +1 -1
- package/dist/tools/read/get-overprint-info.d.ts.map +1 -1
- package/dist/tools/read/get-overprint-info.js +72 -63
- package/dist/tools/read/get-overprint-info.js.map +1 -1
- package/dist/tools/read/get-path-items.d.ts.map +1 -1
- package/dist/tools/read/get-path-items.js +26 -20
- package/dist/tools/read/get-path-items.js.map +1 -1
- package/dist/tools/read/get-selection.d.ts.map +1 -1
- package/dist/tools/read/get-selection.js +19 -33
- package/dist/tools/read/get-selection.js.map +1 -1
- package/dist/tools/read/get-separation-info.d.ts +3 -0
- package/dist/tools/read/get-separation-info.d.ts.map +1 -0
- package/dist/tools/read/get-separation-info.js +94 -0
- package/dist/tools/read/get-separation-info.js.map +1 -0
- package/dist/tools/read/get-symbols.d.ts.map +1 -1
- package/dist/tools/read/get-symbols.js +19 -23
- package/dist/tools/read/get-symbols.js.map +1 -1
- package/dist/tools/read/get-text-frame-detail.d.ts.map +1 -1
- package/dist/tools/read/get-text-frame-detail.js +270 -67
- package/dist/tools/read/get-text-frame-detail.js.map +1 -1
- package/dist/tools/read/list-fonts.d.ts +3 -0
- package/dist/tools/read/list-fonts.d.ts.map +1 -0
- package/dist/tools/read/list-fonts.js +78 -0
- package/dist/tools/read/list-fonts.js.map +1 -0
- package/dist/tools/read/list-text-frames.d.ts.map +1 -1
- package/dist/tools/read/list-text-frames.js +99 -36
- package/dist/tools/read/list-text-frames.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +64 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/session.d.ts +36 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +246 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/utility/check-text-consistency.d.ts +3 -0
- package/dist/tools/utility/check-text-consistency.d.ts.map +1 -0
- package/dist/tools/utility/check-text-consistency.js +303 -0
- package/dist/tools/utility/check-text-consistency.js.map +1 -0
- package/dist/tools/utility/preflight-check.d.ts.map +1 -1
- package/dist/tools/utility/preflight-check.js +141 -43
- package/dist/tools/utility/preflight-check.js.map +1 -1
- package/dist/tools/utility/set-workflow.d.ts +3 -0
- package/dist/tools/utility/set-workflow.d.ts.map +1 -0
- package/dist/tools/utility/set-workflow.js +95 -0
- package/dist/tools/utility/set-workflow.js.map +1 -0
- package/dist/utils/image-header.d.ts.map +1 -1
- package/dist/utils/image-header.js +5 -1
- package/dist/utils/image-header.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeJsx } from '../../executor/jsx-runner.js';
|
|
3
|
+
import { WRITE_ANNOTATIONS, coerceBoolean } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* group_objects — 複数オブジェクトをグループ化
|
|
6
|
+
*
|
|
7
|
+
* @see https://ai-scripting.docsforadobe.dev/jsobjref/GroupItems/ — GroupItems.add()
|
|
8
|
+
*
|
|
9
|
+
* JSX API:
|
|
10
|
+
* GroupItems.add() → GroupItem (空グループ作成)
|
|
11
|
+
* PageItem.move(relativeObject, insertionLocation: ElementPlacement) → PageItem
|
|
12
|
+
* GroupItem.clipped → Boolean (writable)
|
|
13
|
+
*/
|
|
14
|
+
const jsxCode = `
|
|
15
|
+
var preflight = preflightChecks();
|
|
16
|
+
if (preflight) {
|
|
17
|
+
writeResultFile(RESULT_PATH, preflight);
|
|
18
|
+
} else {
|
|
19
|
+
try {
|
|
20
|
+
var params = readParamsFile(PARAMS_PATH);
|
|
21
|
+
var doc = app.activeDocument;
|
|
22
|
+
var uuids = params.uuids;
|
|
23
|
+
|
|
24
|
+
var items = [];
|
|
25
|
+
for (var i = 0; i < uuids.length; i++) {
|
|
26
|
+
var item = findItemByUUID(uuids[i]);
|
|
27
|
+
if (item) items.push(item);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (items.length === 0) {
|
|
31
|
+
writeResultFile(RESULT_PATH, { error: true, message: "No valid objects found for the given UUIDs" });
|
|
32
|
+
} else {
|
|
33
|
+
var parentLayer = items[0].layer;
|
|
34
|
+
var group = parentLayer.groupItems.add();
|
|
35
|
+
|
|
36
|
+
// 順方向で PLACEATEND → items[0] がグループ最下位 (bottom)、最後が最上位 (top)
|
|
37
|
+
// クリッピングマスクでは最上位アイテム(=配列末尾)がクリップパスになる
|
|
38
|
+
for (var j = 0; j < items.length; j++) {
|
|
39
|
+
items[j].move(group, ElementPlacement.PLACEATEND);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (params.name) {
|
|
43
|
+
group.name = params.name;
|
|
44
|
+
}
|
|
45
|
+
if (params.clipped === true) {
|
|
46
|
+
group.clipped = true;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
var uuid = ensureUUID(group);
|
|
50
|
+
writeResultFile(RESULT_PATH, {
|
|
51
|
+
success: true,
|
|
52
|
+
uuid: uuid,
|
|
53
|
+
childCount: group.pageItems.length,
|
|
54
|
+
verified: verifyItem(group)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
} catch (e) {
|
|
58
|
+
writeResultFile(RESULT_PATH, { error: true, message: "group_objects failed: " + e.message, line: e.line });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
export function register(server) {
|
|
63
|
+
server.registerTool('group_objects', {
|
|
64
|
+
title: 'Group Objects',
|
|
65
|
+
description: 'Group multiple objects into a single group. The first UUID in the array becomes the bottommost item, the last becomes the topmost. Note: Illustrator will be activated (brought to foreground) during execution.',
|
|
66
|
+
inputSchema: {
|
|
67
|
+
uuids: z.array(z.string()).min(1).describe('UUIDs of objects to group. Order matters: first=bottom, last=top in layer panel.'),
|
|
68
|
+
name: z.string().optional().describe('Name for the new group'),
|
|
69
|
+
clipped: coerceBoolean
|
|
70
|
+
.optional()
|
|
71
|
+
.default(false)
|
|
72
|
+
.describe('Create as clipping group. The last UUID becomes the clip path (topmost). Example: [content-uuid, mask-uuid] — mask-uuid clips content-uuid.'),
|
|
73
|
+
},
|
|
74
|
+
annotations: WRITE_ANNOTATIONS,
|
|
75
|
+
}, async (params) => {
|
|
76
|
+
const result = await executeJsx(jsxCode, params, { activate: true });
|
|
77
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=group-objects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-objects.js","sourceRoot":"","sources":["../../../src/tools/modify/group-objects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;;;;;;GASG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Cf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,kNAAkN;QACpN,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kFAAkF,CAAC;YAC9H,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC9D,OAAO,EAAE,aAAa;iBACnB,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,6IAA6I,CAAC;SAC3J;QACD,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-artboards.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/manage-artboards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgHpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8ChD"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeJsx } from '../../executor/jsx-runner.js';
|
|
3
|
+
import { DESTRUCTIVE_ANNOTATIONS } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* manage_artboards — アートボードの追加・削除・リサイズ・リネーム・整列
|
|
6
|
+
*
|
|
7
|
+
* @see https://ai-scripting.docsforadobe.dev/jsobjref/Artboards/ — Artboards collection
|
|
8
|
+
* @see https://ai-scripting.docsforadobe.dev/jsobjref/Document/ — Document.rearrangeArtboards(), fitArtboardToSelectedArt()
|
|
9
|
+
*
|
|
10
|
+
* JSX API:
|
|
11
|
+
* Artboards.add(artboardRect: Rect) → Artboard
|
|
12
|
+
* Artboards.remove(index: Number) → void ※最後の1つは削除不可
|
|
13
|
+
* Artboard.artboardRect → Rect [left, top, right, bottom] (writable)
|
|
14
|
+
* Artboard.name → String (writable)
|
|
15
|
+
* Document.fitArtboardToSelectedArt([index]) → Boolean ※要選択
|
|
16
|
+
* Document.rearrangeArtboards(layout, rowsOrCols, spacing, moveArtwork) → Boolean
|
|
17
|
+
*
|
|
18
|
+
* rect パラメータはドキュメント座標系 (Y-up)。artboardRect への変換:
|
|
19
|
+
* [r.x, r.y + r.height, r.x + r.width, r.y]
|
|
20
|
+
*/
|
|
21
|
+
const jsxCode = `
|
|
22
|
+
var preflight = preflightChecks();
|
|
23
|
+
if (preflight) {
|
|
24
|
+
writeResultFile(RESULT_PATH, preflight);
|
|
25
|
+
} else {
|
|
26
|
+
try {
|
|
27
|
+
var params = readParamsFile(PARAMS_PATH);
|
|
28
|
+
var doc = app.activeDocument;
|
|
29
|
+
var action = params.action;
|
|
30
|
+
|
|
31
|
+
if (action === "add") {
|
|
32
|
+
if (!params.rect) {
|
|
33
|
+
writeResultFile(RESULT_PATH, { error: true, message: "rect is required for add action" });
|
|
34
|
+
} else {
|
|
35
|
+
var r = params.rect;
|
|
36
|
+
// artboardRect = [left, top, right, bottom] (document coordinates, Y-up)
|
|
37
|
+
var abRect = [r.x, r.y + r.height, r.x + r.width, r.y];
|
|
38
|
+
var ab = doc.artboards.add(abRect);
|
|
39
|
+
invalidateArtboardCache();
|
|
40
|
+
if (params.name) ab.name = params.name;
|
|
41
|
+
var addedRect = ab.artboardRect;
|
|
42
|
+
writeResultFile(RESULT_PATH, {
|
|
43
|
+
success: true,
|
|
44
|
+
index: doc.artboards.length - 1,
|
|
45
|
+
name: ab.name,
|
|
46
|
+
verified: { artboardRect: addedRect }
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
} else if (action === "remove") {
|
|
50
|
+
if (typeof params.index !== "number") {
|
|
51
|
+
writeResultFile(RESULT_PATH, { error: true, message: "index is required for remove action" });
|
|
52
|
+
} else if (doc.artboards.length <= 1) {
|
|
53
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Cannot remove the last artboard" });
|
|
54
|
+
} else {
|
|
55
|
+
// Artboards.remove(index: Number) → void
|
|
56
|
+
doc.artboards.remove(params.index);
|
|
57
|
+
invalidateArtboardCache();
|
|
58
|
+
writeResultFile(RESULT_PATH, { success: true, removedIndex: params.index });
|
|
59
|
+
}
|
|
60
|
+
} else if (action === "resize") {
|
|
61
|
+
if (typeof params.index !== "number" || !params.rect) {
|
|
62
|
+
writeResultFile(RESULT_PATH, { error: true, message: "index and rect required for resize" });
|
|
63
|
+
} else {
|
|
64
|
+
var r2 = params.rect;
|
|
65
|
+
// Artboard.artboardRect = [left, top, right, bottom] (document coordinates, Y-up)
|
|
66
|
+
doc.artboards[params.index].artboardRect = [r2.x, r2.y + r2.height, r2.x + r2.width, r2.y];
|
|
67
|
+
var resizedRect = doc.artboards[params.index].artboardRect;
|
|
68
|
+
writeResultFile(RESULT_PATH, { success: true, index: params.index, verified: { artboardRect: resizedRect } });
|
|
69
|
+
}
|
|
70
|
+
} else if (action === "rename") {
|
|
71
|
+
if (typeof params.index !== "number" || !params.name) {
|
|
72
|
+
writeResultFile(RESULT_PATH, { error: true, message: "index and name required for rename" });
|
|
73
|
+
} else {
|
|
74
|
+
doc.artboards[params.index].name = params.name;
|
|
75
|
+
var renamedName = doc.artboards[params.index].name;
|
|
76
|
+
writeResultFile(RESULT_PATH, { success: true, index: params.index, name: params.name, verified: { name: renamedName } });
|
|
77
|
+
}
|
|
78
|
+
} else if (action === "fit_to_art") {
|
|
79
|
+
if (!doc.selection || doc.selection.length === 0) {
|
|
80
|
+
writeResultFile(RESULT_PATH, { error: true, message: "fit_to_art requires objects to be selected first" });
|
|
81
|
+
} else {
|
|
82
|
+
var fitIdx = (typeof params.index === "number") ? params.index : 0;
|
|
83
|
+
doc.fitArtboardToSelectedArt(fitIdx);
|
|
84
|
+
writeResultFile(RESULT_PATH, { success: true, index: fitIdx, verified: { artboardRect: doc.artboards[fitIdx].artboardRect } });
|
|
85
|
+
}
|
|
86
|
+
} else if (action === "rearrange") {
|
|
87
|
+
var layoutMap = {
|
|
88
|
+
"grid_by_row": DocumentArtboardLayout.GridByRow,
|
|
89
|
+
"grid_by_col": DocumentArtboardLayout.GridByCol,
|
|
90
|
+
"row": DocumentArtboardLayout.Row,
|
|
91
|
+
"column": DocumentArtboardLayout.Column
|
|
92
|
+
};
|
|
93
|
+
var layout = layoutMap[params.layout] || DocumentArtboardLayout.GridByRow;
|
|
94
|
+
var rowsOrCols = params.rows_or_cols || 1;
|
|
95
|
+
var spacing = (typeof params.spacing === "number") ? params.spacing : 20;
|
|
96
|
+
doc.rearrangeArtboards(layout, rowsOrCols, spacing, true);
|
|
97
|
+
var rearrangedInfo = [];
|
|
98
|
+
for (var rai = 0; rai < doc.artboards.length; rai++) {
|
|
99
|
+
rearrangedInfo.push({ index: rai, name: doc.artboards[rai].name, rect: doc.artboards[rai].artboardRect });
|
|
100
|
+
}
|
|
101
|
+
writeResultFile(RESULT_PATH, { success: true, verified: { artboardCount: doc.artboards.length, artboards: rearrangedInfo } });
|
|
102
|
+
} else {
|
|
103
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Unknown action: " + action });
|
|
104
|
+
}
|
|
105
|
+
} catch (e) {
|
|
106
|
+
writeResultFile(RESULT_PATH, { error: true, message: "manage_artboards failed: " + e.message, line: e.line });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
export function register(server) {
|
|
111
|
+
server.registerTool('manage_artboards', {
|
|
112
|
+
title: 'Manage Artboards',
|
|
113
|
+
description: 'Add, remove, resize, rename, fit, or rearrange artboards. Note: Illustrator will be activated (brought to foreground) during execution.',
|
|
114
|
+
inputSchema: {
|
|
115
|
+
action: z
|
|
116
|
+
.enum(['add', 'remove', 'resize', 'rename', 'fit_to_art', 'rearrange'])
|
|
117
|
+
.describe('Action to perform'),
|
|
118
|
+
index: z
|
|
119
|
+
.number()
|
|
120
|
+
.int()
|
|
121
|
+
.min(0)
|
|
122
|
+
.optional()
|
|
123
|
+
.describe('Target artboard index (0-based). Required for remove/resize/rename/fit_to_art. Note: the last remaining artboard cannot be removed.'),
|
|
124
|
+
rect: z
|
|
125
|
+
.object({
|
|
126
|
+
x: z.number(),
|
|
127
|
+
y: z.number(),
|
|
128
|
+
width: z.number(),
|
|
129
|
+
height: z.number(),
|
|
130
|
+
})
|
|
131
|
+
.optional()
|
|
132
|
+
.describe('Position and size for add/resize (document coordinates)'),
|
|
133
|
+
name: z.string().optional().describe('New name for rename action'),
|
|
134
|
+
layout: z
|
|
135
|
+
.enum(['grid_by_row', 'grid_by_col', 'row', 'column'])
|
|
136
|
+
.optional()
|
|
137
|
+
.describe('Artboard layout for rearrange'),
|
|
138
|
+
rows_or_cols: z
|
|
139
|
+
.number()
|
|
140
|
+
.int()
|
|
141
|
+
.min(1)
|
|
142
|
+
.optional()
|
|
143
|
+
.describe('Number of rows or columns for rearrange'),
|
|
144
|
+
spacing: z.number().optional().default(20).describe('Spacing in points for rearrange'),
|
|
145
|
+
},
|
|
146
|
+
annotations: DESTRUCTIVE_ANNOTATIONS,
|
|
147
|
+
}, async (params) => {
|
|
148
|
+
const result = await executeJsx(jsxCode, params, { activate: true });
|
|
149
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=manage-artboards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-artboards.js","sourceRoot":"","sources":["../../../src/tools/modify/manage-artboards.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,yIAAyI;QAC3I,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;iBACtE,QAAQ,CAAC,mBAAmB,CAAC;YAChC,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CAAC,qIAAqI,CAAC;YAClJ,IAAI,EAAE,CAAC;iBACJ,MAAM,CAAC;gBACN,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;gBACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;gBACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;aACnB,CAAC;iBACD,QAAQ,EAAE;iBACV,QAAQ,CAAC,yDAAyD,CAAC;YACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAClE,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;iBACrD,QAAQ,EAAE;iBACV,QAAQ,CAAC,+BAA+B,CAAC;YAC5C,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CAAC,yCAAyC,CAAC;YACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACvF;QACD,WAAW,EAAE,uBAAuB;KACrC,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-datasets.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/manage-datasets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+SpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgDhD"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeJsx } from '../../executor/jsx-runner.js';
|
|
3
|
+
import { WRITE_ANNOTATIONS } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* manage_datasets — 変数・データセットの一覧・適用・作成・インポート/エクスポート
|
|
6
|
+
*
|
|
7
|
+
* @see https://ai-scripting.docsforadobe.dev/jsobjref/Dataset/ — Dataset, Variable, Document.importVariables()
|
|
8
|
+
*
|
|
9
|
+
* JSX API:
|
|
10
|
+
* Document.variables → Variables コレクション
|
|
11
|
+
* Variable.kind → VariableKind (TEXTUAL | VISIBILITY | IMAGE | GRAPH)
|
|
12
|
+
* Document.dataSets → Datasets コレクション
|
|
13
|
+
* Dataset.display() → void (データセットを表示)
|
|
14
|
+
* Datasets.add() → Dataset
|
|
15
|
+
* Document.importVariables(fileSpec: File) → void
|
|
16
|
+
* Document.exportVariables(fileSpec: File) → void
|
|
17
|
+
*/
|
|
18
|
+
const jsxCode = `
|
|
19
|
+
function parseCsvLine(line) {
|
|
20
|
+
var result = [];
|
|
21
|
+
var current = "";
|
|
22
|
+
var inQuotes = false;
|
|
23
|
+
for (var ci = 0; ci < line.length; ci++) {
|
|
24
|
+
var ch = line.charAt(ci);
|
|
25
|
+
if (inQuotes) {
|
|
26
|
+
if (ch === '"' && ci + 1 < line.length && line.charAt(ci + 1) === '"') {
|
|
27
|
+
current += '"';
|
|
28
|
+
ci++;
|
|
29
|
+
} else if (ch === '"') {
|
|
30
|
+
inQuotes = false;
|
|
31
|
+
} else {
|
|
32
|
+
current += ch;
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
if (ch === '"') {
|
|
36
|
+
inQuotes = true;
|
|
37
|
+
} else if (ch === ',') {
|
|
38
|
+
result.push(current);
|
|
39
|
+
current = "";
|
|
40
|
+
} else {
|
|
41
|
+
current += ch;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
result.push(current);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
var preflight = preflightChecks();
|
|
49
|
+
if (preflight) {
|
|
50
|
+
writeResultFile(RESULT_PATH, preflight);
|
|
51
|
+
} else {
|
|
52
|
+
try {
|
|
53
|
+
var params = readParamsFile(PARAMS_PATH);
|
|
54
|
+
var doc = app.activeDocument;
|
|
55
|
+
var action = params.action;
|
|
56
|
+
|
|
57
|
+
if (action === "list_variables") {
|
|
58
|
+
var vars = [];
|
|
59
|
+
for (var i = 0; i < doc.variables.length; i++) {
|
|
60
|
+
var v = doc.variables[i];
|
|
61
|
+
var kindStr = "unknown";
|
|
62
|
+
if (v.kind === VariableKind.TEXTUAL) kindStr = "textual";
|
|
63
|
+
else if (v.kind === VariableKind.VISIBILITY) kindStr = "visibility";
|
|
64
|
+
else if (v.kind === VariableKind.IMAGE) kindStr = "image";
|
|
65
|
+
else if (v.kind === VariableKind.GRAPH) kindStr = "graph";
|
|
66
|
+
vars.push({ name: v.name, kind: kindStr });
|
|
67
|
+
}
|
|
68
|
+
writeResultFile(RESULT_PATH, { count: vars.length, variables: vars });
|
|
69
|
+
} else if (action === "list_datasets") {
|
|
70
|
+
var ds = [];
|
|
71
|
+
for (var j = 0; j < doc.dataSets.length; j++) {
|
|
72
|
+
ds.push({ index: j, name: doc.dataSets[j].name });
|
|
73
|
+
}
|
|
74
|
+
writeResultFile(RESULT_PATH, { count: ds.length, datasets: ds });
|
|
75
|
+
} else if (action === "apply_dataset") {
|
|
76
|
+
if (!params.dataset_name) {
|
|
77
|
+
writeResultFile(RESULT_PATH, { error: true, message: "dataset_name is required" });
|
|
78
|
+
} else {
|
|
79
|
+
var found = false;
|
|
80
|
+
for (var k = 0; k < doc.dataSets.length; k++) {
|
|
81
|
+
if (doc.dataSets[k].name === params.dataset_name) {
|
|
82
|
+
doc.dataSets[k].display();
|
|
83
|
+
found = true;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (found) {
|
|
88
|
+
writeResultFile(RESULT_PATH, { success: true, dataset: params.dataset_name });
|
|
89
|
+
} else {
|
|
90
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Dataset not found: " + params.dataset_name });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
} else if (action === "create_dataset") {
|
|
94
|
+
// Check that at least one variable is bound to an object
|
|
95
|
+
var hasBound = false;
|
|
96
|
+
for (var cb = 0; cb < doc.pageItems.length && !hasBound; cb++) {
|
|
97
|
+
try { if (doc.pageItems[cb].contentVariable) hasBound = true; } catch(_e1) {}
|
|
98
|
+
try { if (doc.pageItems[cb].visibilityVariable) hasBound = true; } catch(_e2) {}
|
|
99
|
+
}
|
|
100
|
+
if (!hasBound) {
|
|
101
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Cannot create dataset: no variables are bound to objects. Use bind_variable or import_csv first." });
|
|
102
|
+
} else {
|
|
103
|
+
var newDs = doc.dataSets.add();
|
|
104
|
+
if (params.dataset_name) newDs.name = params.dataset_name;
|
|
105
|
+
writeResultFile(RESULT_PATH, { success: true, name: newDs.name, index: doc.dataSets.length - 1 });
|
|
106
|
+
}
|
|
107
|
+
} else if (action === "import") {
|
|
108
|
+
if (!params.file_path) {
|
|
109
|
+
writeResultFile(RESULT_PATH, { error: true, message: "file_path is required for import" });
|
|
110
|
+
} else {
|
|
111
|
+
var impFile = new File(params.file_path);
|
|
112
|
+
if (!impFile.exists) {
|
|
113
|
+
writeResultFile(RESULT_PATH, { error: true, message: "File not found: " + params.file_path });
|
|
114
|
+
} else {
|
|
115
|
+
doc.importVariables(impFile);
|
|
116
|
+
writeResultFile(RESULT_PATH, { success: true, action: "import", path: params.file_path });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} else if (action === "bind_variable") {
|
|
120
|
+
if (!params.variable_name || !params.object_name) {
|
|
121
|
+
writeResultFile(RESULT_PATH, { error: true, message: "variable_name and object_name are required" });
|
|
122
|
+
} else {
|
|
123
|
+
var bindVar = null;
|
|
124
|
+
for (var bv = 0; bv < doc.variables.length; bv++) {
|
|
125
|
+
if (doc.variables[bv].name === params.variable_name) {
|
|
126
|
+
bindVar = doc.variables[bv];
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!bindVar) {
|
|
131
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Variable not found: " + params.variable_name });
|
|
132
|
+
} else {
|
|
133
|
+
var bindItem = null;
|
|
134
|
+
for (var bp = 0; bp < doc.pageItems.length; bp++) {
|
|
135
|
+
if (doc.pageItems[bp].name === params.object_name) {
|
|
136
|
+
bindItem = doc.pageItems[bp];
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!bindItem) {
|
|
141
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Object not found: " + params.object_name });
|
|
142
|
+
} else {
|
|
143
|
+
if (bindVar.kind === VariableKind.TEXTUAL) {
|
|
144
|
+
bindItem.contentVariable = bindVar;
|
|
145
|
+
} else if (bindVar.kind === VariableKind.VISIBILITY) {
|
|
146
|
+
bindItem.visibilityVariable = bindVar;
|
|
147
|
+
} else if (bindVar.kind === VariableKind.IMAGE) {
|
|
148
|
+
bindItem.contentVariable = bindVar;
|
|
149
|
+
} else {
|
|
150
|
+
bindItem.contentVariable = bindVar;
|
|
151
|
+
}
|
|
152
|
+
writeResultFile(RESULT_PATH, { success: true, variable: params.variable_name, object: params.object_name });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
} else if (action === "import_csv") {
|
|
157
|
+
if (!params.file_path) {
|
|
158
|
+
writeResultFile(RESULT_PATH, { error: true, message: "file_path is required for import_csv" });
|
|
159
|
+
} else {
|
|
160
|
+
var csvFile = new File(params.file_path);
|
|
161
|
+
if (!csvFile.exists) {
|
|
162
|
+
writeResultFile(RESULT_PATH, { error: true, message: "File not found: " + params.file_path });
|
|
163
|
+
} else {
|
|
164
|
+
csvFile.encoding = "UTF-8";
|
|
165
|
+
csvFile.open("r");
|
|
166
|
+
var csvText = csvFile.read();
|
|
167
|
+
csvFile.close();
|
|
168
|
+
|
|
169
|
+
var lines = csvText.split(/\\r?\\n/);
|
|
170
|
+
// Remove empty trailing lines
|
|
171
|
+
while (lines.length > 0 && lines[lines.length - 1].replace(/^\\s+|\\s+$/g, "") === "") {
|
|
172
|
+
lines.pop();
|
|
173
|
+
}
|
|
174
|
+
if (lines.length < 2) {
|
|
175
|
+
writeResultFile(RESULT_PATH, { error: true, message: "CSV must have a header row and at least one data row" });
|
|
176
|
+
} else {
|
|
177
|
+
// Parse CSV header
|
|
178
|
+
var headers = parseCsvLine(lines[0]);
|
|
179
|
+
for (var hi = 0; hi < headers.length; hi++) {
|
|
180
|
+
headers[hi] = headers[hi].replace(/^\\s+|\\s+$/g, "");
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Duplicate artboards for each CSV row
|
|
184
|
+
var abRect = doc.artboards[0].artboardRect;
|
|
185
|
+
var abWidth = abRect[2] - abRect[0];
|
|
186
|
+
|
|
187
|
+
// Collect references to original items (iterate in reverse for z-order)
|
|
188
|
+
var origItems = [];
|
|
189
|
+
var rightOverhang = 0;
|
|
190
|
+
var leftOverhang = 0;
|
|
191
|
+
for (var oi = doc.pageItems.length - 1; oi >= 0; oi--) {
|
|
192
|
+
var item = doc.pageItems[oi];
|
|
193
|
+
origItems.push(item);
|
|
194
|
+
// Calculate how far items extend beyond artboard edges
|
|
195
|
+
// geometricBounds: [left, top, right, bottom]
|
|
196
|
+
var gb = item.geometricBounds;
|
|
197
|
+
var rOver = gb[2] - abRect[2];
|
|
198
|
+
var lOver = abRect[0] - gb[0];
|
|
199
|
+
if (rOver > rightOverhang) rightOverhang = rOver;
|
|
200
|
+
if (lOver > leftOverhang) leftOverhang = lOver;
|
|
201
|
+
}
|
|
202
|
+
// Spacing = overhang on both sides + 20pt gap
|
|
203
|
+
var hSpacing = rightOverhang + leftOverhang + 20;
|
|
204
|
+
// Vertical overhang
|
|
205
|
+
var topOverhang = 0;
|
|
206
|
+
var bottomOverhang = 0;
|
|
207
|
+
var abHeight = abRect[1] - abRect[3]; // top - bottom (document coords)
|
|
208
|
+
for (var oi2 = 0; oi2 < origItems.length; oi2++) {
|
|
209
|
+
var gb2 = origItems[oi2].geometricBounds;
|
|
210
|
+
var tOver = gb2[1] - abRect[1];
|
|
211
|
+
var bOver = abRect[3] - gb2[3];
|
|
212
|
+
if (tOver > topOverhang) topOverhang = tOver;
|
|
213
|
+
if (bOver > bottomOverhang) bottomOverhang = bOver;
|
|
214
|
+
}
|
|
215
|
+
var vSpacing = topOverhang + bottomOverhang + 20;
|
|
216
|
+
|
|
217
|
+
// Grid layout: max 4 columns per row
|
|
218
|
+
var maxCols = 4;
|
|
219
|
+
var totalRows = lines.length - 1;
|
|
220
|
+
if (totalRows <= maxCols) maxCols = totalRows;
|
|
221
|
+
|
|
222
|
+
var artboardNames = [];
|
|
223
|
+
for (var ri = 1; ri < lines.length; ri++) {
|
|
224
|
+
var values = parseCsvLine(lines[ri]);
|
|
225
|
+
var rowName = params.dataset_name_prefix
|
|
226
|
+
? params.dataset_name_prefix + " " + ri
|
|
227
|
+
: values[0] || ("Row " + ri);
|
|
228
|
+
var gridIndex = ri - 1;
|
|
229
|
+
var col = gridIndex % maxCols;
|
|
230
|
+
var row = Math.floor(gridIndex / maxCols);
|
|
231
|
+
var xOffset = col * (abWidth + hSpacing);
|
|
232
|
+
var yOffset = row * (abHeight + vSpacing);
|
|
233
|
+
|
|
234
|
+
if (ri === 1) {
|
|
235
|
+
// First row: set text on original artboard
|
|
236
|
+
doc.artboards[0].name = rowName;
|
|
237
|
+
for (var ci2 = 0; ci2 < headers.length && ci2 < values.length; ci2++) {
|
|
238
|
+
if (headers[ci2] === "") continue;
|
|
239
|
+
for (var pi = 0; pi < origItems.length; pi++) {
|
|
240
|
+
if (origItems[pi].name === headers[ci2] && origItems[pi].typename === "TextFrame") {
|
|
241
|
+
origItems[pi].contents = values[ci2];
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
// Subsequent rows: add artboard and duplicate items
|
|
248
|
+
// Document coords: y increases upward, so subtract yOffset
|
|
249
|
+
var newRect = [abRect[0] + xOffset, abRect[1] - yOffset, abRect[2] + xOffset, abRect[3] - yOffset];
|
|
250
|
+
var newAb = doc.artboards.add(newRect);
|
|
251
|
+
newAb.name = rowName;
|
|
252
|
+
invalidateArtboardCache();
|
|
253
|
+
|
|
254
|
+
for (var di = 0; di < origItems.length; di++) {
|
|
255
|
+
var dup = origItems[di].duplicate();
|
|
256
|
+
dup.translate(xOffset, -yOffset);
|
|
257
|
+
if (dup.typename === "TextFrame") {
|
|
258
|
+
for (var ci3 = 0; ci3 < headers.length && ci3 < values.length; ci3++) {
|
|
259
|
+
if (dup.name === headers[ci3]) {
|
|
260
|
+
dup.contents = values[ci3];
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
artboardNames.push(rowName);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Verify each artboard using common helper
|
|
271
|
+
var verification = [];
|
|
272
|
+
for (var vai = 0; vai < doc.artboards.length; vai++) {
|
|
273
|
+
verification.push(verifyArtboardContents(vai));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
writeResultFile(RESULT_PATH, {
|
|
277
|
+
success: true,
|
|
278
|
+
action: "import_csv",
|
|
279
|
+
columns: headers,
|
|
280
|
+
artboards: verification
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
} else if (action === "export") {
|
|
286
|
+
if (!params.file_path) {
|
|
287
|
+
writeResultFile(RESULT_PATH, { error: true, message: "file_path is required for export" });
|
|
288
|
+
} else {
|
|
289
|
+
var expFile = new File(params.file_path);
|
|
290
|
+
doc.exportVariables(expFile);
|
|
291
|
+
writeResultFile(RESULT_PATH, { success: true, action: "export", path: params.file_path });
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
writeResultFile(RESULT_PATH, { error: true, message: "Unknown action: " + action });
|
|
295
|
+
}
|
|
296
|
+
} catch (e) {
|
|
297
|
+
writeResultFile(RESULT_PATH, { error: true, message: "manage_datasets failed: " + e.message, line: e.line });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
`;
|
|
301
|
+
export function register(server) {
|
|
302
|
+
server.registerTool('manage_datasets', {
|
|
303
|
+
title: 'Manage Variables & Datasets',
|
|
304
|
+
description: 'List variables/datasets, apply or create datasets, bind variables to objects, import CSV/XML. CSV headers are auto-bound to objects with matching names. Note: Illustrator will be activated (brought to foreground) during execution.',
|
|
305
|
+
inputSchema: {
|
|
306
|
+
action: z
|
|
307
|
+
.enum([
|
|
308
|
+
'list_variables',
|
|
309
|
+
'list_datasets',
|
|
310
|
+
'apply_dataset',
|
|
311
|
+
'create_dataset',
|
|
312
|
+
'bind_variable',
|
|
313
|
+
'import_csv',
|
|
314
|
+
'import',
|
|
315
|
+
'export',
|
|
316
|
+
])
|
|
317
|
+
.describe('Action to perform'),
|
|
318
|
+
dataset_name: z
|
|
319
|
+
.string()
|
|
320
|
+
.optional()
|
|
321
|
+
.describe('Dataset name (for apply_dataset, create_dataset)'),
|
|
322
|
+
variable_name: z
|
|
323
|
+
.string()
|
|
324
|
+
.optional()
|
|
325
|
+
.describe('Variable name (for bind_variable)'),
|
|
326
|
+
object_name: z
|
|
327
|
+
.string()
|
|
328
|
+
.optional()
|
|
329
|
+
.describe('Object name to bind variable to (for bind_variable)'),
|
|
330
|
+
dataset_name_prefix: z
|
|
331
|
+
.string()
|
|
332
|
+
.optional()
|
|
333
|
+
.describe('Prefix for auto-generated dataset names (for import_csv). If omitted, first column value is used.'),
|
|
334
|
+
file_path: z
|
|
335
|
+
.string()
|
|
336
|
+
.optional()
|
|
337
|
+
.describe('File path (XML for import/export, CSV for import_csv)'),
|
|
338
|
+
},
|
|
339
|
+
annotations: WRITE_ANNOTATIONS,
|
|
340
|
+
}, async (params) => {
|
|
341
|
+
const result = await executeJsx(jsxCode, params, { activate: true });
|
|
342
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=manage-datasets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-datasets.js","sourceRoot":"","sources":["../../../src/tools/modify/manage-datasets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Rf,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EACT,wOAAwO;QAC1O,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC;gBACJ,gBAAgB;gBAChB,eAAe;gBACf,eAAe;gBACf,gBAAgB;gBAChB,eAAe;gBACf,YAAY;gBACZ,QAAQ;gBACR,QAAQ;aACT,CAAC;iBACD,QAAQ,CAAC,mBAAmB,CAAC;YAChC,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kDAAkD,CAAC;YAC/D,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;YAChD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,qDAAqD,CAAC;YAClE,mBAAmB,EAAE,CAAC;iBACnB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mGAAmG,CAAC;YAChH,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-layers.d.ts","sourceRoot":"","sources":["../../../src/tools/modify/manage-layers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoHpE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoChD"}
|