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

Скрипты и API

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

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

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

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

Re: Скрипты и API

Сообщение aranea » 24 фев 2015, 14:47

а почему все переменные var?
обычно делаю так

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

foreach (storableObject so in storableObjects)
                   {
                       if (so is ViewPart)
                       {
                       ViewPart viewPart = so as ViewPart;
                       ....
                       }}

viewPart.Source.Properties.FUNC_ARTICLE_PARTNR.Indexes
с этим надо отдельно разбираться, что возвращает и т.д.

плюс не забывайте значения свойств проверять на IsEmpty
Изображение


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

Re: Скрипты и API

Сообщение KiraKudachinova » 25 фев 2015, 06:02

Здравствуйте!
Александр, спасибо, я попробую. Про "var" -просто удобно.
Последний раз редактировалось AGorskiy 25 фев 2015, 09:52, всего редактировалось 1 раз.
Причина: цитата лишняя, вы отвечаете сразу за этим сообщением, хватило бы и просто обращения

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

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

Re: Скрипты и API

Сообщение Madwolf » 25 фев 2015, 11:01

Удобно глюки ловить с var на этапе выполнения, а не ошибки на этапе компиляции с нормальным указанием типа.


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

Re: Скрипты и API

Сообщение KiraKudachinova » 25 фев 2015, 11:12

aranea писал(а):а почему все переменные var?
обычно делаю так

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

foreach (storableObject so in storableObjects)
                   {
                       if (so is ViewPart)
                       {
                       ViewPart viewPart = so as ViewPart;
                       ....
                       }}

viewPart.Source.Properties.FUNC_ARTICLE_PARTNR.Indexes
с этим надо отдельно разбираться, что возвращает и т.д.

плюс не забывайте значения свойств проверять на IsEmpty


Я попробовала сделать так как вы подсказали, смысл мне проверять пока свойства если исключение возникает при обращение к sourse, я даже пробовала сделать ша if (viewPart.Sourse != null)

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

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

Re: Скрипты и API

Сообщение Madwolf » 25 фев 2015, 12:29

У ViewPart должен быть Sourse, если, конечно, обзор модели не обновлен, а реально в пространстве листа объект удален.
Ко всему прочему запрос, по-моему, в принципе некорректный. Нужно сделать запрос следующим образом: Source.ArticleReferences[0].PartNr, т.к. у 3D объекта, коим является Source может быть только одно изделие.

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

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

Re: Скрипты и API

Сообщение Madwolf » 25 фев 2015, 12:49

И вообще, прежде чем смотреть действительные индексы, нужно убедиться что свойство индексируемое:

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

  if (oProperty.IsIndexed)
  {
  }


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

Re: Скрипты и API

Сообщение KiraKudachinova » 25 фев 2015, 13:00

Madwolf писал(а):У ViewPart должен быть Sourse, если, конечно, обзор модели не обновлен, а реально в пространстве листа объект удален.
Ко всему прочему запрос, по-моему, в принципе некорректный. Нужно сделать запрос следующим образом: Source.ArticleReferences[0].PartNr, т.к. у 3D объекта, коим является Source может быть только одно изделие.


Почему "[0]" (Source.ArticleReferences[0].PartNr), я обращалась к Sourse, чтобы получить доступ к Properties (iewPart.Source.Properties.FUNC_ARTICLE_PARTNR), но честно я не знаю что такое Sourse?


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

Re: Скрипты и API

Сообщение KiraKudachinova » 25 фев 2015, 13:01

Это исключение вылетает именно на второй итерации внешнего цикла, во всех остальных случая все нормально
Последний раз редактировалось AGorskiy 25 фев 2015, 14:11, всего редактировалось 1 раз.
Причина: Кира, я ранее уже писал - цитата в цитате - оверквотинг зло. Обратите внимание на причины редактирования, пожалуйста.


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

Re: Скрипты и API

Сообщение limbir » 04 мар 2015, 14:27

Здравствуйте!
Возможно ли программно запустить какую-нибудь стандартную команду из меню? Конкретно интересует Данные проекта > Кабели > Присвоить жилы > Всё присвоить заново.

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

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

Re: Скрипты и API

Сообщение AGorskiy » 04 мар 2015, 14:31

Предложу другой вариант, назначить "горячую клавишу" на данную команду. Сделать это просто. Или нужно именно программно, то есть при выполнении какого-либо экзешника? Опишите, что вы хотите.
Посмотрите, думаю поможет http://www.eplan4all.info/2012/11/sozda ... trumentov/
Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.


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

Re: Скрипты и API

Сообщение limbir » 04 мар 2015, 15:31

Делаю алгоритм подсчёта аксессуаров для проводов (кабельные наконечники, маркировка). Данные извлекаю из точек определения соединений. Для обработки актуальных данных необходимо присваивать жилы перед запуском алгоритма. Я хотел подстраховать пользователя на случай, если он забудет это сделать.

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

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

Re: Скрипты и API

Сообщение Madwolf » 04 мар 2015, 17:12

