/// <summary> /// 设置荷载对象的单元编号 /// </summary> /// <param name="rt">所有梁单元中点,RTree存储</param> /// <param name="beamLoad">被检查的梁单元线荷载</param> /// <param name="err">检测误差</param> /// private void SetBeamLoadEleNo(RTree rt, BeamLoadCls beamLoad, double err) { Point3d chkPt = beamLoad.LoadLine.PointAt(0.5); EventHandler <RTreeEventArgs> rTreeCallback = (object sender, RTreeEventArgs args) => { beamLoad.EleNo = args.Id + 1; }; rt.Search(new Sphere(chkPt, err), rTreeCallback); }
/// <summary> /// 输出梁单元荷载 /// </summary> void ExptBLoad() { Sw.WriteLine("*STLDCASE"); Sw.WriteLine(" DeadLoad,D,"); Sw.WriteLine(" LiveLoad,L,"); Sw.WriteLine("*USE-STLD,DeadLoad"); Sw.WriteLine("*SELFWEIGHT"); Sw.WriteLine("0,0,-1"); Sw.WriteLine("*BEAMLOAD"); for (int i = 0; i < Model.BeamLoads.Count; i++) { BeamLoadCls loadi = Model.BeamLoads[i]; Sw.WriteLine(" {0},Beam,UNILOAD,{1},NO,NO,aDir[1], , , , 0,{2},1,{2},0,0,0,0,,NO,0,0,NO,", loadi.EleNo, loadi.CoordDir, loadi.Value); } }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { int loadcase = 1; GH_BeamElement Beams = null; int coordinate = 1; int direction = 3; double value = double.NaN; bool bool_case = DA.GetData(0, ref loadcase); bool bool_beams = DA.GetData(1, ref Beams); bool bool_coord = DA.GetData <int>(2, ref coordinate); bool bool_dir = DA.GetData <int>(3, ref direction); bool bool_value = DA.GetData <double>(4, ref value); if (bool_beams && bool_value) { BeamLoadCls beamloadi = new BeamLoadCls(loadcase, Beams.Value.Line, coordinate, direction, value); DA.SetData(0, new GH_BeamLoadCls(beamloadi)); } }
/// <summary> /// Step1:提取线和网格的节点然后根据误差去重,建立起单元-节点的对应关系 /// Step2:设置梁单元荷载对应的单元编号属性,建立起荷载-单元编号索引关系 /// Step3:给模型对象附加各种信息:节点、单元、荷载、边界、组等 /// </summary> /// <param name="DA">用来获取输入端的参数和设置输出端的结果</param> protected override void SolveInstance(IGH_DataAccess DA) { //建立局部变量存储输入参数 List <BeamElementCls> BeamList = new List <BeamElementCls>(); List <ShellElementCls> ShellList = new List <ShellElementCls>(); List <BeamLoadCls> BeamLoadList = new List <BeamLoadCls>(); List <ShellLoadCls> ShellLoadList = new List <ShellLoadCls>(); List <SupportCls> SupportList = new List <SupportCls>(); //获取输入参数传给局部变量,并返回是否成功或取数据 bool bool1 = DA.GetDataList(0, BeamList); bool bool2 = DA.GetDataList(1, ShellList); bool boolBL = DA.GetDataList(2, BeamLoadList); double err = 0.01; DA.GetData(5, ref err); BeamLoadList.RemoveAll(j => { return(j == null); }); bool boolSL = DA.GetDataList(3, ShellLoadList); bool boolSPT = DA.GetDataList(4, SupportList); ModelCls model = new ModelCls(); List <Point3d> pointsOrigin = new List <Point3d>(); List <Point3d> pointsAfter = new List <Point3d>(); //将去重后的点存入Rtree,由列表转变为树形结构数据,以便高效的进行空间点的搜索,建立线段端点索引 RTree pointsAfterRt = new RTree(); RTree beamMidPts = new RTree(); //Step1-1:对线和网格节点合并然后去重,得到去重后的节点列表pointsAfter if (bool1)//如果有梁单元输入的话 { //ElementsList.AddRange(BeamList); for (int k = 0; k < BeamList.Count; k++) { BeamList[k].Ele_no = k + 1;//对线单元赋予单元编号 } //建立所有线段端点组成的列表 pointsOrigin = FunctionClass.getPoints(BeamList); if (bool2)//如果有壳单元输入的话 { //ElementsList.AddRange(ShellList); for (int m = 0; m < ShellList.Count; m++) { ShellList[m].Ele_no = BeamList.Count + 1 + m;//对面单元赋予单元编号 } //获得所有面单元对象的顶点列表 List <Point3d> pointsMesh = FunctionClass.getPoints(ShellList); pointsOrigin.AddRange(pointsMesh); } //1.利用kangaroo中的节点去重功能进行去重,效率比自己判断节点距离高 //2.注意:如果err大于某些线的长度,会造成线段数据丢失,导出的模型没有这部分线段 pointsAfter = Util.RemoveDupPts2(pointsOrigin, err);//测距离方法:x,y,z方向差同时小于err的点。而不是真实距离,真实距离可能大于err,但是速度比算真实距离快。 //List<Point3d> pointsAfter = FunctionClass.deleteDuplicatPts(pointsOrigin, err); //Step1-2:节点列表转为节点树 for (int j = 0; j < pointsAfter.Count; j++) { pointsAfterRt.Insert(pointsAfter[j], j); } for (int k = 0; k < BeamList.Count; k++) { beamMidPts.Insert(BeamList[k].Line.PointAt(0.5), k); } //Step1-3:对所梁单元和壳单元的节点赋予编号,建立单元-节点编号的索引关系 SetLineVerInd(pointsAfterRt, BeamList, err);//对线单元赋予节点索引***核心功能** if (bool2) { SetMeshVerInd(pointsAfterRt, ShellList, err);//对面单元赋予节点索引***核心功能** } } //Step2:设置梁单元荷载对象中的单元编号属性,建立起荷载-单元编号索引关系 if (boolBL) { for (int i = 0; i < BeamLoadList.Count; i++) { BeamLoadCls bloadi = BeamLoadList[i]; if (bloadi != null) { SetBeamLoadEleNo(beamMidPts, bloadi, err);//此属性在单元未合并之前,并不知道每个单元的编号,因此只能放在创建模型中实现 } } } //Step3:给模型对象附加各种信息:节点、单元、荷载、边界、组等 //给模型添加节点信息、梁单元信息、壳单元信息 model.Nodes = pointsAfter; model.BeamElements = BeamList; model.ShellElements = ShellList; model.BeamLoads = BeamLoadList; model.ShellLoads = ShellLoadList; model.Supports = SupportList; DA.SetData(0, model); //输出模型数据对象 DA.SetDataList(1, model.ModelInfo); //输出模型信息 }