Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="routingPreferenceManager"></param>
        /// <param name="mepSize"></param>
        /// <param name="document"></param>
        public Analyzer(RoutingPreferenceManager routingPreferenceManager, double mepSize, Document document)
        {
            m_routingPreferenceManager = routingPreferenceManager;
            m_document = document;


            m_mepSize = Convert.ConvertValueToFeet(mepSize, m_document);
        }
Пример #4
0
        /// <summary>
        /// Check to see if the routing preferences specify a preferred junction type but do not have any
        /// rules with valid fittings for that type (e.g, "Tee" is the preferred junction type, but only "Tap" fittings
        /// are specified in junction rules.)
        /// </summary>
        /// <param name="routingPreferenceManager"></param>
        /// <returns></returns>
        private bool IsPreferredJunctionTypeValid(RoutingPreferenceManager routingPreferenceManager)
        {
            PreferredJunctionType preferredJunctionType = routingPreferenceManager.PreferredJunctionType;

            if (routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Junctions) == 0)
            {
                return(false);
            }

            bool teeDefined = false;
            bool tapDefined = false;

            for (int index = 0; index != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Junctions); ++index)
            {
                RoutingPreferenceRule rule = routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Junctions, index);
                if (rule.MEPPartId == ElementId.InvalidElementId)
                {
                    continue;
                }

                FamilySymbol familySymbol = this.m_document.GetElement(rule.MEPPartId) as FamilySymbol;

                Parameter paramPartType = familySymbol.Family.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
                if (paramPartType == null)
                {
                    throw new Exception("Null partType parameter.");
                }

                PartType partType = (PartType)paramPartType.AsInteger();

                if ((partType == PartType.Tee))
                {
                    teeDefined = true;
                }
                else if (
                    (partType == PartType.TapAdjustable) ||
                    (partType == PartType.TapPerpendicular) ||
                    (partType == PartType.SpudPerpendicular) ||
                    (partType == PartType.SpudAdjustable)
                    )
                {
                    tapDefined = true;
                }
            }
            if ((preferredJunctionType == PreferredJunctionType.Tap) && !tapDefined)
            {
                return(false);
            }
            if ((preferredJunctionType == PreferredJunctionType.Tee) && !teeDefined)
            {
                return(false);
            }

            return(true);
        }
Пример #5
0
        /// <summary>
        /// Create Xml from a RoutingPreferenceManager
        /// </summary>
        /// <param name="routingPreferenceManager"></param>
        /// <returns></returns>
        private XElement CreateXmlFromRoutingPreferenceManager(RoutingPreferenceManager routingPreferenceManager)
        {
            XElement xRoutingPreferenceManager = new XElement(XName.Get("RoutingPreferenceManager"));

            xRoutingPreferenceManager.Add(new XAttribute(XName.Get("pipeTypeName"), GetPipeTypeNameById(routingPreferenceManager.OwnerId)));

            xRoutingPreferenceManager.Add(new XAttribute(XName.Get("preferredJunctionType"), routingPreferenceManager.PreferredJunctionType.ToString()));

            for (int indexCrosses = 0; indexCrosses != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Crosses); indexCrosses++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Crosses, indexCrosses), RoutingPreferenceRuleGroupType.Crosses));
            }

            for (int indexElbows = 0; indexElbows != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Elbows); indexElbows++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Elbows, indexElbows), RoutingPreferenceRuleGroupType.Elbows));
            }

            for (int indexSegments = 0; indexSegments != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Segments); indexSegments++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Segments, indexSegments), RoutingPreferenceRuleGroupType.Segments));
            }

            for (int indexJunctions = 0; indexJunctions != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Junctions); indexJunctions++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Junctions, indexJunctions), RoutingPreferenceRuleGroupType.Junctions));
            }

            for (int indexTransitions = 0; indexTransitions != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Transitions); indexTransitions++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Transitions, indexTransitions), RoutingPreferenceRuleGroupType.Transitions));
            }

            for (int indexUnions = 0; indexUnions != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Unions); indexUnions++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Unions, indexUnions), RoutingPreferenceRuleGroupType.Unions));
            }

            for (int indexMechanicalJoints = 0; indexMechanicalJoints != routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.MechanicalJoints); indexMechanicalJoints++)
            {
                xRoutingPreferenceManager.Add(createXmlFromRoutingPreferenceRule(routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.MechanicalJoints, indexMechanicalJoints), RoutingPreferenceRuleGroupType.MechanicalJoints));
            }


            return(xRoutingPreferenceManager);
        }