Можно следующим образом:

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

String strAction = "XCActionReassignWiresComplete";

ActionManager oAMnr= new ActionManager();
Action oAction= oAMnr.FindAction(strAction);
if (oAction != null)
{
    ActionCallingContext ctx = new ActionCallingContext();
    bool bRet=oAction.Execute(ctx);
    if (bRet)
    {
        MessageBox.Show("The Action " + strAction + " ended successfully!");
    }
    else
    {
        MessageBox.Show("The Action " + strAction + " ended with errors!");
    }
}


Однако данный код не даст результата, если кабели не выбраны.
Посмотреть строку нужной команды можно в Еплане: сначала выбрать нужный пункт меню и запустить его, а потом нажать ctrt+\

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

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

Re: Скрипты и API

Сообщение aranea » 04 мар 2015, 21:51

CableService вроде класс
Eplan.EplApi.HEServices.CableService.DoReassignWires
Изображение


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

Re: Скрипты и API

Сообщение limbir » 05 мар 2015, 07:54

Александр,

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

CableService cableService  = new CableService();
cableService.DoReassignWires(_prj, true, null);

не даёт результата, может я не правильно применил.

Виталий, да всё работает, спасибо! Можно выбирать ведь не кабели, а проект целиком в навигаторе страниц, есть ли способ сделать это за пользователя?

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

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

Re: Скрипты и API

Сообщение aranea » 05 мар 2015, 11:09

у меня работает

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

            Project oProj = selectionSet.GetCurrentProject(false);
            CableService cableService = new CableService();
            cableService.DoReassignWires(oProj, true, null);

а не страшно перезаписывать все жилы?
у Е своя логика автоматического присваивания, по номеру клемм и такой-то матери
и если пользователь где-то руками расставлял очередность жил - все слетит
Изображение

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

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

Re: Скрипты и API

Сообщение Madwolf » 05 мар 2015, 14:12

Выбрать за юзера можно, нужно использовать класс Edit, в частности Edit::SelectObjects Method


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

Re: Скрипты и API

Сообщение limbir » 06 мар 2015, 06:35

Александр, наверное вы правы, сделаю всплывающую напоминалку на кнопку для юзера, пусть сам решает.
Виталий, спасибо, думаю пригодится ещё в другой раз.

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

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

Re: Скрипты и API

Сообщение AGorskiy » 17 мар 2015, 15:34

https://github.com/DanielPa/Eplanwiki.S ... oPageScale
Вставка макроса с учетом, или без, масштаба страницы. Начало мысли, создания появилось тут - https://getsatisfaction.com/stlm/topics ... ng-scripts



А так же еще несколько https://github.com/DanielPa/Eplanwiki.Scripting
Все знания для всех. Поиск знаний священен. Обмен знаниями священен. Копирование священно.


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

Re: Скрипты и API

Сообщение KiraKudachinova » 18 мар 2015, 08:08

Здравствуйте, я хочу изменить позицию легенды через объект ArticleReference, при отладке действительно позиция легенды меняется,но почему-то в Ё нет.Может кто-нибудь знает в чем дело?

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

       private void SetNewLegendPosition(List<ArticleReference> arrAR, Article artSor)
       {
           
        double numberOfLegendItem = 18;
           foreach (var artRef in arrAR)
           {
               
               if ((artSor.PartNr == artRef.PartNr) && (artSor.PartNr == "PXC.3240198"))

                   artRef.Properties.FUNC_ARTICLEPLACEMENT_CAPTIONID = numberOfLegendItem;
               
                   
                   artRef.StoreToObject();
                   
                   
                   
               }
             


           }
           
       }

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

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

Re: Скрипты и API

Сообщение aranea » 18 мар 2015, 09:20

https://getsatisfaction.com/stlm/topics ... y_10148987
если будут вопросы, пишите сюда

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


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

Re: Скрипты и API

Сообщение limbir » 18 мар 2015, 09:49

Здравствуйте, Кира!
Номер позиции надо присваивать не ссылке на изделие, а функции, в которой это изделие размещено.
Приведённый ниже код присвоит всем изделиям позиционный номер 18

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

Project prj;
SelectionSet sel = new SelectionSet();
prj = sel.GetCurrentProject(false);
DMObjectsFinder fndr = new DMObjectsFinder(prj); //извлечение объектов проекта
FunctionsFilter ff = new FunctionsFilter();
ff.IsPlaced = true;
List<Function>
    functions // функции проетка
        = fndr
            .GetFunctions(ff)
            .ToList<Function>();

foreach (Function function in functions)
{
    foreach (ArticleReference articleReference in function.ArticleReferences)
        {
            int i = articleReference.ReferencePos;
            function.Properties.FUNC_ARTICLEPLACEMENT_CAPTIONID[i].Set(18);
        }
}

Надеюсь из этого вы сможете извлечь что-то полезное.
Последний раз редактировалось limbir 18 мар 2015, 13:15, всего редактировалось 1 раз.


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

Re: Скрипты и API

