選択アートボードのデータを吐き出すプラグインを作るためのメモ
自分用です
APIの仕様
公式のAPIリファレンス:
https://developer.sketchapp.com/reference/api/
Sketch APIのgithub:
https://github.com/BohemianCoding/SketchAPI
Sketch App API(非公式のObj-cクラスダンプ):
パブリックプロパティやメソッドを確認できます
https://github.com/abynim/Sketch-Headers
Objective-Cの関数をCocoaScriptの記述に変換
詳細はこちら:
https://developer.sketchapp.com/guides/cocoascript/
関数の引数ラベルは、アンダーバーでつなぐ
例えば、
// Objective-C
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:true attributes:nil error:nil];
↓
// CocoaScript
NSFileManager.defaultManager().createDirectoryAtPath_withIntermediateDirectories_attributes_error(path, true, nil, nil);
Pluginから取得できるSketchのオブジェクトについて
- require('sketch/dom')から取得したオブジェクトは、
Sketch APIのオブジェクト。 - context.documentや、context.selectionなど、contextから取得したオブジェクトは、Sketch App APIのオブジェクト
オブジェクト
ツール名 | クラス名(Sketch App API) |
---|---|
Artboard | MSArtboardGroup |
Line | MSShapeGroup |
Arrow | MSShapeGroup |
Rectangle | MSShapeGroup |
Rounded | MSShapeGroup |
Star | MSShapeGroup |
Polygon | MSShapeGroup |
Triangle | MSShapeGroup |
Vector | MSShapeGroup |
Pencil | MSShapeGroup |
Oval | MSShapeGroup |
Text | MSTextLayer |
Bitmap | MSBitmapLayer |
Hotspot | MSHotspotLayer |
Symbol | MSSymbolInstance |
Slice | MSSliceLayer |
サンプルコード
レイヤーを取得する
var layers = symbolMaster.layers();
log(layers);
実行結果
(
"<MSTextLayer: 0x7fc35ffa7c00> input_TEXT BOX (5B1B913C-E914-4E13-B64E-C0B95B5CF981)",
"<MSShapeGroup: 0x7fc35ffd47f0> shape (F4CAF400-EFEA-49CA-A111-513D221C2184)"
)
オーバーライド元のシンボルを取得する
var parent = symbol.symbolMaster(); // symbolは、MSSymbolInstance 戻り値は、MSSymbolMaster
シンボルのオーバーライド項目を取得する
var overrides = symbol.overrides(); // symbolは、MSSymbolInstance
log(overrides);
実行結果
{
"41A74F0C-1BB0-45EA-8309-DE9D7C9D1DB5" = {
"BB49DFC7-069E-46D8-B998-EFB77658E5A2" = testtest;
symbolID = "ADCB6E13-3EAC-4159-9991-501017FFBBC8";
};
"98CEA3B9-61AE-4756-A858-CC8096E957D6" = {
symbolID = "CF9A2621-1462-4803-B6C0-D498EDFDAF5B";
// シンボルをオーバーライドで選択してる時は、symbolIDが表示される、デフォルトのままで、シンボルを変更してない場合は、表示されないので注意
};
}
シンボルから、オブジェクトIDのオブジェクトを取得
// targetは、MSSymbolInstance
// layers関数があるオブジェクトなら使えるはず
function findObjectByObjectId(target, objectId) {
var layers = target.layers();
var count = layers.count();
for (var i = 0; i < count; i++) {
var layer = layers[i];
if (layer.objectID() == objectId) {
return layer;
}
if (typeof layer.layers == 'function') {
var rtn = findObjectByObjectId(layer, objectId);
if (rtn) return rtn;
}
}
return null;
}
シンボルから、オーバーライドしたオブジェクト名を表示
// symbolは、MSSymbolInstance
var document = require('sketch/dom').getSelectedDocument();
var overrides = symbol.overrides();
for (var key in overrides) {
var items = overrides[key];
if (items['symbolID']) {
var selectedSymbol = document.getSymbolMasterWithID(items['symbolID']);
for (var ikey in items) {
if ('symbolID' != ikey) {
var overrideObj = findObjectByObjectId(selectedSymbol._object, ikey);
log('name:' + overrideObj.name());
}
}
} else {
if (Array.isArray(items)) {
for (var ikey in items) {
var overrideObj = findObjectByObjectId(symbol.symbolMaster(), ikey);
log('name:' + overrideObj.name());
}
} else {
var overrideObj = findObjectByObjectId(symbol.symbolMaster(), key);
log('name:' + overrideObj.name());
}
}
}