Connect failed: Connection timed out

[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: 5826

12. Dez 2014, 09:09
Beitrag # 1 von 4
Bewertung:
(2451 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: 5316

12. Dez 2014, 11:18
Beitrag # 2 von 4
Beitrag ID: #535022
Bewertung:
(2409 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.


als Antwort auf: [#535018]

markierten Text in neuen Rahmen kopieren, Stand soll gleich bleiben

Hans Haesler
  
Beiträge gesamt: 5826

12. Dez 2014, 21:16
Beitrag # 3 von 4
Beitrag ID: #535070
Bewertung:
(2347 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: 5316

13. Dez 2014, 09:41
Beitrag # 4 von 4
Beitrag ID: #535078
Bewertung:
(2297 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)


als Antwort auf: [#535070]
X