На форуме обязательно:
  1. Заполнить свой профиль на Русском языке. См. Правила, п.2.d.
  2. Не писать свой вопрос в первую попавшуюся тему, а вместо этого создать свою. См. Правила, п.3.a.

Скрипты и API

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

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


KiraKudachinova
здесь недавно
здесь недавно
Сообщения: 38
Зарегистрирован: 02 фев 2015, 07:18
Имя: Кудачинова Кира Владимировна

Re: Скрипты и API

Сообщение KiraKudachinova » 02 апр 2015, 19:53

Я поняла, Function.Enums.Category.TerminalDefText - при выборе этой категории - можно получить клеммники,а клеммы в клеммнике можно получить через SubFunctions,правильно?

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 03 апр 2015, 19:11

У себя я использовал определение клеммника, и потом через него получал клеммы данного клеммника. Без определения не работал.


KiraKudachinova
здесь недавно
здесь недавно
Сообщения: 38
Зарегистрирован: 02 фев 2015, 07:18
Имя: Кудачинова Кира Владимировна

Re: Скрипты и API

Сообщение KiraKudachinova » 17 апр 2015, 10:58

Здравствуйте, в Ё можно сгенерировать отчет формата .xls, мы можем сами выбрать, что там отображать (к примеру: Номер изделия, Позицию легенды). Это делается через строку меню(сервисы-> внешняя обработка свойств).
Можно ли сделать такой отчет при помощи API?
Если да, то от чего мне стоит отталкиваться?

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 17 апр 2015, 18:15

Можно, в хелпе на API описан данный функционал.

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 2478
Зарегистрирован: 05 мар 2012, 14:00
Имя: Горский Андрей Сергеевич
Откуда: Санкт-Петербург
Благодарил (а): 43 раза
Поблагодарили: 66 раз
Контактная информация:

Код операции представление символа

Сообщение AGorskiy » 03 авг 2015, 10:41

Хотел создать панельку с кнопочкой которая меняет Вид представления у символа, увы не нашел в списке доступных операций, только под API
<16027> Вид представления символа (закодир.) - API-Define: SYMB_SYBMOLFUNCTIONTYPE
<16028> Вид представления символа - API-Define: SYMB_SYBMOLFUNCTIONTYPE_NAME

Возможно плохо искал или пропустил, может кто знает имя операции для реализации желаемого?
[spoiler=Пример операции для редактирования текста]XGedIaFormatDefPoints

/color:?

Цвет (текста или линии)
Предварительно определенные значения:
0 = черный
1 = красный
2 = желтый
3 = зеленый
4 = циан
5 = голубой
6 = пурпурный
7 = черный
8 = белый
9 = светло-серый
252 = темно-серый
253 = серый
-16002 = Из слоя.[/spoiler]
Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 05 авг 2015, 07:54

Я тоже не нашел. Для поворота уже размещенного символа используй ctrl+r, правда только 3 других варианта можно, насколько я понимаю.

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 2478
Зарегистрирован: 05 мар 2012, 14:00
Имя: Горский Андрей Сергеевич
Откуда: Санкт-Петербург
Благодарил (а): 43 раза
Поблагодарили: 66 раз
Контактная информация:

Написание текста во все страницы проекта сразу

Сообщение AGorskiy » 06 авг 2015, 09:50

Решил написать тут, так как подозреваю, что другими путями этого не достичь, а именно:
появилась необходимость уже в созданный проект во все страницы вставить текст в отведенное место.
Уточнение: комментарии могут отличаться от типа схем, Э3 или Э4, Э5 и так далее.

Так как если бы везде все одинаково, то подошло бы и свойство проекта, свойство страницы, которое косвенно могло бы быть связано с рамкой.

Только через API или есть догадки, а возможно и реализации вышеописанного?
Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.

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

aranea
знаток Eplan
знаток Eplan
Сообщения: 631
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 36 раз
Контактная информация:

Re: Скрипты и API

Сообщение aranea » 06 авг 2015, 10:27

бесполезное свойство описание типа документа 2 (или как оно там называется) вроде можно в рамку вставить?
или через свойство блока и таблицу замены

на апи можно 100%, на скриптах вряд ли
Изображение

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 2478
Зарегистрирован: 05 мар 2012, 14:00
Имя: Горский Андрей Сергеевич
Откуда: Санкт-Петербург
Благодарил (а): 43 раза
Поблагодарили: 66 раз
Контактная информация:

Re: Скрипты и API

Сообщение AGorskiy » 06 авг 2015, 11:20

Да, Саша, по всей видимости проще настроить Доп. поле в свойствах рамки, вынести его и используя фильтры в навигаторе страниц, по типу документа, вставлять комментарии.
Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.


