Skip to content

Instantly share code, notes, and snippets.

@matt-curtis
Last active December 3, 2015 16:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matt-curtis/16cefd064fc7a3613e99 to your computer and use it in GitHub Desktop.
Save matt-curtis/16cefd064fc7a3613e99 to your computer and use it in GitHub Desktop.
(Sketch) Convert a shape layer to a marquee. Select both bitmap and shape layer and run the plugin.
var document = context.document;
// Find first bitmap and shape in selection
var bitmapLayer = document.selectedLayersOfClass(MSBitmapLayer)[0];
if(!bitmapLayer) return;
var shapeLayer = document.selectedLayersOfClass(MSShapeGroup)[0];
if(!shapeLayer) return;
// Info
var bezierPath = shapeLayer.bezierPath().copy();
var bezierBounds = bezierPath.bounds();
var absoluteBitmapFrame = bitmapLayer.absoluteRect();
var absoluteShapeFrame = shapeLayer.absoluteRect();
// Reset 'bounds' of bezier to 0,0
var originResetTransform = NSAffineTransform.new();
originResetTransform.translateXBy_yBy_(-bezierBounds.origin.x, -bezierBounds.origin.y);
bezierPath.transformUsingAffineTransform(originResetTransform);
// Offset bezier so paths line up
var xDiff = absoluteShapeFrame.x() - absoluteBitmapFrame.x();
var yDiff = absoluteShapeFrame.y() - absoluteBitmapFrame.y();
var transform = NSAffineTransform.new();
transform.translateXBy_yBy_(xDiff, yDiff);
bezierPath.transformUsingAffineTransform(transform);
// Enter edit mode for this bitmap
document.setSelectedLayers([ bitmapLayer ]); // layer list inspector does not update :(
document.actionsController().actions()["MSEditAction"].edit(null);
// Bitmap marquee selection = shape layer's path
var currentHandler = context.document.currentHandler(); // MSBitmapEditEventHandler
currentHandler.accumulatedSelection = bezierPath;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment