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

Чтение ОУ объекта

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

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

Ответить

Автор темы
ivansav
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 11 янв 2024, 13:14
Имя: Иван Савченко
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 1 раз

Чтение ОУ объекта

Сообщение ivansav »

Здравствуйте!

Мне нужно получить ОУ (или можно VisibleName) объекта на странице, но, кажется, я не очень понимаю объектную модель Eplan (это мой первый скрипт).

Я могу прочитать все объекты на странице, вызвав page.AllPlacements, но тогда я получаю объекты типа Placement, у которых я могу прочитать только свойства из placement.Properties.ExistingValues, а это – ограниченный набор свойств, в котором нет ОУ.

Также я могу прочитать все функции в проекте:

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

DMObjectsFinder dMObjectsFinder = new DMObjectsFinder(p.Project);
var fs = dMObjectsFinder.GetFunctions(null);
и получить массив из Function, у которых есть .VisibleName, в котором находится то, что нужно. Но вот среди элементов этого массива нет тех объектов, из которых я хочу прочитать ОУ.

Чем вообще отличается "Фунция" от "Размещаемого объекта", зачем существует и то и другое, можно ли их конвертировать друг в друга?

Что можно почитать, чтобы попроще с нуля понять как устроен проект Eplan, а также как пользоваться API?

Заранее спасибо!
Аватара пользователя

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

Чтение ОУ объекта

Сообщение legionercheg »

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

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

Чтение ОУ объекта

Сообщение Barmaley4 »

Нужно откастовать до такого класса у которого есть свойство VisibleName, например вот так

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

        private void ProcessFunctions(Project PR)
        {
            Page[] Epages = PR.Pages
                    .Where(p => p != null)
                    .Where(p => p.PageType == DocumentTypeManager.DocumentType.Circuit)
                    .ToArray();

            List<Function> Funcs = new List<Function>();

            foreach (var P in Epages)
            {
                var FuncPlacements = P.AllFirstLevelPlacements.OfType<Function>();
                Funcs.AddRange(FuncPlacements);
            }

            foreach (var F in Funcs)
            {
                ToLog($"{F.VisibleName} : {F.Page.Name}");
            }


        }

Автор темы
ivansav
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 11 янв 2024, 13:14
Имя: Иван Савченко
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 1 раз

Чтение ОУ объекта

Сообщение ivansav »

Barmaley4 писал(а): 15 янв 2024, 09:31 Нужно откастовать до такого класса у которого есть свойство VisibleName, например вот так
Спасибо большое за ответ!
С таким подходом проблема в том, что OfType<Type> не кастует, а фильтрует, это, кажется, почти аналог dMObjectsFinder.GetFunctions(null); (возвращает все объекты типа функция). И, соответственно, на нужной странице такой код не находит ни одного объекта.
Все нужные объекты находит page.AllPlacements, но у Placement нет ни .VisibleName ни нужного свойства в .Properties. Должен же быть способ добраться до его расширенных свойств.

При этом если в Eplan я делаю по этому объекту даблклик в режиме "Обработать графику"/"(Не) учитывать группирование", в его Свойствах в "Размещение изделия" ОУ присуствуют.
shared.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя

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

Чтение ОУ объекта

Сообщение Barmaley4 »

ivansav писал(а): 23 янв 2024, 17:22 таким подходом проблема в том, что OfType<Type> не кастует, а фильтрует, это, кажется, почти аналог
странно, может компилятор так возвращает, но в любом случае кастануть можно и после

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

foreach (var P in Epages)
            {
                var FuncPlacements = P.AllPlacements.OfType<Function>().Cast<Function>().ToList();
                Funcs.AddRange(FuncPlacements);
            }
ivansav писал(а): 23 янв 2024, 17:22 Все нужные объекты находит page.AllPlacements, но у Placement нет ни .VisibleName ни нужного свойства в .Properties. Должен же быть способ добраться до его расширенных свойств.
Так до функций откастовать и тащить свойство FUNC_DEVICETAG_MAIN

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

foreach (var F in page.AllPlacements.OfType<Function>().Cast<Function>().ToList())
            {
                Print($"{F.Properties.FUNC_DEVICETAG_MAIN.ToString()}");
            }

Автор темы
ivansav
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 11 янв 2024, 13:14
Имя: Иван Савченко
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 1 раз

Чтение ОУ объекта

Сообщение ivansav »

Barmaley4 писал(а): 24 янв 2024, 11:06 странно, может компилятор так возвращает, но в любом случае кастануть можно и после
Не, ну то что OfType не кастует, а фильтрует, это точно, это стандартный метод Linq:
https://learn.microsoft.com/ru-ru/dotne ... ew=net-8.0

При попытке кастовать выбрасывается исключение:

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

InvalidCastException: Не удалось привести тип объекта "Eplan.EplApi.DataModel.ViewPart" к типу "Eplan.EplApi.DataModel.Function".
Код:

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

        public bool Execute(ActionCallingContext oActionCallingContext)
        {
            PseudoConsole console = new PseudoConsole();

            try
            {
                console.Show();

                SelectionSet Set = new SelectionSet();
                Page p = Set.GetSelectedPages()[0];

                foreach (var fnc in p.AllPlacements.Cast<Function>())
                    console.WriteText(fnc.Properties.FUNC_DEVICETAG_MAIN.ToString() + "\r\n");

                return true;

            }
            catch (Exception ex)
            {
                console.WriteText(ex.GetType().Name + ": " + ex.Message);
                return true;
            }

        }
Все объекты, от которых нужен ОУ, в моём файле имеют тип ViewPart. Судя по модели данных https://www.eplan.help/en-US/infoportal ... rview.html Function и ViewPart это вообще разные ветви и в друг друга быть преобразованы не могут, пересекаются только на уровне Placement.
Аватара пользователя

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

Чтение ОУ объекта

Сообщение Barmaley4 »

ivansav писал(а): 24 янв 2024, 15:54 Не, ну то что OfType не кастует, а фильтрует, это точно, это стандартный метод Linq:
https://learn.microsoft.com/ru-ru/dotne ... ew=net-8.0
да это и не важно, он же возвращает то что в обощении указывалось
Возвращаемое значение
IEnumerable<TResult>



ivansav писал(а): 24 янв 2024, 15:54 При попытке кастовать выбрасывается исключение:
ivansav писал(а): 24 янв 2024, 15:54 тип объекта "Eplan.EplApi.DataModel.ViewPart" к типу "Eplan.EplApi.DataModel.Function"
ну так тут ничего не отфильтровывается по калссу Function, вот ему и не из чего кастовать)
ivansav писал(а): 24 янв 2024, 15:54 foreach (var fnc in p.AllPlacements.Cast<Function>())
В изначальном сообщении вопрос был про функции, я и подумал что нужны функции с листа электросхемы.
ViewPart это обзор модели, там нужны функции 3д. В данном случае нужно перейти к источнику, и с него тянуть интересующие свойства

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

ViewPart V = ...
(V.Source as Function3D).Properties.FUNC_VISIBLEDEVICETAG.ToString();

Автор темы
ivansav
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 11 янв 2024, 13:14
Имя: Иван Савченко
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 1 раз

Чтение ОУ объекта

Сообщение ivansav »

Barmaley4 писал(а): 25 янв 2024, 14:25 ViewPart это обзор модели, там нужны функции 3д. В данном случае нужно перейти к источнику, и с него тянуть интересующие свойства
Ура!!! Это то, что нужно.
Ещё раз огромное спасибо! :good:
Ответить

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