复杂形态钢结构设计培训班

首页 结构乌托邦-公众号 【编程】盈建科二次开发:联动Rhino

【编程】盈建科二次开发:联动Rhino

通过公众号之前一篇文章(DB Browser for SQlite-盈建科的另类解法),相信大家已经对盈建科ydb数据库有一定了解,那么如何将这些煮熟的鸭子到手的数据灵活地玩转起来呢?小编今天在这里就给大家简单分享一些数据库常用的命令,以及一个将数据与rhino联动起来的小例子,抛砖引玉,欢迎大家探索数据库这片大海(满满的鱼)。

Rhino中效果:

首先我们先随意打开一个盈建科工程文件,将这个建筑的模型导出为ydb数据库格式:

之后可在文件夹下找到dtlmodel.ydb文件,该文件包含盈建科所有模型信息。下一步就是使用数据库语言来读取想要获得的信息了。
数据库语言是一种独立的语言,它是其他语言与数据库数据沟通的桥梁。数据库就像一个仓库,只有拥有仓库钥匙才可获取仓库中的财富,而数据库语言就是那把钥匙。
如何操作这把钥匙,每种编程语言都有着不同的方法,也就是不同的程序库。小编在这里用的是C#语言,所以需要用到操作钥匙的库是“System.Data.SQLite”
另外,在操作数据库的同时,希望可以将数据可视化,用以校对数据获取方式的准确性。这里可以使用上篇公众号文章里的DB Browser for SQLite,也可以使用其他方便的小工具,小编在这里使用的是一个很轻量级的软件SQLiteSpy,它可以直接读取数据库里的数据,也能执行数据库语言。
要在Rhino里绘制所有梁,首先需要所有的节点坐标。在ydb文件中,所有节点信息都存储在tblJoint数据库表中,我们可以先观察tblJoint的表格格式:(在SQLiteSpy或者DB Browser for SQLite里打开tblJoint)

发现这个表中有好几列数据,显然X和Y就是我们想要的节点坐标。在这里就要用到最最最基础的一个数据库命令“SELECT…FROM…”了:


SELECT X, Y FROM tblJoint


该命令是在tblJoint里提取X和Y列的所有数据。我们可以把这行命令直接复制到SQLiteSpy的上方空白区域,然后选择Execute下的Execute SQL,就能看到这行数据库语言命令能获取到的数据是什么样子的:

可见,X和Y坐标被成功显示出来。那么,我们要怎么才能在Rhino里面通过这些节点的X/Y坐标画出点来呢?这就需要用到C#或者Python来驱动数据库语言了。
如同小编之前提到的,在这里我们使用C#电池,python电池的应用方法也大体相通,仅需调用相应的SQLite程序包就可以实现了!
首先我们在C#的电池上加载SQLite。右键单击C#电池,选择“Manage Assemblies…”,然后将安装好的System.Data.SQLite文件夹下所有的dll文件都选中并添加到电池中。
然后打开C#电池,添加System.Data.SQLite命名空间。
然后添加下列代码以实现我们刚刚提到的那个功能,注意中间的“Data Source =”后面要接的是盈建科的ydb数据库完整路径。这样就能将X和Y坐标提取到两个List中(xContainer和yContainer)。

var xContainer = new List<double>();

var yContainer = new List<double>();

var conn new SQLiteConnection(@”Data Source = D:TEMPdtlmodel.ydb”);

conn.Open();

var cmd = conn.CreateCommand();

cmd.CommandText = @”SELECT X, Y FROM tblJoint”;

var reader = cmd.ExecuteReader();

while (reader.Read()) {

    xContainer.Add(reader.GetDouble(0));

    yContainer.Add(reader.GetDouble(1));

}

同时我们也要注意到最后的while循环内的两行语句,其中有reader.GetDouble(0)和reader.GetDouble(1)。这里的0和1代表相应数据类型的数据在数据表库中的排列顺序类似的,也有GetString和GetInt语句,详细可见程序语言运行库中的文档。

下面就是要在rhino里画出这些点。首先我们需要在电池中添加一个新的出口,因为C#电池默认只有一个数据出口“A”,但是X、Y坐标有两列,所以可以添加一个新的数据出口来方便数据传递。用鼠标滚轮放大C#电池,直到电池中出现小小的加号和减号。

