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

Скрипты и API

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

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

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

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

Re: Скрипты и API

Сообщение aranea »

а почему все переменные 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 »

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

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

Re: Скрипты и API

Сообщение Madwolf »

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

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

Re: Скрипты и API

Сообщение KiraKudachinova »

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

Re: Скрипты и API

Сообщение Madwolf »

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

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

Re: Скрипты и API

Сообщение Madwolf »

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

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

  if (oProperty.IsIndexed)
  {
  }

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

Re: Скрипты и API

Сообщение KiraKudachinova »

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 »

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

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

Re: Скрипты и API

Сообщение limbir »

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 3327
Зарегистрирован: 05 мар 2012, 15:00
Имя: Горский Андрей Сергеевич
город/регион: Санкт-Петербург
Благодарил (а): 176 раз
Поблагодарили: 364 раза

Re: Скрипты и API

Сообщение AGorskiy »

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

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

Re: Скрипты и API

Сообщение limbir »

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

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

Re: Скрипты и API

Сообщение Madwolf »

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

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

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
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Re: Скрипты и API

Сообщение aranea »

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

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

Re: Скрипты и API

Сообщение limbir »

Александр,

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

CableService cableService  = new CableService();
cableService.DoReassignWires(_prj, true, null);
не даёт результата, может я не правильно применил.

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

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

Re: Скрипты и API

Сообщение aranea »

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

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

            Project oProj = selectionSet.GetCurrentProject(false);
            CableService cableService = new CableService();
            cableService.DoReassignWires(oProj, true, null);
а не страшно перезаписывать все жилы?
у Е своя логика автоматического присваивания, по номеру клемм и такой-то матери
и если пользователь где-то руками расставлял очередность жил - все слетит
Изображение

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

Re: Скрипты и API

Сообщение Madwolf »

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

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

Re: Скрипты и API

Сообщение limbir »

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

AGorskiy
знаток Eplan
знаток Eplan
Сообщения: 3327
Зарегистрирован: 05 мар 2012, 15:00
Имя: Горский Андрей Сергеевич
город/регион: Санкт-Петербург
Благодарил (а): 176 раз
Поблагодарили: 364 раза

Re: Скрипты и API

Сообщение AGorskiy »

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 »

Здравствуйте, я хочу изменить позицию легенды через объект 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
Сообщения: 1136
Зарегистрирован: 21 сен 2012, 22:45
Имя: aranea
Благодарил (а): 27 раз
Поблагодарили: 155 раз

Re: Скрипты и API

Сообщение aranea »

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

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

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

Re: Скрипты и API

Сообщение 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 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 »

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 »

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, 08:13
Имя: Сергей
Страна: Россия
Благодарил (а): 1 раз

Re: Скрипты и API

Сообщение limbir »

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

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

Re: Скрипты и API

Сообщение KiraKudachinova »

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

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