sketch是什么?

Sketch是 Mac系统才有的软件,可以理解为精简版的PS ,比PS更适合 UI设计,Sketch 插件开发的语言是类Javascript ,而 Sketchup是一款三维建模软件,一般用于建筑设计、景观设计还有游戏场景设计等,插件开发是用的 ruby语言。完成 sketch的插件开发指南这个系列,我也会开始写Sketchup插件开发指南

sketch的主要对象

所有的关于 sketch对象的操作,都是通过 context 来的。contextdocument 对象,oc 对应的是 MSDocument 对象 。可以通过 log 命令打印出来查看

var doc = context.document,
plugin = context.plugin,
command = context.command,
page = doc.currentPage(),
artboards = page.artboards(),
selectedArtboard = page.currentArtboard(),// 当前被选择的画板
selection = context.selection; // 被选择的图层
console.log(doc);

Context

当输入插件定制的命令时,Sketch 会去寻找该命令对应的实现函数, 并传入 context 变量。context包含以下变量

  • command: MSPluginCommand 对象,当前执行命令
  • document: MSDocument 对象 ,当前文档
  • plugin: MSPluginBundle 对象,当前的插件 bundle,包含当前运行的脚本
  • scriptPath: NSString 当前执行脚本的绝对路径
  • scriptURL: 当前执行脚本的绝对路径,跟 **scriptPath **不同的是它是个 NSURL 对象
  • selection: 一个 NSArray 对象,包含了当前选择的所有图层。数组中的每一个元素都是 MSLayer 对象

Sketch分析

sketch是用Objective-C构建的。sketch官方针对 Sketch Native API 封装了一套 JS API,目前还未涵盖所有场景,比如UI界面、组件拖放等,若需要更丰富的底层 API 需结合 CocoaScript 进行实现

OC是一种通用、高级、面向对象的语言,是C语言的严格超集,广泛用于IOS开发。

CocoaScript 是一种bridge,实现 JavaScript 运行环境到 Objective-C运行时的桥接功能,可通过桥接器编写 JavaScript 外部脚本访问内部 Sketch API 和 macOS 框架(AppKit)底层丰富的 API 功能。

AppKit是为macOS应用程序构建和管理事件驱动的图形用户界面

技术实现

UI层:采用Webview实现可以使用各种前端开发框架,比如React或者Vue等

逻辑层:负责调用sketch API 通过CocoaScript Bridge进行通信

可以通过一张图看下整个流程:

sketch插件

  1. Sketch 插件是按照特定方式管理的一个文件夹,包含一个或多个 scripts,每个 script 含有若干扩展 Sketch 用途的命令
  2. 插件主要使用 Javascript 语言编写,支持 ES6 语法,但运行环境既不是浏览器也不是 Nodejs,而是 Hybrid SketchAPI for macOS Native 运行环境

sketch官方API

Actions API

该API用于监听用户操作行为而触发事件,例如 OpenDocumen(打开文档)、CloseDocument(关闭文档)、Shutdown(关闭插件)、TextChanged(文本变化)、TogglePresentationMode等。该API未来会被新的 Events API 替代。它代表了 Sketch App 内部触发的事件。具体可以参考官方文档:https://developer.sketch.com/reference/action/

  1. 订阅 Actions

    manifest.json 文件,配置相应 handlers

    "commands" : [ ... {   "script" : "action.js", "name" : "Action",  "handlers" : {    "actions": {  "OpenDocument": "onOpenDocument"    }   },  "identifier" : "my-plugin.my-command-identifier"    }   ... ]// action.js
    export function onOpenDocument(context) {   context.actionContext.document.showMessage('Document Opened')
    }
    
  2. Action Context

    Action事件会将context.actionContext 传递给handler。有些Action包含两个状态,begin和finished,比如SelectionChanged 。需分别订阅 SelectionChanged.begin 和 SelectionChanged.finished,否则会触发两次事件。

    不知道应该订阅哪个 Action 时,可以使用通配符。但运行时性能开销很大,建议仅在开发阶段使用

    // 终端打开通配符支持
    defaults write com.bohemiancoding.sketch3 actionWildcardsAllowed -bool YES// manifest.json 文件配置通配符
    {   ... "handlers": { "actions": {  "*": "onActionHandler"  }   }   ...
    }
    

Javascript API

是针对 Native API 的封装,目前还未涵盖所有场景,官方承诺未来将覆盖90%。具体可以看官方文档:https://developer.sketch.com/reference/api/

Sketch插件开发大概有如下三种方式:

  1. 纯使用 CocoaScript 脚本进行开发
  2. 通过 Javascript + CocoaScript 的混合开发模式
  3. 通过 AppKit + Objective-C 进行开发

官方建议使用 JavaScript API 编写 Sketch 插件,且官方针对 Sketch Native API 封装了一套 JS API ,目前还未涵盖所有场景, 若需要更丰富的底层 API 需结合 CocoaScript 进行实现。通过 JS API 可以很方便的对 Sketch 中 DocumentArtboardGroupLayer 进行相关操作以及导入导出等,不过可能需要考虑兼容性.

