public void AddRigidLink(MctRigidLink link) { foreach (var singleLink in _rigidLinks) { if ((singleLink._mainNode == link._mainNode) && (singleLink._subNodes == link._subNodes)) { return; } } _rigidLinks.Add(link); }
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); }