[GastForen Programmierung/Entwicklung AppleScript markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

8. Dez 2014, 01:41
Beitrag # 1 von 14
Bewertung:
(3935 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
ich hoffe der Betreff hat es schon ausrechend genau beschrieben was ich vor habe.
Ich möchte den markierten Text (immer ganze Absätze) in einen neuen Textrahmen kopieren. Dabei soll der Text an der selben Stelle erscheinen. Eine Suche fördert leider nichts zu tage oder ich suche falsch. Oder es hat noch niemand was entsprechendes programmiert...
Sollte also jemand schon mal sowas gemacht haben bitte ich um Anregungen. Bevorzugt in Applescript. Das verstehe ich meistens, Javascript eher weniger.

Gruß
Michael
X

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

8. Dez 2014, 09:28
Beitrag # 2 von 14
Beitrag ID: #534755
Bewertung:
(3867 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

weil Du AppleScript bevorzugst, habe ich Deine Anfrage hierher verschoben.
Welche Version von InDesign benutzest Du? Unter welchem Mac OS X?

Eine erste Lösung:

Code
tell application "Adobe InDesign CS5" 
activate
-- der Textrahmen
set sF to item 1 of text containers of parent of selection
-- die Positionen
set gB to geometric bounds of sF
-- die Grundlinie der ersten Zeile der Auswahl
set y1 to baseline of line 1 of selection
-- der linke Rand des Textrahmens
set x1 to item 2 of gB
-- die Grundlinie der letzten Zeile der Auswahl
set y2 to baseline of line -1 of selection
-- der rechte Rand des Textrahmens
set x2 to item 4 of gB
-- kopieren
copy
-- die Auswahl aufheben
set selection to nothing
-- einsetzen
paste
tell document 1
tell text frame 1
-- der obere Rand des neuen Rahmens
set yN to item 1 of geometric bounds
-- die Grundlinie der ersten Zeile
set yB to baseline of line 1 of text 1
-- dem neuen Rahmen die Positionswerte zuweisen
set geometric bounds to {y1 - (yB - yN), x1, y2 + 1, x2}
end tell
end tell
end tell

Probiere bitte mal dieses Script aus. Dann können wir es erweitern (z.B. prüfen, ob etwas ausgewählt ist; Position auf Doppelseiten; Eigenschaften des neuen Rahmens).

Gruss, Hans


als Antwort auf: [#534753]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

8. Dez 2014, 10:32
Beitrag # 3 von 14
Beitrag ID: #534761
Bewertung:
(3848 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
danke für den Ansatz. Ich nutze derzeit Indesign CS 5.5.

Mit Paste landet der neue Rahmen in der Mitte vom Fenster. Da bei mir der Nullpunkt Seitenbezogen ist (mein Dokument hat Doppelseiten). Ich denke ich das es einfacher ist den Upsprungsrahmen zu duplizieren, den Text darin zu entfernen, den neuen Text darin einzufügen und dann die Koordinaten des Duplikates anzupassen.

Als ersten Test habe ich nun den untersten Teil (tell document) von dir durch das hier ersetzt:
Code
	set nF to duplicate sF 
tell nF
-- der obere Rand des neuen Rahmens
set yN to item 1 of geometric bounds
-- die Grundlinie der ersten Zeile
set yB to baseline of line 1 of text 1
-- dem neuen Rahmen die Positionswerte zuweisen
set geometric bounds to {y1 - (yB - yN), x1, y2 + 1, x2}
end tell


Damit steht der Rahmen da wo er hin soll.
Als Idee zum Texttransfer:
Wenn man sich alle Absätze durchnummeriert vorstellet dann könnte man einfach alle Absätze bis zum ersten markierten und alle nach dem letzten markierten löschen. Ungefähr so:
Code
delete paragraphs 1 thru (startpara - 1) of story 1 of nF 
delete paragraphs (endpara + 1) thru -1 of story 1 of nF


Womit nur noch startPara und endPara bestimmt werden müssen.

In meinem Fall ist gibt es keine Textverkettungen zu anderen Rahmen (gab es zwar schon aber die hab ich schon aufgetrennt. In dem Abwasch hab ich auch die 2 Spalten der ursprünglichen Textrahmen auf eine Spalte reduziert damit das alles nicht zu kompliziert wird :-)

Gruß
Michael


als Antwort auf: [#534755]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

8. Dez 2014, 11:29
Beitrag # 4 von 14
Beitrag ID: #534763
Bewertung:
(3831 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

bitte sehr.

Nun, einfacher wäre, vorübergehend den Ursprung des Lineals von Seite auf Druckbogen umzustellen:

Code
tell application "Adobe InDesign CS5.5" 
tell document 1
tell view preferences
set rulerOrigin to ruler origin
if rulerOrigin is not spread origin then set ruler origin to spread origin
end tell
end tell
end tell

Und am Schluss wieder zurück auf Seite:

Code
    tell view preferences 
if rulerOrigin is not spread origin then set ruler origin to rulerOrigin
end tell

Aber wie Du willst. :-)

Brauchst Du noch Hilfe? Oder funktioniert es wie gewünscht?

Gruss, Hans


als Antwort auf: [#534761]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

8. Dez 2014, 15:09
Beitrag # 5 von 14
Beitrag ID: #534778
Bewertung:
(3786 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
sorry, bin erst jetzt wieder bei diesem Projekt...

Wenn du aus dem Stehgreif noch eine einfache Lösung für den Index des ersten und letzten ausgewählten Absatzes auf Lager hast wäre ich dir dankbar :-)
Sonst gehe ich Absätze und Insertion Points zählen.


als Antwort auf: [#534763]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

8. Dez 2014, 16:07
Beitrag # 6 von 14
Beitrag ID: #534786
Bewertung:
(3764 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo
ich hab es erstmal mit der "Hau drauf Methode" gelöst da mir keine elegante Lösung für die Indices der Absätze eingefallen ist.

Hier eine funktionieren Lösung
Code
tell application "Adobe InDesign CS5.5" 
-- der Textrahmen
set sF to item 1 of text containers of parent of selection
set gB to geometric bounds of sF -- die Positionen

set y1 to baseline of line 1 of selection -- die Grundlinie der ersten Zeile der Auswahl
set x1 to item 2 of gB -- der linke Rand des Textrahmens
set y2 to baseline of line -1 of selection -- die Grundlinie der letzten Zeile der Auswahl
set x2 to item 4 of gB -- der rechte Rand des Textrahmens

copy-- markierten Text in die Zwischenablage kopieren

set nF to duplicate sF
tell nF
set yN to item 1 of geometric bounds -- der obere Rand des neuen Rahmens
set yB to baseline of line 1 of text 1 -- die Grundlinie der ersten Zeile

-- dem neuen Rahmen die Positionswerte zuweisen
set geometric bounds to {y1 - (yB - yN), x1, y2 + 1, x2}
end tell

-- Tet in neuem duplizierten Textrahmen auswählen und per paste ersetzen
set selection to text of parent story of nF
paste
end tell


Eine Lösung ohne den Umweg über die Zwischenablage wäre zwar eleganter aber ich muß den Job erstmal fertig machen. Dann kann ich immer noch nach Eleganz suchen :-)


als Antwort auf: [#534778]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

8. Dez 2014, 22:36
Beitrag # 7 von 14
Beitrag ID: #534808
Bewertung:
(3717 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

für paragraph gibt es zwar die Eigenschaft index. Aber mit index of paragraph 1 of item 1 of selection bekommt man nur die Position des ersten Zeichens des ersten Absatzes der Auswahl. Und zwar ist es die Position in der Textkette.

Darum ist das Feststellen der Absatz-Nummern ziemlich unelegant :-)

Code
tell application "Adobe InDesign CS5.5" 

set insPos to index of paragraph 1 of item 1 of selection
tell parent of item 1 of selection
set totChars to 0
repeat with p from 1 to count of paragraphs
tell paragraph p
set nChars to count of characters
set totChars to (totChars + nChars)
if totChars is greater than insPos then
set startPara to p
exit repeat
end if
end tell
end repeat
end tell

set insPos to index of paragraph -1 of item 1 of selection
tell parent of item 1 of selection
set totChars to 0
repeat with p from 1 to count of paragraphs
tell paragraph p
set nChars to count of characters
set totChars to (totChars + nChars)
if totChars is greater than insPos then
set endPara to p
exit repeat
end if
end tell
end repeat
end tell

end tell

{startPara, endPara}

Die Auswahl muss die Absätze nicht komplett umfassen. Sie kann von Mitte bis Mitte gehen und das Ergebnis ist trotzdem richtig.

Wenn startPara der erste Absatz der Story ist und/oder endPara der letzte, dann wird es eine Fehlermeldung absetzen.

Deshalb setzt man am einfachsten die Zeilen in zwei 'try'-Wickel:

Code
try 
delete paragraphs 1 thru (startPara - 1) of story 1 of nF
end try
try
delete paragraphs (endPara + 1) thru -1 of story 1 of nF
end try

Gruss, Hans


als Antwort auf: [#534786]
(Dieser Beitrag wurde von Hans Haesler am 8. Dez 2014, 22:37 geändert)

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

8. Dez 2014, 22:50
Beitrag # 8 von 14
Beitrag ID: #534810
Bewertung:
(3714 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

vielleicht möchtest Du vermeiden, dass zum Feststellen von endPara die Zeichen erneut gezählt und addiert werden müssen.

Code
tell application "Adobe InDesign CS5" 
set startPara to 0
set startPos to index of paragraph 1 of item 1 of selection
set endPos to index of paragraph -1 of item 1 of selection
tell parent of item 1 of selection
set totChars to 0
repeat with p from 1 to count of paragraphs
tell paragraph p
set nChars to count of characters
set totChars to (totChars + nChars)
if totChars is greater than startPos then
if startPara is 0 then
set startPara to p
end if
end if
if totChars is greater than endPos then
set endPara to p
exit repeat
end if
end tell
end repeat
end tell
end tell

{startPara, endPara}

Gruss, Hans


als Antwort auf: [#534808]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

9. Dez 2014, 13:55
Beitrag # 9 von 14
Beitrag ID: #534829
Bewertung:
(3637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen vielen Dank für deine Lösung und dein Bemühen.

Meine Gedanken um das Start-Ende-Absatz Problem zu lösen gingen eher in die Richtung eine Liste mit dem Index des ersten Zeichens aller Absätze zu erstellen und dann in einer Funktion die Liste durchzugehen. Der Index des 1. Eintrag in dieser Liste bei dem der Index größer ist als bei dem 1. Absatz der Markierung ist der 2 Absatz der Markierung. Die Suche läßt man dann gleich solange weiter laufen bis der Wert des Listeneintrages n größer als der Index des letzen Absatzes ist und schon hat man auch den Index des letzten Absatzes.

Ob das nun eleganter, einfacher zu verstehen und schneller oder langsamer ist mögen die Theoretiker entscheiden. Wenn ich Zeit habe werde ich den dazugehörigen Code hier noch mit reinschreiben. Aber nur wenn er auch so funktioniert wie ich denke... :-)


als Antwort auf: [#534810]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

9. Dez 2014, 14:34
Beitrag # 10 von 14
Beitrag ID: #534837
Bewertung:
(3630 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

bitte sehr.

Wir sind gespannt auf das Umsetzen Deiner Outline. :-)

Gruss, Hans


als Antwort auf: [#534829]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

9. Dez 2014, 21:29
Beitrag # 11 von 14
Beitrag ID: #534860
Bewertung:
(3587 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Bitte sehr. Ist wirklich recht kurz und funktioniert wirklich genau so wie ich es mir ausgedacht habe :-)
Der Übersichtlichkeit hab ich das komplette Script reinkopiert und meine finalen Änderungen dann rot gemacht. Nebenbei hat sich nun auch dieVerwendung der Zwischenablage erübrigt. Der Text wird mit "duplicate paragraphs to after insertion point 1 of nf" direkt in den Zieltextrahmen befördert.


Code
on getStartEndID(startID, endID, idList) 
set sParaID to 1
set eParaID to 1

repeat with i from 1 to count idList
log {startID, endID, i}
if startID ≥ item i of idList then set sParaID to i
if endID ≤ item i of idList then
set eParaID to i
exit repeat
end if
end repeat
return {sParaID, eParaID}
end getStartEndID


tell application "Adobe InDesign CS5.5"
-- der Textrahmen
set sF to item 1 of text containers of parent of selection
set gB to geometric bounds of sF -- die Positionen

-- Absatzindex der Markierung innerhalb des Basisrahmens bestimmen
set paraIDs to index of every paragraph of sF
set startIndex to index of paragraph 1 of selection
set endIndex to index of paragraph -1 of selection

set {startParaID, endParaID} to my getStartEndID(startIndex, endIndex, paraIDs)


set y1 to baseline of selection -- die Grundlinie der ersten Zeile der Auswahl
set x1 to item 2 of gB -- der linke Rand des Textrahmens

set y2 to end baseline of selection -- die Grundlinie der letzten Zeile der Auswahl
set x2 to item 4 of gB -- der rechte Rand des Textrahmens

set nF to duplicate sF
tell nF
set yN to item 1 of geometric bounds -- der obere Rand des neuen Rahmens
set yB to baseline of line 1 of text 1 -- die Grundlinie der ersten Zeile
set geometric bounds to {y1 - (yB - yN), x1, y2 + 1, x2} -- dem neuen Rahmen die Positionswerte zuweisen

set text of parent story to "" -- alten Text löschen
end tell
-- und die Absätze in den neuen Rahmen kopieren
duplicate paragraphs startParaID thru endParaID of parent story of sF to after insertion point 1 of nF
set selection to nF
end tell



als Antwort auf: [#534837]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

9. Dez 2014, 22:50
Beitrag # 12 von 14
Beitrag ID: #534863
Bewertung:
(3563 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

gut, dass Du es selber geschafft hast. Respekt!

Ein paar Anmerkungen:
1. Beim Posten in diesem Forum sind Spezialzeichen zu vermeiden. Anstelle von ...

Code
if startID ≥ item i of idList then set sParaID to i 
if endID ≤ item i of idList then

... sollte die ausführliche Version getippt werden:

Code
if startID is greater than or equal to item i of idList then set sParaID to i 
if endID is less than or equal to item i of idList then

Eigentlich würde es auch so klappen:

Code
if startID is item i of idList then set sParaID to i 
if endID is item i of idList then

2. Anstelle der Grundlinie der ersten und letzen Zeile der Auswahl die Grundlinie der ersten und letzen Zeile der Absätze der Auswahl speichern:

Code
set y1 to baseline of line 1 of paragraph 1 of selection 
set y2 to baseline of line -1 of paragraph -1 of selection

Der Vorteil: Die Zeilen der Absätze müssen nicht komplett ausgewählt sein. Wenn nur ein Absatz: Der blinkende Cursor genügt.

3. Handler setzt man besser an den Schluss des Codes. Dann ist die Lesereihefolge logischer.

Gruss, Hans


als Antwort auf: [#534860]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Minimac
Beiträge gesamt: 55

9. Dez 2014, 23:30
Beitrag # 13 von 14
Beitrag ID: #534865
Bewertung:
(3550 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ja, da hast du überall recht. Aber da wo ich "of line 1" weggelassen habe stimmen die Ergebnisse trotzdem weil zumindest in ID 5.5 die Baseline des Absatze die gleiche wie der Line 1 ist. Zumindest in meinem Test. Da hatte der Absatz aber auch nur eine Zeile...

und "end baseline of selection" ist immer die letzte". Angeblich :-)

Ist halt wie mit den Wegen nach Rom. Es gibt viele.

Wichtig für mich (oder meine Bequemlichkeit) war deine Hilfe mit den Koordinaten. Gerüchteweise Sollte man angeblich auch Ascend und Descend der ersten bzw. letzten Zeile mit einbauen. Beim Descend hat es gepaßt (anstatt deiner +1, beim Ascend der ersten Zeile war der Kasten dann viel zu Hoch. Aber egal, für meinen Zweck hat die Genauigkeit gereicht.

Gruß
Michael


als Antwort auf: [#534863]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

10. Dez 2014, 07:51
Beitrag # 14 von 14
Beitrag ID: #534868
Bewertung:
(3509 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

Zitat und "end baseline of selection" ist immer die letzte". Angeblich :-)

Nicht nur angeblich. Es ist die letzte Zeile der Auswahl. Aber damit die Auswahl nicht alle Zeilen des Absatzes umfassen muss, ist es besser die letzte Zeile des Absatzes zu befragen.

Zum Descent: Ja, diesen Wert könnte man beiziehen. Doch die richtige Distanz zum Text ist nur wichtig, wenn die Kontur des Rahmens eine druckende Stärke hat. Oder wenn der Rahmenhintergrund sichtbar ist.

Sonst reicht es, einen "Sicherheitswert" (gegen das Überfliessen) einzusetzen. Du kannst die +1 auf +1.5 oder +2 erhöhen, falls der Abstand zu klein erscheint.

Gruss, Hans


als Antwort auf: [#534865]
X

Aktuell

InDesign / Illustrator
MTT_300x300_11_2022

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
14.05.2024

Online
Dienstag, 14. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Prozessoptimierung ist ein Teamsport! Keine Software und keine Maschine allein kann Ihnen helfen, die Effizienzpotenziale Ihres Betriebes maximal auszuschöpfen. Von der Auftragsannahme über die Vorstufe und den Druck bis hin zur Weiterverarbeitung – alles muss optimal ineinandergreifen. Apropos Weiterverarbeitung – in vielen Druckbetrieben fristet sie in Sachen Prozessoptimierung immer noch ein Schattendasein. Dabei liegen hier mittlerweile die größten Einsparpotenziale! In einem Webinar von Horizon und Impressed erfahren Sie, wie Sie diese Einsparungen realisieren können. Horizon, bekannt für innovative Lösungen in der Druckweiterverarbeitung, bietet mit iCE LiNK eine Workflowlösung für die Weiterverarbeitung. iCE LiNK überwacht, visualisiert und analysiert Produktionsabläufe und unterstützt bei der Wartung – damit immer alles reibungslos läuft. Den gleichen Anspruch hat der von Impressed entwickelte Impressed Workflow Server – er ist die smarte PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt. Im Webinar zeigen Ihnen die Experten von Horizon und Impressed, wie beide Lösungen im Team die Effizienz und Produktivität Ihres Betriebes steigern können. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Ja

Organisator: Impressed / Horizon

https://www.impressed.de/schulung.php?c=sDetail&sid=327

Einsparpotenziale in der Weiterverarbeitung
Veranstaltungen
16.05.2024

Online
Donnerstag, 16. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Günther Business Solutions und Impressed treten in einem Webinar den Gegenbeweis an. Experten beider Unternehmen zeigen, wie Großformatdrucker vom Einsatz zweier bewährter Lösungen profitieren können: • von advanter print+sign von Günther Business Solutions, dem ERP-System für den Großformatdruck, dass alle Phasen der Wertschöpfung im Large Format Printing abdeckt • von Impressed Workflow Server, der smarten PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt Über die Kombination beider Lösungen können Großformatdrucker ihre Prozesse mit modernen Workflows Schritt für Schritt automatisieren – und so zügig deutliche Zeit- und Kosteneinsparungen realisieren. Das Webinar sollten Sie sich nicht entgehen lassen – damit Sie keine Effizienzpotenziale mehr liegen lassen. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Nein

Organisator: Impressed / Günther Business Solutions

https://www.impressed.de/schulung.php?c=sDetail&sid=326

Und es geht doch: Automatisierung im Großformatdruck!