Профиль должен быть заполнен на русском языке кириллицей. Заполнение профиля заведомо ложными или некорректными данными - причина возможного отказа в регистрации на форуме.

Скрипты и API

Обсуждение и решение проблем в работе с Eplan.

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

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 890
Зарегистрирован: 17 окт 2012, 10:24
Ф.И.О.: Виталий
Благодарил (а): 4 раза
Поблагодарили: 15 раз

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
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

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
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

Re: Скрипты и API

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

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

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

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

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

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 890
Зарегистрирован: 17 окт 2012, 10:24
Ф.И.О.: Виталий
Благодарил (а): 4 раза
Поблагодарили: 15 раз

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
Сообщения: 2273
Зарегистрирован: 05 мар 2012, 14:00
Ф.И.О.: Горский Андрей Сергеевич
Откуда: Санкт-Петербург
Благодарил (а): 18 раз
Поблагодарили: 21 раз
Контактная информация:

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
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

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 раз.
Причина: цитата лишняя, вы отвечаете сразу за этим сообщением, хватило бы и просто обращения


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

Re: Скрипты и API

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

Сейчас попробую разобраться


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

Re: Скрипты и API

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

Другое свойство нужно менять: Номер позиции <20464>
function.Properties.FUNC_ARTICLE_POSNR[i].Set(18);

Правда я не знаю это вам надо или нет


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

Re: Скрипты и API

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

Нет,это не то ,мне нужно <20450>,ладно спасибо.
Последний раз редактировалось AGorskiy 18 мар 2015, 14:12, всего редактировалось 2 раза.
Причина: цитата лишняя, вы отвечаете сразу за этим сообщением, хватило бы и просто обращения


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

Re: Скрипты и API

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

Нет... мне с легендами не приходилось работать, не правильно изначально понял суть вопроса и повёл вас не по тому пути


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

Re: Скрипты и API

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

Ничего страшного)
Последний раз редактировалось AGorskiy 18 мар 2015, 14:13, всего редактировалось 1 раз.
Причина: Кира, прочтите это - http://asutpforum.ru/viewtopic.php?f=78&t=2426#p26989


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

Re: Скрипты и API

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

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

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

aranea
знаток Eplan
знаток Eplan
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

Re: Скрипты и API

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

Кира, вы смотрели приведенную мной выше ссылку?
по ней, почти 3 года назад, я выяснил, что свойство "Позиция легенды" FUNC_ARTICLEPLACEMENT_CAPTIONID # 20450 это свойство ФУНКЦИИ, размещенной на виде общем, которой присвоены различные изделия (через ArticleReference - ссылки изделий)
одной функции можно присвоить несколько ссылок изделий!
поэтому когда идет перебор ссылок изделий проекта нужно получить их Родителя (Function parent = artref.ParentObject as Function;)
а далее уже менять его позицию легенды parent.Properties.FUNC_ARTICLEPLACEMENT_CAPTIONID = 1234;

то что вы пытаетесь сделать, реализуется при помощи ArticleReferencePropertyList::ARTICLEREF_POSNR # 20487
это как раз свойство Ссылки изделия и оно теоретически может быть уникальным для каждого типа изделий
и оно связано со свойством "Номер позиции" <20464> функции - индекс есть порядковый номер изделия в списке изделий

попробуйте в навигаторе спецификаций выбрать пункт контекстного меню "Задать номера позиций" для всего проекта
правда в версии 2.2 и ниже нельзя сделать так, чтобы номера по какому-то принципу группировались (( может в 2.3-2.4 нету, Ё такой Ё
почитайте тут viewtopic.php?f=78&t=4421&hilit=20464

в результате, если вы пронумеруете все ссылки изделий проекта нужным вам способом нумерации, при котором все одинаковые изделия будут иметь один и тот же "Номер позиции" <20464> - то при выводе этого номера в ГСИ это значение будет сквозным идентификатором конкретного изделия в проекте!

тогда как номер легенды электрошкафа может повторяться в каждом шкафу!

посмотрите описание на мой модуль нумерации позиции легенды viewtopic.php?f=90&t=3684
там подробно описано по какому принципу производится нумерация и какие цели это преследует

я считаю что, то FUNC_ARTICLEPLACEMENT_CAPTIONID находится в хэлпе в списке свойств ArticleReference является ошибкой


не нужно цитировать мое сообщение при ответе
Изображение

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

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 890
Зарегистрирован: 17 окт 2012, 10:24
Ф.И.О.: Виталий
Благодарил (а): 4 раза
Поблагодарили: 15 раз

Re: Скрипты и API

Сообщение Madwolf » 18 мар 2015, 21:43

По-моему пользователям Еплана очевидно, что позиция легенды вообще не связана напрямую с изделием, более того, она даже с функцией только косвенно связана, а является свойством функций с видом представления "компоновка электошкафа" или 3D моделей в пространстве листа.

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

aranea
знаток Eplan
знаток Eplan
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

Re: Скрипты и API

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

упорство Киры да в нужное русло... =)
Изображение


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

Re: Скрипты и API

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

Здравствуйте, я поняла вас, просто когда я пытаюсь получить допуск к свойству через parent (parent.Properties.FUNC_ARTICLEPLACEMENT_CAPTIONID ), то вылетает исключение "Недействительное свойство" - не знаю почему, поэтому и решила,что этот путь для меня не годится.А изменять мне нужно именно позицию легенды. Может мне кто-нибудь ответить вообще возможно ли изменение позиции легенды в принципе? Вы писали, что к изделиям это никак не относится и к функциям тоже, тогда получается моя задача сортировки изделий с изменением позиции легенды невозможна?

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

aranea
знаток Eplan
знаток Eplan
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

Re: Скрипты и API

Сообщение aranea » 19 мар 2015, 23:50

вы ведь перебираете все ссылки изделий проекта, а не факт что они привязаны к какой-то функции, поэтому у них может не быть parent
начните работать с Номером позиции для решения вашей задачи, или объясните доходчиво почему именно Позиция легенды вам нужна, но ее использовать не получится все равно
Изображение


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



Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 0 гостей