| 
 | 
 
上一章节我们已经尝试在Python电池组里写基本代码。这一章我们介绍编程的一些基本语法和数据类型。 
变量与基本数据类型 
首先我们需要知道什么是变量。变量是用来存储数据的内存位置,分为不同的数据类型。Python的变量支持多种数据类型,在给变量赋值的时候,解释器会自动推断变量的数据类型。Python常见的数据类型有以下几种:整型int,浮点数float,字符串str,布尔值bool。除了这些基础数据类型之外,还有一些高级的数据结构,比如列表list,元组tuple,集合set和字典dict。在这里,我们先了解前面几种基础数据类型。其他地几种数据类型在之后会慢慢补充。 
首先是我们已经接触过的整数int,整数代表没有小数部分的数值,例如-1,-190,0,114115,这些都是整数,在python中整数没有最大限制,所以可以表示非常大的数。比如: 
x = 100 
y = -50 
 
a = x + y 
print(a)然后是浮点数float,浮点数表示具有小数部分的数值,例如0.1,-3.14以及2.0等。在Python中浮点数使用双精度,也就是64位比特。比如: 
f1 = 3.14 
f2 = 5 
 
f3 = f1 + f2 
print(f3)这里要注意的是,Python可以让整数和浮点数进行直接运算,Python会自动将数据转换成浮点数: 
x = 100 
f1 = 2.5 
 
a = x + f1 
print(a)第三钟数据类型是字符串str。字符串表示一系列的字符,比如字母、数字、空格和符号。在python中,需要用到双引号来表示字符串。比如我们想让变量word等于Hello, world。我们不能直接写成: 
word = Hello, world  #代码报错 
print(word)而是: 
word = "Hello, world" 
print(word)字符串之间也可以实现相加,比如: 
intro = "My name is " 
name = "Kun" 
 
sentence = intro + name 
print(sentence)但是字符串和数字不能直接相加,需要用str()将数字转换成字符串的数据类型再进行运算: 
year = 2.5 
word = "age" 
 
sentence = year + word  #这里会报错 
 
sentence = str(year) + word 
print(sentenct)第四种数据类型则是布尔型,用来表示真True或者假False的逻辑值,所以布尔值也只有True和False这两种。布尔类型常常用于条件判断和循环控制。给变量赋值布尔类型的方法很简单,就是True和False。或者还可以通过布尔运算来实现,这个我们马上会讲。 
bool_example_1 = True 
bool_example_2 = False 
运算符 
Python支持各种数据之间的算数、比较和逻辑运算符。那么以下是几种比较常见的算数运算的写法,分别是加法、减法、乘法、除法、取余、幂运算以及整除。以下是代码示例: 
a = 5 + 3 #加法 
b = 4 - 6 #减法 
c = 5 * 3 #乘法 
d = 8 / 5 #除法 
e = 8 % 3 #取余 
f = 5 ** 3 #幂运算 
g = 7 // 3 #整除加减乘除这个常规的四则运算就不说了,大家应该很清楚。然后取余、幂运算和整除这三个运算,大家可以试着用print命令把结果打出来。 
print(e,f,g)然后我们就知道,取余就是取8除以3的余数,3乘以2得6,6加2等于8,所以余2。幂运算也就是次方,f的意思就是5的三次方,5乘5等于25,25再乘5等于125。整除和取余刚好相反,得到的结果是能整除的部分不要余数。 
这里顺便说一下,用Python时我们要善于运用print命令来检查代码运行的过程,这对于我们梳理代码逻辑和debug十分重要。再一个就是Python里井号#之后的内容被视为注释,它不会对代码有任何影响,但是能给阅读代码的人起到很好的提示作用。 
然后我们说第二种运算符,比较运算符。比较运算一般用于比较大小关系,运算结果是布尔型。最常见的当然是大于、小于和等于,还有大于等于、小于等于和不等于。如果两个变量符合比较运算符的逻辑的话,那么输出结果是True,反之则为False。以下是代码的示例,大家可以看看哪些结果是True,哪些是False: 
x = 5 
y = 10 
 
