| delorie.com/archives/browse.cgi | search |
| 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--
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |