private bool CheckMemberRestraint(Member MemberToCheck, Beam StartBeam, MEMBERCLASS MemberClass) { bool output = false; // Gather all nodes connected to the beam to check or any beams parallel to it var nodes = new HashSet <Node>(BeamHelpers.GatherParallelBeams(StartBeam).SelectMany(b => new List <Node>() { b.StartNode, b.EndNode })); // Check if any of the connected members are class above the current member var connectedMembers = nodes.SelectMany(n => n.ConnectedMembers).Where(m => m != null && m != MemberToCheck); if (MemberClass == MEMBERCLASS.PRIMARY) { output = connectedMembers.Any(m => this.PrimaryMembers.Contains(m)); } else if (MemberClass == MEMBERCLASS.SECONDARY) { output = connectedMembers.Any(m => this.PrimaryMembers.Contains(m) || this.SecondaryMembers.Contains(m)); } else if (MemberClass == MEMBERCLASS.TERTIARY) { output = connectedMembers.Any(m => this.PrimaryMembers.Contains(m) || this.SecondaryMembers.Contains(m) || this.TertiaryMembers.Contains(m)); } return(output); }
/// <summary> /// Classify the beams in the model accordin to their specifications /// </summary> void ClassifyBeams() { const string status = "Classifying beams..."; int beamsProcessed; int totalBeamToProcess; HashSet <Beam> beamsToProcess; beamsToProcess = new HashSet <Beam>(this.Beams); beamsProcessed = 0; totalBeamToProcess = beamsToProcess.Count; // Any vertical beam attached directly to a support node is a column Parallel.ForEach(beamsToProcess.Where(b => (b.StartNode.IsSupport || b.EndNode.IsSupport) && (this.ZAxisUp ? b.IsParallelToZ : b.IsParallelToY)), beam => { foreach (var parallelBeam in BeamHelpers.GatherParallelBeams(beam)) { parallelBeam.Type = BeamType.COLUMN; this.OnModelBuildStatusUpdate(new ModelBuildStatusUpdateEventArgs(status, Interlocked.Increment(ref beamsProcessed), totalBeamToProcess)); } }); beamsToProcess.RemoveWhere(b => b.Type == BeamType.COLUMN); // Classify all remaining beams // If a beam is vertical and not a column, then it is a post, otehrwise it is a beam // All other beams are classified as braces Parallel.ForEach(beamsToProcess, beam => { if (beam.Spec == BeamSpec.Unspecified) { if ((this.ZAxisUp && beam.IsParallelToZ) || !this.ZAxisUp && beam.IsParallelToY) { beam.Type = BeamType.POST; } else { beam.Type = BeamType.BEAM; } } else { beam.Type = BeamType.BRACE; } this.OnModelBuildStatusUpdate(new ModelBuildStatusUpdateEventArgs(status, Interlocked.Increment(ref beamsProcessed), totalBeamToProcess)); }); }