Всем привет.
Можно ли каким то образом через API заставить работать фильтр в отчете по свойству блока? Т.е. например есть куча черных ящиков, у них в Свойстве блока 1 указано что они берут данные из другого устройства, если это свойство блока 1 пустое, то этот ЧЯ не попадает в отчет, если Свойство блока 1 не пустое (пофиг что там есть), то устройство попадает в отчет. Отчет предполагается использовать "Спецификация изделий".
Вопрос и выбор отчета - согласен дурацкие, но мало ли "боги API" смогут помочь)))
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Свойство блока в фильтре отчета
Модератор: специалисты Eplan
-
- знаток Eplan
- Сообщения: 973
- Зарегистрирован: 18 ноя 2013, 08:32
- Имя: Сергей
- Страна: Россия
- Благодарил (а): 90 раз
- Поблагодарили: 116 раз
-
- знаток Eplan
- Сообщения: 58
- Зарегистрирован: 30 окт 2018, 09:17
- Имя: Павел
- Страна: РФ
- город/регион: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 54 раза
Свойство блока в фильтре отчета
Не очень понятно зачем использовать для этого API?
Если нужно отфильтровать для отчёта "спецификация изделий" конкретные функции (чёрные ящики), то достаточно просто в таких чёрных ящиках заполнить свойство "Место монтажа описательное" (например букву Х там поставить), это единственной свойство которое отчёт будет проверять в функции, а не в самом изделии.
<20024> Место монтажа (описат.)
В фильтре отчёта поставить изделия с местом монтажа описат. не равно "X".
Если таких чёрных ящиков много, и есть риск пропустить что то с заполненным свойством блока, можно автоматизировать это проходом по страницам с валидатором
Но делать ради этого отдельный модификатор отчёта - крайне избыточная мера.
Если нужно отфильтровать для отчёта "спецификация изделий" конкретные функции (чёрные ящики), то достаточно просто в таких чёрных ящиках заполнить свойство "Место монтажа описательное" (например букву Х там поставить), это единственной свойство которое отчёт будет проверять в функции, а не в самом изделии.
<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 { }
}
-
- знаток Eplan
- Сообщения: 973
- Зарегистрирован: 18 ноя 2013, 08:32
- Имя: Сергей
- Страна: Россия
- Благодарил (а): 90 раз
- Поблагодарили: 116 раз
Свойство блока в фильтре отчета
Смысл в том, что мне нужно именно "динамически" знать - в свойстве блока 1 есть данные или нет? Т.е. есть ли эти данные у подключенного устройства напротив? Сейчас их нет, значит ЧЯ с пустым свойством блока в отчет не попадает, а через 5 мин они появились, значит и ЧЯ полетел в отчет. А если я буду что то "заполнять руками", так я могу и в каком нибудь "Пользователь, доп. поле 20 <EPLAN.ArticleRef.EPLAN.PartRef.UserSupplementaryField20>" это делать и потом в фильтре ловить...
Вот пример: Есть ЧЯ (цифры 1 и 2, синие и красный квадраты), они подключены к выводам ПЛК (цифра 3, зеленый квадрат). Эти ЧЯ "смотрят" есть ли данные у выводов ПЛК (цифра 4, оранжевые квадраты), смотрят они естественное через Свойство блока 1. Так вот мне надо запихнуть в отчет все ЧЯ которые "собрали" данные с выводов ПЛК и вывести в отчет. Сейчас я тупо сам вижу где заполнено (оранжевые квадраты) и просто вручную добавляю напротив ЧЯ и так по каждому листу. Когда сигналов штук 10-20, все было норм, щас их под 1000, че то как то уныло)))
Т.е. сейчас вот так: А я хочу чтобы всегда было так (графически): и в отчет попадали только нужные ЧЯ (синие). Формат ЧЯ тупо для примера, так они все одинаковые))
Это вот вообще щас не понял, это скрипт или что, объясните попроще "для тупеньких")))
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- знаток Eplan
- Сообщения: 58
- Зарегистрирован: 30 окт 2018, 09:17
- Имя: Павел
- Страна: РФ
- город/регион: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 54 раза
Свойство блока в фильтре отчета
Перед генерацией отчёта, нужно выполнить данный код через 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 { }
}
-
- знаток Eplan
- Сообщения: 58
- Зарегистрирован: 30 окт 2018, 09:17
- Имя: Павел
- Страна: РФ
- город/регион: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 54 раза
Свойство блока в фильтре отчета
Доработал до полного кода экшона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;
}