Перейти к публикации

Создать массив(array) НОМЕРОВ элементов в компоненте.


Алексеев Денис

Рекомендованные сообщения

Алексеев Денис
Здравствуйте. Возможно, вопрос решается элементарно, но облазил гугл и ничего подобного не нашел. Я создал компоненте (CM) состоящий из элементов. Далее я его выбрал (CMSEL). Теперь мне надо в цикле перебрать все выделенные элементы и что-то с каждым сделать (сравнить напряжения с каким-то конкретным значением, например). Не пойму, как всунуть в массив ТОЛЬКО номеры выделенных элементов. Вот маленький отрывок моего кода:

 

CMSEL,S,bv1_comp          ! выделим компонент

*get,el_count,ELEM,,count        ! число выделенных элементов

*DIM,elem_numbers,ARRAY,el_count,1 ! создаю пустой массив длиной el_count    

*VGET,elem_numbers,ELEM,.... ! КАК-ТО ТАК ХОЧУ ЗАПОЛНИТЬ МАССИВ НОМЕРАМИ ВЫДЕЛЕННЫХ ЭЛЕМЕНТОВ

 

Помогите, пожалуйста.

Ссылка на сообщение
Поделиться на других сайтах


перебрать все выделенные элементы и что-то с каждым сделать

Как вариант:

выбрали элементы (esel,s)

открыли цикл (*do)

получили минимальный номер активного элемента (*get)

сделали, что нужно, с ним

выкинули элемент из текущего выбора (esel,u)

закрыли цикл (*enddo)

 

 

 

сравнить напряжения с каким-то конкретным значением, например

Если конкретное значение - константа, то могут помочь команды SADD или SALLOW.

Ссылка на сообщение
Поделиться на других сайтах
Алексеев Денис

 

перебрать все выделенные элементы и что-то с каждым сделать

Как вариант:

выбрали элементы (esel,s)

открыли цикл (*do)

получили минимальный номер активного элемента (*get)

сделали, что нужно, с ним

выкинули элемент из текущего выбора (esel,u)

закрыли цикл (*enddo)

 

 

 

сравнить напряжения с каким-то конкретным значением, например

Если конкретное значение - константа, то могут помочь команды SADD или SALLOW.

 

"получили минимальный номер активного элемента (*get)" - а можно конкретнее? Что-то вроде этого мне и нужно. Мне нужно работать с конкретной группой элементов, принадлежащих конкретной группе (компоненту). Поясню подробнее.

 

Что я делаю сейчас: 

выделяю все элементы в модели(esel)

открываю цикл (*DO) от 1 до "all_elements_count"

зная, что у меня всего N элементов выбираю определенный элемент просто по номеру итерации.

сравниваю координаты центра масс элемента с нужными, и если элемент принадлежит какой-то области -  

работаю с ним(не важно, как, сравнить напряжения с каким-то конкретным значением - ПРИМЕР ).

 

Что я хочу делать:

выделяю все элементы в КОМПОНЕНТЕ, т.е сам компонент(cmsel)

открываю цикл (*DO) от 1 до "elements_in_component_count"

у меня в этой области есть много элементов с разными номерами, не по порядку идущими. Поэтому я беру в цикле не по номеру итерации элементы а по номеру взятому из заранее приготовленного СПИСКА НОМЕРОВ ВЫДЕЛЕННЫХ ЭЛЕМЕНТОВ.

работаю с ним, и никаких сравнений координат уже не надо.

Ссылка на сообщение
Поделиться на других сайтах
 получили минимальный номер активного элемента (*get)" - а можно конкретнее? Что-то вроде этого мне и нужно.

Вы же смогли найти команду

 

*get,el_count,ELEM,,count        ! число выделенных элементов

там рядом описано как вытащить минимальный номер элемента

*get,el_min_num,ELEM,,num,min
Ссылка на сообщение
Поделиться на других сайтах
Алексеев Денис

Ага. Теперь понял Вас. А раньше не понял. Да, должно сработать, и никакой список не нужен будет :happy:. Спасибо большое за помощь, попробую, если что, еще напишу сюда...

Ссылка на сообщение
Поделиться на других сайтах

Код, лишенный всех недостатков и проверенный героями многих легенд на протяжении многих тысячелетий.

ne=0
cmsel,s,...

*dowhile,i
   *get,ne,elem,ne,nxth
   *if,ne,eq,0,then
      *exit
   *endif

   .... ! Делаем что нужно
 
*enddo
allsel,all
Ссылка на сообщение
Поделиться на других сайтах

С точки зрения структурного программирования выход из середины цикла уже серьезный недостаток :)

http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

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

Можно номер элемента в счетчик цикла читать. Тогда цикл сам вывалится, когда элементы закончатся.

