2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Sketchプラグイン メモ

Last updated at Posted at 2018-04-03

選択アートボードのデータを吐き出すプラグインを作るためのメモ
自分用です

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());
    }
  }
}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?