a = x > y  #大于 
b = x < y  #小于 
c = x == y #等于 
d = x >= 2 #大于等于 
e = y <= 8 #小于等于 
f = x != y #不等于同样的,我们可以用print命令来输出这几个变量的结果: 
print(a,b,c,d,e,f)这里要注意的是,比较运算符里的等于号是这个==,而一个等于号=是赋值。很多时候大家会下意识地把两个搞混。 
接下来是第三种逻辑运算符,也就是与and,或or和非not。逻辑运算符常用于条件判断和循环结构。and的运算逻辑是:当两个操作数都为True时,返回值为True,否则为False。 
True and True     # 返回 True 
True and False    # 返回 False 
False and True    # 返回 False 
False and False   # 返回 Falseor的运算逻辑是,当至少有一个操作数为True时,返回值为True。当两个数都为False时,返回值为False: 
True or True     # 返回 True 
True or False    # 返回 True 
False or True    # 返回 True 
False or False   # 返回 Falsenot的运算逻辑是,对布尔值取反,如果输入为True,则返回为False,如果输入为False,则返回为True: 
not True    # 返回 False 
not False   # 返回 True逻辑运算符可以与比较运算符结合,创建更复杂的表达形式,比如: 
a = 1  
b = 5 
 
#判断a是否大于0且小于b 
result = a > 0 and a < b  #返回为True 
 
#判断a是否等于5或b是否等于5 
result = a == 5 or b == 5  #返回值为True 
 
#判断a和b是否都大于3 
result = a > 3 and b > 3  #返回值为False 
Rhino中特有的数据类型 
作为设计师,我们更多的会关注代码的可视化内容,或者说我们更关注利用代码来生成几何形体。而Rhino作为3D建模软件,也提供了很多几何数据类型,这也是为什么我们推荐设计师使用Rhino来学习编程的原因。一方面我们可以提高自己的编程知识水平,另一方面学到的编程知识能够快速地应用在设计领域,产生正反馈。这样的学习未来无论是转行还是在业内深耕都有帮助。 
由于这些数据类型不是Python原生的,而是Rhino API提供的的数据类型和方法,所以我们需要在代码的最开头写上一行命令,来调用Rhino API的数据: 
import Rhino.Geometry as rg这句话的意思是,我们在Python里导入RhinoCommon库中的几何模块,并命名为rg。通过这个模块,我们可以创建点、线、曲线、面等几何图形。接下来我们从基础的几个几何图形开始讲解。 
首先是三维点Point3d,这个数据类型也是在使用Rhino编程中最常用的一种。要确定一个三维点,需要x,y和z三个方向的坐标,以下是一个创建三维点变量的代码示例: 
import Rhino.Geometry as rg 
 
point = rg.Point3d(1,1,0)创立了三维点之后,我们可以访问和修改它的坐标值: 
import Rhino.Geometry as rg 
 
point = rg.Point3d(1,1,0) 
 
xCoor = point.X  #获取点的x坐标 
yCoor = point.Y  #获取点的y坐标 
point.Z = 10  #将点的z坐标改为10 
 
print(xCoor, yCoor, point.Z)  #输出点的三个坐标但此时我们还不能在Rhino中看到这个点,我们需要将数据传递给输出变量,才能在Rhino中看到我们生成的点。我们在最后加上一行代码: 
a = point 
  
Point3d点之间能进行加减运算,其结果为坐标值的相加或相减: 
import Rhino.Geometry as rg 
 
pt1 = rg.Point3d(1,2,3) 
pt2 = rg.Point3d(-1,0,1) 
 
pt3 = pt1 + pt2 
print(pt3)  #输出为 0,2,4Rhino还为Point3d提供了许多方法,例如计算点和点之间的距离: 
import Rhino.Geometry as rg 
 
pt1 = rg.Point3d(3,4,0) 
pt2 = rg.Point3d(0,0,0) 
 
distance = pt1.DistanceTo(pt2) #计算pt1到pt2的距离 
print(distance)  #输出结果为5.0点是一切几何的基础。介绍完了点,自然就有线的数据类型。最常见的线就是线段Line,Line包含两个Point3d对象,From和To,也就是线段的起点和终点。以下是创捷Line对象的一个例子: 
import Rhino.Geometry as rg 
 
