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