1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Свойство блока в фильтре отчета

Сценарии / Модули API

Модератор: специалисты Eplan

Ответить
Аватара пользователя

Автор темы
legionercheg
знаток Eplan
знаток Eplan
Сообщения: 973
Зарегистрирован: 18 ноя 2013, 08:32
Имя: Сергей
Страна: Россия
Благодарил (а): 90 раз
Поблагодарили: 116 раз

Свойство блока в фильтре отчета

Сообщение legionercheg »

Всем привет.
Можно ли каким то образом через API заставить работать фильтр в отчете по свойству блока? Т.е. например есть куча черных ящиков, у них в Свойстве блока 1 указано что они берут данные из другого устройства, если это свойство блока 1 пустое, то этот ЧЯ не попадает в отчет, если Свойство блока 1 не пустое (пофиг что там есть), то устройство попадает в отчет. Отчет предполагается использовать "Спецификация изделий".
Вопрос и выбор отчета - согласен дурацкие, но мало ли "боги API" смогут помочь)))
Аватара пользователя

Barmaley4
знаток Eplan
знаток Eplan
Сообщения: 58
Зарегистрирован: 30 окт 2018, 09:17
Имя: Павел
Страна: РФ
город/регион: Москва
Благодарил (а): 2 раза
Поблагодарили: 54 раза

Свойство блока в фильтре отчета

Сообщение Barmaley4 »

Не очень понятно зачем использовать для этого API?
Если нужно отфильтровать для отчёта "спецификация изделий" конкретные функции (чёрные ящики), то достаточно просто в таких чёрных ящиках заполнить свойство "Место монтажа описательное" (например букву Х там поставить), это единственной свойство которое отчёт будет проверять в функции, а не в самом изделии.
<20024> Место монтажа (описат.)
В фильтре отчёта поставить изделия с местом монтажа описат. не равно "X".

Если таких чёрных ящиков много, и есть риск пропустить что то с заполненным свойством блока, можно автоматизировать это проходом по страницам с валидатором

Код: Выделить всё

Project PR = ;// проект для обработки

            var pagesE3 = PR.Pages.Where(p => p != null && p.PageType == DocumentTypeManager.DocumentType.Circuit);
            List<Function> BBoxes = new List<Function>();

            foreach (var P in pagesE3)
                BBoxes.AddRange(P.Functions.OfType<BoxedDevice>();

            foreach (var F in BBoxes)
            {
                try
                {
                    if (F.Properties.FUNC_SUPPLEMENTARYFIELD[1] != null &&
                        F.Properties.FUNC_SUPPLEMENTARYFIELD[1].ToString(ISOCode.Language.L___).Length > 0)
                            F.Properties.FUNC_MOUNTINGLOCATION = "X";
                    else
                        F.Properties.FUNC_MOUNTINGLOCATION = "";
                }
                catch { }


            }
Но делать ради этого отдельный модификатор отчёта - крайне избыточная мера.
Аватара пользователя

Автор темы
legionercheg
знаток Eplan
знаток Eplan
Сообщения: 973
Зарегистрирован: 18 ноя 2013, 08:32
Имя: Сергей
Страна: Россия
Благодарил (а): 90 раз
Поблагодарили: 116 раз

Свойство блока в фильтре отчета

Сообщение legionercheg »

Barmaley4 писал(а): 14 ноя 2024, 14:39 Если нужно отфильтровать для отчёта "спецификация изделий" конкретные функции (чёрные ящики), то достаточно просто в таких чёрных ящиках заполнить свойство "Место монтажа описательное"
Смысл в том, что мне нужно именно "динамически" знать - в свойстве блока 1 есть данные или нет? Т.е. есть ли эти данные у подключенного устройства напротив? Сейчас их нет, значит ЧЯ с пустым свойством блока в отчет не попадает, а через 5 мин они появились, значит и ЧЯ полетел в отчет. А если я буду что то "заполнять руками", так я могу и в каком нибудь "Пользователь, доп. поле 20 <EPLAN.ArticleRef.EPLAN.PartRef.UserSupplementaryField20>" это делать и потом в фильтре ловить...
Вот пример:
[+]
123.png
Есть ЧЯ (цифры 1 и 2, синие и красный квадраты), они подключены к выводам ПЛК (цифра 3, зеленый квадрат). Эти ЧЯ "смотрят" есть ли данные у выводов ПЛК (цифра 4, оранжевые квадраты), смотрят они естественное через Свойство блока 1. Так вот мне надо запихнуть в отчет все ЧЯ которые "собрали" данные с выводов ПЛК и вывести в отчет. Сейчас я тупо сам вижу где заполнено (оранжевые квадраты) и просто вручную добавляю напротив ЧЯ и так по каждому листу. Когда сигналов штук 10-20, все было норм, щас их под 1000, че то как то уныло)))
Т.е. сейчас вот так:
[+]
111.JPG
А я хочу чтобы всегда было так (графически):
[+]
222.JPG
и в отчет попадали только нужные ЧЯ (синие). Формат ЧЯ тупо для примера, так они все одинаковые))
Barmaley4 писал(а): 14 ноя 2024, 14:39 Если таких чёрных ящиков много, и есть риск пропустить что то с заполненным свойством блока, можно автоматизировать это проходом по страницам с валидатором
Это вот вообще щас не понял, это скрипт или что, объясните попроще "для тупеньких"))) :thankyou:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

