예제 #1
0
 public void AddSection(MctSection sec, ref int secId)
 {
     if (_sections.Count == 0)
     {
         _sections[secId - 1] = sec;
         secId++;
     }
     else
     {
         foreach (var section in _sections)
         {
             if (sec.Name != section.Value.Name)
             {
                 _sections[secId] = sec;
                 secId++;
                 break;
             }
         }
     }
 }
예제 #2
0
        public void TranslateGirder()
        {
            var girderSet = _ifcModel.Instances.OfType <IIfcElementAssembly>().
                            Where(ea => ea.PredefinedType == IfcElementAssemblyTypeEnum.GIRDER).ToList();

            if (girderSet.Count == 0)
            {
                throw new InvalidOperationException("A bridge without superstructure cannot be processed");
            }

            List <IIfcMaterialSelect> girderSet_Material = new List <IIfcMaterialSelect>();

            foreach (var girder in girderSet)
            {
                girderSet_Material.Add(girder.Material);
            }

            //parse BridgeDeckMat
            var deckSlab = _ifcModel.Instances.OfType <IIfcSlab>().FirstOrDefault();

            if (deckSlab == null)
            {
                throw new InvalidOperationException("Parse BrigdeDeck Failed");
            }
            girderSet_Material.Add(deckSlab.Material);

            var mat = TranslatorToolkitFactory.TranslateMaterial(girderSet_Material, ref matIndex);

            _mctStore.AddMaterial(mat);

            //parse diretrix
            GetLateralGirderNums(girderSet.Count);

            //parse section
            var dimensions = new List <List <double> >();

            foreach (var girder in girderSet)
            {
                PreProcessDirectrix(girder);
                dimensions.Add(TranslatorToolkitFactory.ParseSectionDimensions(girder));
            }
            //20191111
            var deckInfo = TranslatorToolkitFactory.ParseDeckDimensions(deckSlab);

            //循环完毕之后表示收集到所有的支座信息
            var bearingMap = new Dictionary <MctNode, IIfcProxy>();

            foreach (var position in _pointPlacementTable)
            {
                var coordinates = position.Value.Select(p => p.Key).ToList();
                var nodes       = Utilities.TranslatorToolkitFactory.TranslateNodes((IIfcCurve)_ifcModel.Instances[position.Key], coordinates, nodeIndex++);
                _mctStore.AddNode(nodes);
                foreach (var node in nodes)
                {
                    girderNodeSet.Add(node);
                }
                int        nodeNums = position.Value.Keys.Count;
                MctSection sec      = null;
                for (int i = 0; i < nodeNums - 1; i++)
                {
                    double currentPos       = position.Value.Keys[i];
                    double nextPos          = position.Value.Keys[i + 1];
                    bool   isSectionChanged = position.Value.Values[i];
                    sec = TranslatorToolkitFactory.TranslateSectionCompsite_I(girderSet[0], dimensions[0], deckInfo, sectionIndex);

                    var element = new MctFrameElement()
                    {
                        Id    = elementIndex++,
                        Mat   = mat.Where(m => m.Type == MctMaterialTypeEnum.STEEL).FirstOrDefault(),
                        Sec   = sec,
                        Type  = MctElementTypeEnum.BEAM,
                        Node1 = nodes[i],
                        Node2 = nodes[i + 1],
                    };
                    _mctStore.AddElement(element);

                    var bearingPair = Bearings.Where(b => b.ObjectPlacement is IIfcLinearPlacement lp &&
                                                     (lp.Distance.DistanceAlong == currentPos)).ToList();
                    for (int j = 0; j < bearingPair.Count; j++)
                    {
                        foreach (var node in nodes)
                        {
                            if (node.Id == (j * nodeNums + i + 1))
                            {
                                bearingMap[node] = bearingPair[j];
                            }
                        }
                    }

                    bearingPair = Bearings.Where(b => b.ObjectPlacement is IIfcLinearPlacement lp &&
                                                 (lp.Distance.DistanceAlong == nextPos)).ToList();
                    for (int j = 0; j < bearingPair.Count; j++)
                    {
                        foreach (var node in nodes)
                        {
                            if (node.Id == (j * nodeNums + i + 2))
                            {
                                bearingMap[node] = bearingPair[j];
                            }
                        }
                    }
                }
            }
            var section = TranslatorToolkitFactory.TranslateSectionCompsite_I(girderSet[0], dimensions[0], deckInfo, sectionIndex);

            _mctStore.AddSection(section, ref sectionIndex);

            foreach (var pair in bearingMap)
            {
                var constraint = TranslatorToolkitFactory.TranslateBearing(pair.Value);
                _mctStore.AddSupport(pair.Key, constraint);
            }
        }