Stas
знаток Eplan
знаток Eplan
Сообщения: 25
Зарегистрирован: 14 май 2014, 11:22
Имя: Станиславский Станислав Леонидович

Re: Скрипты и API

Сообщение Stas » 18 авг 2015, 10:29

Добрый день!
Возникла необходимость отчет "спецификация кабеля" фильтровать по источнику и цели кабеля. Соответствующих свойств у кабеля не нашел.
Сформировал свойства блока:
Источник (Место установки) [20205,1,3<20211,1,1<20201<1220,0,0,0,0,0,0,0,0,ru_RU,0,0,0,0,0,0>>>]
Цель (Место установки) [20205,1,3<20211,2,1<20201<1220,0,0,0,0,0,0,0,0,ru_RU,0,0,0,0,0,0>>>].
... И к своему сожалению обнаружил что я не могу фильтровать отчет по Свойствам блока :( (наверное по тому что они динамически формируются).
Далее возникла идея... переписать данные из Свойств блока в Доп. поля кабеля...
Подскажите возможно ли это реализовать (я так понял что реализация будет возможна только на API, так как скрипты не умеют читать свойства объектов).
Возможно у кого то есть русскоязычный help по API? \\насколько мне известно его нет в природе

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 2478
Зарегистрирован: 05 мар 2012, 14:00
Имя: Горский Андрей Сергеевич
Откуда: Санкт-Петербург
Благодарил (а): 43 раза
Поблагодарили: 66 раз
Контактная информация:

Re: Скрипты и API

Сообщение AGorskiy » 19 авг 2015, 20:21

Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.


Stas
знаток Eplan
знаток Eplan
Сообщения: 25
Зарегистрирован: 14 май 2014, 11:22
Имя: Станиславский Станислав Леонидович

Re: Скрипты и API

Сообщение Stas » 01 сен 2015, 17:03

Добрый день!
После нескольких недель штурма вышеупомянутой задачи есть результат.
Но сначала несколько слов о API в целом.
Итак...
1. Для разработки дополнений желательно установить среду разработки IDE (у меня Microsoft Visual Studio), хотя обойтись можно и notepad++ (далее буду описывать ситуацию исходя из наличия IDE).
2. В IDE создаем новый проект (Файл -> Создать -> Проект -> Библиотека классов), Имя проекта (и в конце концов dll файла) должно соответствовать *.EplAddIn.* . В хэлпе было упомянуто что в VS нужно использовать шаблон Eplan Api AddIn, но у меня такого шаблона не оказалось.
3. В проекте нужно указать ссылки на библиотеки Eplan:
[spoiler=]Eplan.EplApi.AFu.dll
Eplan.EplApi.Baseu.dll
Eplan.EplApi.DataModelu.dll
Eplan.EplApi.EServicesu.dll
Eplan.EplApi.Guiu.dll
Eplan.EplApi.HEServicesu.dll
Eplan.EplApi.MasterDatau.dll
Eplan.EplApi.Ppeu.dll
Eplan.EplApi.RecorderToolsu.dll
Eplan.EplApi.RemoteClientu.dll
Eplan.EplApi.Remotingu.dll
Eplan.EplApi.Starteru.dll
Eplan.EplApi.Systemu.dll
Eplan.EplApi.WebServiceu.dll
System.Windows.Forms.dll[/spoiler]
В зависимости от реализуемого решения набор ссылок может отличаться.

4. Реализовать класс EplAddInModule содержащий:

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

using Eplan.EplApi.ApplicationFramework;

namespace Eplanwiki.EplAddIn.GetPropertyValue
{
    public class EplAddInModule : IEplAddIn
    {
        public bool OnExit()
        {
            return true;
        }

        public bool OnInit()
        {
            return true;
        }

        public bool OnInitGui()
        {
            return true;
        }

        public bool OnRegister(ref bool bLoadOnStart)
        {
            bLoadOnStart = true;
            return true;
        }

        public bool OnUnregister()
        {
            return true;
        }
    }
}

Этот класс обеспечивает "стыковку" со средой Eplan
5. Реализовать класс Get содержащий непосредственную логику работы дополнения:

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

using Eplan.EplApi.ApplicationFramework;
using System;
using System.Windows.Forms;
using Eplan.EplApi.DataModel;
using Eplan.EplApi.HEServices;

namespace Eplanwiki.EplAddIn.GetPropertyValue
{
    class Get : IEplAction
    {
        public bool Execute(ActionCallingContext oActionCallingContext)
        {

            PropertyValue oPropValue1;
            PropertyValue oPropValue2;
            int count = 0;                                      //Инициализация счетчика считающего кол-во обработанных кабелей

            SelectionSet selectionSet = new SelectionSet();     //Выбор выделенных кабелей
            StorableObject [] storableObjects = selectionSet.SelectionRecursive;

           

            foreach (StorableObject so in storableObjects)      //Перебор всех выбранных кабелей
            {
               
                oPropValue1 = so.Properties[20201, 2];          //Вычитывание свойства <20201 2>
                oPropValue2 = so.Properties[20201, 3];          //Вычитывание свойства <20201 3>
                so.Properties[20901, 1] = oPropValue1;          //Запись свойства <20201 2> в Доп. поле <20901 1>
                so.Properties[20901, 2] = oPropValue2;          //Запись свойства <20201 2> в Доп. поле <20901 2>
                count = ++count;                                           //Инкремент счетчика считающего кол-во обработанных кабелей
            }

            MessageBox.Show("Обработано " + count.ToString() + " кабеля(ей)."); //Отчет о том сколько кабелей было обработано
            return true;
        }

        public void GetActionProperties(ref ActionProperties actionProperties)
        {
            throw new NotImplementedException();
        }

        public bool OnRegister(ref string Name, ref int Ordinal)
        {
            Name = "Get";
            Ordinal = 20;
            return true;
        }
    }
}

6. Собрать решение (Сборка -> Собрать решение).
7. Найти готовую dll, скопировать ее в папку c:\Program Files\EPLAN\Platform\2.4.4\Bin\.
8. Запустить Eplan и загрузить Eplan API AddIn (Сервисные программы -> API-AddIns... -> Загрузить).
9. Создать кнопку выполняющую операцию Get.
10. Выделить необходимые кабели.
11. Нажать на кнопку выполняющую операцию Get.
12. Be Happy :)