Сообщение KiraKudachinova » 18 мар 2015, 10:59

limbir
Спасибо, что откликнулись, то что я скидывала( где присваивалось значение "18") была просто тестовой функцией для проверки. На самом деле я хочу сортировать все изделия по категориям ( по свойству <22147>) ( т.е : Прочие изделия,Детали, Материалы и т.д).Затем, для изделий категории "Детали" присваивать значения позиции легенды от 1 до 100, для материалов от 101 до 200 и т.д. Просто ключевой момент, что я работаю именно с ИЗДЕЛИЯМИ, а вы мне показали на примере с function. Что я уже сделала:

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

 Вот таким образом получаю изделия по категориям (входной параметр -название категории: private  List<Article> GetArticlesByCategory(string category)
        {
            var currentProject = new ProjectManager().CurrentProject;
            Article[] articles = currentProject.Articles;
            List<Article> articleOfCatrgory = new List<Article>();


           foreach(var article in articles)
           {
             
               if (article.Properties.ARTICLE_FREE_DATA_VALUE[2].ToString(ISOCode.Language.L___) == category)
               {
                   articleOfCatrgory.Add(article);
               
               }
           }
   

           return articleOfCatrgory;
        }

Затем я сортирую изделия по алфавиту

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

  public List<Article> SortByAlphabet()
       {
           List<Article> articles = this.GetArticlesByCategory("Материалы");
           ShowArticles(articles);
         
           for (int i = 0; i < articles.Count; i++)
           {
               for (int j = i+1; j < articles.Count; j++)
               {
                   if (String.Compare(articles[i].Properties.ARTICLE_DESCR1.ToString(ISOCode.Language.L___),articles[j].Properties.ARTICLE_DESCR1.ToString(ISOCode.Language.L___))>0)
                   {
                       Article tempArticle = articles[i];
                       articles[i] = articles[j];
                       articles[j] = tempArticle;
                   }

               }
           }
         //  MessageBox.Show(Convert.ToString(articles.Count));
           return articles;
       
       }

Затем я изменяю позицию легенд

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

       public void RestructLegendItem()
       {
           var currentProject = new ProjectManager().CurrentProject;
       
           List<Article> articleSorts = SortByAlphabet();

           

           DMObjectsFinder oDMO = new DMObjectsFinder(currentProject);
           ArticleReferencesFilter aRFilter = new ArticleReferencesFilter();
         
         List<ArticleReference> arrAR = new List<ArticleReference>();
         
         

          arrAR = oDMO.GetArticleReferences(aRFilter).ToList<ArticleReference>();
       
           foreach (var artSor in articleSorts)
           {
               SetNewLegendPosition(arrAR, artSor);
             
           }
       
       }
Последний раз редактировалось AGorskiy 18 мар 2015, 14:10, всего редактировалось 1 раз.
Причина: цитата лишняя, вы отвечаете сразу за этим сообщением, хватило бы и просто обращения


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

Re: Скрипты и API

Сообщение KiraKudachinova » 18 мар 2015, 11:32

limbir писал(а):Здравствуйте, Кира!
Номер позиции надо присваивать не ссылке на изделие, а функции, в которой это изделие размещено.
Приведённый ниже код присвоит всем изделиям позиционный номер 18

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

Project prj;
SelectionSet sel = new SelectionSet();
prj = sel.GetCurrentProject(false);
DMObjectsFinder fndr = new DMObjectsFinder(prj); //извлечение объектов проекта
FunctionsFilter ff = new FunctionsFilter();
ff.IsPlaced = true;
List<Function>
    functions // функции проетка
        = fndr
            .GetFunctions(ff)
            .ToList<Function>();














foreach (Function function in functions)
{
    foreach (ArticleReference articleReference in articleReferencesClamp)
        {
            int i = articleReference.ReferencePos;
            function.Properties.FUNC_ARTICLEPLACEMENT_CAPTIONID[i].Set(18);
        }
}

Надеюсь из этого вы сможете извлечь что-то полезное.


Мне не совсем понятны строки

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

      int i = articleReference.ReferencePos;
            function.Properties.FUNC_ARTICLEPLACEMENT_CAPTIONID[i].Set(18);
Разве FUNC_ARTICLEPLACEMENT_CAPTIONID индексируемое свойство? Я попробовала этот вариант вылезает исключение "Недействительное свойство".Вы не знаете чем это обусловлено?


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

Re: Скрипты и API

Сообщение limbir » 18 мар 2015, 13:11

Оно индексируемо для функции.
articleReference.ReferencePos - это номер строки на вкладке "Изделия" в свойствах.


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

Re: Скрипты и API

Сообщение KiraKudachinova » 18 мар 2015, 13:18

Почему тогда у меня вылетает исключение "Недействительное свойство"?
Последний раз редактировалось AGorskiy 18 мар 2015, 14:11, всего редактировалось 1 раз.
Причина: цитата лишняя, вы отвечаете сразу за этим сообщением, хватило бы и просто обращения