Sketchup提供了两套API:

  • C API,主要用于读写SU文件。我们的SU文件导入功能就是用这套API做的

  • Ruby API,用于开发SU插件

这次我们主要关注Ruby API,因为它是实现更丰富的SU扩展功能的主要方式

不得不承认Sketchup的Ruby API开发文档相对于React,或是Inventor/Revit这些都太不友好了。不过从这篇文档开始我们还是能按图索骥,找到门径。

如果不想读这篇文档,那么也可以遵循如下步骤:

  1. 去Github把官方tutorial教程项目clone下来

  2. clone下来之后,直接把tutorial里面的rb源文件拷贝到Sketchup的Plugins目录(e.g. C:\Users\kzhan\AppData\Roaming\SketchUp\SketchUp 2018\SketchUp\Plugins),重启SU,就可以执行tutorial里面的插件了

      ==》  

  3. 用VS code把官方tutorial项目打开,阅读代码。代码里有详细的注释,解释了插件代码要怎么写

    1. 代码全都是Ruby的,但我觉得也没必要再专门去学Ruby语言了。对着代码看,大部分还是能理解意思。遇到不熟悉的语法可以查Ruby官方文档  以及SU的 Ruby API文档

    2. 个人查阅过,觉得值得了解的Ruby语法知识点有:

       Ruby Syntax
      1. Ruby的方法名可以包含!,?这些标点符号。包含!的方法名一般表示这是一个“危险”的操作,包含?的方法名一般表示它会return一个boolean。注意这些是coding convention而不是编译要求

      2. Ruby有unless语句,unless [condition] then 中,condition为false,then后面的语句才会执行。且 unless和if 都可以放到待执行表达式的后面,如 a += 1 if a.zero

      3. Sketchup::InputPoint.new, Sketchup是module name,InputPoint是class name,此语句new了一个InputPoint对象

      4. Ruby调用一个方法时,如果不带参数,则方法后的括号可以省略。e.g. my_method()也可写成my_method

      5. 以$开头的变量名是全局变量,以@开头的变量名是类的成员变量(instance variable),以@@开头的变量名是类的静态成员变量(class variable)

  4. 可以先阅读tut_hello_cube的代码和注释。这是一个Hello World级别的插件,执行插件命令后直接在世界坐标系原点处生成一个立方体

  5. 接下来阅读tut_custom_tool,这是一个实现了和SU原生的“画直线”命令相同功能的插件。这才是我们真正需要了解的东西

从tut_custom_tool的程序结构看,SU插件和Inventor/Revit插件的程序结构其实很相似。它要定义一个custom tool的类,然后实现activate/deactivate/onCancle/onMouseMove/onLButtonDown等方法,在这些方法里实现业务逻辑

从tut_custom_tool的调用的API来看,SU Ruby API还是提供了相当丰富的、封装层次较高的基础设施,包括:

  1. 交互操作工具类。如InputPoint类,可完成从屏幕上交互拾取一个点的功能。其pick方法的输入参数还可打开“本次拾取的点与上次拾取的点的连线与坐标轴平行吸附“这样的高级功能。打开后,我们的插件画线工具和原生画直线工具一样,可以红/绿/蓝灯不同颜色的虚线,表示此时推断的连线和哪个坐标轴平行。而这样的交互能力的获取,只需要在调用API时传入一个参数即可

  2. 几何造型工具类。如Sketchup.active_model.active_entities.add_line,根据拾取的点在模型上加边;edge.find_faces,用于根据刚加好的边生成面

  3. 实现undo/redo管理util,如start_operation/commit_opeation等

  4. 视图操作util,如view.tool_tip, Sketchup.status_text, view.invalidate 等直接修改/更新视图对象的方法

感觉按照这样的API能力,SU Ruby API也和Onshape的FeatureScript一样,可以将其原生的建模功能完全用API重写一遍。

最新文章

  1. Statement对象的executeUpdate返回信息
  2. 供销大集-JS修改
  3. Linux工具入门:make工具与Makefile文件
  4. Linux下Steam中支持中文的办法
  5. 常用数据存储集合与Map
  6. Let's Encrypt 正式出發(免费HTTPS证书即将到来)
  7. 2016 - 1- 19 利用多线程优化从网上加载图片的Demo
  8. 记一次 java程序优化
  9. HDOJ 1561 - 树形DP,泛化背包
  10. 搭建Hadoop集群 (二)
  11. 【HNOI2002】【矩阵快速幂】公交车路线
  12. linux架构师之路!
  13. webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
  14. 抽象代数-p22商群
  15. RDD特性
  16. R12.2常用手册
  17. Xamarin.Android 调用手机拍照功能
  18. python 同时运行两个程序
  19. [转][CentOS]开机时
  20. Win32动态链接库和MFC 动态链接库

热门文章

  1. Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.212.el6_10.3.x86_64
  2. 第19届亚太零售商大会 | 奇点云CEO行在受邀出席发表演讲
  3. 关于MyBatis的运行原理(转载)
  4. JVM如何判断对象能否被回收
  5. Jmeter之压力测试总结
  6. linux中用户和用户组的概念以及查看命令
  7. docker pull很慢解决办法
  8. 吴裕雄--天生自然HTML学习笔记:HTML 文本格式化
  9. 吴裕雄--天生自然 R语言开发学习:图形初阶(续二)
  10. 在腾讯云服务器上安装JDK+Tomcat并启动tomcat