pt1 = rg.Point3d(1,2,0) 
pt2 = rg.Point3d(0,0,0) 
 
ln = rg.Line(pt1,pt2) #创建一个从pt1到pt2的线段同样的,我们可以通过类似的方法计算点和线段之间的距离: 
import Rhino.Geometry as rg 
 
# 创建一个 Point3d 点 
point = rg.Point3d(1, 2, 3) 
 
# 创建一条线 
line_start = rg.Point3d(0, 0, 0) 
line_end = rg.Point3d(5, 5, 5) 
line = rg.Line(line_start, line_end) 
 
# 找到线上离点最近的点 
closest_point_on_line = line.ClosestPoint(point, True) 
 
# 计算点到线的距离 
distance = point.DistanceTo(closest_point_on_line) 
 
# 输出距离 
print(distance)在这个例子中,我们创建了一个Point3d点和一条线,然后使用line.CloestPoint(point,True)方法找到在线上距离点最近的点,然后计算这两个点的距离。 
Rhino API中还有一个很重要的类,就是Vector3d三维向量。Vector3d三维向量包括三个浮点数:X、Y和Z,分别表示向量在三维坐标系中的X轴、Y轴和Z轴的分量。以下是创建Vector3d对象的示例: 
import Rhino.Geometry as rg 
 
v = rg.Vector3d(0,1,0)与Point3d类似,可以通过类似的方法获取Vector3d对象的属性,也可以进行加减运算,也能进行点乘: 
import Rhino.Geometry as rg 
 
v1 = rg.Vector3d(0,1,0) 
v2 = rg.Vector3d(1,1,0) 
 
xCoor = v1.X  #获取v1的x坐标 
v2.Y = 2   #修改v2的y坐标 
 
v3 = v1 + v2  #向量相加 
v4 = v3 * v1  #向量点乘Rhino API也提供了许多关于向量有用的方法: 
import Rhino.Geometry as rg 
 
v1 = rg.Vector3d(1,0,0) 
v2 = rg.Vector3d(2,1,0) 
 
length = v1.Length  #获取v1的长度 
v2.Unitize()   #将v2单位化向量不能在Rhino中直接显示出来,我们可以在Grasshopper里通过增加vector display的电池组显示向量。这个电池组的第一个输入为向量的起始点,第二个输入为向量的值。例如: 
import Rhino.Geometry as rg 
 
pt = rg.Point3d(0,0,0) 
v = rg.Vector3d(1,1,0) 
 
a = pt 
b = v 
  
此外,Rhino API还提供了许多不同的数据类型和方法,部分知识我们会在稍后涉及。这里十分推荐大家去参阅Rhino API的官方网站,了解具体数据类型的使用: 
Rhino - API References (rhino3d.com) 
至此,我们已经简单介绍了python的一些基本语法和数据类型,包括Rhino里特有的一些几何类。我们也在这一期也留了几个训练题给大家巩固知识的理解和应用。 
训练题: 
1.请制作一个python电池组(如图所示),它有x,y和z三个float数据类型的输入。并以这三个数值为三维坐标建立一个点point1,另外用代码建立一个坐标为(1,1,0)的点point2。计算这两个点的距离,输出一段话”点x,y,z到点1,1,0的距离为xxx“。 
 
  
2.已知Rhino API 提供了Circle这个数据类型,想要新建一个Circle变量,需要一个中心点和一个半径数据。请建参照Line的创建方法,创建一个圆心在(5,3,0)半径为2.5的圆。 
3.请制作一个python电池组,有三个输入变量,分别是圆心的x坐标,圆心的y坐标和圆的半径(圆心z坐标默认为0)。并将圆心、圆和圆心指向(1,1,0)向量方向的半径可视化出来。 
 
  
以上就是今天的训练题,讲解会在之后的P2视频放出。初步掌握这些数据类型,就像在Sketch Up或者AutoCAD里了解如何建立矩形、圆形等等基本的元素。这些元素会在以后的学习中不断用到,是万丈高楼平地起的基础,十分的重要。 |   
 
 
 
 |