Данные из свойств блока <20201 2> и <20201 3> будут скопированы в Доп. поля <20901 1> и <20901 2>.
Жду отзывов.

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 2478
Зарегистрирован: 05 мар 2012, 14:00
Имя: Горский Андрей Сергеевич
Откуда: Санкт-Петербург
Благодарил (а): 43 раза
Поблагодарили: 66 раз
Контактная информация:

Re: Скрипты и API

Сообщение AGorskiy » 01 сен 2015, 21:20

Мой отзыв, Стас - http://www.eplan4all.info/2015/09/stanislavskiy/ кроме благодарностей добавить нечего.
Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 02 сен 2015, 17:04

1. В документации Еплан API есть сразу готовые шаблоны для студии, не нужно было изобретать велосипед )
2. При работе с выделенными объектами, лучше сразу отфильтровать кабели, т.к. если юзер выделить что-то другое, возможны ошибки, вплоть до вылета Еплана. В данном случае я бы просто выполнял проверку типа "if so is Cable ..."


Stas
знаток Eplan
знаток Eplan
Сообщения: 25
Зарегистрирован: 14 май 2014, 11:22
Имя: Станиславский Станислав Леонидович

Re: Скрипты и API

Сообщение Stas » 02 сен 2015, 17:48

Увы, я не располагаю шаблонами для Visual Studio.
Если Вы поделитесь шаблонами и любыми другими материалами по API - буду признателен.

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

aranea
знаток Eplan
знаток Eplan
Сообщения: 631
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 36 раз
Контактная информация:

Re: Скрипты и API

Сообщение aranea » 03 сен 2015, 10:00

тоже внесу пару предложений

1. в описании забыли указать, что нужно выделить кабели в навигаторе кабелей, так как SelectionRecursive работает только в навигаторах, и если выделить кабели на листе - не сработает, не будет вложений (насколько помню)
2. копировать dll в папку еплана не обязательно, все равно указывается полный путь при выборе
3. эта конструкция перебирает не только кабели, но и жилы (скорее всего, проверьте записываются ли у них эти свойства)

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

SelectionSet selectionSet = new SelectionSet();
StorableObject [] storableObjects = selectionSet.SelectionRecursive;           

foreach (StorableObject so in storableObjects)
    {
    }

лучше перебирать именно определения кабелей, чтобы не зацепить ничего лишнего, например так

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

SelectionSet selectionSet = new SelectionSet();
List<Cable> oCables = selectionSet.SelectionRecursive.OfType<Cable>().ToList();

foreach (Cable oCable in oCables)
    {
    }

4. переменные oPropValue1, oPropValue2 лишние, можно присваивать напрямую
5. достаточно count++;
6. лучше проверять не пустое ли свойство перед копированием, чтобы не словить исключение

а так, с почином!
успехов в разработке!
Изображение


Stas
знаток Eplan
знаток Eplan
Сообщения: 25
Зарегистрирован: 14 май 2014, 11:22
Имя: Станиславский Станислав Леонидович

Re: Скрипты и API

Сообщение Stas » 03 сен 2015, 15:57

Благодарю за замечания и предложения.
Учту.


