Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выравнивание объектов в Allegro PCB
Форум разработчиков электроники ELECTRONIX.ru > Печатные платы (PCB) > Разрабатываем ПП в САПР - PCB development > Cadence
Страницы: 1, 2, 3
John Silver
Представляю на ваш суд скрипт для выранивания и распределения объектов в Allegro PCB.
Возможности:
- объекты Group, Component, Pad, Via, Text
- выравнивание по горизонтали и вертикали (привязка к Origin, Body, Pin1)
- привязка к сетке
- выравнивание по краю (пока реализовано только Top)
- распределение автоматическое (между крайним левым/правым и крайним нижним/верхним объектом)
- рапределение с фиксированным шагом
- в планах распределение с использованием Boundary Box, автоматическое и с фиксированным шагом.

Проблемы:
- привязка к сетке сделана через *?:№;%%!". Как взять значение сетки?
- основной цикл программы постоянно висит в ожидании выбора объектов, отсюда некоторые проблемы...
- нет отката последних действий. Как это сделать стандартными средствами?
- выход из скрипта только по кнопке или из контекстного меню, т.е. при выборе другого инструмента
скрипт не закрывается, а потом при нажатии кнопки мы выходим, но у нас уже выбран другой инструмент.
Не красиво и не удобно, как это победить?
- после выполнения любой операции сбрасывается выделение и подсветка.

Установка и использование:
- файл формы и картинки положить в папку каденса по пути %formpath%
- файлы скриптов (3 шт) загрузить в Allegro
- запустить скрипт из ком. строки - align, или Alt+e+a, или через меню Edit
- выбрать объкты, на форме нажать кнопку с необходимым действием (форма встраивается в панель Options)

Высказвайте свои мнения, предложения, баги. Можно присоединиться к разработке на _https://bitbucket.org/Kapustin/align. Там же можно забрать и свежую версию.
John Silver
PS посмотрите как скрипт работает в других программах, например в редакторе футпринтов, проверьте выравнивание для падов. А то я даже ни разу и не попробовал...
PPS как сделать, что бы при перемещении компонента разведенные дорожки тянулись за ним, а не оставались на месте? перебирать все соединения вручную и двигать дорожки? Или есть какой-нить стандартный механизм?
John Silver
Много чего пофиксил, да порефакторил.
Сделал распределение по зазору между объектами.
Сделал восстановление выделения.
А вот как все выглядит:
vitan
Давно хотел что-то подобное сделать, только все никак руки не доходили. Выравниваю по-старинке, кликами мышкой по компонентам с привязкой к сетке...
Скажите, а особых требований к версии нету (по скриншотам вижу, что 16)? У меня просто 15.х...
John Silver
Насчет версии не скажу, я взялся за skill начиная с 16,3
Пробуйте, если что, пишите, будем разбираться.

Обновил репозиторий. Все, что знал и представлял как сделать, сделал.
help.gif помогите решить оставшиеся проблемы.
vitan
Попробую обязательно. Судя по картинкам сделано неплохо. Да и выложить не пожалели, за что спасибо.
Ant_m
Попробовал, кажется все работает (16,3 h28). Особенно радует функция Distribute. Спасибо за подарок santa2.gif

Есть несколько наблюдений:
- В командую строку, при запуске pcb, выводится "0 ==== ("move" nil (("&Align" "align")))"
- Не работает встроенная, стандартная, функция align components (которая доступна по правой клавише мыши, в режиме расстановки компонентов) пишет "E- *Error* align: too many arguments (0 expected, 1 given) - ("components")"

И еще хочется более развернутые рекомендации по установке...
Например для быстрой проверки сделал так:
- закинул все файлы из архива в папку с файлом brd
- в командной строке загрузил скрипты:
Цитата
skill load "align.il"
skill load "align_do.il"
skill load "align_utils.il"

Скрипты можно загрузить и используя файл allegro.ilinit. Тогда они будут читаться сами, при каждом открытии pcb редактора. В файле нужно указать:
Цитата
load( "D:\\Some_Path\\align.il")
load( "D:\\Some_Path\\align_do.il")
load( "D:\\Some_Path\\align_utils.il")


