Перейти к содержанию
    

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

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

Изменено пользователем John Silver

Поделиться сообщением


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

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

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

Изменено пользователем John Silver

Поделиться сообщением


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

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

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

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

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

image_4de51412d1d6a.jpgimage_4de5141a30b60.jpg

align.zip

Изменено пользователем John Silver

Поделиться сообщением


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

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

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

Поделиться сообщением


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

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

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

 

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

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

Поделиться сообщением


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

Попробую обязательно. Судя по картинкам сделано неплохо. Да и выложить не пожалели, за что спасибо.

Поделиться сообщением


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

Попробовал, кажется все работает (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 тоже не работает.

Поделиться сообщением


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

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

Изменено пользователем John Silver

Поделиться сообщением


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

Еще заметил:

Если сразу после открытия редактора сделать выравнивание 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 например сделаны безобразно, пока названия не прочтешь, не поймешь)

 

Поделиться сообщением


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

Пофиксил.

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

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

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

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

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

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

 

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

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

Изменено пользователем John Silver

Поделиться сообщением


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

...

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

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

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

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

axlDBTransactionCommit

axlDBTransactionMark

axlDBTransactionOops

axlDBTransactionStart

axlDBTransactionRollback

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

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

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

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

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

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

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

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

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

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

Поделиться сообщением


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

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

 

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

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

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

 

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

axlDBTransactionCommit

...

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

 

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

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

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

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

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

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

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

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

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

 

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

Изменено пользователем John Silver

Поделиться сообщением


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

...

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

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

...

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

Поделиться сообщением


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

Да, это вариант.

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

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

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

  Разрешено использовать не более 75 эмодзи.

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

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

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

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