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

首页 非解构-公众号 盈建科,二次开发

盈建科,二次开发

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

Rhino中效果:

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

然后我们就可以在文件夹下面找到一个叫做dtlmodel.ydb的文件了,这个文件就是包含这个盈建科模型中所有信息的一个文件。下一步就是使用数据库语言来读取想要获得的信息了。

数据库语言其实是一种独立于所有其他编程语言的一类语言,数据库语言是其他语言与数据库里的数据沟通的桥梁。所以,在使用Python、C#、C++或者其他的语言编程时,如果想要与数据库沟通,都需要执行数据库语言。数据库就像一个仓库,无论是谁,想要获取仓库里的东西,就必须要使用仓库的钥匙,而数据库语言就是那把钥匙。

如何操作这把钥匙,每种编程语言都有着不同的方法,也就是不同的程序库。小编在这里用的是C#语言,所以需要用到操作钥匙的库是“System.Data.SQLite”,关于这个库以及其他编程语言中操作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#电池,在最上方的using中插入对System.Data.SQLite的引用。

然后添加下列代码以实现我们刚刚提到的那个功能,注意中间的“Data Source =”后面要接的是盈建科的ydb数据库完整路径。

List<double>xContainer = new List<double>();

List<double>yContainer = new List<double>();

SQLiteConnection conn;

SQLiteCommand cmd;

SQLiteDataReader reader;

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

conn.Open();

cmd = conn.CreateCommand();

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

reader = cmd.ExecuteReader();

while (reader.Read()) {

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

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

}

这样,就能实现将数据里的X和Y坐标提取到两个List中了(xContainer和yContainer)。下图是完成后的C#电池里的代码。

同时我们也要注意到最后的while循环内的两行语句,其中有reader.GetDouble(0)和reader.GetDouble(1)。这里的0和1的顺序分别代表了SELECT语句后面所跟的提取的数据库列的顺序一样,因为是“SELECT X, Y”,所以GetDouble(0)是提取的X,而GetDouble(1)是Y。类似的,也有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命令后面需要拉取的数据不明确到底是哪个节点,所以需要重命名一下节点1后面跟的节点数据库表中的的信息名字都叫joint1,节点2数据库表中拉出的数据为joint2,这个名字的命名是任意的。

ON命令后面跟的就规定了两张数据库表是以什么形式链接在一起。在这里是用到了Grid表格中Jt1ID一列的信息等于Joint表格中ID一列的信息,同时,再链接第二张同样的Joint表格且Jt2ID一列的信息也等于Joint表格中ID一列的信息。这样数据库在寻找数据的时候就会根据Jt1ID与Jt2ID不一样,拉取同一个Joint表格中不同一行的所代表的节点坐标了(这也是为什么需要用到AS命令,不然无法区分两个节点。在这里也相当于是将Joint表格复制了一份,分别叫joint1和joint2,然后分别从这两份表格中分别查找信息)。

我们来试试看这个命令会出现什么样的结果

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

首先在C#电池上按照上面说过的方法添加数据出口至4个:

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

(别忘了using System.Data.SQLite

List<double> x1Container = new List<double>();

List<double> y1Container = new List<double>();

List<double> x2Container = new List<double>();

List<double> y2Container = new List<double>();

SQLiteConnection conn;

SQLiteCommand cmd;

SQLiteDataReader reader;

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

conn.Open();

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 “;

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电池的妙用/更多的结构软件使用小技巧/二次开发范例敬请关注我们非解构团队的其他文章哦!有问题也欢迎入群讨论:

二次开发往期精彩

当结构设计遇到遗传算法,于是它学会了自己进化!

如何教会房子学会自己设计自己的基础——当结构设计遇到遗传算法(二)

惊喜!设计院实习两个月,竟成了码农!——小白攻城狮的代码升级之路

Python爬虫实战——从太平洋地震工程研究中心数据库自动下载地震波时程

本文来自网络,不代表钢构人的立场,转载请注明出处。搜索工程类文章,就用钢构人网站。 https://www.ganggouren.com/2019/09/3fad909c06/

钢结构地图

上一篇
下一篇

作者: ganggouren

为您推荐

发表回复

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

联系我们

联系我们

17717621528

在线咨询: QQ交谈

邮箱: 1356745727@qq.com

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

微信扫一扫关注我们

关注微博
返回顶部