Цитата(John Silver @ May 30 2011, 14:08) *
Проблемы:
- основной цикл программы постоянно висит в ожидании выбора объектов, отсюда некоторые проблемы...

Добавлю еще одну: Если не завершить скрипт(прав. кл. - Done), то нельзя даже выйти из редактора. На кнопочку с крестиком не реагирует. File->Exit тоже не работает.
John Silver
"0 ==== ("move" nil (("&Align" "align")))" Появляется при регистрации пункта меню, и кто-нить знает, что это?

Если сделать например так:
axlCmdRegister( "alignDDD" 'alignDDD )
axlUIMenuRegister( "moveDDD" '( ("&Align" "alignDDD") ) )
то будет работать и стандартная функция.
Я это видел, но после изучения стандартной функции решил, что моя лучше и стандартная не нужна. В readme.txt есть соответствующее предепреждение.

По установке может добавлю более полное описание... потОм... Это может сделать любой, readme я вкомитаю.
Изменил установку картинок, теперь их нужно ложить по пути %bmppath%.
Ну и для быстрой проверки специально в каментах лежат записи типа skill load "o:\\Sripts\\align\\align_utils.il"

Цитата
основной цикл программы постоянно висит в ожидании выбора объектов, отсюда некоторые проблемы...
Если не завершить скрипт(прав. кл. - Done), то нельзя даже выйти из редактора. На кнопочку с крестиком не реагирует. File->Exit тоже не работает.

"некоторые проблемы" - это я мягко выразился. Вообще ничего не работает пока не выйдешь из скрипта.

Может кто предложит более симпатичные иконки?
Перевод надо бы проверить, например "Align by TOP boundary" - выровнять по верхней границе.
Ant_m
Еще заметил:
Если сразу после открытия редактора сделать выравнивание distribute то компоненты выстраиваются не лесенкой!
Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла
И только потом, если сделать align, например по центру, distribute равняет лесенкой.
Нажмите для просмотра прикрепленного файла

З.Ы. Иконки для кнопок вполне хороши, все сразу понятно из того что на них нарисовано. (В open office draw 3,0 например сделаны безобразно, пока названия не прочтешь, не поймешь)
John Silver
Да, воспроизвел у себя, буду разбираться
John Silver
Пофиксил.
Это происходило потому что:
- элементы выровнены по горизонтали, у всех одинаковая Y
- выбираем распределение по вертикали
- вызывается функуция для сортировки по координате Y
- т.к. Y у всех одинаковый, сортировка не происходит
- вызывается функци непосредственно сортировки, и видим фигню

Теперь при сортировке по Y, если Y-ки равны, дополнительно проверяется координата X. Тоже и при сортировке по X, дополнительно проверяем Y.
!!! Но, если хоть один объект будет иметь Y отличный от остальных, он выпадет из общего ряда и распределение опять отработает криво (или нормально??? laughing.gif )
Old1
Цитата(John Silver @ May 30 2011, 12:08) *
...
- привязка к сетке сделана через *?:№;%%!". Как взять значение сетки?

Если нужен размер сетки, то используй функцию axlDBGridGet
Цитата
- нет отката последних действий. Как это сделать стандартными средствами?

Смотри функции
axlDBTransactionCommit
axlDBTransactionMark
axlDBTransactionOops
axlDBTransactionStart
axlDBTransactionRollback
Цитата
- выход из скрипта только по кнопке или из контекстного меню, т.е. при выборе другого инструмента
скрипт не закрывается, а потом при нажатии кнопки мы выходим, но у нас уже выбран другой инструмент.
Не красиво и не удобно, как это победить?

В твоем случае как минимум нужно сделать так:
Код
axlCmdRegister( "align" 'align  ?doneCmd 'alignDone )

тогда твоя скилл процедура будет автоматом закрываться по событию DONE при вызове какой либо другой команды или по нажатию F6.
А еще лучше так:
Код
axlCmdRegister( "align" 'align  ?doneCmd 'alignDone ?cancelCmd 'alignСancel )

и написать обработчик для Cancel.
Тогда при нажатии стандартной горячей клавиши F9 (Cancel) процедура должна адекватно выгрузиться. Сейчас этого не происходит.
John Silver
Спасибо, Леша. Где ж ты раньше был...

Цитата(Old1 @ Jun 2 2011, 23:28) *
Если нужен размер сетки, то используй функцию axlDBGridGet

И ни в одном мануале ее нету, негодяи...
Посмотрел, примерил, таки придется делать анализ объекта, выбор необходимой сетки. А сейчас все делается само, таки решил оставить как есть.

Цитата
Смотри функции
axlDBTransactionCommit
...

Это уже давно использовано. Работает как "Oops" внутри скрипта. А вот Undo не работает, пробовал и так, и сяк, не получилось. Где собака порылась?

Цитата
А еще лучше так:
Код
axlCmdRegister( "align" 'align  ?doneCmd 'alignDone ?cancelCmd 'alignСancel )

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

Вот за это отдельное спасибо. Тепеть можно работать.
Может знаешь, как взять текущую горячую клавишу, по имени команды?
Дабы повесить "Oops" на клаву.
А проблема в следующем: я, например, до сих пор использую старый набор, и на Oops висит F3. А кто-то использует другой набор.
По-хорошему надо узнать какая кнопка сейчас на команде "oops" и переассайнить ее на себя, а при выходе восстановить.

PS Вкомитал свежак.
Old1
Цитата(John Silver @ Jun 3 2011, 01:39) *
...
Может знаешь, как взять текущую горячую клавишу, по имени команды?
Дабы повесить "Oops" на клаву.
...

как вариант для oops - axlGetAlias, сначала получаешь список всех псевдонимов, затем перебирай пока не найдешь тот, который соответствует oops
John Silver
Да, это вариант.
А как сделать, что бы дорожки не рвались, а тянулись за компонентом, переходным?
Ant_m
В опциях команды Move поставить галочку Stretch etch. Но тогда, чтоб вопрос не возникал, ratsnets не будут тянуться за компонентом во время перемещения.
John Silver
sm.gif В команде
axlTransformObject(
lo_dbid/o_dbid
?move l_deltaPoint
?mirror t/nil
?angle f_angle
?origin l_rotatePoint
?allOrNone t/nil)
)
нет галочек.

Сделал горячую кнопку для Oops.

Свежий архивчик:
Old1
Цитата(John Silver @ Jun 3 2011, 09:46) *
...
А как сделать, что бы дорожки не рвались, а тянулись за компонентом, переходным?

Сделать можно.
В общих чертах порядок действий например такой:
-выделяем символ (и определяем его dbid);
-берем список пинов (атрибут pins);
далее для каждого пина
-берем атрибут branch;
-у взятого бранча берем атрибут children ( это список );
-проверяем полученный список на наличие объекта типа path, если такой объект или объекты присутствуют, то к пину проведена дорожка или дорожки;
-у каждого объекта path берем список сегментов из которых он состоит (атрибут segments);
-перебираем список сегментов и находим тот который выходит из пина (у каждого семента проверяется атрибут startEnd, это список с координатами начала и конца сегмента, координаты пина можно определить, взяв атрибут xy);
- зная смещение символа ( пина) вычисляем новые координаты сегмента;
- двигаем символ;
- удаляем прилегающий к пину сегмент ( axlDeleteObject );
- создаем сегмент с посчитанными координатами ( axlDBCreateLine ).
John Silver
Жесть, может когда нибудь сделаю...

А вот какой баг я нашел:
- выставте десяток элементов по вертикали, координаты X должны быть различными
- нажмите "Распределить по вертикали", настройки распределения не важны
- элементы выстраиваются, но при этом перемешиваются
- таже ситуация и для распределения по горизонтали

Посмотрел на код, вроде должны сортироваться по возрастанию, а получается, что нет.
Сортировка происходит в функции orderByY (objectList), при этом используется стандартная процедура sort( objectList 'comparePositionY ).
Где косяк??? Я не вижу. Может sort имеет какой-нибудь ньанс в работе?

PS горячая клавиша для Oops при повторной загрузке скрипта не работала. Исправил.
John Silver
Пофиксил, вкомитал.
John Silver
Цитата(vitan @ May 31 2011, 22:40) *
Давно хотел что-то подобное сделать, только все никак руки не доходили. Выравниваю по-старинке, кликами мышкой по компонентам с привязкой к сетке...
Скажите, а особых требований к версии нету (по скриншотам вижу, что 16)? У меня просто 15.х...


Ну как, работает в 15 версии?
Ant_m
John Silver
Нашел мелкий баг. Компоненты "сползают" вниз, если использовать Distribute с отрицательным Step.
Например Step = -4, применяем. Потом делаем Step = -8, применяем. Еще раз делаем Step = -4, и видим что компоненты на прежнее место не вернулись - ушли ниже. Это если для Vertical, для Horizontal работает аналогично.

Есть еще предложение - можно ли сделать выбор компонента, относительно которого происходит равнение других? Т.е чтобы этот компонент всегда оставался на месте, а другие равнялись на него?
John Silver
За баг спасибо, посмотрю.

Про фиксированный компонент.
Я например не вижу, как это будет выглядеть в UI, не представляю алгоритм.
Предлагайте алгоритм, UI.
Может лучше использовать отдельный скрипт (вроде align_sym.il, в интернетах лежит)?

Вот я попользовался скриптом (в кои-то веки) и понял, что Align и Distribute располагать на разных "вкладках" не удобно. Но, с другой стороны, место на панельке нету.
Кто предложит другой UI?

PS align_sym.il лежит сдесь на ftp (по крайней мере гугль так сказал)
PPS Нашел скрипт (как раз для сдвига с привязкой к компоненту):
John Silver
Цитата(Ant_m @ Jun 10 2011, 09:51) *
Нашел мелкий баг. Компоненты "сползают" вниз, если использовать Distribute с отрицательным Step.


Это не баг, это фича wink.gif
Ведь при каждой следующей итерации, снизу оказывается уже другой компонент. А фиксируется, как раз самый нижний.
John Silver
Ну вот я и переборол свою лень, и перепилил UI. Теперь все действия в одном флаконе.
Оценивайте.


Скачивать по-прежнему сдесь.
PotHead
John Silver, сколько Вы потратили на всю эту работу времени ? И сколько Вы с этого заработали ?
А.... гордость - какой я крутой конструктор или ой как интересно конструировать ?
Гордость в карман не положишь, а ой как интересным сыт не будешь !
Вот из-за таких людей как Вы, убивающих бесплатно вечерами свое время (а обычно овертайм оплачивается по ставке х1.5) электронщики - бомжовская специальность.
Приходит человек на работу чтобы денег заработать, а там сидит вот такой бобер, влюбленный в паялник и компилятор, ой как интересно котнструировать !
Забился в свою норку и лишь бы его палкой не трогали.

Дорочась в комп вечерами и выкладывая на халяву результаты своей пререработки убивыющей ваше здоровье, Вы рубите сук на котором Вы сидите. А потому-что завтра на ваше место возмут студента, котрыый вызубрил все ваши знания, за 1/3 вашей зарплаты, а Вы с производсвенной близорукостью и геммороем пойдете на улицу как отраобанный материал.

Кто хочет научится - тот научится и будет ценить свои знания, зарабатывать с их помощью денги и не разбрасыватся ими налево и направо за гордость.
А везде ходить и учите всех и вся за спасибо - это себе-же хуже делаете.
John Silver
О! Вот кого нам не хватало в этой теме, встречаем PotHead'а!
Он сейчас нас научит, как и что надо делать, а главное сколько это должно стоить в денежном выражении! А еще он нам расскажет, кто и какие должен преследовать цели, когда раздает бесплатно код.

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

В любом случае, дорогой PotHead, это флуд и офф, и я не хочу его видеть в этой теме.

PS Ну и конечно же есть здравое зерно.
vitan где отзыв про работоспособность в 15 версии? (кстати, спасибо за протекцию)

Цитата
Есть еще предложение - можно ли сделать выбор компонента, относительно которого происходит равнение других? Т.е чтобы этот компонент всегда оставался на месте, а другие равнялись на него?

Ant_m, почему бы Вам не предложить нам, как это должно работать. Расскажите свое видение этого вопроса.
to ALL удобен ли новый интерфес, аль старый был лучше?
Ant_m
Свое видение? Постараюсь внятно изложить... В общем то, у вас все сделано, нужно только добавить фичу)))
Для ясности опишу как вижу алгоритм когда выравнивание, например, к верху:
- пользователь выделяет компоненты и нажимает align top;
- скрипт ищет компонент с самой большой координатой Y;
- скрипт поднимает(сдвигает) другие компоненты на такую же высоту.

Теперь чего хочу я: а хочу я чтобы компоненты выстраивались по указанной, заданной пользователем координате. Тогда будет всего 2 варианта выравнивания либо горизонтально, либо вертикально. Вот как я это представляю:
- пользователь выделяет компоненты, для выравнивания;
- пользователь указывает координату, тут есть 2 варианта:
-- "абстракная координата", т.е пользователь тыкает мышью в "пустое" место. На практике такое не нужно.
-- координата компонента, причем любого другого, он не входит в группу выделенных компонентов. (можно конечно сделать чтобы и входил в группу выделенных, но кажется это лишние, и не нужные сложности)
- пользователь указывает как он хочет равнять: вертикально или горизонтально (соответственно алгоритму нужна будет либо X либо Y);
- скрипт выстраивает компоненты по указанной координате. При этом уточняю, что у компонентов меняется лишь одна координата.

Собственно и все. Кажется это не сложно реализовать, хотя могу ошибаться...
Если хотите я могу снять ролик как это делается вручную, для лучшего понимания.

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

З.Ы как это привязать к UI... Порядок действий не обязателен, поэтому можно сделать например так:
сделать 2 кнопки: вертикальное и горизонтальное выравнивание.
пользователь тыкает в кнопку, затем указывает группу компонентов. Потом его просят ткнуть мышкой для выбора компонента. Дальше работает скрипт.
vitan
Цитата(John Silver @ Jun 20 2011, 22:24) *
О! Вот кого нам не хватало в этой теме, встречаем PotHead'а!

Не обращайте внимания. У него последний месяц болезнь попустила немного, начал философствовать. Пытается зацепить демагогией. Скоро ему выделят отдельную ветку, будет сам с собой разговаривать.
А может, посчитает время, которое потратил, переведет в деньги, ужаснется и смоется...
Цитата(John Silver @ Jun 20 2011, 22:24) *
vitan где отзыв про работоспособность в 15 версии? (кстати, спасибо за протекцию)

Не за что. sm.gif
У меня не получилось установить.
Команда skill load "align.il" выдает ошибку "undefined function axlUIMenuRegister"
Очевидно, с предыдущей функцией проблем не возникло, непонятно только, что в этой не так.

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

Я тоже хочу присоединиться к предложению Ant_m. Было бы очень правильно, если была бы возможность выравнивать по компоненту, т.е. как бы по образцу.

И еще есть вопрос: а нельзя ли сделать так, чтобы после нажатия Oops после выравнивания с выбранных компонентов не сбрасывалось выделение и они продолжали бы оставаться выделенными? Это чтобы выровнять по-другому, если ошибся. А то приходится снова выделять компоненты, temp group и т.п....
John Silver
Цитата(Ant_m @ Jun 21 2011, 08:39) *
З.Ы как это привязать к UI... Порядок действий не обязателен, поэтому можно сделать например так:
сделать 2 кнопки: вертикальное и горизонтальное выравнивание.
пользователь тыкает в кнопку, затем указывает группу компонентов. Потом его просят ткнуть мышкой для выбора компонента. Дальше работает скрипт.

Вот теперь и я увидел, как это может работать.
1 На форме чекбокс (кнопки Done, Oops... придется удалить, появится место) для перехода в режим привязки по компоненту. Жмем его.
2 Появляется 2 кнопки и 2 поля для фиксированных координат (поля не активны, включим их 2-мя чекбоксами).
3 Выбираем объекты.
4 Жмем действие, получаем приглашение для указания привязки к объекту или точке. (Сдесь будут проблемы, у нас уже есть выбранные обекты, придется сбрасывать и потом восстанавливать их)
5 Тыркаем выбирая привязку. Ву-а-ля.
6 Восстанавливаем выделение?
7 Если активны поля для фиксированных координат: жмем действие и сразу выстраиваемся.
Вроде неплохо получается?

Цитата(vitan)
Команда skill load "align.il" выдает ошибку "undefined function axlUIMenuRegister".... картинки не возникли ...

Посмотрите доки в своей версии, что они говорят? (никто кроме Вас это не сделает)
В коде есть заглушка для формы в отдельном окне, попробуйте, может появятся картинки. 2 строки раскоментировать, одну закоментировать.

Цитата
а нельзя ли сделать так, чтобы после нажатия Oops после выравнивания с выбранных компонентов не сбрасывалось выделение

Хорошее предложение, надо будет сделать.
Ant_m
Цитата(John Silver @ Jun 21 2011, 13:55) *
Вот теперь и я увидел, как это может работать.
1 На форме чекбокс (кнопки Done, Oops... придется удалить, появится место) для перехода в режим привязки по компоненту. Жмем его.
2 Появляется 2 кнопки и 2 поля для фиксированных координат (поля не активны, включим их 2-мя чекбоксами).
3 Выбираем объекты.
4 Жмем действие, получаем приглашение для указания привязки к объекту или точке. (Сдесь будут проблемы, у нас уже есть выбранные обекты, придется сбрасывать и потом восстанавливать их)
5 Тыркаем выбирая привязку. Ву-а-ля.
6 Восстанавливаем выделение?
7 Если активны поля для фиксированных координат: жмем действие и сразу выстраиваемся.

Ээээ... Как то многовато действий будет smile3046.gif

п.2 - поля мне кажется тоже совершенно лишние, никто руками цифры вбивать не будет - это не удобно. А если и будет то для этого есть команды pick, ipick

п.4 явно лишний. Посмотрите как работает команда Move, когда в опциях указана привязка user pick. Там происходит так: жмешь кнопку move(или через меню), потом выделяешь рамочкой объекты. А после этого среда ждет что пользователь ткнет мышкой в любую точку на экране(это собственно п.5). Относительно этой точки все выделенные объекты и начинаются перемещаться. Все довольно просто и не нужно никаких приглашений.

Нужно добавить только 2 кнопки(вертикальное и горизонтальное выравнивание) и все. Итого получится:
п1: давим кнопку
п2: выбираем компоненты
п3: тыкая мышкой указываем точку отсчета, или компонент относительно которого все равняется.
и больше от пользователя ничего не требуется.
John Silver
Цитата
Многовато действий

Я расписал подробно, а суть та же.

Все же:
1 Выбираем компоненты
2 Выбираем действие
...
Иначе нарушается идеология, да и как изменить выбор? Получается один шанс для выбора объектов.

Поля для цифирь можно оставить напотом. Но они будут весьма полезны. Мы и сдвинем на нужное место, и выровняем сразу.

4 Приглашение в командной строке.

А может не нужна смена режимов...? Кнопки расположить на основной форме? Но тогда не останется места для новых полей ввода.
vitan
Я уже прямо начал пользоваться. sm.gif Картинки чинить некогда, и так работает, красоту потом наведем.
А как быть с выравниванием переходных отверстий? Если к ним подключены дороги, то они отсоединяются и возникает куча DRC. Нельзя ли предусмотреть опцию stretch etch, как это сделано в move? rolleyes.gif

UPD. И еще у меня после выравнивания отверстий на них назначаются другие цепи...
John Silver
Да, тянучек очень не хватает. Как это сделать написанно в посте 18.
Сделать это займет от 2 до 8 часов, а я трошку выдохся, недосуг пока.
Кто хочет потрудится? (помните приключения Шурика? sm.gif ) Присоединяйтесь, не стесняйтесь!

Да, эта фича должна быть обязательно, на основной форме, значит кнопки для работы с привязкой придется все же вынести на другую форму, использвать режимы.
Ant_m
Цитата(John Silver @ Jun 21 2011, 14:58) *
А может не нужна смена режимов...? Кнопки расположить на основной форме? Но тогда не останется места для новых полей ввода.

Насчет места не знаю у меня все с этим нормально, там еще 3 таких панели легко поместятся.

что если сделать так? (извиняюсь за качество каракуль на картинке, с gimp не слишком знаком)
Нажмите для просмотра прикрепленного файла

Пояснения:
п1: Выделяем группу компонентов (на рис. это 1)
п2: давим кнопку [Pick], и выбираем точку привязки. тут же происходит выравнивание.
п3. Если юзера устраивает, то он давит [Done], если нет то [Oops], а потом опять [Pick]

Поле ввода, входящее в группу 2 можно использовать также не только для кнопки Distribute но и кнопки Pick. rolleyes.gif
John Silver
Цитата(Ant_m @ Jun 21 2011, 15:23) *
Насчет места не знаю у меня все с этим нормально, там еще 3 таких панели легко поместятся.

Какое интересное расположение панелей. У меня все 3 стоят друг над другом. И места уже не осталось.
Оно конечно хорошо все на одной форме, все под рукой, но место...
Ладно, будет видно...

Цитата
Пояснения:
п1: Выделяем группу компонентов (на рис. это 1)
п2: давим кнопку [Pick], и выбираем точку привязки. тут же происходит выравнивание.
п3. Если юзера устраивает, то он давит [Done], если нет то [Oops], а потом опять [Pick]

Вроде я именно так и сказал 1111493779.gif

Цитата
Поле ввода, входящее в группу 2 можно использовать также не только для кнопки Distribute но и кнопки Pick. rolleyes.gif

не пойдет, придется перебивать постоянно значения, там отлично влазит второе поле напротив кнопки.
Например я делаю так: делаю распределение автоматом, в поле появляется текущее растояние, при неообходимости включаю Step и корректирую расстояние. Очень удобненько.
John Silver
Ну вот, как-то так. Слева новая панель.
Нажмите для просмотра прикрепленного файла

Как-то зело перегруженный интерфейс получается. wacko.gif

И иконки не придумываются...

PS Последние выделенные объекты остаюся во внутренней переменной после команды Oops, и с ними можно производить обычные действия.
Вот такая вот бага-фича. laughing.gif
Ant_m
Цитата(John Silver @ Jun 23 2011, 00:02) *
Как-то зело перегруженный интерфейс получается. wacko.gif
И иконки не придумываются...

Хороший интерфейс - все что нужно есть. А любители простоты пусть идут в... консоль.
З.Ы. Насколько я понял пока кнопки pick не работают...
John Silver
Сделал Pick для гозонтали.
Довольно удобный инструмент получился.
Можете по аналогии пока допилить и для вертикали, а я на выходные уехал.
John Silver
Закончил Pick.
Пофиксил привязку к сетке.
Улучшил производительность, теперь при работе внутри заливки все летает.

Создается впечатление, что я говорю сам с собой. cranky.gif
Что тема уже никому не интересна? Никто не заметил, что привязка к сетке работает криво... что выравнивание десятка переходных при включенном обновлении шейпов занимает 30с...
vitan
Цитата(John Silver @ Jun 28 2011, 03:27) *
Создается впечатление, что я говорю сам с собой. cranky.gif

Да не переживайте Вы так! sm.gif Просто не всегда есть время на то, на что оно есть у Вас.
Ant_m
Цитата(John Silver @ Jun 28 2011, 03:27) *
Что тема уже никому не интересна? Никто не заметил, что привязка к сетке работает криво... что выравнивание десятка переходных при включенном обновлении шейпов занимает 30с...

Тема очень интересна, но времени иногда не хватает wacko.gif
Про сетку: даже мысли не возникло проверять - сеткой пользуюсь редко. Только для особо крупных и критичных компонентов. Их все равно волей-неволей нужно ставить вручную. А мелкие компоненты совершенно не важно как стоят - лишь бы красиво и ровно.

Потестил. Не ясно назначение галочки напротив Distrib... Она отключает поле ввода, но если отключить поле то кнопка Distrib не работает. Тогда зачем эта галочка вообще нужна? Или чего-то не уловил...

А так все супер, огромное спасибо a14.gif

З.Ы про шейпы не переживайте, это у всех так. Я когда много чего двигаю, отключаю динамическое обновление, иначе можно уснуть пока на 10-ти слоях все перерисуется.
John Silver
Цитата(Ant_m @ Jun 28 2011, 12:02) *
Потестил. Не ясно назначение галочки напротив Distrib... Она отключает поле ввода, но если отключить поле то кнопка Distrib не работает. Тогда зачем эта галочка вообще нужна? Или чего-то не уловил...

Это хитрая фича
1 выбираем объекты, жмем Distrib, рассчитывается расстояние между крайними компонентами в автоматическом режиме, рассчитывается шаг, двигаются обекты
2 в поле появляется текущий шаг
3 жмем галку, поле активируется, шаг все тот же
4 жмем Distrib, ничего не меняется, ведь шаг все тот же
5 вводим другой шаг в поле, жмем Distrib, объекты двигаются
Я использую как линейку: распределил, посмотрел расстояние, если расстояние не устраивает, то нажал чеккбокс, изменил расстояние, перераспределил.
Кстати, так же обновляется и поле для Pick.

Цитата
З.Ы про шейпы не переживайте, это у всех так. Я когда много чего двигаю, отключаю динамическое обновление, иначе можно уснуть пока на 10-ти слоях все перерисуется.

да уже нечего переживать, ща все в пакетном режиме, достаточно быстро.
John Silver
Сделал Stretch.
Тестируйте, чувствую будет много багов.
Один полу-баг уже есть: если двигаем компонент, а дорожка проведена только к нему и на конце обрывается, то после сдвига дорожка может потерять Net, например прицепиться к земляной заливке.
Не представляю, возможно ли это поправить.
У кого-нибудь есть соображения на этот счет? ( см. align_utils.il moveObject() )
Old1
Цитата(John Silver @ Jun 29 2011, 10:26) *
Сделал Stretch.
...
У кого-нибудь есть соображения на этот счет? ( см. align_utils.il moveObject() )

Если я правильно понял твой код, то реализован такой порядок действий: удаляется сегмент на старом месте -> создается сегмент на новом месте -> перемещается объект (символ или виа).
Попробуй сделать так: удаляется сегмент на старом месте -> перемещается объект -> создается сегмент на новом месте.
John Silver
Вроде такой вариант пробовал sad.gif. Там есть закомментированные рудименты.
Точно помню, что делал:
создаются сегменты -> удаляются сегменты -> перемещается объект
создаются сегменты -> перемещается объект -> удаляются сегменты
Не помогло.
А ваще надо еще разок пройтись по всем вариантам.

Еще вопрос. Ведь надо сначала найти все сегменты, сохранить их, выйти из всех циклов, и только тогда можно двигать объект.
Как это изящьней реализовать, куда сохранять сегменты и новые точки. Что то не лежит душа к структуре, как потом удалить тип структуры?
Old1
Цитата(John Silver @ Jun 29 2011, 11:55) *
...
Еще вопрос. Ведь надо сначала найти все сегменты, сохранить их, выйти из всех циклов, и только тогда можно двигать объект.
Как это изящьней реализовать, куда сохранять сегменты и новые точки...

Можно использовать список ( list ) , он вроде-бы может содержать любые типы данных, включая списки...
John Silver
Делал sm.gif
Во время итерации для удаления, выдается варнинг об отсутствующем ID (который удалили на предыдущем шаге).
Не красиво, загрязняют консоль.
Old1
Цитата(John Silver @ Jun 29 2011, 13:40) *
Делал sm.gif
Во время итерации для удаления, выдается варнинг об отсутствующем ID (который удалили на предыдущем шаге).
Не красиво, загрязняют консоль.

перед тем как что-то делать проверяй этот dbid существует или нет, тогда ворнингов не будет...
John Silver
Не-не-не.
Я иду по списку:
1 взял сегмент, удалил, в списке осталась запись, но ID:removed
2 взял сегмент, получил варнинг о первой записи, ...
....
Ни обновить ID, ни удалить из списка.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.