分享

在PowerPoint里实现3D模型对象的复位——兼谈方法和属性的区别

 遇见数学 2022-04-13

一、基本功能的实现

上一篇文章中,细心的朋友可以看到幻灯片页面里有个“初始化”按钮,怎么实现呢?有人会说,既然上一篇文章里讲到多次撤销,那么只要一步步退回到最初的状态不就可以了?这样执行起来会很慢的,但是我们可以这样编程:

Public Sub Init()
    With ActivePresentation.Slides(1).Shapes(2).Model3D
       .RotationX=0
       .RotationY=0
       .RotationZ=0
    End With
    str_3D = ""
End Sub

二、方法和属性的基本区别

大家可以看出,这里用到的是 RotationX 等“属性”,而非前面所用到的 IncrementRotationX 等“方法”。二者的区别是:属性一般被看作和对象有关的一个值,可以进行设置,也可以进行读取,而方法被看作是对于对象的一个操作。比如某个现实中的学生,对他进行升留级操作是“方法”,而他所属的年级则是这个学生的“属性”,“升级”这个操作对应着年级值加1;“迁户口”是一个方法,“户籍所在地”是一个属性(当给某学生执行了一个方法之后往往也就相当于设置了对应的属性)。也就是说,方法名往往是动词,而属性名则是名词。一般来说,往往用下面的语句给属性赋值(如果属性值是对象,下面语句开头要有Set关键字):

对象名.属性(参数)=值

要把属性值赋给某个变量,则用下面的语句:

变量名=对象名.属性(参数)

而要使用方法,则只能采用下面的语句(其中参数没有括号):

对象名.方法 参数

根据不同的属性和方法,其后的参数可能是一个、多个或没有(本例里方法的后面有一个参数,属性的后面没有参数)。

不同的编程语言,对于方法和属性的实现不同,对于二者的“偏好”亦不同,比如有的语言推荐即使是访问对象的属性,也用方法来实现:以对象的坐标属性(X、Y)来说,读取其坐标用 getX 和 getY 方法,设置坐标用 setX、setY 方法或者 Move 方法(多数情况下 set 方法和 get 方法总是对应的)。用方法的好处是隔离了全局变量和内部变量,同时方法内部可以写程序实现各种功能,而不是只提供一个简单的变量。请读者注意,这一段针对的不是 VBA。

三、IncrementRotationX 方法和 RotationX 属性的区别

具体到本文的例子,就我个人的体会,这二者(对应的还有 IncrementRotationY 方法和RotationY 属性,以及 IncrementRotationZ 方法和 RotationZ 属性)还有两个区别:

首先,前者的参数是“变化量”,也就是“变化了多少”,在代码里直接写好旋转角度(比如例子里的正负5)后执行一次代码就旋转一下,后者是“变化到多少”,如果固定了旋转角度的话,只有第一次执行代码才会旋转,这是最明显的差别,也是一般资料里提到的差异。大家可以想一下如何通过设置RotationX等属性实现多次旋转。

其次,前者的坐标系是固定在 3D 模型对象上的,随着对象的旋转,坐标轴也在旋转,执行效果和执行顺序有关,后者的坐标系是不变的,执行效果和执行顺序无关。如果用物理上的概念来比喻,前者好像是“质心坐标系”,后者好像是“实验室坐标系”。至于我这么理解对不对,就请读者来检验了。如果大家有更好的解释,也欢迎留言。

PS:下面三个图,左图是该模型对象初始位置的视图,缺口在右上靠前方,中间的是利用方法来实现的绕三个轴各转 30 度,右边是利用属性实现绕三个轴各转 30 度(中图和右图是对相同初始位置的 3D 对象分别执行后的效果,先执行完 r1 过程得到中图,复位后再执行 r2 过程得到右图):

Public Sub r1()   '执行效果如中图
    With ActivePresentation.Slides(1).Shapes(2).Model3D
       .IncrementRotationX 30
       .IncrementRotationY 30
       .IncrementRotationZ 30
    End With
End Sub

Public Sub r2()   '
执行效果如右图
    With ActivePresentation.Slides(1).Shapes(2).Model3D
       .RotationX = 30
       .RotationY = 30
       .RotationZ = 30
    End With
End Sub

(读者可以看到这个系列里程序文本的颜色有点怪,是因为我们虽然写的是VBA代码,但是公众号提供的代码格式却是基于Java的,这只影响程序在公众号里的观感,不影响实际执行效果)

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多