# -*- coding: ISO-8859-1 -*- """ capellaScript -- Copyright (c) 2003 Peter Becker >>> Triolen Fix Dieses Script dient zur Umgehung eines uralten Capella Problems. Ist das erste Element einer Triole eine Pause, beginnt die linke Seite der Triolenklammer meist im Nirwana. Dieses Script bringt den linken Eckpunkt der Klammer wieder in den darstellbaren Bereich und erzeugt eine waagerechte Klammer.|| Es kann nicht alle Variationen abdecken, daher sind manchmal manuelle Korrekturen erforderlich.|| Bei Problemen bitte eine Mail an peter_becker@freenet.de <<< History : 20.01.2004 Erste Version 22.01.2004 Sind die 2 Noten auf der gleichen Höhe verläuft die Klammer parallel 24.08.2004 Script vereinfacht. Es sollte jetzt immer bei einer achtel Pause am Anfang einer Triole greifen 07.06.2006 korrigiert jetzt auch wenn die Triolenklammer nur als Bracket angegeben ist 08.06.2006 Klammern besser positioniert 14.11.2007 Klammern waagerecht auswählbar """ def changeDoc(score): global formatTyp for voice in score.getElementsByTagName('voice'): noteObjects = voice.getElementsByTagName('noteObjects') for child in noteObjects[0].childNodes: if child.nodeType == child.ELEMENT_NODE: if child.tagName == 'rest': if child.getElementsByTagName('bracket'): bracket = child.getElementsByTagName('bracket')[0] y1 = float(bracket.getAttribute('y1')) if y1 >= 10: # nur Ausreisser korrigieren y2 = float(bracket.getAttribute('y2')) if y2 <= -3.5 or y2 >= 3.5: bracket.setAttribute('y1',str(y2)) elif y2 <= 0: bracket.setAttribute('y1','-3.5') bracket.setAttribute('y2','-3.5') else: bracket.setAttribute('y1','3.5') bracket.setAttribute('y2','3.5') if child.tagName == 'rest'or child.tagName == 'chord' and formatTyp == 1: # gerade richten if child.getElementsByTagName('bracket'): bracket = child.getElementsByTagName('bracket')[0] y1 = float(bracket.getAttribute('y1')) y2 = float(bracket.getAttribute('y2')) if y2 <= -3.5 or y2 >= 3.5: bracket.setAttribute('y1',str(y2)) elif y2 <= 0: bracket.setAttribute('y1','-3.5') bracket.setAttribute('y2','-3.5') else: bracket.setAttribute('y1','3.5') bracket.setAttribute('y2','3.5') def tfDialog(): global formatTyp options = ScriptOptions() opt = options.get() placeholder1 = Label(' ',width=1) placeholder2 = Label(' ',width=1) placeholder3 = Label(' ',width=1) placeholder4 = Label(' ',width=1) radFormatTyp = Radio(['nur Fix','waagerechte Triolenklammer'],text='Fixoption auswählen',value=int(opt.get('FormatTyp','0'))) box = VBox([radFormatTyp,placeholder1],padding=1) dlg = Dialog('Triolenfix', box) if dlg.run(): formatTyp = radFormatTyp.value() 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 activeScore(): if tfDialog(): activeScore().registerUndo("TriolenFix") tempInput = tempfile.mktemp('.capx') tempOutput = tempfile.mktemp('.capx') activeScore().write(tempInput) ScoreChange(tempInput, tempOutput) activeScore().read(tempOutput) os.remove(tempInput) os.remove(tempOutput)