NCF参数化建筑论坛

标题: 使用GhPython做地形分析,无法生成相应的图例,返回值全为null [打印本页]

作者: Faker_Coder    时间: 2017-9-25 15:38
标题: 使用GhPython做地形分析,无法生成相应的图例,返回值全为null
使用Ghpython配合Grasshopper做地形分析,参考西建大包瑞清老师的那本书,但遇到图例模块返回值全部是null,Legend电池没有数据无法生成与地形对应的图例。
[attach]48243[/attach]

grasshopper电池图
[attach]48241[/attach]

grasshopper生成的模型
[attach]48242[/attach]

数据调入代码:
  1. # -*- coding: UTF-8 -*-
  2. import rhinoscriptsyntax as rs #导入模块rhinoscriptsyntax,并重新命名为rs方便以rs.function()格式使用这个模块的函数
  3. point=LocationPoint
  4. file=File
  5. x=[] #定义空列表,用于放置X坐标
  6. y=[] #定义空列表,用于放置Y坐标
  7. z=[] #定义空列表,用于放置Z坐标
  8. xyz=[] #定义空列表,用于放置X、Y、Z坐标
  9. rexyz=[] #定义空列表,用于放置调整位置后的X、Y、Z坐标
  10. repoint=[] #定义空列表,用于放置调整后的点坐标
  11. orpoint=[] #定义空列表,用于放置初始位置的点坐标
  12. f=open(file,'r') #使用open()函数打开文件,'r'为只读模式
  13. firstpoint=f.readline() #使用f.readline()方法读取行,当没有任何参数时,读取到第一个换行符出现,同时也读取这个换行符
  14. subdistance=rs.PointSubtract(rs.AddPoint(firstpoint),point) #读取第一行点坐标,建立点并与输入的定位点做差,获取两点之间坐标的差值,用于新位置点的定义
  15. for line in f.readlines(): #对文件内容进行迭代,读取所有行
  16.     lst=line.split(',') #切分字符串返回列表
  17.     x.append(float(lst[0])) #提取索引值为0的项值,并用函数int()将字符串转变为浮点数,追加到列表,即X坐标值列表
  18.     y.append(float(lst[1])) #提取索引值为1的项值,并用函数int()将字符串转变为浮点数,追加到列表,即Y坐标值列表
  19.     z.append(float(lst[2])) #提取索引值为2的项值,并用函数int()将字符串转变为浮点数,追加到列表,即Z坐标值列表
  20.     xyz.append((float(lst[0]),float(lst[1]),float(lst[2]))) #提取索引值为0、1、2的项值,并用函数int()将字符串转变为浮点数,追加到列表,即X、Y、Z坐标值列表
  21.     orpoint.append(rs.AddPoint((float(lst[0]),float(lst[1]),float(lst[2])))) #根据初始坐标建立点,并追加到列表中
  22.     rexyz.append(((float(lst[0])-subdistance[0]),(float(lst[1])-subdistance[1]),(float(lst[2])-subdistance[2]))) #根据初始坐标建立点,并追加到列表中
  23.     repoint.append(rs.AddPoint((float(lst[0])-subdistance[0]),(float(lst[1])-subdistance[1]),\
  24.     (float(lst[2])-subdistance[2]))) #根据新坐标增加点,并追加到列表中
  25. f.close() #文件读取完后,关闭文件
复制代码
分类模块代码
  1. import rhinoscriptsyntax as rs
  2. data=data
  3. cal=Classification
  4. da=[] #定义空的列表用于放置转化为浮点数的Z值
  5. for j in data: #循环遍历Z值列表,将字符串使用函数float()转化为浮点数
  6.     da.append(float(j))
  7. data=da #将转化后的值列表赋值给原变量data
  8. for i in cal: #以类似的方法转化分类列表的值为浮点数,该方法为直接替换原来的值
  9.     cal[cal.index(i)]=float(i)
  10. for k in range(len(cal)-1): #循环遍历分类列表,循环截止到索引值为-2的位置,使用K+1获取最后索引位置项值
  11.     a=cal[k] #获取索引值为k位置的项值
  12.     b=cal[k+1] #获取索引值为k+1位置的项值
  13.     for q in range(len(data)): #内循环遍历Z值列表
  14.         if a<=data[q]<b: #通过条件语句判断Z值是否位于分类区间a~b之间
  15.             data[q]=a #Z值如果位于a~b分类区间,则将该值以a值替换
  16. for w in range(len(data)):
  17.     if data[w]>=cal[-1]: #使用条件语句判断是否Z值有大于分类列表中索引值为-1位置的值,如果存在则将Z值调整为分类列表中索引值为-1位置的值
  18.         data[w]=cal[-1]
  19.     elif data[w]<=cal[0]: #使用条件语句判断是否Z值有不小于分类列表中索引值为0位置的值,如果存在则将Z值调整为分类列表中索引值为0位置的值
  20.         data[w]=cal[0]
  21. clalist=data