Пример #6
0
        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);
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <summary>
        /// Get all segments from a the currently selected pipe type, get each size from each segment,
        /// collect, sort, and return.
        /// </summary>
        public static List <double> GetAvailableSegmentSizes(RoutingPreferenceManager routingPreferenceManager, Autodesk.Revit.DB.Document document)
        {
            System.Collections.Generic.HashSet <double> sizes = new HashSet <double>();
            int segmentCount = routingPreferenceManager.GetNumberOfRules(RoutingPreferenceRuleGroupType.Segments);

            for (int index = 0; index != segmentCount; ++index)
            {
                RoutingPreferenceRule segmentRule = routingPreferenceManager.GetRule(RoutingPreferenceRuleGroupType.Segments, index);

                Segment segment = document.GetElement(segmentRule.MEPPartId) as Segment;
                foreach (MEPSize size in segment.GetSizes())
                {
                    sizes.Add(size.NominalDiameter);
                }
            }
            List <double> sizesSorted = sizes.ToList();

            sizesSorted.Sort();
            return(sizesSorted);
        }
Пример #9
0
        /// <summary>
        /// Populate a routing preference manager from Xml
        /// </summary>
        /// <param name="routingPreferenceManagerXElement"></param>
        private void ParseRoutingPreferenceManagerFromXML(XElement routingPreferenceManagerXElement)
        {
            XAttribute xaPipeTypeName          = routingPreferenceManagerXElement.Attribute(XName.Get("pipeTypeName"));
            XAttribute xaPreferredJunctionType = routingPreferenceManagerXElement.Attribute(XName.Get("preferredJunctionType"));

            PreferredJunctionType preferredJunctionType;
            bool r1 = Enum.TryParse <PreferredJunctionType>(xaPreferredJunctionType.Value, out preferredJunctionType);

            if (!r1)
            {
                throw new RoutingPreferenceDataException("Invalid Preferred Junction Type in: " + routingPreferenceManagerXElement.ToString());
            }

            ElementId pipeTypeId = GetPipeTypeByName(xaPipeTypeName.Value);

            if (pipeTypeId == ElementId.InvalidElementId)
            {
                throw new RoutingPreferenceDataException("Could not find pipe type element in: " + routingPreferenceManagerXElement.ToString());
            }

            PipeType pipeType = m_document.GetElement(pipeTypeId) as PipeType;

            RoutingPreferenceManager routingPreferenceManager = pipeType.RoutingPreferenceManager;

            routingPreferenceManager.PreferredJunctionType = preferredJunctionType;

            foreach (XNode xRule in routingPreferenceManagerXElement.Nodes())
            {
                if (xRule is XElement)
                {
                    RoutingPreferenceRuleGroupType groupType;
                    RoutingPreferenceRule          rule = ParseRoutingPreferenceRuleFromXML(xRule as XElement, out groupType);
                    routingPreferenceManager.AddRule(groupType, rule);
                }
            }
        }
Пример #10
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="routingPreferenceManager"></param>
 /// <param name="document"></param>
 public Analyzer(RoutingPreferenceManager routingPreferenceManager, Document document)
 {
     m_routingPreferenceManager = routingPreferenceManager;
     m_document = document;
     m_mepSize  = 0;
 }
Пример #11
0
        void SelectAndPlaceTakeOffFitting(Document doc)
        {
            ElementId mainDuctId = ElementId.InvalidElementId;

            // Get DuctType - we need this for its
            // RoutingPreferenceManager. This is how we assign
            // our tap object to be used. This is the settings
            // for the duct object we attach our tap to.

            Duct duct = doc.GetElement(mainDuctId) as Duct;

            DuctType ductType = duct.DuctType;

            RoutingPreferenceManager routePrefManager
                = ductType.RoutingPreferenceManager;

            // Set Junction Prefernce to Tap.

            routePrefManager.PreferredJunctionType
                = PreferredJunctionType.Tap;

            // For simplicity sake, I remove all previous rules
            // for taps so I can just add what I want here.
            // This will probably vary.

            int initRuleCount = routePrefManager.GetNumberOfRules(
                RoutingPreferenceRuleGroupType.Junctions);

            for (int i = 0; i != initRuleCount; ++i)
            {
                routePrefManager.RemoveRule(
                    RoutingPreferenceRuleGroupType.Junctions, 0);
            }

            // Get FamilySymbol for Tap I want to use.

            FamilySymbol tapSym = null;

            doc.LoadFamilySymbol("C:/FamilyLocation/MyTap.rfa",
                                 "MyTap", out tapSym);

            // Symbol needs to be activated before use.

            if ((!tapSym.IsActive) && (tapSym != null))
            {
                tapSym.Activate();
                doc.Regenerate();
            }

            // Create Rule that utilizes the Tap. Use the argument
            // MEPPartId = ElementId for the desired FamilySymbol.

            RoutingPreferenceRule newRule
                = new RoutingPreferenceRule(tapSym.Id, "MyTap");

            routePrefManager.AddRule(
                RoutingPreferenceRuleGroupType.Junctions, newRule);

            // To create a solid tap, we need to use the Revit
            // doc.Create.NewTakeoffFitting routine. For this,
            // we need a connector. If we don't have one, we
            // just create a temporary object with a connector
            // where we want it.

            Connector tmpConn = CreateTemporaryConnectorForTap();

            // Create our tap.

            FamilyInstance tapInst
                = doc.Create.NewTakeoffFitting(tmpConn, duct);
        }