Ссылка на сообщение
Поделиться на других сайтах

Надежнее ввести переменную флажок и ей присваивать значения в зависимости от ситуации. И выходить из цикла в зависимости от этого флажка. С его помощью и ветвления осуществлять. В виндовом программировании такие флажки называются событиями. Их и обрабатывают по существу. Способ борьбы со сложностью, которая по системному анализу растет по квадратичному закону от управляемой системы. Примерно как сопротивление движению байдарки в воде. Хочешь идти вдвое быстрее, маши веслами в четыре раза шустрее :)

Ссылка на сообщение
Поделиться на других сайтах
Надежнее ввести переменную флажок и ей присваивать значения в зависимости от ситуации. И выходить из цикла в зависимости от этого флажка.

А счетчик цикла не такой флажок?

Ссылка на сообщение
Поделиться на других сайтах

 

Надежнее ввести переменную флажок и ей присваивать значения в зависимости от ситуации. И выходить из цикла в зависимости от этого флажка.

А счетчик цикла не такой флажок?

 

Такой. Просто эта идея распространяется на гораздо большее число возможных ситуаций и не связана с натуральным рядом.

 

http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

 

В Qt они называются сигналами http://ru.wikipedia.org/wiki/Qt

Ссылка на сообщение
Поделиться на других сайтах
Просто эта идея распространяется на гораздо большее число возможных ситуаций и не связана с натуральным рядом.

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

Ссылка на сообщение
Поделиться на других сайтах

Дa i вообще не нужна, надо бритвой Оккама побрить. Вообще не понятно какая она. While обычно проверяется в начале цикла, в него  можно и не попасть вообще.

Если приглядеться по программистски , то похоже, что код вообще из одних недостатков  :)

Ссылка на сообщение
Поделиться на других сайтах
Дa i вообще не нужна, надо бритвой Оккама побрить. Вообще не понятно какая она. While обычно проверяется в начале цикла, в него  можно и не попасть вообще. Если приглядеться по программистски , то похоже, что код вообще из одних недостатков  :)

Если i заменить на ne, то счетчик циклов окажется таки используемым(хотя не совсем правильно его счетчиком называть. переменная для проверки условия). Также надо будет убрать обнуление ne перед циклом, а задать, наоборот, любое ненулевое значение(хоть тот же минимальный номер элемента). Тогда можно будет убрать условие проверки равенства нулю ne, поскольку это сам по себе делает цикл. И в цикл хотя бы один раз зайдем наверняка.

Но алгоритма это все равно не изменит. Так... вылизывание и причесывание.

Ссылка на сообщение
Поделиться на других сайтах

!Стопроцентно работает

 

*get,EN,elem,,count                 !получили количество элементов
*get,EMIN,elem,,num,min         !получили минимальный номер элемента

*dim,massiv_elementov,array,en

*do,i,1,EN
  *if,i,ne,1,then
    ii=elnext(ii)
  *else
    ii=EMIN
  *endif
 
massiv_elementov(i)=ii

 

*enddo

Изменено пользователем Petr_ansys
Ссылка на сообщение
Поделиться на других сайтах

*do,i,1,EN   !!! здесь текстом прокомментируйте что делается
        *if,i,ne,1,then  $     ii=elnext(ii)   $     *else   $      ii=EMIN
  *endif

 

И не рекомендуется давать идентификаторам имена типа kk   иначе когда-нибудь вляпаетесь в трудно уловимую ошибку.

А так неплохо, легко воспринимается смысл. Через год посмотрите и не будете мучиться :)

Ссылка на сообщение
Поделиться на других сайтах
Алексеев Денис

Все работает, как часы, спасибо большое всем за активную помощь :smile: Думаю, к этой теме я больше не вернусь.

Ссылка на сообщение
Поделиться на других сайтах
  *if,i,ne,1,then

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

Ссылка на сообщение
Поделиться на других сайтах

Логично. Начальную инициализацию всегда надо делать вне цикла. Оптимизирующие компиляторы в принципе часто сами это делают, но грамотнее все-таки позаботиться самому об этом :)

 

ii=EMIN  $  *do,i,1,EN $  ii=elnext(ii)  $  *endif  !! комментарий ...

 

 Что то в таком духе и в одну строчку. И все запутал :) Ну надеюсь поняли, что главное в коде читаемость иначе будут ругать. Программисты это называют в чужом дерьме ковыряться. Проще выкинуть и по новой написать обычно если ясно что надо делать :)

Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

А вообще-то можно сделать еще проще

 

*get,NN,node,,count        !определение количества узлов

*vget,nn_array,node,,nlist        !заполнение массива номеров узлов (автоматом в порядке возрастания)

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...