delorie.com/archives/browse.cgi   search  
Mail Archives: geda-user/2015/07/20/09:18:58

X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f
X-Recipient: geda-user AT delorie DOT com
X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20120113;
h=date:from:to:subject:message-id:mail-followup-to:references
:mime-version:content-type:content-disposition:in-reply-to
:user-agent;
bh=bs6twa5jo+hr5n6CbmCXvwmb5GtOFlM3AHU76pxcKXk=;
b=p4YKMMn2AEzm/Pgj91Ac3/KlNZ3rdusmpMVdqsxdAIJlNcuiGezwatruzzlCAk/kn7
RPnsp7DCytlQdSzvSH0oLij76AKLwMszRncplJQtGsz1HjfwVNUjeoUYMGaYPI9wNUAo
fT2nCpSJDTdUMJaL4daHeYbjLptOIG7tkJWNVRAJNEwktoMBTvJASF0AzIiVoeAC5iXU
grNXpYGjss2/aeJf5+N1SDZMj6yQjZ6orEkCzyqYxpOgSml9ign/SfkgeP+lkU5rRiiv
E1Qa9UEUBG3gUisjzqDBIzTH7CU5s4PgC1EmKvF0aZJMhsjd81IL0Gi8b9LZdOSwyweW
Ns8A==
X-Received: by 10.112.210.137 with SMTP id mu9mr26809165lbc.95.1437398276887;
Mon, 20 Jul 2015 06:17:56 -0700 (PDT)
Date: Mon, 20 Jul 2015 16:17:54 +0300
From: "Vladimir Zhbanov (vzhbanov AT gmail DOT com) [via geda-user AT delorie DOT com]" <geda-user AT delorie DOT com>
To: geda-user AT delorie DOT com
Subject: Re: [geda-user] The new to do
Message-ID: <20150720131753.GA19305@localhost.localdomain>
Mail-Followup-To: geda-user AT delorie DOT com
References: <CAM2RGhQ70Pex5aNeQ86vKHc7sKf_Vpws69__CPb2QKg6fJTeHg AT mail DOT gmail DOT com>
<mnv04v$if0$1 AT ger DOT gmane DOT org>
<0A5D410F-D1EF-4FC6-AF0F-BB13218B1615 AT icloud DOT com>
<alpine DOT DEB DOT 2 DOT 00 DOT 1507131000330 DOT 6924 AT igor2priv>
<mo1rd7$oef$1 AT ger DOT gmane DOT org>
<20150714084906 DOT GC14371 AT localhost DOT localdomain>
<moheag$673$1 AT ger DOT gmane DOT org>
MIME-Version: 1.0
In-Reply-To: <moheag$673$1@ger.gmane.org>
User-Agent: Mutt/1.5.23 (2014-03-12)
Reply-To: geda-user AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: geda-user AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

--OgqxwSJOaUobr8KG
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline

On Mon, Jul 20, 2015 at 02:10:55AM +0200, Kai-Martin Knaak wrote:
> Vladimir Zhbanov (vzhbanov AT gmail DOT com) 
> [via geda-user AT delorie DOT com] wrote:
> 
> > What a first scripting example would you like to see in the
> > scripting how to?
> > 
> Do a custom PDF print of the pcb layout:
>   page one: top layer with refdes
>   page two: top layer with values
>   page three: bottom layer with refdes
>   page four: bottom layer with values
> all pages: black silk, black outline, pads and pins in dark gray and 
> tracks in light gray. Rescale the layout until it fits an A4 paper.
> 
> Ok, this may be a bit over the top for a first example. It is what I 
> actually need, though. So I whipped up a bash script which calls the 
> pcb printing hid with action commands to change sides and switch from 
> refdes to value. I had to patch pcb to not exit immediately. It 
> assumes that non-interactive hids should never use these commands and 
> exits preemptively. Unfortunately, my patch which replaced this 
> deliberate exit with a warning did not get accepted by the devs. So I 
> habitually apply this patch locally.
> 
> Back to a first example for useful scripting. How about multi-copy:
>   Copy/paste the current selection multiple times translated by an
>   amount given by the user. For bonus points also rotate the selection
>   by an angle with each paste action.

Rereading your post after I wrote the script for gschem, I start to
suspect you've meant PCB here, haven't you?

Anyway, the script for gschem is attached. Comments and example usage
are inside, and an only comment here: there are many rotation strategies
and I've applied one I think is more appropriate for this case.

Cheers,
  Vladimir

--OgqxwSJOaUobr8KG
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="move-and-rotate.scm"

; Scripting example by vzh per request of Kai-Martin Knaak :-)
; Use at your own risk.

; The main procedure here is
; multiple-copy-move-and-rotate-selection which can be abbreviated
; as mcmars.
; Usage:
;   launch gschem so it can use this script, e.g.
;     gschem -s move-and-rotate.scm
;   select objects in gschem, then hit ':' (semicolon) and type
;     (mcmars '(1000 . 500) 90 10)
;   hit <Enter>
; Enjoy!


(use-modules (gschem selection))

; align coords by ALIGN
(define (ceiling-coords vector align)
  (cons
    (* (ceiling-quotient (car vector) align) align)
    (* (ceiling-quotient (cdr vector) align) align)
    ))

; Get minimum X and minimum Y of two pairs of coords
(define (min-coords coord1 coord2)
  (let ((x (min (car coord1) (car coord2)))
        (y (min (cdr coord1) (cdr coord2))))
    ; return value
    (cons x y)))

; Copy, move and rotate current selection. The selected objects
; are first copied, then translated by VECTOR and finally rotated
; by ANGLE about center which is calculated as rounded by 100
; lower left coordinate of all objects in selection.
; If no objects are selected, opens gschem message dialog with
; warning.
; Returns the copied objects.
(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)
      )))

; Multiply VECTOR which must be a pair by NUMBER
(define (multiply-vector-by vector number)
  (cons (* number (car vector)) (* number (cdr vector))))

; Copy, move and rotate current selection NUMBER times. Applies
; the copy-move-and-rotate-selection procedure multiple times
; increasing every time vector and angle by given values of VECTOR
; and ANGLE.
; If no objects are selected, opens gschem message dialog with
; warning.
; Returns value is unspecified.
(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)))
    ))

; Abbreviated name for the multiple-copy-move-and-rotate-selection
; procedure
(define mcmars multiple-copy-move-and-rotate-selection)

--OgqxwSJOaUobr8KG--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019