然后添加两行代码在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中发现了有关于节点的信息:

同时我们也发现在有关于剪力墙信息的表格中也有GridID这一项内容,原来在ydb里梁和墙的定位是通过Grid表格中的信息来确定的,也就是轴线网格表中的信息确定的!这样我们的思路就确定了:
  1. 通过梁墙表中的轴线网格编号找到对应轴线网格;

  2. 再通过对应轴线网格的节点编号找到两个节点;

  3. 最后通过这两个节点的坐标定义的节点作为线段的起始点和结束点,画出梁/墙的中轴线。
在数据库里,这种通过表与表之间的某一列元素相对应的关系将两个表的信息联合在一起并取得最终数据的模式是十分常见的,也是一个很常用的查询方式,在SQLite里需要用到的数据库命令是将两个表联合在一起的INNER JOIN…ON…命令。比如说我们现在先实现上面的步骤2(通过grid信息找节点的坐标信息),需要用到的命令是:

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
中间还用到的一个数据库命令是AS,其作用是给不同的数据库表起一个临时名字。因为通过轴线网格来找节点坐标时,轴线网格表中有两列数据都是节点ID数据,这个数据链接到的都是同一张节点数据库表,如果不加以区分,就会导致最终在SELECT命令后面需要拉取的数据不明确到底是哪个节点,因此需要重命名。
ON命令确定两张数据库表链接形式。在这里是用到了Grid表格中Jt1ID一列的信息等于Joint表格中ID一列的信息,同时,再链接第二张同样的Joint表格且Jt2ID一列的信息也等于Joint表格中ID一列的信息。这样在寻找数据时可成功拉取同一个Joint表格中不同一列的数据。

可以看到会出来4列值,每一行都对应了一个轴线网格,4列中每一列都对应了我们在SELECT后所定义的joint1.X/ joint1.Y/joint2.X/joint2.Y的值。通过这四列数据就能在Rhino里画出所有的轴线

首先在C#电池上按照前述方法添加至4个数据出口:

然后键入与之前类似的代码,需要替换的部分仅仅是cmd.CommandText 的值,并且多增加几个数据的Container:

var x1Container = new List<double>();

var y1Container = new List<double>();

var x2Container = new List<double>();

var y2Container = 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 “;

var reader cmd.ExecuteReader();


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;


然后在Rhino的Grasshopper里按上面的方法将C/D的数据出口也接上电池,创建点,最后在以这两个点来创建线:

于是:

样所有的梁/墙所对应的轴线网格就已经成功的在Rhino里画出来了
进一步的,通过INNER JOIN…ON…命令将梁和墙的数据库表再链接轴线网格的数据库表,以获取梁和墙所在的Grid信息,再配合上Rhino里Grasshopper的Evaluate Curve、Rectangle和Extrude电池,就可以完成最终的效果了:

选用不同的渲染模式,以及可以分别替换材质,怎么酷怎么来:

再进一步地,可以将C#电池里面,Data Source=后面的数据库文件的地址做成一个电池接入的参数,这样可以将这个电池运用于任意的ydb数据库,随意替换,瞬间形成自己想要的Rhino里的结构效果图,跟建筑的交流也就更愉快。
另外不要忘了把自己做的Rhino电池交给建筑同事们,一起愉快的玩耍吧!

总结一下:

数据库语言是拉取数据库内容的必备内容,需要用程序语言驱动数据库语言来获取数据库里的数据。
  • SELECT … FROM … 用来获取某个特定数据库表里的某些列的数据。

  • INNER JOIN … ON … 用来链接某几个数据库表的数据,进行联合查找。

  • … AS … 用来临时重命名表格,使需要同时拉取同一张数据库表中的数据时不产生混淆。

关于Rhino中Grasshopper电池的妙用/更多的结构软件使用小技巧/二次开发范例敬请关注我们非解构团队的其他文章哦!

本文来自网络,不代表钢构人的立场,转载请注明出处。搜索工程类文章,就用钢构人网站。 https://www.ganggouren.com/2020/01/5c19b5889d/
上一篇
下一篇

作者: ganggouren

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

17717621528

在线咨询: QQ交谈

邮箱: 1356745727@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部