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

API. Вывести обозначения и свойства изделий всех устройств проекта в Excel

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

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

Закрыто

Автор темы
limbir
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 12 фев 2014, 08:13
Имя: Сергей
Страна: Россия
Благодарил (а): 1 раз

API. Вывести обозначения и свойства изделий всех устройств проекта в Excel

Сообщение limbir »

Всем привет!
Стоит задача получения спецификации в Excel с помощью API.
Пока что у меня получается вывести список ОУ устройств проекта.
Вот код действия:

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

public class Action01 : IEplAction
{
    public bool Execute(ActionCallingContext ctx)
    {
        Project prj = null;
        ProjectManager prjMngr = new ProjectManager();
        prj = prjMngr.CurrentProject;
        DMObjectsFinder fndr = new DMObjectsFinder(prj);
        Function[] arrTest01 = fndr.GetFunctions(null);
        prj = null;
        Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();
        oExcel.Visible = true;
        Microsoft.Office.Interop.Excel.Workbooks iWorkBooks = oExcel.Workbooks;
        Microsoft.Office.Interop.Excel.Workbook iWorkBook = iWorkBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
        Microsoft.Office.Interop.Excel.Worksheet iSheet = (Microsoft.Office.Interop.Excel.Worksheet)oExcel.ActiveSheet;
        int j=1;
        foreach (var test01 in arrTest01)
        {
            iSheet.Cells[j, 1] = test01.VisibleName;
    //      iSheet.Cells[j, 5] = test01.Properties.FUNC_ARTICLE_DESCR2;
            j++;
        }
        return true;
}
Пытался вытянуть из базы свойства изделия через test01.Properties.FUNC_ARTICLE_DESCR2, но EPLAN выдаёт сообщение:
"Отсутствующий параметр не имеет значения по умолчанию. Имя параметра: parameters".

Подскажите, пожалуйста, какими методами можно вытянуть свойства изделий из базы?
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Re: Скрипты и API

Сообщение aranea »

приветствую!

если сходу, то лучше foreach (Function test01 in arrTest01)
и возможно обращаться к ArticleReference этой функции test01 (Ссылка на изделие)
перед чтением свойств проверять не пустое ли оно (IsEmpty)
еще проверяйте является ли функция главной
присвоены ли ей изделия (foreach по всем ArticleReference)

чем Отчеты - Маркировка не устраивает? =)
Изображение

Автор темы
limbir
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 12 фев 2014, 08:13
Имя: Сергей
Страна: Россия
Благодарил (а): 1 раз

Re: Скрипты и API

Сообщение limbir »

Замена var на Function результата не дала.
При проверке на пустоту свойства обнаружил, что надо бы указывать индекс изделия, т.е. вернее будет запись
iSheet.Cells[j, 5] = test01.Properties.FUNC_ARTICLE_DESCR2[1];
Ну а проверку реализовал так:

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

if (test01.Properties.FUNC_ARTICLE_DESCR2[1].IsEmpty == true)
                {
                    MessageBox.Show("Пустое свойство");
                    return true;
                }
                else
                {
                    MessageBox.Show("Не пустое свойство");
                    iSheet.Cells[j, 1] = test01.Properties.FUNC_ARTICLE_DESCR2[1];
                }
Получил что свойство не пустое, и всё то же сообщение: "Отсутствующий параметр не имеет значения по умолчанию. Имя параметра: parameters".
При обращении к ссылке на изделие
iSheet.Cells[j, 2] = test01.ArticleReference.Properties.ARTICLE_DESCR2[1];
компилятор выдаёт ошибку:
Error 5: The property or indexer 'Eplan.EplApi.DataModel.Function.ArticleReference' cannot be used in this context because it lacks the get accessor.

Маркировкой пользуюсь, но здесь задача больше на получение умений и знаний в API)
Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Re: Скрипты и API

Сообщение aranea »

ну учиться так учиться =)
читать хэлп, изучать объектную модель, обращать внимание на подсказки в VisualStudio

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

foreach (Function oFunc in arrTest01)
    {
    // выводим свойства oFunc, например oFunc.Name

    foreach (ArticleReference oArtRef in oFunc.ArticleReferences)
        {
        // выводим свойства oArtRef
        }
    }
Изображение

Автор темы
limbir
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 12 фев 2014, 08:13
Имя: Сергей
Страна: Россия
Благодарил (а): 1 раз

Re: Скрипты и API

Сообщение limbir »

Нашёл ошибку, забыл перевести значение в строковое: ToString().
Александр, большое спасибо за помощь! Использование вложенного цикла по ссылкам получается проще и логичней.
Вот такой код получился по вытаскиванию параметра "Изделие. Обозначение 2" из базы:

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

public class Action01 : IEplAction
{
    public bool Execute(ActionCallingContext ctx)
    {
        Project prj = null;
        ProjectManager prjMngr = new ProjectManager();
        prj = prjMngr.CurrentProject;
        DMObjectsFinder fndr = new DMObjectsFinder(prj);
        Function[] arrTest01 = fndr.GetFunctions(null);
        prj = null;
        Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();
        oExcel.Visible = true;
        Microsoft.Office.Interop.Excel.Workbooks iWorkBooks = oExcel.Workbooks;
        Microsoft.Office.Interop.Excel.Workbook iWorkBook = iWorkBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
        Microsoft.Office.Interop.Excel.Worksheet iSheet = (Microsoft.Office.Interop.Excel.Worksheet)oExcel.ActiveSheet;
        int j=1;
        foreach (var test01 in arrTest01)
        {
                foreach (ArticleReference oArtRef in oFunc.ArticleReferences)
                {
                    iSheet.Cells[j, 1] = oArtRef.Properties.ARTICLE_DESCR2.ToString();
                    j++;
                }
        }
        return true;
}
Пока на сегодня результатом доволен) Получаются строчки такого вида:
??_??@Выключатель-разъединитель 3p 80A;
??_??@Наборная клемма с пружинной фиксацией двухуровневая, 2,5мм²;
Смущает только "??_??@" вначале каждой строки, но это отбросить не сложно.

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1454
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 60 раз
Поблагодарили: 181 раз

Re: Скрипты и API

Сообщение Madwolf »

oArtRef.Properties.ARTICLE_DESCR2 это MultiLangString, поэтому лучше пользоваться методом GetAsString() или GetString(). Язык в параметре укажите по умолчанию.

Автор темы
limbir
здесь недавно
здесь недавно
Сообщения: 36
Зарегистрирован: 12 фев 2014, 08:13
Имя: Сергей
Страна: Россия
Благодарил (а): 1 раз

Re: Скрипты и API

Сообщение limbir »

madwolf_by
спасибо за совет!

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1454
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 60 раз
Поблагодарили: 181 раз

Re: Скрипты и API

Сообщение Madwolf »

Я использовал следующим образом: GetString(ISOCode.Language.L___)
Закрыто

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