复制代码
图例模块代码
  1. import rhinoscriptsyntax as rs
  2. color=color
  3. value=value #复制value的值
  4. selectvalue=value #再次复制value的值,当selectvalue列表项值发生改变时,value列表项值相应发生改变
  5. boolean=switch #当数据量较大的时候可以将布尔值作为开关,使用条件语句判断程序是否运行
  6. def classification(color,value,selectvalue): #定义图例变量的函数,关于函数的阐述查阅相关章节
  7.     color=color #将传递的参数赋值给新的变量
  8.     value=value #将传递的参数赋值给新的变量
  9.     selectvalue=selectvalue #将传递的参数赋值给新的变量
  10.     symcolor=[] #建立空的列表,用于放置图例的颜色值
  11.     symvalue=[] #建立空的列表,用于放置图例的标签值
  12.     sym=[] #建立空的列表,放置调整后的Z值
  13.     for m in value: #外部循环遍历Z值
  14.         for n in range(len(selectvalue)): #内部循环遍历Z值,虽然变量不同,但是selectvalue与value均是复制的输入数据的z值
  15.             if selectvalue[n]==m: #使用条件语句判断内部循环的Z值是否等于外部循环的Z值,外部循环进行一步,内部循环进行一圈,当相等时,将该值赋值为空值None,外部循环value变量的列表的值相应发生改变以与selectvalue列表的值保持一致
  16.                 selectvalue[n]==None
  17.         sym.append(m) #将外部循环列表的值追加到新的列表中,此时外部循环列表value的值已经发生了改变,等于内部循环列表selectvalue的值
  18.     for i in range(len(sym)): #遍历循环调整后的Z值,此时Z值列表仅保留了唯一值,其他与之相同的值均被赋予空值None
  19.         if sym[i]!=None: #使用条件语句判断列表的值是否为空值,如果是非空值,则将该值追加到列表symvalue中,同时将对应的颜色值追加到列表symcolor中
  20.             symvalue.append(sym[i])
  21.             symcolor.append(color[i])
  22.     return symvalue,symcolor #函数返回值为symvalue列表(即图例的标签值)以及symcolor列表(即图例的颜色值)
  23.     if boolean == Ture: #使用条件语句判断输入布尔值是否为真即为Ture,如果为真,运行定义的图例函数,否则不进行计算
  24.         symvalue,symcolor=classification(color,value,selectvalue)
复制代码
这是源文件
[attach]48244[/attach]



作者: Faker_Coder    时间: 2017-9-28 16:54
几天之后再检查了一遍,是自己粗心了,color的数据类型应该设置为列表,然后选择color型

  1. if boolean == Ture:
复制代码


这里单词拼错了

  1. selectvalue[n]==None
复制代码


这里应该是赋值,不是等于

  1.     if boolean == Ture: #使用条件语句判断输入布尔值是否为真即为Ture,如果为真,运行定义的图例函数,否则不进行计算
  2.         symvalue,symcolor=classification(color,value,selectvalue)
复制代码


这段首行不缩进,缩进就相当于还在def定义函数那段里面

作者: 展颜    时间: 2017-10-1 16:28
请问,这个地形分析是指什么,用GH来计算给定地形的平整度吗
作者: Faker_Coder    时间: 2017-10-9 09:50
展颜 发表于 2017-10-1 16:28
请问,这个地形分析是指什么,用GH来计算给定地形的平整度吗

用来看地形的高程分布。
作者: 展颜    时间: 2017-10-10 14:01
Faker_Coder 发表于 2017-10-9 09:50
用来看地形的高程分布。

哦哦,明白了,很实用的工具!




欢迎光临 NCF参数化建筑论坛 (http://bbs.ncf-china.com/) Powered by Discuz! X3.2