private bool IsRuleSetToRangeNone(RoutingPreferenceManager routingPreferenceManager, RoutingPreferenceRuleGroupType groupType, int index) { if (routingPreferenceManager.GetNumberOfRules(groupType) == 0) { return(false); } RoutingPreferenceRule rule = routingPreferenceManager.GetRule(groupType, index); if (rule.NumberOfCriteria == 0) { return(false); } PrimarySizeCriterion psc = rule.GetCriterion(0) as PrimarySizeCriterion; if (psc.IsEqual(PrimarySizeCriterion.None())) { return(true); } else { return(false); } }
private bool IsGroupSetToRangeNone(RoutingPreferenceManager routingPreferenceManager, RoutingPreferenceRuleGroupType groupType) { bool retval = true; if (routingPreferenceManager.GetNumberOfRules(groupType) == 0) { return(false); } for (int index = 0; index != routingPreferenceManager.GetNumberOfRules(groupType); ++index) { if (!(IsRuleSetToRangeNone(routingPreferenceManager, groupType, index))) { retval = false; } } return(retval); }
private bool CheckSegmentForValidCoverage(RoutingPreferenceManager routingPreferenceManager, double lowerBound, double upperBound, ElementId segmentId, RoutingPreferenceRuleGroupType groupType, List <double> sizesNotCovered) { bool retval = true; if (segmentId == ElementId.InvalidElementId) { throw new Exception("Invalid segment ElementId"); } PipeSegment segment = this.m_document.GetElement(segmentId) as PipeSegment; foreach (MEPSize size in segment.GetSizes()) { //skip sizes outside of rp bounds if (size.NominalDiameter < lowerBound) { continue; } if (size.NominalDiameter > upperBound) { break; } RoutingConditions conditions = new RoutingConditions(RoutingPreferenceErrorLevel.None); conditions.AppendCondition(new RoutingCondition(size.NominalDiameter)); ElementId foundFitting = routingPreferenceManager.GetMEPPartId(groupType, conditions); if (foundFitting == ElementId.InvalidElementId) { sizesNotCovered.Add(size.NominalDiameter); retval = false; } } return(retval); }
/// <summary> /// Checks to see if any segments in the routing preference manager have sizes that cannot be fitted with fittings defined in a rule group type, such as "Elbow." /// For example, if a segment rule defines a segment be used from sizes 2" to 12", and there are three elbows rules defined to be used from ranges /// 2"-4", 4"-7", and 9"-14", this method will return warning information specifying the sizes (8", 8.5", etc...) not covered by elbow fittings. /// </summary> private XElement GetSegmentRangeNotCoveredWarning(RoutingPreferenceManager routingPreferenceManager, RoutingPreferenceRuleGroupType groupType) { for (int index = 0; index != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Segments); ++index) { RoutingPreferenceRule rule = routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Segments, index); if (rule.MEPPartId == ElementId.InvalidElementId) { continue; } if (rule.NumberOfCriteria == 0) //double check all/none { continue; } PrimarySizeCriterion psc = rule.GetCriterion(0) as PrimarySizeCriterion; PipeSegment segment = m_document.GetElement(rule.MEPPartId) as PipeSegment; List <double> sizesNotCovered = new List <double>(); bool isCovered = CheckSegmentForValidCoverage(routingPreferenceManager, psc.MinimumSize, psc.MaximumSize, rule.MEPPartId, groupType, sizesNotCovered); if (!isCovered) { XElement xSegmentNotCovered = new XElement(XName.Get("SegmentRangeNotCovered")); xSegmentNotCovered.Add(new XAttribute(XName.Get("name"), segment.Name)); StringBuilder sBuilder = new StringBuilder(); foreach (double size in sizesNotCovered) { double roundedSize = Convert.ConvertValueDocumentUnits(size, m_document); sBuilder.Append(roundedSize.ToString() + " "); } sBuilder.Remove(sBuilder.Length - 1, 1); xSegmentNotCovered.Add(new XAttribute(XName.Get("sizes"), sBuilder.ToString())); xSegmentNotCovered.Add(new XAttribute(XName.Get("unit"), m_document.GetUnits().GetFormatOptions(UnitType.UT_PipeSize).DisplayUnits.ToString())); xSegmentNotCovered.Add(new XAttribute(XName.Get("groupType"), groupType.ToString())); return(xSegmentNotCovered); } } return(null); }
/// <summary> /// Constructor /// </summary> /// <param name="groupType"></param> /// <param name="ids"></param> public PartIdInfo(RoutingPreferenceRuleGroupType groupType, IList <ElementId> ids) { m_ids = new List <ElementId>(); m_groupType = groupType; m_ids.AddRange(ids); }
/// <summary> /// Create Xml from a RoutingPreferenceRule /// </summary> /// <param name="rule"></param> /// <param name="groupType"></param> /// <returns></returns> private XElement createXmlFromRoutingPreferenceRule(RoutingPreferenceRule rule, RoutingPreferenceRuleGroupType groupType) { XElement xRoutingPreferenceRule = new XElement(XName.Get("RoutingPreferenceRule")); xRoutingPreferenceRule.Add(new XAttribute(XName.Get("description"), rule.Description)); xRoutingPreferenceRule.Add(new XAttribute(XName.Get("ruleGroup"), groupType.ToString())); if (rule.NumberOfCriteria >= 1) { PrimarySizeCriterion psc = rule.GetCriterion(0) as PrimarySizeCriterion; if (psc.IsEqual(PrimarySizeCriterion.All())) { xRoutingPreferenceRule.Add(new XAttribute(XName.Get("minimumSize"), "All")); } else if (psc.IsEqual(PrimarySizeCriterion.None())) { xRoutingPreferenceRule.Add(new XAttribute(XName.Get("minimumSize"), "None")); } else //Only specify "maximumSize" if not specifying "All" or "None" for minimum size, just like in the UI. { xRoutingPreferenceRule.Add(new XAttribute(XName.Get("minimumSize"), (Convert.ConvertValueDocumentUnits(psc.MinimumSize, m_document)).ToString())); xRoutingPreferenceRule.Add(new XAttribute(XName.Get("maximumSize"), (Convert.ConvertValueDocumentUnits(psc.MaximumSize, m_document)).ToString())); } } else { xRoutingPreferenceRule.Add(new XAttribute(XName.Get("minimumSize"), "All")); } if (groupType == RoutingPreferenceRuleGroupType.Segments) { xRoutingPreferenceRule.Add(new XAttribute(XName.Get("partName"), GetSegmentNameById(rule.MEPPartId))); } else { xRoutingPreferenceRule.Add(new XAttribute(XName.Get("partName"), GetFittingNameById(rule.MEPPartId))); } return(xRoutingPreferenceRule); }
/// <summary> /// Create a RoutingPreferenceRule from Xml /// </summary> /// <param name="ruleXElement"></param> /// <param name="groupType"></param> /// <returns></returns> private RoutingPreferenceRule ParseRoutingPreferenceRuleFromXML(XElement ruleXElement, out RoutingPreferenceRuleGroupType groupType) { XAttribute xaDescription = null; XAttribute xaPartName = null; XAttribute xaMinSize = null; XAttribute xaMaxSize = null; XAttribute xaGroup = null; xaDescription = ruleXElement.Attribute(XName.Get("description")); xaPartName = ruleXElement.Attribute(XName.Get("partName")); xaGroup = ruleXElement.Attribute(XName.Get("ruleGroup")); xaMinSize = ruleXElement.Attribute(XName.Get("minimumSize")); ElementId partId; bool r3 = Enum.TryParse <RoutingPreferenceRuleGroupType>(xaGroup.Value, out groupType); if (!r3) { throw new RoutingPreferenceDataException("Could not parse rule group type: " + xaGroup.Value); } string description = xaDescription.Value; if (groupType == RoutingPreferenceRuleGroupType.Segments) { partId = GetSegmentByName(xaPartName.Value); } else { partId = GetFittingByName(xaPartName.Value); } if (partId == ElementId.InvalidElementId) { throw new RoutingPreferenceDataException("Could not find MEP Part: " + xaPartName.Value + ". Is this the correct family name, and is the correct family loaded?"); } RoutingPreferenceRule rule = new RoutingPreferenceRule(partId, description); PrimarySizeCriterion sizeCriterion; if (string.Compare(xaMinSize.Value, "All", true) == 0) //If "All" or "None" are specified, set min and max values to documented "Max" values. { sizeCriterion = PrimarySizeCriterion.All(); } else if (string.Compare(xaMinSize.Value, "None", true) == 0) { sizeCriterion = PrimarySizeCriterion.None(); } else // "maximumSize" attribute is only needed if not specifying "All" or "None." { try { xaMaxSize = ruleXElement.Attribute(XName.Get("maximumSize")); } catch (System.Exception) { throw new RoutingPreferenceDataException("Cannot get maximumSize attribute in: " + ruleXElement.ToString()); } double min, max; bool r1 = double.TryParse(xaMinSize.Value, out min); bool r2 = double.TryParse(xaMaxSize.Value, out max); if (!r1 || !r2) { throw new RoutingPreferenceDataException("Could not parse size values: " + xaMinSize.Value + ", " + xaMaxSize.Value); } if (min > max) { throw new RoutingPreferenceDataException("Invalid size range."); } min = Convert.ConvertValueToFeet(min, m_document); max = Convert.ConvertValueToFeet(max, m_document); sizeCriterion = new PrimarySizeCriterion(min, max); } rule.AddCriterion(sizeCriterion); return(rule); }