Sketchup用ruby进行二次开发--利用Transformation实现Move工具(平移、旋转和缩放)

 

在Sketchup中,move工具使用的非常广泛,,可以移动、拉伸和复制几何体,也可以用来旋转组件。举一个简单地例子。

我们要做一个建筑物的尖顶,如下图所示,就是使用move工具实现的。

             

    接下来我们就要学习如何使用ruby实现这样的功能。

    实体类(Entities)提供了transform_entities方法来实现move的功能,transform_entities需要两个参数,一个或一系列实体对象和一个变换对象(Transformation)。

    例如,上图中屋顶中间的线我们叫做roof_line,下面的代码实现把这条线沿着Z轴网上移动5个单位(英寸)。

ents = Sketchup.active_model.entities
tr = Geom::Transformation.translation [0, 0, 5]
ents.transform_entities tr, roof_line
    在第二行,前缀“Geom::”是必须的,这是因为Transformation类包含于Geom模型,这在接下来的章节中会介绍它是如何使用的。在这个例子中,tr是一个transformation对象,用于把roof_line从一个位置移动到另一个位置。
    transformation可以实现平移、旋转和缩放。

    1、平移

    在讲平移之前,我们要先了解一个概念,平移向量。我们在高中学习过,从一个点移动到另一个点,如从点(1,2,3)移动到点(3,4,5),只需要知道起点和移动向量就能到达终点,这个移动向量是用终点坐标减去起点坐标,即向量(2,2,2)。这里的平移向量类似于移动向量。

    SketchUp API提供了三种方法来实现平移动能。

    调用Geom::Transformation.new
    调用Geom::Transformation.translation
    使用平移向量本身。
    下面用一个例子演示如何使用这三种方法,这个例子是将一个面移动三次,首先沿着X轴正向移动4个单位,然后Y轴正向6个单位,最后沿X轴负向移动3个单位。

# 创建一个正方形面
ents = Sketchup.active_model.entities
tran_face = ents.add_face [-1, -1, 0],
[-1, 1, 0], [1, 1, 0], [1, -1, 0]
# T沿着X轴正向移动4个单位
t = Geom::Transformation.new [4, 0, 0]
ents.transform_entities t, tran_face
# Y轴正向6个单位
t = Geom::Transformation.new [0, 6, 0]
ents.transform_entities t, tran_face
# X轴负向移动3个单位
ents.transform_entities [-3, 0, 0], tran_face

    移动路径如下图所示。
    

    2、旋转

    去旋转一个图形,我们需要三个参数。

旋转起源点(点)
旋转轴(向量)
旋转角度(浮点型)
看下图更有助于理解。

    系统提供两种方法用Transformation对象实现旋转功能

调用Geom::Transformation.new 和起源点、旋转轴和角度参数
调用Geom::Transformation.rotation和起源点、旋转轴和角度参数
    例如,要实现上图把圆围绕(0,0,0)和Z轴旋转30度,代码写为:

        tr = Geom::Transformation.new [0, 0, 0], [0, 0, 1], 30.degrees
        tr = Geom::Transformation.rotation [0, 0, 0], [0, 0, 1], 30.degrees

另外需要注意的是如果旋转角度是正值,则按‘逆时钟方向’旋转,如果是负值,就按顺时针方向旋转。

    3、缩放
    在Sketchup中,缩放工具可以改变图形的大小形状和改变图形的位置。在用代码实现时,我们创建的缩放Transformation对象即会缩放图形的大小也会缩放相对于默认点(0,0,0)的距离,例如下面的代码缩小了图形的大小,也减小了到(0,0,0)的距离。

#创建一个正方形
ents = Sketchup.active_model.entities
 
tran_face = ents.add_face [-1, -1, 0],
[-1, 1, 0], [1, 1, 0], [1, -1, 0]
#沿X轴正向移动4个单位
t = Geom::Transformation.new [4, 0, 0]
 
ents.transform_entities t, tran_face
#把正方形缩放为原来的一半,即改变形状也改变距原点的长度
t = Geom::Transformation.new 0.5
 
ents.transform_entities t, tran_face

    效果如下图所示


    实现缩放功能还可以用如下代码,效果跟上面的一样。

ents = Sketchup.active_model.entities
t = Geom::Transformation.scaling 0.5
ents.transform_entities t, shape
    除此之外,我们还可以改变默认缩放的源点,即上面的(0,0,0)。例如,下面的代码实现把图形放大2倍并把源点变为(5,5,5),相信在以后的应用中,这种写法会比较常见。
t = Geom::Transformation.scaling [5, 5, 5], 2

    上面介绍了改变源点进行缩放,下面我们介绍一下如何基于坐标轴进行缩放。
    为实现基于坐标轴缩放,需要调用Transformation.scaling结合三个参数,即X,Y,Z所缩放值,例如,下面代码实现减小X轴的一半,扩大Y轴的3倍,保持Z轴不变。

t = Geom::Transformation.scaling 0.5, 3, 1

示意图为


scaling最后一种用法是结合以上三种,即,改变源点和x,y,z的缩放值,例如,设置源点为(5,5,5),相对于源点,实现减小X轴的一半,扩大Y轴的3倍,保持Z轴不变代码如下。

t = Geom::Transformation.scaling [5, 5, 5], 0.5, 3, 1

总结:

在本节中我们实现了平移、旋转和缩放功能,下一节中我将简单介绍将三种方法结合使用。
————————————————
版权声明:本文为CSDN博主「李涛_华电」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/litaosdau/article/details/38611081

你可能感兴趣的:(插件)