Пример #12
0
        /// <summary>
        /// 检测系统中是否有默认连接项,无则进行添加
        /// </summary>
        /// <param name="src"></param>
        /// <param name="type"></param>
        protected FamilySymbol Judge_LoadDefaultFitting(MEPCurve src, MEPCurveConnectTypeENUM type)
        {
            FamilySymbol fs = null;

            switch (type)
            {
            case MEPCurveConnectTypeENUM.Elbow:    //弯头
                fs = src.GetDefaultFittingSymbol(RoutingPreferenceRuleGroupType.Elbows); break;

            case MEPCurveConnectTypeENUM.Tee:    //三通
                fs = src.GetDefaultFittingSymbol(RoutingPreferenceRuleGroupType.Junctions); break;

            case MEPCurveConnectTypeENUM.Cross:    //四通
                fs = src.GetDefaultFittingSymbol(RoutingPreferenceRuleGroupType.Crosses); break;

            case MEPCurveConnectTypeENUM.Transition:    //过渡件
                fs = src.GetDefaultFittingSymbol(RoutingPreferenceRuleGroupType.Transitions); break;

            case MEPCurveConnectTypeENUM.TakeOff:    //侧接
                fs = src.GetDefaultTakeoffFittingSymbol(); break;

            default:
                fs = null;
                break;
            }

            if (fs != null)
            {
                return(fs);
            }

            if (this.IsOnlyUseRevitDefault)
            {
                return(null);
            }

            var familyName = this.GetDefaultFittingName(src, type);

            if (familyName == null)
            {
                return(null);
            }

            fs = FamilyLoadUtils.FindFamilySymbol_SubTransaction(src.Document, familyName, null);
            if (fs == null)
            {
                return(null);
            }
            if (src is Pipe || src is Duct)
            {
                RoutingPreferenceManager rpm = src.GetMEPCurveType().RoutingPreferenceManager;
                var rule = new RoutingPreferenceRule(fs.Id, "");
                rule.AddCriterion(PrimarySizeCriterion.All());

                switch (type)
                {
                case MEPCurveConnectTypeENUM.Elbow:    //弯头
                    rpm.AddRule(RoutingPreferenceRuleGroupType.Elbows, rule); break;

                case MEPCurveConnectTypeENUM.Tee:    //三通
                    rpm.AddRule(RoutingPreferenceRuleGroupType.Junctions, rule); break;

                case MEPCurveConnectTypeENUM.Cross:    //四通
                    rpm.AddRule(RoutingPreferenceRuleGroupType.Crosses, rule); break;

                case MEPCurveConnectTypeENUM.Transition:    //过渡件
                    rpm.AddRule(RoutingPreferenceRuleGroupType.Transitions, rule); break;

                case MEPCurveConnectTypeENUM.TakeOff:    //侧接
                    rpm.AddRule(RoutingPreferenceRuleGroupType.Junctions, rule); break;

                default:
                    break;
                }
            }
            else if (src is Conduit)
            {
                Parameter param = null;

                switch (type)
                {
                case MEPCurveConnectTypeENUM.Elbow:    //弯头
                    param = (src.Document.GetElement(src.GetTypeId())).GetParameters("弯头").FirstOrDefault(); break;

                case MEPCurveConnectTypeENUM.Tee:    //三通
                    param = (src.Document.GetElement(src.GetTypeId())).GetParameters("T 形三通").FirstOrDefault(); break;

                case MEPCurveConnectTypeENUM.Cross:    //四通
                    param = (src.Document.GetElement(src.GetTypeId())).GetParameters("交叉线").FirstOrDefault(); break;

                case MEPCurveConnectTypeENUM.Transition:    //过渡件
                    param = (src.Document.GetElement(src.GetTypeId())).GetParameters("过渡件").FirstOrDefault(); break;

                default:
                    break;
                }

                if (param != null)
                {
                    param.Set(fs.Id);
                }
            }
            else if (src is CableTray)
            {
                Parameter param = null;
                var       t     = new FilteredElementCollector(src.Document).OfClass(typeof(CableTrayType)).FirstOrDefault(p => p.GetParameters("族名称").First().AsString() == "带配件的电缆桥架");
                switch (type)
                {
                case MEPCurveConnectTypeENUM.Elbow:    //弯头
                    param = t.GetParameters("水平弯头").FirstOrDefault(); break;

                case MEPCurveConnectTypeENUM.Tee:    //三通
                    param = t.GetParameters("T 形三通").FirstOrDefault(); break;

                case MEPCurveConnectTypeENUM.Cross:    //四通
                    param = t.GetParameters("交叉线").FirstOrDefault(); break;

                case MEPCurveConnectTypeENUM.Transition:    //过渡件
                    param = t.GetParameters("过渡件").FirstOrDefault(); break;

                default:
                    break;
                }

                if (param != null)
                {
                    param.Set(fs.Id);
                }
            }
            return(fs);
        }