# -*- coding: ISO-8859-1 -*- """ capellaScript -- (c) Peter Becker >>> Triolen Manager Mit diesem Script lassen sich n-tolen Klammern entfernen,| oder die Richtung der Klammer umdrehen <<< History: 25.09.07 - Erste Ausgabe 29.01.11 - Richtungsänderung der Klammer, Bereichsunterstützung 31.01.11 - zusätzlicher Versatz und waagerechte Klammern """ from xml.dom.minidom import NodeList, Node, Element def handleBracket(note): global pos, ber, form, abst dOs = note.getElementsByTagName('bracket') offsetList = (-1.5,-1,-0.5,0,0.5,1,1.5) offset = offsetList[abst] for do in range(dOs.length): bracket = dOs[do] y1 = float(bracket.getAttribute('y1')) y2 = float(bracket.getAttribute('y2')) oDir = bracket.getAttribute('orientation') if bracket.hasAttribute('orientation'): if pos == 1 and form == 0: # spiegeln ansonsten unverändert if oDir == 'up': y1 = float(y1) + 8.5 + offset y2 = float(y2) + 8.5 + offset dir = 'down' else: offset = offset * -1 y1 = float(y1) - 8.5 + offset y2 = float(y2) - 8.5 + offset dir = 'up' if pos == 1: bracket.setAttribute('orientation',dir) elif pos == 1 and form == 1: if oDir == 'up': y1 = float(y1) + 8.5 y2 = float(y2) + 8.5 dir = 'down' else: offset = offset * -1 y1 = float(y1) - 8.5 y2 = float(y2) - 8.5 dir = 'up' if pos == 1: bracket.setAttribute('orientation',dir) elif pos == 2: if oDir == 'up': offset = offset * -1 y1 = float(y1) + offset y2 = float(y2) + offset elif pos == 0: # ohne Klammer bracket.removeAttribute('orientation') if form == 1: if y1 < y2: y2 = y1 else: y1 = y2 bracket.setAttribute('y1',str(y1)) bracket.setAttribute('y2',str(y2)) def getElementObjects(objList): # returns a List newList = NodeList() for n in range(objList.length): if objList[n].nodeType == objList[n].ELEMENT_NODE: newList.append(objList[n]) return newList def changeDoc(score): global pos, ber, form, abst sel = curSelection() #messageBox('SEL',str(sel)) selvon = sel[0] selbis = sel[1] syvon = selvon[0] stvon = selvon[1] vovon = selvon[2] novon = selvon[3] sybis = selbis[0] stbis = selbis[1] vobis = selbis[2] nobis = selbis[3] systems = score.getElementsByTagName('system') staff = systems[syvon].getElementsByTagName('staff') voice = staff[stvon].getElementsByTagName('voice') noteObjs = voice[vovon].getElementsByTagName('noteObjects')[0] objList = getElementObjects(noteObjs.childNodes) if ber == 0: #ganze Partitur bearbeiten for sys in range(systems.length): noteObjs = systems[sys].getElementsByTagName('noteObjects') for nos in range(noteObjs.length): noteObj = noteObjs[nos] objList = getElementObjects(noteObj.childNodes) for no in range(objList.length): obj = objList[no] handleBracket(obj) elif ber == 1: #markierte Systeme bearbeiten if syvon >= sybis: syixEnde = syvon + 1 syixStart = sybis else: syixEnde = sybis + 1 syixStart = syvon while syixStart < syixEnde: noteObjs = systems[syixStart].getElementsByTagName('noteObjects') syixStart = syixStart + 1 for nos in range(noteObjs.length): noteObj = noteObjs[nos] objList = getElementObjects(noteObj.childNodes) for no in range(objList.length): obj = objList[no] handleBracket(obj) else: #markierten Bereich in der Zeile bearbeiten if novon >= nobis: ixEnde = novon ixStart = nobis else: ixEnde = nobis ixStart = novon while ixStart < ixEnde: obj = objList[ixStart] handleBracket(obj) ixStart = ixStart + 1 def pqDialog(): global pos, ber, form, abst options = ScriptOptions() opt = options.get() Aopt = ['Klammer weg','Klammer spiegeln','Klammer hier beibehalten'] radioA = Radio(Aopt, value=int(opt.get('pos', 0)),text='Funktion') Bopt = ['ganze Partitur','markierte Systeme','markierter Bereich in einer Zeile'] radioB = Radio(Bopt, value=int(opt.get('ber', 0)),text='Bereich') Copt = ['unverändert','gerade Klammer'] radioC = Radio(Copt, value=int(opt.get('form', 0)),text='Form') Dopt = ['-1,5','-1','-0,5','0 ','+0,5','+1','+1,5'] radioD = Radio(Dopt, value=int(opt.get('abst', 3)),text='zusätzlicher Abstand') subbox1 = HBox([radioA,radioB],padding=4) subbox2 = HBox([radioC,radioD],padding=4,text='Klammer') box = VBox([subbox1,subbox2],padding=4) dlg = Dialog('Triolen - (n-Tolen) Manager', box) if dlg.run(): pos = radioA.value() ber = radioB.value() form = radioC.value() abst = radioD.value() opt.update(dict(pos=pos, ber=ber, form=form, abst=abst)) options.set(opt) return True else: return False # Hauptprogramm: from caplib.capDOM import ScoreChange import tempfile class ScoreChange(ScoreChange): def changeScore(self, score): global doc doc = score.parentNode changeDoc(score) if pqDialog(): if activeScore(): activeScore().registerUndo('Klammer Manager') tempInput = tempfile.mktemp('.capx') tempOutput = tempfile.mktemp('.capx') activeScore().write(tempInput) ScoreChange(tempInput, tempOutput) activeScore().read(tempOutput) os.remove(tempInput) os.remove(tempOutput)