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; } } } }
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); } }