[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5793

12. Dez 2014, 09:09
Beitrag # 1 von 4
Bewertung:
(1863 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Scripter,

weil der OP Michael eine AppleScript-Lösung bevorzugte, wurde seine Anfrage ins AppleScript-Forum verschoben http://www.hilfdirselbst.ch/..._P534753.html#534753 und dort diskutiert.

Vielleicht benötigt der eine oder andere so etwas unter Windows. Deshalb: Hier die finale Lösung, etwas ergänzt und nach JavaScript portiert.

Es werden die Indizes der Absätze festgestellt. Somit muss man sie nicht komplett auswählen. Wenn nur ein Absatz kopiert werden soll, genügt die blinkende Einfügemarke.

Code
//AuswahlInNeuenRahmen_02.js 

// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// das Dokument im Vordergrund
var curDoc = app.documents[0];

// die Auswahl speichern
var curSel = app.selection[0];
// eine erste Prüfung
if (curSel == undefined) {
alert ("Es ist nichts ausgewählt.", "Stop");
exit();
}
// die Auswahl näher prüfen
if (curSel.hasOwnProperty("baseline")) {
// der Textrahmen, welcher die Auswahl enthält
var sF = curSel.parentTextFrames[0];
}
else {
alert ("Bitte Text auswählen.", "Stop");
exit();
}

// die Masseinheiten speichern; ändern, wenn nicht 2054188905 (= points)
hM = (curDoc.viewPreferences.horizontalMeasurementUnits)*1;
if (hM != 2054188905) {
curDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.POINTS;
}
vM = curDoc.viewPreferences.verticalMeasurementUnits;
if (vM != 2054188905) {
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.POINTS;
}

// Positionen speichern
var gB = sF.geometricBounds;
var y1 = curSel.paragraphs[0].lines[0].baseline;
var x1 = gB[1];
var y2 = curSel.paragraphs.item(-1).lines.item(-1).baseline;
var x2 = gB[3];

// die Indizes aller Absätze auflisten
var paraIDs = sF.parentStory.paragraphs.everyItem().index;
// Absatzindizes der Markierung innerhalb des Quellrahmens bestimmen
var startID = curSel.paragraphs[0].index;
var endID = curSel.paragraphs.item(-1).index;

// die Auswahl aufheben
app.selection = null;

// eine Schleife durch die Indizes; Start- und Endwert feststellen
for (var p=0; p<paraIDs.length; p++) {
if (startID == paraIDs[p]) {
sParaID = p;
}
if (endID == paraIDs[p]) {
eParaID = p;
break;
}
}

// den Quellrahmen an Ort und Stelle duplizieren
var nF = sF.duplicate(undefined, [0,0]);

// Werte speichern
var yN = nF.geometricBounds[0];
var yB = nF.lines[0].baseline;
var dC = nF.lines.item(-1).descent;
var sW = nF.strokeWeight;
if (sW > 0) {
var sA = (nF.strokeAlignment)*1;
if (sA == 1936998723) {
sW = sW/2;
}
else if (sA == 1936998735) {
sW = 0;
}
}
var bI = nF.textFramePreferences.insetSpacing;
if (bI.constructor.name == "Array") {
bI = bI[2];
}

// die Textkette des neuen Rahmens entfernen
nF.parentStory.remove();
// dem neuen Rahmen die Positionswerte zuweisen
nF.geometricBounds = [y1-(yB-yN), x1, y2+dC+bI+sW, x2];
// die gewünschten Absätze in den neuen Rahmen kopieren
sF.parentStory.paragraphs.itemByRange(sParaID, eParaID).duplicate(LocationOptions.AFTER,nF.insertionPoints[0]);

// die Masseinheiten zurücksetzen (falls notwendig)
if (hM != 2054188905) {
curDoc.viewPreferences.horizontalMeasurementUnits = hM;
}
if (vM != 2054188905) {
curDoc.viewPreferences.verticalMeasurementUnits = vM;
}

Es werden nur die geläufigsten "Fallstricke" ausgetrickst (Konturstärke, Kontur-Ausrichtung, Abstand zum Rahmen). Für andere (z.B. Rotation oder Sperrung) müsste der Code ergänzt werden.

Gruss, Hans

(Dieser Beitrag wurde von Hans Haesler am 12. Dez 2014, 09:39 geändert)
X

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Uwe Laubender
Beiträge gesamt: 4852

12. Dez 2014, 11:18
Beitrag # 2 von 4
Beitrag ID: #535022
Bewertung:
(1821 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke, Hans!

Noch sehe ich für mich keine praktische Anwendung, aber kann ja noch kommen.

Nach ein paar Tests:

Weitere "Fälle":

A. Script bricht mit Fehlermeldung ab, hinterlässt das Dokument etwas unordentlich:
1. Angewählter Text ist Teil eines Übersatzes
2. Angewählter Text ist Inhalt einer Tabellenzelle

Könnte man ganz am Anfang abfangen und den ursprünglichen Zustand des Dokuments wiederherstellen (die Meassurements) oder erst gar nicht umstellen.

Test der Auswahl auf Text innerhalb einer Tabellenzelle nach erster Prüfung auf "undefined":

Code
if(curSel.parent.getElements()[0].constructor.name === "Cell"){ 
alert("Text in Tabellenzellen wird leider nicht unterstützt.", "Stop");
exit();
};


Der Test für Übersatz kann komplizierter ausfallen, muss aber nicht, wenn wir einfach darauf bestehen, dass der Textabschnitt keinen Übersatz aufweisen darf:

Nach der Prüfung auf Text einfügen:

Code
if(curSel.parentStory.overflows){ 
alert("Text hat Übersatz.", "Stop");
exit();
};


Noch eine Frage zum Alert: Das zweite Argument "Stop" wird ja unter Mac OSX nicht gezeigt. Ich nehme mal an, dass das unter Windows als Titel der Alertmeldung erscheint. Ah ja. Keine Frage mehr: Hab's gerade in der DOM Dokumentation nachgeschaut:

Argument 2 und 3 des Alerts werden unter OSX ignoriert.
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#535018]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5793

12. Dez 2014, 21:16
Beitrag # 3 von 4
Beitrag ID: #535070
Bewertung:
(1759 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Uwe!

bitte sehr.

Der gepostete Code geht schon weit über die vom OP gestellten Anforderungen hinaus. Deshalb werde ich dieses Script nur auf Anfrage ausbauen.

Bei einer Tabellenzelle könnte man auf den Ansatz umschalten, auf welchem die erste Lösung im AppleScript-Forum beruht:
– die Auswahl kopieren;
– die Auswahl aufheben;
– den Inhalt der Zwischenablage einsetzen;
– dem neuen Textrahmen die Positionswerte zuweisen.

Zu Deiner Frage, den Alert betreffend: Ja, das hast Du richtig erkannt. Das "Stop" erscheint nur unter Windows im Balken des Dialogs. Und ohne dieses zweite Argument wird dort "Script Alert" gezeigt (wenigstens mit meinem alten Windows XP).

Das dritte Argument, hingegen, wird unter Mac OS X nicht ignoriert. Ausprobieren (getestet mit CS5):

Code
alert ("normales Icon :-((", "", false); 
alert ("mit Warndreieck :-))", "", true);

Das 'false' ist nicht notwendig, weil Vorgabewert. Mit 'true' wird ein anderes Icon gezeigt.

Gruss, Hans


als Antwort auf: [#535022]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Uwe Laubender
Beiträge gesamt: 4852

13. Dez 2014, 09:41
Beitrag # 4 von 4
Beitrag ID: #535078
Bewertung:
(1709 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans!

Danke für den Hinweis und den Test mit dem alert().
Tja, traue niemals einer DOM-Doku…

Ja. Das dritte Argument wird nicht ignoriert. Das Icon fällt je nach InDesign-Version unterschiedlich aus. Ab CS5 gelbes Dreieck mit kleinem InDesign-Logo. Vor CS5 nur das InDesign-Logo ohne gelbes Dreieck.

(Unter OSX 10.6.8 getestet: CS3-CS5.5)
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#535070]
X

Aktuell

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
21.01.2021 - 22.01.2021

Digicomp Academy AG, Bern oder Basel
Donnerstag, 21. Jan. 2021, 08.30 Uhr - Freitag, 22. Jan. 2021, 17.00 Uhr

Kurs

Dieser Basic-Kurs ist der perfekte Einstieg in die Welt von InDesign, dem vielseitigen Layout-Programm. Sie lernen, wie InDesign aufgebaut ist, wie saubere Dokumente erstellt werden und wie man korrekt mit gelieferten InDesign-Projekten umgeht.

Dauer: 2 Tage
Preis: CHF 1'400.–

Ja

Organisator: Digicomp Academy AG

Kontaktinformation: Kundenberater-Team, E-Mailkundenberatung AT digicomp DOT ch

digicomp.ch/d/INDEM1

Veranstaltungen
21.01.2021

Illustrator - das unbekannte Wesen

Online
Donnerstag, 21. Jan. 2021, 19.00 Uhr

Vortrag

Millionen Funktionen, und immer kommen neue dazu! Monika Gause ist jeden Januar aufs Neue ein gern gesehener Gast bei der IDUG Stuttgart. - Sie bringt alle Neuerungen mit, die 2020 dazukamen und jede Menge Tipps und Tricks. - Zudem wird sie uns informieren, was wir in Illustrator beachten müssen, wenn wir Daten fürs Web erstellen bzw. aufbereiten. - Wichtig zu wissen: "Dos and Don'ts" in Illustrator. Welche Fehler sollte man dringend vermeiden und was muss man unbedingt tun, damit es Spaß macht mit Illustrator zu arbeiten. - Dieses Jahr hast Du zusätzlich die Möglichkeit Monika im Voraus Fragen zu stellen. Fülle dieses Formular mit deinen Fragen; auch Beispieldateien sind anfügbar: https://forms.gle/fJmF8C6MjbDoEhED8

Nein

Organisator: InDesign Usergroup Stuttgart

Kontaktinformation: Christoph Steffens, E-Mailidug AT satzkiste DOT de

https://idugs67.eventbrite.de/

IDUGS #67 Illustrator mit Monika Gause

Neuste Foreneinträge


Verschiedene Netzwerke Handeln

Netzwerklaufwerke verbinden -> Bei nicht verfügbar Fehlermeldung unterdrücken

Fortlaufende Nummerierung der Druckbogen

Ende der Unterstützung von Flash Player - und jetzt?

Bilder High> Low

weitere peinliche Fragen zu Selbstverständlichkeiten

WLAN-Verbindung mit iPhone 11

In Illustrator einen Kreis zerschneiden bzw. erstmal sinnvoll anlegen

Event 'mausedown': Kriege das Kontext-Menü des Browsers nicht weg...

Skript-Ordner
medienjobs