/// <summary> /// группировка розеток для Кроссовых шкафов, для Серверных(с функцией Кроссовых) группировать не надо /// </summary> /// <param name="shelfAndSockets"></param> /// <returns> группы розеток по параметру "Розетка - Система" </returns> public static List <IEnumerable <Socket> > groupingSocketsByPurpose(ShelfAndSockets shelfAndSockets) { List <Socket> socList = shelfAndSockets.socketList; Element shelf = shelfAndSockets.shelf; string panelName = shelf.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString(); //дополнительно - марку щита в розетки foreach (var i in socList) { i.shelfNumber = panelName; } List <IEnumerable <Socket> > socketPurposes = new List <IEnumerable <Socket> >(); // Разделение розеток на системы, если шкаф Кроссовый if (shelf.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM).AsValueString() == "СКС_Шкаф_[серверный, кроссовый] : Кроссовый") { var groupSockets = socList.GroupBy(s => s.system); foreach (var g in groupSockets) { socketPurposes.Add(g.AsEnumerable()); } } return(socketPurposes); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { // Get application and document objects UIApplication ui_app = commandData.Application; UIDocument ui_doc = ui_app?.ActiveUIDocument; doc = ui_doc?.Document; string[] symbolNames = { "Ф_Шкаф", "Ф_Органайзер", "Ф_Патч-панель 24 RG45", "Ф_Коммутатор 24 RG45", "Ф_Коммутатор 48 RG45", "Ф_Шкос 1U 32 волокон", "Ф_Шкос 2U 96 волокон", "Ф_Коммутатор Cisco WS-C3750X-24S-S", "Ф_Коммутатор Cisco WS-C3750X-24T-S", "Ф_Маршрутизатор CISCO2921", "С_Патч-панель 24 RG45", "С_Коммутатор 48 RG45", "С_Коммутатор 24 RG45", "С_Шкос 1U 32 волокон", "Розетка RJ45 в коробе", "Розетка RJ45 в лючке", "Розетка RJ45 в установочной коробке", "Розетка RJ45 врезная", "Розетка RJ45 накладная", "Розетка телефонная", "Розетка неизвестная" }; List <FamilySymbol> symbols2 = new List <FamilySymbol>(); //собираем FamilySymbol'ы проверяем их наличие в проекте string alert = String.Empty; foreach (var name in symbolNames) { var x = Util.GetFamilySymbolByFamilyName(doc, name); if (x == null) { alert += $"{name};\n"; } else { symbols2.Add(x); } } if (alert != String.Empty) { Util.InfoMsg2("В модели отсутствуют семейства:", alert); return(Result.Cancelled); } //если семейства в проект загружены, мы получили список семейств symbols2 frameSymbol = symbols2[0]; orgSymbol = symbols2[1]; patch24Symbol = symbols2[2]; commut24Symbol = symbols2[3]; commut48Symbol = symbols2[4]; shkos1U32Symbol = symbols2[5]; shkos2U96Symbol = symbols2[6]; core24sSymbol = symbols2[7]; core24tSymbol = symbols2[8]; routerSymbol = symbols2[9]; patch24SchemeSymbol = symbols2[10]; commut48SchemeSymbol = symbols2[11]; commut24SchemeSymbol = symbols2[12]; shkosSchemeSymbol = symbols2[13]; socketInBox = symbols2[14]; socketInHatch = symbols2[15]; socketInInstallBox = symbols2[16]; socketMortise = symbols2[17]; socketPatch = symbols2[18]; socketPhone = symbols2[19]; socketUnknown = symbols2[20]; socketSymbolDict = new Dictionary <string, ElementId> { ["1xRJ-45, Врезная"] = socketMortise.Id, ["2xRJ-45, Врезная"] = socketMortise.Id, ["1xRJ-45, Лючок"] = socketInHatch.Id, ["2xRJ-45, Лючок"] = socketInHatch.Id, ["1xRJ-45, Накладная"] = socketPatch.Id, ["2xRJ-45, Накладная"] = socketPatch.Id, ["1xRJ-45, Размещение в коробе"] = socketInBox.Id, ["2xRJ-45, Размещение в коробе"] = socketInBox.Id, }; #region try try { using (Transaction t = new Transaction(doc, "SKSFasad")) { t.Start(); frameSymbol.Activate(); orgSymbol.Activate(); patch24Symbol.Activate(); commut24Symbol.Activate(); commut24Symbol.Activate(); commut48Symbol.Activate(); shkos1U32Symbol.Activate(); shkos2U96Symbol.Activate(); patch24SchemeSymbol.Activate(); commut48SchemeSymbol.Activate(); commut24SchemeSymbol.Activate(); shkosSchemeSymbol.Activate(); core24sSymbol.Activate(); core24tSymbol.Activate(); routerSymbol.Activate(); // Кроссовые шкафы, в которые собираются розетки IList <Element> shelfs = Util.GetElementsByStringParameter( doc, BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM, "СКС_Шкаф_[серверный, кроссовый] : Кроссовый"); // розетки типоразмеров из списка socketTypeNames IList <Element> sockets = Util.GetElementsByStringParameter( doc, BuiltInParameter.ELEM_FAMILY_PARAM, "СКС_Розетка_[1xRJ45, 2xRJ45, TV, radio]") .Where(i => socketSymbolDict.Keys.Contains(i.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString())) .ToList(); // собираем розетки в шкафы по параметру "Розетка - Шкаф" if (shelfs.Count > 0 && sockets.Count > 0) { List <ShelfAndSockets> shelfAndSockets = new List <ShelfAndSockets>(); foreach (var i in shelfs) { ShelfAndSockets sas = new ShelfAndSockets(); sas.shelf = i; string shelfNumber = i.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString(); var socketsForShelf = sockets.Where(s => s.LookupParameter("Розетка - Шкаф").AsString() == shelfNumber); foreach (var s in socketsForShelf) { Socket socket = new Socket(); socket.socket = s; string socketTypeName = s.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString(); //символ розетки socket.symbolId = socketSymbolDict[socketTypeName]; //количество портов if (socketTypeName.Contains("1xRJ-45")) { socket.countOfPorts = 1; } else if (socketTypeName.Contains("2xRJ-45")) { socket.countOfPorts = 2; } //система string sys = s.LookupParameter("Розетка - Система").AsString(); if (!string.IsNullOrWhiteSpace(sys)) { socket.system = sys; } var space = ((FamilyInstance)s).Space; if (space != null) { socket.roomNumber = space.Number; } else { socket.roomNumber = string.Empty; } sas.socketList.Add(socket); } if (sas.socketList.Count > 0) { shelfAndSockets.Add(sas); } } //имена существующих чертежных видов var viewCreatedNames = ViewDraftingCreate.viewDraftingNames(doc); string viewFasadeName; string viewSchemeName; int countPorts; int commutNumber; int typeOfCommutators; foreach (var i in shelfAndSockets) { var socketGroups = SocketNumbering.groupingSocketsByPurpose(i); Element shelf = i.shelf; shelfName = shelf.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString(); typeOfCommutators = shelf.LookupParameter("Коммутаторы по 24 порта").AsInteger(); viewFasadeName = createViewName("СКС Фасад", shelfName, viewCreatedNames); viewSchemeName = createViewName("СКС Схема", shelfName, viewCreatedNames); viewFasade = ViewDraftingCreate.viewDraftingCreate(doc, viewFasadeName); viewScheme = ViewDraftingCreate.viewDraftingCreate(doc, viewSchemeName); viewFasade.Scale = 10; viewScheme.Scale = 2; createFrame(); pointFacade = new XYZ(0, 0, 0); pointScheme = new XYZ(0, 0, 0); foreach (var group in socketGroups) { countPorts = SocketNumbering.countPorts(group); countCommuts = countOfCommuts(countPorts, typeOfCommutators); List <string> portsNames = SocketNumbering.socketMarking(group, countPorts); //Создаем шкосы если шкаф Кроссовый if (shelf.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM).AsValueString() == "Шкаф СКС: Кроссовый") { pointFacade = createShkos(); } string literals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; commutNumber = 1; //алгоритм для 48-портовых коммутаторов if (typeOfCommutators == 0) { lengthYShkos = (countCommuts * (260 + 150) - 130) / 304.8; // длина проводка у шкоса на схемах pointScheme = createShkosScheme(); while (countPorts > 0) { if (countPorts > 24) { portNamesForPatch1 = portsNames.GetRange(0, 24); portsNames.RemoveRange(0, 24); if (countPorts > 48) { portNamesForPatch2 = portsNames.GetRange(0, 24); portsNames.RemoveRange(0, 24); } else { portNamesForPatch2 = portsNames; } socketSymbolsIdsPatch1 = SocketGraphicElementIds(group, portNamesForPatch1); socketSymbolsIdsPatch2 = SocketGraphicElementIds(group, portNamesForPatch2); socketRoomsForPatch1 = SocketRoomNumbers(group, portNamesForPatch1); socketRoomsForPatch2 = SocketRoomNumbers(group, portNamesForPatch2); patch1Number = literals[0]; literals = literals.Remove(0, 1); patch2Number = literals[0]; literals = literals.Remove(0, 1); pointFacade = createPatch48(); pointScheme = createPatch48Scheme(); countPorts -= 48; } else { pointFacade = createPatch24(); portNamesForPatch1 = portsNames; socketSymbolsIdsPatch1 = SocketGraphicElementIds(group, portNamesForPatch1); socketRoomsForPatch1 = SocketRoomNumbers(group, portNamesForPatch1); patch1Number = literals[0]; literals = literals.Remove(0, 1); pointScheme = createPatch24Scheme(); countPorts -= 24; } commutNumber++; } } //алгоритм для 24-портовых else if (typeOfCommutators == 1) { lengthYShkos = countCommuts * 280 / 304.8; // длина проводка у шкоса на схемах pointScheme = createShkosScheme(); while (countPorts > 0) { pointFacade = createPatch24(); if (countPorts > 24) { portNamesForPatch1 = portsNames.GetRange(0, 24); portsNames.RemoveRange(0, 24); } else { portNamesForPatch1 = portsNames; } socketSymbolsIdsPatch1 = SocketGraphicElementIds(group, portNamesForPatch1); socketRoomsForPatch1 = SocketRoomNumbers(group, portNamesForPatch1); patch1Number = literals[0]; literals = literals.Remove(0, 1); pointScheme = createPatch24Scheme(); countPorts -= 24; commutNumber++; } } foreach (var s in group) { Parameter parMark1 = s.socket.LookupParameter("Розетка - Марка 1"); Parameter parMark2 = s.socket.LookupParameter("Розетка - Марка 2"); parMark1.Set(s.mark1); parMark2.Set(s.mark2); } } } } t.Commit(); } TaskDialog.Show("Готово", "ОК"); return(Result.Succeeded); } // This is where we "catch" potential errors and define how to deal with them catch (Autodesk.Revit.Exceptions.OperationCanceledException) { // If user decided to cancel the operation return Result.Canceled return(Result.Cancelled); } catch (Exception ex) { // If something went wrong return Result.Failed message = ex.Message; return(Result.Failed); } #endregion }