原理

CocoaScript

实现 JavaScript 运行环境到 Objective-C 运行时的桥接功能,可通过桥接器编写 JavaScript 外部脚本访问内部 Sketch API 和 macOS 框架底层丰富的 API 功能。

借助CocoaScript使用JavaScript调Objective-C 语法:

  • 方法调用用 ‘.’ 语法
  • Objective-C 属性设置
    • Getter: object.name()
    • Setter: object.setName('Sketch')object.name='sketch'
  • 参数都放在 ‘ ( ) ’ 里
  • Objective-C中 ’ : '(参数与函数名分割符) 转换为 ’ _ ',最后一个下划线是可选的
  • 返回值,JavaScript 统一用 var/const/let 设置类型

开发环境

Skpm

是一个打包工具,用于快速上手插件开发。它基于 webpack,项目根目录下存放 webpack.skpm.config.js, 用于工程配置修改

Dialog控件

skpm提供了一些供 JavaScript 调用的Native 控件,比如Dialog

import dialog from '@skpm/dialog'
console.log(    dialog.showOpenDialog({ properties: ['openFile', 'openDirectory', 'multiSelections']  })
)

代码调试

  1. Safari 浏览器开发工具可用于插件的 Javascript 代码调试。

    Developer > name of your machine > Automatically Show Web Inspector for JSContexts

    同时启用选项 Automatically Pause Connecting to JSContext

Objective-C Classes

Sketch 对外暴露了全部内部方法的调用权限,其 Objective-C 类 通过 Bridge 提供 Javascript API 调用。

Sketch 插件系统可以完全访问应用程序的内部结构和 macOS 中的核心框架。Sketch 是用 Objective-C 构建的,其 Objective-C 类通过 Bridge (CocoaScript/mocha) 提供 Javascript API 调用,简单的了解 Sketch 暴露的相关类以及类方法,对开发插件非常有帮助。

GUI

  1. 插件GUI的实现

    skpm 提供了已封装好的基于 WKWebView 的 sketch-module-web-view,其 API 设计接近 Electron,具体见GitHub。

    https://github.com/skpm/sketch-module-web-view/blob/master/docs/browser-window.md

  2. CocoaScript GUI

    Sketch 插件通过 Mohca / CocoaScript 连接到 Objective-C / Cocoa。Javascript 调用 Objective-C 方法,需要将方法名的冒号改为下划线,所有 selector 连接成一个连续的字符串。

    打开文件对话框,使用 Appkit NSOpenPanel,详细官方文档见:https://developer.apple.com/documentation/appkit/nsopenpanel?language=objc

  3. Native GUI

  4. WebView GUI

    Webview与Plugin之间需要实现双向通讯互操作。Webview通过 WKWebView delegates向Plugin发送消息,Plugin则通过webView.evaluateJavaScript_completionHandler() 触发Webview执行Javascript代码

可以做什么?

  1. 根据复杂的规则选择文档中的图层
  2. 操作图层属性
  3. 以所有支持的格式导出资产
  4. 与用户交互(要求输入,显示输出)
  5. 从外部文件和Web服务获取数据
  6. 与剪贴板交互
  7. 操作Sketch的环境(编辑指南,缩放等…)
  8. 通过从插件调用菜单选项来自动化现有功能
  9. 设计规格
  10. 内容生成
  11. 透视转换

webview

Sketch模块,用于使用webview创建复杂的UI。不用于一般的插件页面,可以使用webview模块加载一个复杂的Web应用,使其与Sketch进行交互。

BrowserWindow

// 在浏览器窗口中创建和控制Sketch
// plugin插件中
const BrowserWindow = require('sketch-module-web-view')let win = new BrowserWindow({ width: 800, height: 600 })
win.on('closed', () => {win = null
})// 加载远程url
win.loadURL('https://github.com')// 或者是加载本地文件
win.loadURL(require('./index.html'))

webContents

const BrowserWindow = require('sketch-module-web-view')
let win = new BrowserWindow({ width: 800, height: 1500 })
win.loadURL('http://github.com')
let contents = win.webContents
console.log(contents)

sketch和webview通信

