Example #1
0
        public void TranslateLateralBeam()
        {
            var LateralBeamSet = _ifcModel.Instances.OfType <IIfcElementAssembly>()
                                 .Where(ea => (ea.PredefinedType == IfcElementAssemblyTypeEnum.USERDEFINED && ea.Name == "LateralGirder")).ToList();

            if (LateralBeamSet.Count == 0)
            {
                throw new InvalidOperationException("Must input Beams");
            }

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

            foreach (var lateralBeam in LateralBeamSet)
            {
                BeamSetMaterial.Add(lateralBeam.Material);
            }
            var mat = TranslatorToolkitFactory.TranslateMaterial(BeamSetMaterial, ref matIndex);

            _mctStore.AddMaterial(mat);

            nodeIndex = (nodeIndex - 1) * _lateralBeamNums + 1;
            var offsetValues = TranslatorToolkitFactory.ParseOffsetValues(LateralBeamSet, _lateralBeamNums);

            PushLateralBeamNodes(offsetValues, ref nodeIndex);

            var sectionDimensions = TranslatorToolkitFactory.ParseLateralSection(LateralBeamSet[0]);
            var sec = new MctSectionDBUSER(MctSectionDBUSERShapeTypeEnum.DOUBLE_L, sectionDimensions, ref sectionIndex);

            _mctStore.AddSection(sec, ref sectionIndex);
            var matSet  = _mctStore.GetTotalMaterial();
            var beamMat = matSet.Where(m => m.Value.Type == MctMaterialTypeEnum.STEEL).FirstOrDefault();

            for (int i = 0; i < (LateralBeamSet.Count / _lateralBeamNums); i++)
            {
                for (int j = 0; j < _lateralBeamNums; j++)
                {
                    var element = new MctFrameElement()
                    {
                        Id    = elementIndex++,
                        Mat   = beamMat.Value,
                        Sec   = sec,
                        Type  = MctElementTypeEnum.BEAM,
                        Node1 = LateralBeamNodeSet[i * _lateralBeamNums + j],
                        Node2 = LateralBeamNodeSet[i * _lateralBeamNums + j + _lateralBeamNums]
                    };
                    _mctStore.AddElement(element);
                    element = new MctFrameElement()
                    {
                        Id    = elementIndex++,
                        Mat   = beamMat.Value,
                        Sec   = sec,
                        Type  = MctElementTypeEnum.BEAM,
                        Node1 = LateralBeamNodeSet[i * _lateralBeamNums + j],
                        Node2 = LateralBeamNodeSet[i * _lateralBeamNums + j + 2 * (LateralBeamSet.Count + _lateralBeamNums)],
                    };
                    _mctStore.AddElement(element);
                    element = new MctFrameElement()
                    {
                        Id    = elementIndex++,
                        Mat   = beamMat.Value,
                        Sec   = sec,
                        Type  = MctElementTypeEnum.BEAM,
                        Node2 = LateralBeamNodeSet[i * _lateralBeamNums + j + 2 * (LateralBeamSet.Count + _lateralBeamNums)],
                        Node1 = LateralBeamNodeSet[i * _lateralBeamNums + j + _lateralBeamNums],
                    };
                    _mctStore.AddElement(element);
                    element = new MctFrameElement((180, 0))
                    {
                        Id    = elementIndex++,
                        Mat   = beamMat.Value,
                        Sec   = sec,
                        Type  = MctElementTypeEnum.BEAM,
                        Node2 = LateralBeamNodeSet[i * _lateralBeamNums + j + (LateralBeamSet.Count + _lateralBeamNums)],
                        Node1 = LateralBeamNodeSet[i * _lateralBeamNums + j + 2 * (LateralBeamSet.Count + _lateralBeamNums)],
                    };
                    _mctStore.AddElement(element);
                    element = new MctFrameElement((180, 0))
                    {
                        Id    = elementIndex++,
                        Mat   = beamMat.Value,
                        Sec   = sec,
                        Type  = MctElementTypeEnum.BEAM,
                        Node2 = LateralBeamNodeSet[i * _lateralBeamNums + j + 2 * (LateralBeamSet.Count + _lateralBeamNums)],
                        Node1 = LateralBeamNodeSet[i * _lateralBeamNums + j + _lateralBeamNums + (LateralBeamSet.Count + _lateralBeamNums)],
                    };
                    _mctStore.AddElement(element);
                }
            }

            var elasticLinkCollector = new List <MctElasticLink>();
            var rigidLinkCollector   = new List <MctRigidLink>();

            for (int i = 0; i <= LateralBeamSet.Count / _lateralBeamNums; i++)
            {
                for (int j = 0; j < _lateralBeamNums - 1; j++)
                {
                    var link = new MctElasticLink(elasticLinkIndex++, LateralBeamNodeSet[i * _lateralBeamNums + j],
                                                  LateralBeamNodeSet[i * _lateralBeamNums + j + 1]);
                    elasticLinkCollector.Add(link);
                    _mctStore.AddElasticLink(link);
                }
            }
            for (int i = 0; i < girderNodeSet.Count; i++)
            {
                var subNodes = new List <MctNode>()
                {
                    LateralBeamNodeSet[i], LateralBeamNodeSet[i + girderNodeSet.Count]
                };
                var link = new MctRigidLink(rigidLinkIndex++, girderNodeSet[i], subNodes);
                rigidLinkCollector.Add(link);
                _mctStore.AddRigidLink(link);
            }
            _mctStore.AddLink(rigidLinkCollector, elasticLinkCollector);
            //_mctStore.AddNode(BeamNodesSet);
        }
Example #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);
            }
        }