🌓
搜索
 找回密码
 立即注册

【SU Ruby教程】这一课从立方体开始

admin 2022-9-12 19:42:23 89728

这篇文章是SketchUp Ruby教程的第二篇,将介绍如何在SU的Ruby控制台中通过编写代码在SU中绘制一个立方体,并以这样一个例子展开提出三个问题,引出一些基础的操作技巧,包括Entities容器类的简要介绍、默认单位的注意事项和方法参数错误的返回判读。


第一部分:使用Ruby绘制单元立方体


第①步:一切如常,打开SketchUp,在“窗口”菜单中选择“Ruby控制台”。


第②步:在Ruby控制台中逐行输入以下代码,每一行使用回车键结尾:

ents=Sketchup.active_model.entitiese1=ents.add_line [0,0,0],[0,1,0]e2=ents.add_line [1,1,0],[0,1,0]e3=ents.add_line [1,1,0],[1,0,0]e4=ents.add_line [0,0,0],[1,0,0]f=ents.add_face e1,e2,e3,e4res=f.pushpull 1g=ents.add_group f.all_connected


之后就可以看到SU绘图区发生如下的变化:



第二部分:对生成立方体代码的解读


第1行在上一篇已经解释过,是一种类似于定义简写的方法。第2行到第5行文意上十分的直观,就是分别创建四条规定了起讫点坐标的边线,并且把生成的边线用最前面的标识符(“e1” ~ “e4”)来表示以便之后的代码使用。第6行根据给定的前四条边线生成一个平面,并且将生成的平面用标识符“f”来表示。第7行将“f”表示的平面进行推拉操作,推拉的高度也是单位长度,得到上图第三个状态,并将这个过程的返回结果存入“res”。


最后一行稍微复杂一些,这是一个生成群组的方法,并且将新创建的群组结果返回到“group”之中,但是这个方法的参数却不是一个直观的内容——“f.all_connected”。也就是说ents.add_group方法使用的参数是f.all_connected的返回结果,也就是说这一行可以改写为如下形式:

arr=f.all_connectedg=ents.add_group arr#这里arr是一个数组类型

而.all_connected是所有图元实体都具有的方法,其含义为返回一个图元数组,数组中包含“给定图元以及所有与给定图元相连的图元”,所以说在这里返回的数组中所包含的图元和直接对着“给定图元”连续点击鼠标三下所选择的图元是一样的。所以第一部分的最后一行含义就很明显了,即:将所有与“f”平面向量的图元打包生成一个群组。


第三部分:在立方体的基础上继续追问


第①问:现在SU模型有几个实体?

要回答这个问题首先要知道如何用ruby表示模型中的实体,之前都是直接使用预先预留好的标识符,那么如果标识符丢失或者被遗忘,要如何访问它们呢?上一篇介绍过使用.methods方法可以查看一个对象可使用的方法。使用ents.methods之后可以看到下图这些方法。



其中醒目的标注了“length”,“size”和“[]”这样的一些方法,如果有过一点编程经历应该可以强烈地感觉到ents应该是一个数组。尝试一下以下代码:

ents.lengthents.countents.sizeents[0].typenameents[0]==gents[0].entitiesents[0].entities.length


如果刚刚的代码之后没有任何的修改,前三个的结果应该都是1,它们都表示SU模型中有几个图元,也就是为一个一个立方体群组。所以不出所料,第4行的返回结果是“Group”,第5行的结果是true。这两个结果都表明唯一的图元实体的类型是群组,并且正式刚刚创建的。


但是刚刚创建的线条和平面不是图元吗?不应该也能在模型中找到吗?不也可以编辑吗?是的。它们依然存在,但是并不在ents里了,而是在g里头。它们是g的附庸,但不是ents的附庸。尝试上面第6行和第7行的代码,群组g之下也有一个类似于ents的结构,而它的元素数量为18,一个正方体12条边线6个面,这不是巧合。


于是答案浮出水面,现在SU中有1个图元,这个图元中有18个图元,答案是1个或者是19个。


