Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
 /// <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);
     }
 }
Exemplo n.º 3
0
        /// <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));
            }
        }
Exemplo n.º 4
0
        /// <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); //输出模型信息
        }