Hi João,

Changed the behaviour and also added some code that prevents #A and #N lines from being changed. Make sure you proper test it, because I didn't. Consider this the price of free software :-).

@Dan: It is Tcl, but I should look into the gui plugin interface to make it work. And another way of selecting objects as there aren't any line numbers within Pd. It could be converted to some kind of rasterizer or align-to-grid option, but that may already exist...

Greetings & success,

Fred Jan

Hi Fred,

I did some testing today when I had some more time. It works great, and
if I use it in a command like xxxx > new.pd, I get the new patch out of it.

If I may, I would ask for a small improvement: it would be great if the
processing would be done in the opposite way; that is, all lines with #X
obj are processed, *except* the ones given as arguments. I can also work
with the version you sent me, but for the exercises I'm thinking about,
only an exception of lines will be kept in the original way.

I tried to do it myself, but quickly I came to the conclusion that my
lack of experience with scripting languages doesn't really help me.

Thanks a lot,

Joao


Hi João,

It appeared to be a simple program in Tcl, which you should have, as it
comes with Pd.
The usage is: tclsh changeCoords.tcl patchName xcoord ycoord line1
?line2? ...
lineN arguments may be a number or a range, like 12-15.

The patch is currently dumped to the console. Only minimal checking is
done.

If you remove the #'s for the puts "..." lines, you can see some interim
results (which will ruin the patch format).

Greetings,

Fred Jan

#!/usr/bin/env tclsh
#
# changeCoords.tcl v0.2
# fjkr...@xs4all.nl

if {$argc < 4} {
    error "Usage: tclsh changeCoords.tcl patchName xcoord ycoord line1 ?line2? ..."
}

set patchName [lindex $argv 0]
set xcoord    [lindex $argv 1]
set ycoord    [lindex $argv 2]
set lineArgCount $argc
set lineList {}

#puts "patchName $patchName; xcoord $xcoord; ycoord $ycoord lineArgCount; $lineArgCount"
# line arguments may be numeric or a numeric range "nn-mm" (inclusive)

for {set start 3} {$lineArgCount > $start} {incr start} {
        set arg [lindex $argv $start]
#        puts "$start: $arg"
        if [regexp {(\d+)-(\d+)} $arg lineRange startLine endLine] {
                if {$startLine < $endLine} {
#                        puts "startLine $startLine; endLine $endLine;;  $lineRange"
                        for {set line $startLine} {$line <= $endLine} {incr line} {
                                lappend lineList $line
                        }
                }
        } else {
#                puts "line $arg"
                lappend lineList $arg
        }
}

#puts "lines not to patch: $lineList"

set lineCount 1
set f [open $patchName]
while {[gets $f patchLine] >= 0} {
    if [regexp {\#[AN] } $patchLine] {
#        puts -nonewline "$lineCount: "
        puts $patchLine
        incr lineCount
        continue
    }
    if [regexp {\#[X] } $patchLine] {
        if {[lsearch $lineList $lineCount] == -1} { # >= 0 for matching lines, == -1 for non-matching lines
            if [regexp {\#X obj (\d+) (\d+) (.+)} $patchLine allOfLine orgX orgY restOfLine] {
#                puts -nonewline "$lineCount: "
                puts "#X obj $xcoord $ycoord $restOfLine"
            } else {
#                puts -nonewline "$lineCount: "
                puts $patchLine
            }
        } else {
#            puts -nonewline "$lineCount: "
            puts $patchLine
        }
        incr lineCount
    } else {
        puts $patchLine
    }
}
close $f
_______________________________________________
Pd-list@lists.iem.at mailing list
UNSUBSCRIBE and account-management -> 
http://lists.puredata.info/listinfo/pd-list

Reply via email to