ids
знаток Eplan
знаток Eplan
Сообщения: 23
Зарегистрирован: 17 сен 2015, 09:25
Имя: Иванюк Дмитрий Сергеевич
Благодарил (а): 2 раза

Re: Скрипты и API

Сообщение ids » 17 сен 2015, 09:44

Добрый день, господа. Имеется опыт написания довольно серьезных дополнений с окнами редактирования, встроенными в Eplan. Есть ли здесь люди, которые делали подобные вещи? Есть желание поделиться опытом.
Устройства.png
Операции.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.


IOIOOIIOIO
новенький
новенький
Сообщения: 1
Зарегистрирован: 25 сен 2015, 16:56
Имя: Андрей

Re: Скрипты и API

Сообщение IOIOOIIOIO » 25 сен 2015, 17:18

Madwolf писал(а):Eplan.EplApi.EServices.Ged.Interaction прерывается при вызове любого другого Action, будь то смена страницы или вызов из командной строки. Выделить несколько объектов на разных страницах не получится (

Понимаю, что своего рода "некропост", но заметил, что данное ошибочное утверждение не подправили. Итак, как же сменить страницу и продолжить Interaction:
1. В ходе выполнения I-n следим за состоянием. В случае прерывания выполнения - сохраняем состояние в промежуточный файл (папка с проектом доступна для записи)
2. Создаем перехватчик событий на момент открытия страницы (насколько показывает GUI, имеем "XPmPageOpenOnePage")
3. В перехватчике создаем проверку на наличие файла и перезапуск I-n'a
4. Так как данный момент будет притормаживать систему, добавляем перехватчик в методе OnStart, отключаем внутри метода OnSuccess.
Как то так :roll:

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 26 сен 2015, 15:24

Я бы сказал что не "ошибочное утверждение", а как побороть данную проблему. Ведь сама суть класса InterAction подразумевает работу на конкретной странице, ведь в экземпляре класса хранятся данные о координатах объектов на странице, тип страницы, из которой вызван Interaction.

По сути да, можно сохранять выделенные объекты (их ID) в буфер и потом выполнить команду для их обработки.


ids
знаток Eplan
знаток Eplan
Сообщения: 23
Зарегистрирован: 17 сен 2015, 09:25
Имя: Иванюк Дмитрий Сергеевич
Благодарил (а): 2 раза

Re: Скрипты и API

Сообщение ids » 08 окт 2015, 10:01

Я реализовывал так:
так как Interaction может прерваться по многим причинам (не только смена страница, но и нажатие Esc например) , в методе OnStop() проверял, надо ли перезапустить Interaction. Далее, если прервал Interaction не я, перезапускал его заново. Для выделенных объектов я сразу выполнял необходимую операцию.

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 22 окт 2015, 10:43

Всем привет. Что за ерунда с locking step. Пытаюсь что-то записать в объект - ничего не дает "объект не был заблокирован перед обращением для записи", пытаюсь блокировать с помощью LockObject() или SmartLock() - работает через раз. Спасает только открытие проекта в режиме "с защитой от записи". Кто как это разруливает?


ids
знаток Eplan
знаток Eplan
Сообщения: 23
Зарегистрирован: 17 сен 2015, 09:25
Имя: Иванюк Дмитрий Сергеевич
Благодарил (а): 2 раза

Re: Скрипты и API

Сообщение ids » 22 окт 2015, 23:58

Попробуй так сделать перед получением активного проекта:

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

  //Получение текущего проекта.
  Eplan.EplApi.HEServices.SelectionSet selection = new Eplan.EplApi.HEServices.SelectionSet();
  selection.LockSelectionByDefault = false;
 
  Project currentProject = selection.GetCurrentProject( true );

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

aranea
знаток Eplan
знаток Eplan
Сообщения: 631
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 36 раз
Контактная информация:

Re: Скрипты и API

Сообщение aranea » 23 окт 2015, 09:41

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

            SelectionSet selectionSet = new SelectionSet();
            selectionSet.LockProjectByDefault = true;

в хэлпе что-то было про LockProjectByDefault и LockSelectionByDefault
Изображение

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 964
Зарегистрирован: 17 окт 2012, 10:24
Имя: Виталий
Благодарил (а): 13 раз
Поблагодарили: 47 раз

Re: Скрипты и API

Сообщение Madwolf » 23 окт 2015, 10:33

Спасибо, буду иметь ввиду, мне еще посоветовали:

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

using (LockingStep ls = new LockingStep())
                {
                    try
                    {
                        Project.LockAllObjects();
                        // all project's objects are locked now
                    }
                    catch (ProjectLockingException ex)
                    {
                        WriteMessage("Не удалось заблокировать проект, причина: " + ex.Message);
                    }
             }