; Scripting example by vzh per request of ; Kai-Martin Knaak :-) ; Use at your own risk. ; Основная процедура здесь ; multiple-copy-move-and-rotate-selection, что можно сократить до ; mcmars. ; Использование: ; запустите gschem, чтобы там можно было использовать этот скрипт, например ; gschem -s move-and-rotate.scm ; выделите объекты в gschem, нажмите ':' (двоеточие) и наберите ; (mcmars '(1000 . 500) 90 10) ; нажмите ; Наслаждайтесь! (use-modules (gschem selection)) ; округление координат по ALIGN (define (ceiling-coords vector align) (cons (* (ceiling-quotient (car vector) align) align) (* (ceiling-quotient (cdr vector) align) align) )) ; Получение минимума X и минимума Y двух пар координат (define (min-coords coord1 coord2) (let ((x (min (car coord1) (car coord2))) (y (min (cdr coord1) (cdr coord2)))) ; возвращаемое значение (cons x y))) ; Копирование, перемещение и вращение текущего выделения. Выделенные объекты ; сначала копируются, затем перемещаются на вектор VECTOR и, наконец, вращаются ; на угол ANGLE вокруг центра, который рассчитывается как округлённая до ; множителей 100 левая нижняя координата всех объектов в выделении. ; Если никакие объекты не выделены, открывает диалоговое окно сообщений gschem ; с предупреждением. ; Возвращает скопированные объекты. (define (copy-move-and-rotate-selection vector angle) (let ((objects (page-selection (active-page)))) (if (null? objects) (gschem-msg "Select something first!") ; else (let* ((copied-objects (map copy-object objects)) (translated-objects (apply translate-objects! vector copied-objects)) (bounds (apply object-bounds translated-objects)) (rotation-center (ceiling-coords (min-coords (car bounds) (cdr bounds)) 100)) (rotated-objects (apply rotate-objects! rotation-center angle translated-objects))) (apply page-append! (active-page) rotated-objects) rotated-objects) ))) ; Умножает VECTOR, который должен быть парой, на число NUMBER (define (multiply-vector-by vector number) (cons (* number (car vector)) (* number (cdr vector)))) ; Копирование, перемещение и вращение текущего выделения количество ; раз, указанное аргументом NUMBER. Применяет процедуру ; copy-move-and-rotate-selection несколько раз, каждый раз увеличивая ; вектор и угол на заданные значения VECTOR и ANGLE. ; Если никакие объекты не выделены, открывает gschem message dialog with ; warning. ; Если никакие объекты не выделены, открывает диалоговое окно сообщений gschem ; с предупреждением. ; Возвращаемое значение не определено. (define (multiple-copy-move-and-rotate-selection vector angle num) (if (null? (page-selection (active-page))) (gschem-msg "Select something first!") ; else (do ((i num (1- i))) ((= i 0)) (copy-move-and-rotate-selection (multiply-vector-by vector i) (* angle i))) )) ; Сокращение для имени процедуры multiple-copy-move-and-rotate-selection (define mcmars multiple-copy-move-and-rotate-selection)