1. 从plugin命令向WebView发送消息// webview中
window.someGlobalFunctionDefinedInTheWebview = function(arg) {console.log(arg)
}
// 插件中
browserWindow.webContents.executeJavaScript('someGlobalFunctionDefinedInTheWebview("hello")').then(res => {// do somethingconsole.loh(res);})2.从WebView向插件发送消息// 插件中
var sketch = require('sketch')
browserWindow.webContents.on('nativeLog', function(s) {sketch.UI.message(s)
})// webview中
window.postMessage('nativeLog', 'Called from the webview')// 传递单个参数
window.postMessage('nativeLog', {a: b,
})// 传递多个参数
window.postMessage('nativeLog', 1, 2, 3)

相关网址

  • sketch-module-web-view:https://github.com/skpm/sketch-module-web-view
  • Sketch-dev-tools:https://github.com/skpm/sketch-dev-tools

参考网址:

https://mp.weixin.qq.com/s/8Am4AD-qzO57W3XKx22ytQ?

https://mp.weixin.qq.com/s/pZx7nqYNjG9_7U0yVjqOjw?

https://juejin.cn/post/6844903984491134990 (非常详细)

https://github.com/mathieudutour/git-sketch-plugin (git客户端内置到sketch中)

https://blog.csdn.net/nx2xjbur4jg8ef80l1k/article/details/92854864

https://github.com/sketch-hq/SketchAPI/tree/develop/examples (sketch插件demo集合)

https://www.cnblogs.com/jingwhale/p/10520149.html

浅谈sketch插件二相关推荐

  1. catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文

    浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文 一.概述 单排四点接触球转盘轴承是一种能够同时承受较大轴向负荷.径向负荷和倾覆力矩等综合载荷,集支承.旋转.传动.固定等多种功能于一身的特殊 ...

  2. 浅谈sketch插件开发(三)

    sketch是什么? sketch是一款用来制作矢量绘图的软件,矢量绘图也是进行网页,图标以及界面设计的最好方式.但除了矢量编辑的功能之外,sketch同样添加了一些基本的位图工具,比如模糊和色彩校正 ...

  3. 浅谈领导力之二 - 授权与放权

    前文回顾 浅谈关于领导力之一 - 识人之能 我见过非常多优秀的草根创业者,能力极为出众,自己可以搞定很多事情,但是做公司却很难做大,很多人卡在这个环节上,经常抱怨,没有人才啊,你看招来的都笨死了,是的 ...

  4. [转]浅谈浏览器插件检测 和自定义协议的支持

    前一阵子一直在折腾浏览器的插件检测和自定义协议的支持. 经过种种痛苦的折腾,算是对这一领域有了点浅显的认知.特此记录一下 一.背景知识 自定义协议:常用的协议有 http:// https://  f ...

  5. 浅谈通信编程(二)--如何分离通信物理接口和应用程序

    如何分离通信物理接口和应用程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  6. 浅谈python_浅谈Python(二)

    一.Python算术运算符 以下假设变量a为10,变量b为21: 运算符描述实例 + 加 -- 两个对象相加 a + b 输出结果 31 - 减 -- 得到负数或是一个数减去另一个数 a - b 输出 ...

  7. hdfs安全模式退出_浅谈HDFS(二)之NameNode与SecondaryNameNode

    NN与2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 假设存储在NameNode节点的硬盘中,因为经常需要随机访问和响应客户请求,必然效率太低,所以是存储在内存中的 但是,如果存储在 ...

  8. 浅谈数据库设计二三事

    作为程序员,程序设计前的数据库设计非常重要,这将直接关系到紧接着的代码编写工作,这里谈谈有关数据库设计过程中的一些细节问题. 一.数据表主键的字段选择(ID,Code,Number) ID(编号)一般 ...

  9. 浅谈分页插件PageHelper

    前言: PageHelper是一款开源免费的Mybatis第三方物理分页插件.所谓物理分页,也就是每次都会根据要查询的参数去对应的数据库进行查询,真正实现了按需动态查询.逻辑分页,一般是指一次性查询所 ...

最新文章

  1. libc.so.6 is needed by mysql_libc.so.6(GLIBC_2.14)(64bit) is needed by…问题的解决办法
  2. flash里alert
  3. jquery页面加载的时候加载函数
  4. 18.IDA-创建自己的sig
  5. CVE-2019-2725复现(从环境搭建到getshell)
  6. [机器学习-Sklearn]K-means(K均值)学习与总结
  7. PLSQL_案例优化系列_明白索引是如何让SQL运行飞快(案例5)
  8. python变量类型字符串的内建函数使用
  9. Java小游戏之飞翔的小鸟
  10. python27的Windows下环境搭建
  11. 破解wifi时遇到rtl8187 - [phy1]SIOCSIFFLAGS: Name not unique on network
  12. Multisim卸载删除经历(已重新安装)
  13. dimm和udimm_服务器内存UDIMM与RDIMM区别
  14. cocos2dx游戏-可爱的小精灵的各种用法大全
  15. SpringBoot引入Dubbo问题解析
  16. Version 28 (intended for Android Pie and below) is the last version of the legacy support library, s
  17. 使用神器you-get获取萧大bilibili课程视频
  18. [python] 分治法查找数组元素的最大值和最小值
  19. 桌面计算机找不到硬盘,电脑BIOS启动项找不到硬盘,该怎么办?
  20. 如何用matlab拟合二元函数,怎么拟合二元函数?用什么软件比较容易实现?

热门文章

  1. 空间分辨率和灰度分辨率
  2. jpress连接数据库mysql_通过Tomcat jpress连接不到数据库
  3. pgsql 后台回复数据
  4. 『TensorFlow』pad图片
  5. E-R图、N-S图、PAD图、程序流程图
  6. 手机移动端WEB资源整合
  7. linux磁盘所有格式化命令,Linux磁盘格式化命令的详细说明
  8. 前端基础学习-element-ui表格表头做成斜线表头
  9. 为什么应该学好软件工程?
  10. 微型计算机电路试卷,微机原理试卷及答案2