这里就需要多说一下,包括上一篇中的文本图元(Text)还有这一篇中出现的边线图元(Edge)、平面图元(Face)和群组图元(实体组,Group)以及其他种种,他们都是Entity类,可以翻译成“图元类”或者“实体类”。而ents是Entities类,也就是这些类的容器,可以被称之为容器类。它们在名称上是所装载类的复数形式,定义上是所承载类对象的数组。Sketchup.active_model中还有很多类似结构的定义,它们控制着图元实体、图层、组件定义、材质、视角页面和其他的一些选项,使用的方法与Entities类大同小异。


Sketchup.active_model类中的成员

(图片来自 Automatic SketchUp - Creating 3-D Models in Ruby,书中第44页)


第②问:这个立方体的面积是多少?

这个问题不需要ruby也可以解答,在图元信息中就可以看到群组的体积大小,并且它又是一个单位立方体,很容易得知它的体积是1。另外也可以通过“g.volume”来获取这个群组的体积。但是这三种方法得到的答案并不是一致的。经验判断的结果是1,而另外两个方法的答案是16387立方毫米:这就是这个问题的意义。


16387立方毫米 = 1立方英寸


这就是答案,所以之前的线段e1 ~ e4的长度并不是1mm或是别的公制单位长度,而是1英寸。那么如何使用毫米或者是米作为单位呢?可以尝试以下代码:

ents=Sketchup.active_model.entitiese5=ents.add_line [0,0,0],[0,1000.mm,0]e6=ents.add_line [1000.mm,1000.mm,0],[0,1000.mm,0]e7=ents.add_line [1000.mm,1000.mm,0],[1000.mm,0,0]e8=ents.add_line [0,0,0],[1000.mm,0,0]f2=ents.add_face e1,e2,e3,e4res2=f.pushpull 1000.mmg2=ents.add_group f.all_connected


这样就可以绘制一个1立方米的正方体了。这里的.mm看上去像是一种单位表达方式,实则是一个方法。是数字的一个方法,可以将任何一个数字除以25.4再返回。试试以下六种转换方式,会有进一步了解:

254.mm100.inch100.to_mm100.to_inch254.mm.to_inch100.inch.to_mm


第③问:如何确定方法需要什么参数

最后这个问题很重要,光通过.methods方法只能知道方法名,却不知道这个方法需要什么参数,返回什么对象,这样是很抓瞎的。


因此要能够看得懂ruby控制台返回的错误提示。在这里列出了几种可能出现的错误,并解释一下其言外之意,从前到后分别是:


错误提示
言外之意
错误的参数类型(需要Entity类只能将实体打组
数组元素数量不合要顶点坐标应该是二维或三维数组
不能将Face类强制转换成Float类需要的是Float类型(浮点数)
顶点数不够 - 至少需要两个
试探方法参数数量的好办法
所有实体需要在同一个父要素中
组内和组外的图元不能打组在一起


至于方法返回什么可以在调用方法之前加上“iden=”,就可以将结果储存在“iden”之中,随后用“iden.class”和“iden.methods”就可以了解这个返回类型了。还记得第一部分第7行的“res=”吗?如果输入“res.class”会返回NilClass,这表示这是一个空类,就是对象中的0的概念(但是数字0本身在ruby中也是对象),也就是说“.pushpull”方法并不会返回任何对象。


其实理解英文提示的本意就能够知晓了,更多的问题反而可能来自于ruby本身的语法错误或者对ruby数据类型的不熟悉,对于语法和数据类型,会在之后的教程中继续介绍。


懂得查看错误信息固然重要,但是这只是快捷的作法,最可靠的作法还是登录SketchUp官网的线上ruby文档,可以查看得到所有(各个版本的)方法及其参数。


SketchUp Ruby线上文档

(网址:https://ruby.sketchup.com)


最后依照惯例,放一个和本期内容有关并且有助于进一步理解的例子聊以消遣。

g.explode#炸开立方体群组g=add_group ents.to_a#使用to_a可以将容器类转换成数组,从而将整个模型打组g.explode#继续炸开立方体ents.add_group e1,[e2,e3],e4,[[f]]#这样同样可以打组#因为它等价于 ents.add_group (e1,[e2,e3],e4,[[f]]).flatten



扫一扫

109309.jpg

0 回复

高级模式
游客
返回顶部