Rhino中效果:
首先我们先随意打开一个盈建科工程文件,将这个建筑的模型导出为ydb数据库格式:
发现这个表中有好几列数据,显然X和Y就是我们想要的节点坐标。在这里就要用到最最最基础的一个数据库命令“SELECT…FROM…”了:
SELECT X, Y FROM tblJoint
该命令是在tblJoint里提取X和Y列的所有数据。我们可以把这行命令直接复制到SQLiteSpy的上方空白区域,然后选择Execute下的Execute SQL,就能看到这行数据库语言命令能获取到的数据是什么样子的:
var xContainer = new List<double>();
var yContainer = new List<double>();
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = @”SELECT X, Y FROM tblJoint”;
while (reader.Read()) {
xContainer.Add(reader.GetDouble(0));
yContainer.Add(reader.GetDouble(1));
同时我们也要注意到最后的while循环内的两行语句,其中有reader.GetDouble(0)和reader.GetDouble(1)。这里的0和1代表相应数据类型的数据在数据表库中的排列顺序。类似的,也有GetString和GetInt语句,详细可见程序语言运行库中的文档。
然后添加两行代码在C#的电池里刚刚插入的代码后面:
A = xContainer;
B = yContainer;
那么,让我们来接两个panel上去看看效果吧:
X和Y的坐标果然成功的显示了!由于这个model的坐标位置不是在画布的最中间,通过几个小的操作找到这个x坐标和y坐标的最小值并在这两个列表中减掉,就可以将所有点位移到接近rhino画布的中间位置了(用到了“Bounds”、“deconstruct domain”和“subtraction”电池):
将结果连入创建点的电池:
所有的节点就成功的生成出来了:
对比一下盈建科里的原始模型:
接下来我们就需要读取ydb数据库中有关于梁/剪力墙的信息,找到它们的起始节点和结束节点,将刚刚画出来的点用连接逻辑按顺序连接起来。回到数据可视化程序SQLiteSpy里来打开存储梁信息的表格tblBeamSeg:
结果发现梁信息的表格里并没有包含梁开始于哪个节点结束于哪个节点的信息,不过我们发现了StdFlrID、SectID和GridID的信息,分别打开相对应的表格来看看是什么(tblStdFlr、tblBeamSect、tblGrid),最终我们在tblGrid中发现了有关于节点的信息:
-
通过梁墙表中的轴线网格编号找到对应轴线网格;
-
再通过对应轴线网格的节点编号找到两个节点;
-
最后通过这两个节点的坐标定义的节点作为线段的起始点和结束点,画出梁/墙的中轴线。
SELECT joint1.X, joint1.Y, joint2.X, joint2.Y
FROM tblGrid
INNER JOIN tblJoint AS joint1 ON tblGrid.Jt1ID = joint1.ID
可以看到会出来4列值,每一行都对应了一个轴线网格,4列中每一列都对应了我们在SELECT后所定义的joint1.X/ joint1.Y/joint2.X/joint2.Y的值。通过这四列数据就能在Rhino里画出所有的轴线。
首先在C#电池上按照前述方法添加至4个数据出口:
var x1Container = new List<double>();
var y1Container = new List<double>();
var x2Container = new List<double>();
var conn new SQLiteConnection(@”Data Source = D:TEMPdtlmodel.ydb”);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = @”SELECT joint1.X, joint1.Y, joint2.X, joint2.Y FROM tblGrid “
+ @”INNER JOIN tblJoint AS joint1 ON tblGrid.Jt1ID = joint1.ID “
+ @”INNER JOIN tblJoint AS joint2 ON tblGrid.Jt2ID = joint2.ID “;
while (reader.Read()) {
x1Container.Add(reader.GetDouble(0));
y1Container.Add(reader.GetDouble(1));
x2Container.Add(reader.GetDouble(2));
y2Container.Add(reader.GetDouble(3));
A = x1Container;
B = y1Container;
C = x2Container;
D = y2Container;
于是:
选用不同的渲染模式,以及可以分别替换材质,怎么酷怎么来:
总结一下:
-
SELECT … FROM … 用来获取某个特定数据库表里的某些列的数据。
-
INNER JOIN … ON … 用来链接某几个数据库表的数据,进行联合查找。
-
… AS … 用来临时重命名表格,使需要同时拉取同一张数据库表中的数据时不产生混淆。
关于Rhino中Grasshopper电池的妙用/更多的结构软件使用小技巧/二次开发范例敬请关注我们非解构团队的其他文章哦!