Grasshopper と C# を使って H 形鋼を出力する
24 December, 2016 - 5 min read - Tags: Grasshopper,CSharp,構造とデジタル
以前の記事では、単純梁の計算をするコンポーネントを作成しました。その際はすべてのパラメーターが手入力だったので、今回は H 形鋼を対象にして、解析に必要なパラメーターを計算し、出力するコンポーネントの作成を行います。
また設定した形状の H 形鋼を Rhino 上への出力も併せて行います。
初めに Rhino への出力の仕方から説明します。やることは実際の Rhino でサーフェスを作成することに非常に近いことをします。作成はフランジとウェブごとにサーフェスを作成するという方法で行っています。上フランジを例に説明します。
まず Point3d で、(x,y,z)の座標を持つ点を 3 点(UFp1、UFp2、UFp3)作成します。その後、その 3 点を通る平面として Plane(UFplane)を作成します。この平面が、サーフェスを作成する面となります。サーフェスは、入力される部材幅 B と部材長さ L をもとに平面のサーフェスとして作成します。ここでは、Interval を使用して、原点から対象に B の幅を持つものとしてします。
// 上フランジのサーフェス作成
var UFp2 = new Point3d(1, 0, H / 2);
var UFp1 = new Point3d(0, 0, H / 2);
var UFp3 = new Point3d(0, 1, H / 2);
var UFplane = new Plane(UFp1, UFp2, UFp3);
var upper_flange = new PlaneSurface(UFplane, new Interval(-B / 2, B / 2), new Interval(0, L) );
次に、解析用諸元の計算と出力の設定です。断面二次モーメントと断面係数は、書いてある通りです。基本的なところですが、C#の割り算は、double 型等にしても小数点以下を明示しないと整数での割り算になって、小数点以下はなくなってしまうので注意しましょう。
出力に際して、パラメータを一つの引数でコンポーネント間でやり取りしたいので、ここでは List 型の Params を定義し、その中に、部材長さ、断面二次モーメント、断面係数を格納するようにしています。サーフェスはとりあえず出力するだけなので、リストではなくただの配列としてまとめています。
最後の出力設定では、以前は SetData としていましたが、今回は List を出力するので、SetDataList として出力しています。
// 解析用パラメータの計算
Iy = (1.0 / 12.0 * B * H * H * H) - (1.0 / 12.0 * (B - tw) * (H - 2 * tf) * (H - 2 * tf) * (H - 2 * tf));
Zy = Iy / (H / 2);
// ひとまとめにするため List で作成
List<double> Params = new List<double>();
Params.Add(L); // 部材長さ
Params.Add(Iy) ; // 断面二次モーメント
Params.Add(Zy) ; // 断面係数
// モデルはRhino状に出力するだけなので、とりあえず配列でまとめる
var model = new PlaneSurface[3];
model[0] = upper_flange;
model[1] = bottom_flange;
model[2] = web;
// まとめての出力なので、SetDataList で出力
DA.SetDataList(0, model);
DA.SetDataList(1, Params);
これで H 型鋼の諸元を出力するコンポーネントの作成は終わりです。
次に単純梁の計算を行うコンポーネントの修正を行います。前回ここにパラメータを入力していた部分を一括して入力を受ける Param という入力に変更します。
List 型のデータを受け取るので、最初の RegisterInputParams の個所で、Param を登録する箇所では、
pManager.AddNumberParameter("Analysis Parametar", "Param", "Input Analysis Parameter", GH_ParamAccess.list);
として、item ではなく list としています。同様に以前 GetData としていた箇所も、GetDataList として List 型のデータを受け取る形としています。
protected override void RegisterInputParams(GH_InputParamManager pManager)
{
pManager.AddNumberParameter("Analysis Parametar", "Param", "Input Analysis Parameter", GH_ParamAccess.list);
pManager.AddNumberParameter("Load", "P", "Centralized load (kN)", GH_ParamAccess.item);
pManager.AddNumberParameter("Young's modulus", "E", "Young's modulus (N/mm^2)", GH_ParamAccess.item);
}
protected override void SolveInstance(IGH_DataAccess DA)
{
// input
// パラメータはひとまとめにするため、List にまとめる
List<double> Param = new List<double>();
// Paramは List なので、GetDataList とする。
if (!DA.GetDataList(0, Param )) { return; }
if (!DA.GetData(1, ref P)) { return; }
if (!DA.GetData(2, ref E)) { return; }
}
完成したコード全体は以下のようになります。
using System;
using Grasshopper.Kernel;
using Rhino.Geometry;
using System.Collections.Generic;
namespace SBAnalysis
{
public class SBComponent : GH_Component
{
public SBComponent()
: base("SimpleBeamAnalysis", "SB Analysis","calculate sinmple beam", "rgkr", "Simple-beam")
{
}
protected override void RegisterInputParams(GH_InputParamManager pManager)
{
pManager.AddNumberParameter("Analysis Parametar", "Param", "Input Analysis Parameter", GH_ParamAccess.list);
pManager.AddNumberParameter("Load", "P", "Centralized load (kN)", GH_ParamAccess.item);
pManager.AddNumberParameter("Young's modulus", "E", "Young's modulus (N/mm^2)", GH_ParamAccess.item);
}
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
{
pManager.AddNumberParameter("Bending Moment", "M", "output max bending moment(kNm)", GH_ParamAccess.item);
pManager.AddNumberParameter("Bending Stress", "Sig", "output max bending stress (N/mm^2)", GH_ParamAccess.item);
pManager.AddNumberParameter("Deformation", "D", "output max deformation(mm)", GH_ParamAccess.item);
}
protected override void SolveInstance(IGH_DataAccess DA)
{
// input
// パラメータはひとまとめにするため、List にまとめる
List<double> Param = new List<double>();
double P = double.NaN;
double E = double.NaN;
// output
double M = double.NaN;
double Sig = double.NaN;
double D = double.NaN;
//
double L, Iy, Zy;
// Paramは List なので、GetDataList とする。
if (!DA.GetDataList(0, Param )) { return; }
if (!DA.GetData(1, ref P)) { return; }
if (!DA.GetData(2, ref E)) { return; }
L = Param[0];
Iy = Param[1];
Zy = Param[2];
M = P * (L/1000) / 4;
Sig = M * 1000000 / Zy;
D = P*1000*L*L*L/(48*E*Iy);
// 出力設定
DA.SetData(0, M);
DA.SetData(1, Sig);
DA.SetData(2, D);
}
public override Guid ComponentGuid
{
get { return new Guid("419c3a3a-cc48-4717-8cef-5f5647a5ecfc"); }
}
}
}
namespace H_Shape_Model
{
public class H_Shape_Model : GH_Component
{
public H_Shape_Model() : base("Make H Shape Model", "H Steel", "Display H Shape Model", "rgkr", "H-Shape")
{
}
protected override void RegisterInputParams(GH_InputParamManager pManager)
{
pManager.AddNumberParameter("Width", "B", "Model Width (mm)", GH_ParamAccess.item);
pManager.AddNumberParameter("Height", "H", "Model High (mm)", GH_ParamAccess.item);
pManager.AddNumberParameter("Web Thickness", "tw", "Web Thickness (mm)", GH_ParamAccess.item);
pManager.AddNumberParameter("Flange Thickness", "tf", "Flange Thickness (mm)", GH_ParamAccess.item);
pManager.AddNumberParameter("Length", "L", "Model Length (mm)", GH_ParamAccess.item);
}
protected override void RegisterOutputParams(GH_OutputParamManager pManager)
{
pManager.AddSurfaceParameter("View Model", "model", "output Model", GH_ParamAccess.item);
pManager.AddNumberParameter("Analysis Parametar", "Param", "output Analysis Parameter", GH_ParamAccess.item);
}
protected override void SolveInstance(IGH_DataAccess DA)
{
// 引数設定
double B = double.NaN;
double H = double.NaN;
double L = double.NaN;
double tw = double.NaN;
double tf = double.NaN;
double Iy, Zy;
// 入力設定
if (!DA.GetData(0, ref B)) { return; }
if (!DA.GetData(1, ref H)) { return; }
if (!DA.GetData(2, ref tw)) { return; }
if (!DA.GetData(3, ref tf)) { return; }
if (!DA.GetData(4, ref L)) { return; }
// 原点の作成
var Ori = new Point3d(0, 0, 0);
// 上フランジのサーフェス作成
var UFp1 = new Point3d(0, 0, H / 2);
var UFp2 = new Point3d(1, 0, H / 2);
var UFp3 = new Point3d(0, 1, H / 2);
var UFplane = new Plane(UFp1, UFp2, UFp3);
var upper_flange = new PlaneSurface(UFplane, new Interval(-B / 2, B / 2), new Interval(0, L) );
// 下フランジのサーフェス作成
var BFp1 = new Point3d(0, 0, -H / 2);
var BFp2 = new Point3d(1, 0, -H / 2);
var BFp3 = new Point3d(0, 1, -H / 2);
var BFplane = new Plane(BFp1, BFp2, BFp3);
var bottom_flange = new PlaneSurface(BFplane, new Interval(-B / 2, B / 2), new Interval(0, L) );
// ウェブのサーフェス作成
var Wp1 = new Point3d(0, 0, 0);
var Wp2 = new Point3d(0, 0, -1);
var Wp3 = new Point3d(0, 1, 0);
var Wplane = new Plane(Wp1, Wp2, Wp3);
var web = new PlaneSurface(Wplane, new Interval(-H / 2, H / 2), new Interval(0, L));
// 解析用パラメータの計算
Iy = (1.0 / 12.0 * B * H * H * H) - (1.0 / 12.0 * (B - tw) * (H - 2 * tf) * (H - 2 * tf) * (H - 2 * tf));
Zy = Iy / (H / 2);
// ひとまとめにするため List で作成
List<double> Params = new List<double>();
Params.Add(L); // 部材長さ
Params.Add(Iy) ; // 断面二次モーメント
Params.Add(Zy) ; // 断面係数
// モデルはRhino上に出力するだけなので、とりあえず配列でまとめる
var model = new PlaneSurface[3];
model[0] = upper_flange;
model[1] = bottom_flange;
model[2] = web;
// まとめての出力なので、SetDataList で出力
DA.SetDataList(0, model);
DA.SetDataList(1, Params);
}
public override Guid ComponentGuid
{
get { return new Guid("419c3a3a-cc48-4717-8cef-5f5647a5ecAa"); }
}
}
}