示例#1
0
        //you don't need to assign modelSetting.num_longit as it will calculated by axis
        public static void BuildCurveModel(ModelSetting modelSetting, Model model, string path)
        {
            //get the coordinary of each ring
            double length = Math.Abs(modelSetting.axis.AxisPoints.First().Mileage -
                modelSetting.axis.AxisPoints.Last().Mileage);
            modelSetting.num_ring = (int)(length / modelSetting.width);
            List<RingInfo> ringInfos = GetRingInfo(modelSetting);

            //get single ring result
            SingleRingResult ringResult = new SingleRingResult();
            GenerateNodes.GenerateSingleRingNode(modelSetting, ringResult);
            GenerateElements.GenerateSingleRingElement(modelSetting, ringResult);

            //initial 3D result
            List<ShieldTunnel3DResult> results = new List<ShieldTunnel3DResult>();

            for (int i = 0; i < ringInfos.Count - 1; i++)
            //for (int i = 0; i < 10; i++)
            {
                ShieldTunnel3DResult result = new ShieldTunnel3DResult();
                ChangeLocal(ringInfos[i], result);
                GetNodes(i, modelSetting, ringResult, result);
                GetShellElements(i, modelSetting, ringResult, result);
                RotateNode(i, modelSetting, result);
                results.Add(result);
            }

            Output(model, results, path);
        }
示例#2
0
        private static void RotateNode(int ringNo, ModelSetting modelSetting, ShieldTunnel3DResult result)
        {
            //rotate the nodes of back border of the last ring
            if (ringNo != 0) //not the first ring
                for (int j = 0; j < modelSetting.num_node_face; j++)
                {
                    result.rotateNodeID.Add(j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit);
                }

            //rotate all the nodes of this ring
            for (int j = 0; j < modelSetting.num_node_ring; j++)
            {
                result.rotateNodeID.Add(j + 1 + ringNo * modelSetting.num_node_all);
            }
        }
示例#3
0
 private static void GetShellElements(int ringNo, ModelSetting modelSetting, SingleRingResult ringResult, ShieldTunnel3DResult result)
 {
     if (!result.PreElements.ContainsKey(1))
         result.PreElements[1] = new List<Element>();
     foreach (Element element in ringResult.elements[1])
     {
         ElementShell shell = element as ElementShell;
         ElementShell newShell = new ElementShell(1,
             shell.pid, shell.n1 + modelSetting.num_node_all * ringNo, shell.n2 + modelSetting.num_node_all * ringNo,
             shell.n3 + modelSetting.num_node_all * ringNo, shell.n4 + modelSetting.num_node_all * ringNo);
         result.PreElements[1].Add(newShell);
     }
 }
示例#4
0
 private static void GetNodes(int ringNo, ModelSetting modelSetting, SingleRingResult ringResult, ShieldTunnel3DResult result)
 {
     for (int j = 0; j < modelSetting.num_node_all; j++)
     {
         Node node = ringResult.nodes[j];
         Node newNode = new Node(node.nid + ringNo * modelSetting.num_node_all,
             node.x, node.y, node.z);
         result.nodes.Add(newNode);
     }
 }
示例#5
0
 private static void GetLongitudinalJoint(int ringNo, ModelSetting modelSetting, ShieldTunnel3DResult result)
 {
     if (!result.PostElements.ContainsKey(5))
         result.PostElements[5] = new List<Element>();
     for (int j = 0; j <= modelSetting.num_longit; j++)
     {
         for (int k = 0; k < modelSetting.pos_joint.Count; k++)
         {
             ElementCombin combinZ = new ElementCombin(1, 5,
                 modelSetting.num_segment_element[k] + 1 + j * modelSetting.num_node_face + ringNo * modelSetting.num_node_all,
                 k + 1 + modelSetting.num_circum + j * modelSetting.num_node_face + ringNo * modelSetting.num_node_all);
             result.PostElements[5].Add(combinZ);
         }
     }
 }
示例#6
0
        private static void GetGroundElements(int ringNo, ModelSetting modelSetting, SingleRingResult ringResult, ShieldTunnel3DResult result)
        {
            if (!result.PreElements.ContainsKey(2))
                result.PreElements[2] = new List<Element>();
            //generate radial ground spring
            foreach (Element element in ringResult.elements[2])
            {
                ElementLink link = element as ElementLink;
                ElementLink newLink = new ElementLink(1,
                    link.pid, link.n1 + modelSetting.num_node_all * ringNo, link.n2 + modelSetting.num_node_all * ringNo);
                result.PreElements[2].Add(newLink);
            }

            if (!result.PreElements.ContainsKey(3))
                result.PreElements[3] = new List<Element>();
            //generate tangential ground spring
            foreach (Element element in ringResult.elements[3])
            {
                ElementLink link = element as ElementLink;
                ElementLink newLink = new ElementLink(1,
                    link.pid, link.n1 + modelSetting.num_node_all * ringNo, link.n2 + modelSetting.num_node_all * ringNo);
                result.PreElements[3].Add(newLink);
            }
        }
示例#7
0
        private static void GetCircumferentialJoint(int ringNo, ModelSetting modelSetting, ShieldTunnel3DResult result)
        {
            if (!result.PostElements.ContainsKey(4))
                result.PostElements[4] = new List<Element>();
            if (!result.PostElements.ContainsKey(6))
                result.PostElements[6] = new List<Element>();
            if (!result.PostElements.ContainsKey(7))
                result.PostElements[7] = new List<Element>();

            if(ringNo != 0)
                for (int j = 0; j < modelSetting.num_node_face; j++)
                {
                    ElementCombin combinCircumZ = new ElementCombin(1, 4,
                         j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit,
                         j + 1 + ringNo * modelSetting.num_node_all);
                    result.PostElements[4].Add(combinCircumZ);

                    ElementCombin combinCircumX = new ElementCombin(1, 6,
                         j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit,
                         j + 1 + ringNo * modelSetting.num_node_all);
                    result.PostElements[6].Add(combinCircumX);

                    ElementCombin combinCircumY = new ElementCombin(1, 7,
                        j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit,
                         j + 1 + ringNo * modelSetting.num_node_all);
                    result.PostElements[7].Add(combinCircumY);
                }
        }
示例#8
0
 private static void ChangeLocal(RingInfo info, ShieldTunnel3DResult result)
 {
     result.changeLocal = String.Format("local,11,0,{0:0.00},{1:0.00},{2:0.00},{3:0.00},{4:0.00},{5:0.00}",
         info.x, info.y, info.z,
         Math.Atan(info.vecY / info.vecX) / Math.PI * 180, 0, Math.Atan(info.vecZ / info.vecX) / Math.PI * 180);
 }