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