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