Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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
        }