Jump to content

    
Sign in to follow this  
John Silver

Выравнивание объектов в Allegro PCB

Recommended Posts

Представляю на ваш суд скрипт для выранивания и распределения объектов в 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. Там же можно забрать и свежую версию.

align.zip

Edited by John Silver

Share this post


Link to post
Share on other sites

PS посмотрите как скрипт работает в других программах, например в редакторе футпринтов, проверьте выравнивание для падов. А то я даже ни разу и не попробовал...

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

Edited by John Silver

Share this post


Link to post
Share on other sites

Много чего пофиксил, да порефакторил.

Сделал распределение по зазору между объектами.

Сделал восстановление выделения.

А вот как все выглядит:

image_4de51412d1d6a.jpgimage_4de5141a30b60.jpg

align.zip

Edited by John Silver

Share this post


Link to post
Share on other sites

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

Скажите, а особых требований к версии нету (по скриншотам вижу, что 16)? У меня просто 15.х...

Share this post


Link to post
Share on other sites

Насчет версии не скажу, я взялся за skill начиная с 16,3

Пробуйте, если что, пишите, будем разбираться.

 

Обновил репозиторий. Все, что знал и представлял как сделать, сделал.

:help: помогите решить оставшиеся проблемы.

Share this post


Link to post
Share on other sites

Попробовал, кажется все работает (16,3 h28). Особенно радует функция Distribute. Спасибо за подарок :santa2:

 

Есть несколько наблюдений:

- В командую строку, при запуске 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")

 

Проблемы:

- основной цикл программы постоянно висит в ожидании выбора объектов, отсюда некоторые проблемы...

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

Share this post


Link to post
Share on other sites

"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" - выровнять по верхней границе.

Edited by John Silver

Share this post


Link to post
Share on other sites

Еще заметил:

Если сразу после открытия редактора сделать выравнивание distribute то компоненты выстраиваются не лесенкой!

post-29765-1306919263_thumb.png post-29765-1306919272_thumb.png post-29765-1306919282_thumb.png

И только потом, если сделать align, например по центру, distribute равняет лесенкой.

post-29765-1306919524_thumb.png

 

З.Ы. Иконки для кнопок вполне хороши, все сразу понятно из того что на них нарисовано. (В open office draw 3,0 например сделаны безобразно, пока названия не прочтешь, не поймешь)

 

Share this post


Link to post
Share on other sites

Пофиксил.

Это происходило потому что:

- элементы выровнены по горизонтали, у всех одинаковая Y

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

- вызывается функуция для сортировки по координате Y

- т.к. Y у всех одинаковый, сортировка не происходит

- вызывается функци непосредственно сортировки, и видим фигню

 

Теперь при сортировке по Y, если Y-ки равны, дополнительно проверяется координата X. Тоже и при сортировке по X, дополнительно проверяем Y.

!!! Но, если хоть один объект будет иметь Y отличный от остальных, он выпадет из общего ряда и распределение опять отработает криво (или нормально??? :laughing: )

Edited by John Silver

Share this post


Link to post
Share on other sites
...

- привязка к сетке сделана через *?:№;%%!". Как взять значение сетки?

Если нужен размер сетки, то используй функцию axlDBGridGet

- нет отката последних действий. Как это сделать стандартными средствами?

Смотри функции

axlDBTransactionCommit

axlDBTransactionMark

axlDBTransactionOops

axlDBTransactionStart

axlDBTransactionRollback

- выход из скрипта только по кнопке или из контекстного меню, т.е. при выборе другого инструмента

скрипт не закрывается, а потом при нажатии кнопки мы выходим, но у нас уже выбран другой инструмент.

Не красиво и не удобно, как это победить?

В твоем случае как минимум нужно сделать так:

axlCmdRegister( "align" 'align  ?doneCmd 'alignDone )

тогда твоя скилл процедура будет автоматом закрываться по событию DONE при вызове какой либо другой команды или по нажатию F6.

А еще лучше так:

axlCmdRegister( "align" 'align  ?doneCmd 'alignDone ?cancelCmd 'alignСancel )

и написать обработчик для Cancel.

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

Share this post


Link to post
Share on other sites

Спасибо, Леша. Где ж ты раньше был...

 

Если нужен размер сетки, то используй функцию axlDBGridGet

И ни в одном мануале ее нету, негодяи...

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

 

Смотри функции

axlDBTransactionCommit

...

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

 

А еще лучше так:

axlCmdRegister( "align" 'align  ?doneCmd 'alignDone ?cancelCmd 'alignСancel )

и написать обработчик для Cancel.

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

Вот за это отдельное спасибо. Тепеть можно работать.

Может знаешь, как взять текущую горячую клавишу, по имени команды?

Дабы повесить "Oops" на клаву.

А проблема в следующем: я, например, до сих пор использую старый набор, и на Oops висит F3. А кто-то использует другой набор.

По-хорошему надо узнать какая кнопка сейчас на команде "oops" и переассайнить ее на себя, а при выходе восстановить.

 

PS Вкомитал свежак.

Edited by John Silver

Share this post


Link to post
Share on other sites
...

Может знаешь, как взять текущую горячую клавишу, по имени команды?

Дабы повесить "Oops" на клаву.

...

как вариант для oops - axlGetAlias, сначала получаешь список всех псевдонимов, затем перебирай пока не найдешь тот, который соответствует oops

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this