Barmaley4
знаток Eplan
знаток Eplan
Сообщения: 58
Зарегистрирован: 30 окт 2018, 09:17
Имя: Павел
Страна: РФ
город/регион: Москва
Благодарил (а): 2 раза
Поблагодарили: 54 раза

Свойство блока в фильтре отчета

Сообщение Barmaley4 »

Перед генерацией отчёта, нужно выполнить данный код через API (можно его как экшон зарегистрировать), тогда все чёрные ящики которые не имеют текста в свойстве блока 1, получат букву Х в место монтажа описательное.
При генерации отчёта, фильтр не пропустит изделия, в функции которых в месте монтажа описательное стоит буква Х. (Фильтр: место монтажа описательное не равно Х)
В вышеуказанном примере я немного не правильно понял задачу, вот исправленный вариант

Код: Выделить всё

	Project PR = ;// проект для обработки

            var pagesE3 = PR.Pages.Where(p => p != null && p.PageType == DocumentTypeManager.DocumentType.Circuit);
            List<Function> BBoxes = new List<Function>();

            foreach (var P in pagesE3)
                BBoxes.AddRange(P.Functions.OfType<BoxedDevice>();

            foreach (var F in BBoxes)
            {
                try
                {
                    if (F.Properties.FUNC_BLOCK_VALUE[1] != null &&
                        F.Properties.FUNC_BLOCK_VALUE[1].ToString().Length > 0)
                            F.Properties.FUNC_MOUNTINGLOCATION = "";
                    else
                        F.Properties.FUNC_MOUNTINGLOCATION = "X";
                }
                catch { }


            }
Аватара пользователя

Barmaley4
знаток Eplan
знаток Eplan
Сообщения: 58
Зарегистрирован: 30 окт 2018, 09:17
Имя: Павел
Страна: РФ
город/регион: Москва
Благодарил (а): 2 раза
Поблагодарили: 54 раза

Свойство блока в фильтре отчета

Сообщение Barmaley4 »

Barmaley4 писал(а): 14 ноя 2024, 16:45 Перед генерацией отчёта, нужно выполнить данный код через API (можно его как экшон зарегистрировать), тогда все чёрные ящики которые не имеют текста в свойстве блока 1, получат букву Х в место монтажа описательное.
При генерации отчёта, фильтр не пропустит изделия, в функции которых в месте монтажа описательное стоит буква Х. (Фильтр: место монтажа описательное не равно Х)
В вышеуказанном примере я немного не правильно понял задачу, вот исправленный вариант

Код: Выделить всё

	Project PR = ;// проект для обработки

            var pagesE3 = PR.Pages.Where(p => p != null && p.PageType == DocumentTypeManager.DocumentType.Circuit);
            List<Function> BBoxes = new List<Function>();

            foreach (var P in pagesE3)
                BBoxes.AddRange(P.Functions.OfType<BoxedDevice>();

            foreach (var F in BBoxes)
            {
                try
                {
                    if (F.Properties.FUNC_BLOCK_VALUE[1] != null &&
                        F.Properties.FUNC_BLOCK_VALUE[1].ToString().Length > 0)
                            F.Properties.FUNC_MOUNTINGLOCATION = "";
                    else
                        F.Properties.FUNC_MOUNTINGLOCATION = "X";
                }
                catch { }


            }
Доработал до полного кода экшона

Код: Выделить всё

try
                {

                    var selection = new SelectionSet().Selection;

                    if (selection.Length == 0)
                    {
                        MessageBox.Show($"Не выбран проект или элемент проекта для обработки", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return true;
                    }

                    Project PR = selection.First().Project;

                    if (MessageBox.Show($"Выполнить проверку чёрных ящиков в проекте {PR.ProjectName} на заполненность свойства блока 1, и ввести значение в место монтажа описательное?",
                        "Проверка", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                        return true;

                    var pagesE3 = PR.Pages.Where(p => p != null && p.PageType == DocumentTypeManager.DocumentType.Circuit);
                    List<Function> BBoxes = new List<Function>();
                    foreach (var P in pagesE3)
                        BBoxes.AddRange(P.Functions.OfType<BoxedDevice>());

                    int emptyBB = 0, filledBB = 0, errs = 0;

                    UndoStep undo = new UndoManager().CreateUndoStep();
                    using (new LockingStep())
                    {
                        PR.LockAllObjects();
                        foreach (var F in BBoxes)
                        {
                            try
                            {
                                if (F.Properties.FUNC_BLOCK_VALUE[1] != null &&
                                      !F.Properties.FUNC_BLOCK_VALUE[1].IsEmpty &&
                                        F.Properties.FUNC_BLOCK_VALUE[1].ToString().Length > 0)
                                {
                                    F.Properties.FUNC_MOUNTINGLOCATION = "";
                                    filledBB++;
                                }
                                else
                                {
                                    F.Properties.FUNC_MOUNTINGLOCATION = "X";
                                    emptyBB++;
                                }
                            }
                            catch (Exception ex2) { AddinStatic.SendMSGToEplanLog($"Сбой в обработке функции: {ex2.Message}"); errs++; }
                        }
                    }

                    MessageBox.Show($"В проекте {PR.ProjectName} обработано {BBoxes.Count} чёрных ящиков, пустых и заполненых свойств {emptyBB}/{filledBB}, ошибок {errs}", "Завершено", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
                catch (Exception ex)
                { MessageBox.Show($"Сбой обработки: {ex.Message}"); }

                return true;
            }
Ответить

Вернуться в «Eplan API»