hilfdirselbst.ch
Facebook Twitter gamper-media
Forenindex -- Lesezeichen

15 Lesezeichen für skript

Skript zum Index generieren
Mit folgendem Skript lassen sich Indexeinträge basierend auf einer Konkordanzliste (Liste mit aufzunehmenden Begriffen) erzeugen. Ein Dialog fordert zur Auswahl der Textdatei mit der Begriffsliste auf. Die Begriffe müssen durch Zeilenschaltung voneinander getrennt sein (je Begriff eine neue Zeile).

Code
// IndexFromList.jsx  
//DESCRIPTION: Erzeugt Indexeinträge anhand einer externen Konkordanzdatei, die über einen Dialog ausgewählt wird.

var myDoc = app.activeDocument;
var myList = File.openDialog ("Liste mit Indexbegriffen");
if (!myList) exit();

var myWords = getWords(myList);
proceedWithList(myWords);
alert("Habe fertig!");


// Konkordanzliste einlesen
function getWords (aFile) {
if (aFile.exists) {
aFile.open ('r', undefined, undefined);
var aText = aFile.read()+'\n';
// löschen von Leerzeichen am Ende der Zeile + löschen von leeren Zeilen
aText = aText.replace(/ +\n/g, '\n').replace(/\n+/g, '\n');
// ersetzen von mehrfach aufeinander folgende Leerzeichen aller Art und von RETURNs durch RETURNs
aText = aText.replace(/\s+/g, '\n');

var words = aText.split('\n');
aFile.close();
return words;
}
else {
exit();
}
}

// Begriffsliste abarbeiten
function proceedWithList (w) {
// bei Bedarf wird ein neuer Index erzeugt
if (myDoc.indexes.length == 0)
myDoc.indexes.add();

app.findPreferences = app.changePreferences = null;

for (var i = 0; i < w.length; i++)
if (w[i] != "")
makeEntry(w[i]);

// Aktualisieurng des Index
myDoc.indexes[0].update();
}

// Indexeintrag erzeugen
function makeEntry(oneWord) {
var myResult = myDoc.search(oneWord, true, true, undefined);
for (var oneEntry = myResult.length-1; oneEntry >=0; oneEntry--) {
// Fehler abfangen, z.B. Fußnoten ausnehmen
try {
// Hinzufügen des Themas
myDoc.indexes[0].topics.add(oneWord);
// Hinzufügen der Referenz
myDoc.indexes[0].topics.item(myResult[oneEntry].contents).pageReferences.add(myResult[oneEntry], PageReferenceType.currentPage);
}
catch(e) {}
}
}


Das Skript basiert auf Peter Kahrels IndexFromCharacterStyle_shortVersion.js (Dank für die Vorlage).

Aktuell ist es so eingestellt, daß es Groß-/Kleinschreibung unterscheidet ("fischen" ungleich "Fischen") und daß es nach ganzen Worten sucht ("Fisch" findet "Fisch", aber nicht "Fischer").
Diese Einschränkung könnte bei Bedarf später per Dialog mit Optionen geöffnet werden.

Ferner ignoriert diese Version Fundstellen in Fußnoten.
Um letztere zu berücksichtigen, müßten die Fußnoten z.B. über das Skript notes2text.jsx von Peter Kahrel zunächst in Endnoten umgewandelt und nach der Erzeugung der Indexeinträge mit demselben Skript wieder in Fußnoten zurückkonvertiert werden.

edit (16.11.2007):
Eine aktualisierte Fassung (für InDesign CS2) findet sich in Indexhilfe erwünscht.
...
Martin Fischer
5. Mär 2007, 08:48
Tabellenbreite proportional skalieren
Das Script habe ich grade für eine (eigentlich unsympatische) Anfrage im englischen Forum erstellt.
War eh halb fertig ;)
Ich, nicht das Script.
Das war dreiviertelfertig.
Jetzt ist es ganz fertig.

Also dachte ich, hier hat vielleicht auch einer Freude daran:
Es rechnet die Breite einer Tabelle aus (ohne Konturen am Rand) und zeigt diese in einem Dialog an, so dass ich eine neue Breite eingeben kann. Alle Spalten werden dann proportional verbreitert oder -schmälert, um die neue Breite zu erreichen.

Code
tell application "Adobe InDesign CS3" 
set ms to selection
set aTable to parent of item 1 of ms
if class of aTable ? table then
set aTable to parent of aTable
if class of aTable ? table then
display dialog "no table selected"
return
end if
end if

set nC to count columns in aTable
set tWidth to 0.0
repeat with n from 1 to nC
set aWidth to (width of (column n of aTable))
set tWidth to tWidth + aWidth
end repeat

set myDialog to make dialog with properties {name:"Set Width of Table"}
tell myDialog
make dialog column
tell the result
set tNuWidth to make measurement editbox with properties {edit value:(tWidth * 2.83465), edit units:millimeters}
end tell
end tell
set nu to show myDialog
if nu is true then
set nuWidth to (edit value of tNuWidth) * 0.35278
set scaleClm to nuWidth / tWidth
repeat with n from 1 to nC
set aWidth to (width of (column n of aTable))
set width of column n of aTable to (scaleClm * aWidth)
end repeat
else
destroy myDialog
return
end if
end tell

...
Gerald Singelmann
11. Sep 2007, 19:13
Absatzformate die sich automatisch gemäss Voreinstellungen ändern
Weil's ohnehin aktualisiert werden mußte (http://www.adobeforums.com/webx/.3c05c1b8/5), hier die CS3-Version des Skript zum Wechsel der Sprache in Absatz- und Zeichenformaten:

Code
// changeLanguageOfStyles_CS3.jsx   
//
myDoc=app.documents[0];
var theResult = myDisplayDialog();
var myLanguage= theResult[0];

// Absatzformate
if ( theResult[1] == true )
{
var myStyles=myDoc.paragraphStyles;
for ( var oneStyle=1; oneStyle < myStyles.length; oneStyle++ )
{
myStyles[oneStyle].appliedLanguage=myLanguage;
}
}

// Zeichenformate
if ( theResult[2] == true )
{
var myStyles=myDoc.characterStyles;
for ( var oneStyle=1; oneStyle < myStyles.length; oneStyle++ )
{
myStyles[oneStyle].appliedLanguage=myLanguage;
}
}

function myDisplayDialog()
{
var theLanguages = app.languagesWithVendors.everyItem().name;
var allLang = app.languagesWithVendors;

var myDialog = app.dialogs.add( {name:"Ändere die Sprache aller Absatzformate"} );
with( myDialog.dialogColumns.add() )
{
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"Sprache:", minWidth:120} );
}
with( dialogColumns.add() )
{
var myLanguagesDropdown = dropdowns.add( {stringList:theLanguages, selectedIndex:1} );
}
}
with( dialogRows.add() )
{
with( dialogColumns.add() )
{
staticTexts.add( {staticLabel:"anwenden auf:", minWidth:120} );
}
with( dialogColumns.add() )
{
var myParacheckbox = checkboxControls.add( {staticLabel:"Absatzformate", checkedState:true} );
var myCharcheckbox = checkboxControls.add( {staticLabel:"Zeichenformate", checkedState:false} );
}
}
}
var theResult = myDialog.show();
if ( theResult == true )
{
var theLan = allLang[myLanguagesDropdown.selectedIndex]
var theParaSt = myParacheckbox.checkedState;
var theCharSt = myCharcheckbox.checkedState;
myDialog.destroy();
}
else
{
myDialog.destroy();
exit();
}
return [theLan, theParaSt, theCharSt];
}

...
Martin Fischer
10. Jan 2008, 00:54
Textrahmen, die ein bestimmtes Absatzformat enthalten, auf andere Ebene kopieren per Skript
Damit?

Code
// Adobe InDesign CS3 Script 

Absatzformat = app.activeDocument.paragraphStyles.item( 'Normal' );
Ebene = app.activeDocument.layers.item( 'Ebene 1' );

app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
try { app.findTextPreferences.appliedParagraphStyle = Absatzformat; } catch(e) { alert( 'Fehler\rAbsatzformat ok?' )}

f = app.activeDocument.findText();
for ( i = 0; i < f.length; i++ )
try { f[i].parentTextFrames[0].itemLayer = Ebene; } catch(e) { alert('Fehler\rEbene ok?\rEventuell steckt der Absatz im Überlauf.' )}


Mist, Du brauchtest es für CS2.
Damit?

Code
// Adobe InDesign CS2 Script 

Absatzformat = app.activeDocument.paragraphStyles.item( 'Normal' );
Ebene = app.activeDocument.layers.item( 'Ebene 1' );

app.findPreferences = app.changePreferences = NothingEnum.nothing;
try { app.findPreferences.appliedParagraphStyle = Absatzformat;} catch(e) {alert('Fehler\rAbsatzformat ok?')}

f = app.activeDocument.search();
for (i = 0; i < f.length; i++)
try {f[i].parentTextFrames[0].itemLayer = Ebene;} catch(e) {alert('Fehler\rEbene ok?\rEventuell steckt der Absatz im Überlauf.')}

...
Martin Fischer
23. Jan 2008, 22:52
[JS] Barcode Generator Skript - TESTEN
 
Hallo,

im engl. Skripting-Forum wurde ein Skript zur Erstellung von EAN13/ISBN-Barcodes veröffentlicht.

Hat irgendjemand die Möglichkeit einen mit diesem Skript erzeugten Barcode mit einem Barcode-Leser zu prüfen?

Hier der Link:
http://www.adobeforums.com/...?14@581.kUhHholPQaO@
...
zaphodbeeblebroxx
26. Sep 2007, 14:33
Scripting Hilfe? - Smartes Ankerpunkt wählen
Hallo Scripter,

Ich bin faul, und darum möcht ich den Ankerpunkt per Tastaturkürzel wählen können. Darum habe ich mir 9 Scripts gemacht die jeweils aus einer dieser Zeilen bestehen.
Die Zeile habe ich mir übrigens aus dem Forum gefischt. (Singelmann sei wiedermal dank - muss mir mal sein Buch kaufen) ;)

Code
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR; 
app.layoutWindows[0].transformReferencePoint = AnchorPoint.RIGHT_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_RIGHT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_LEFT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_LEFT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.LEFT_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR;


Die 9 Skripte habe ich mir auf 9 Tasten gelegt und nun kann ich bequem den Ankerpunkt ändern.

Nun gibt es aber ein zwar logisches aber unbequemes Verhalten beim Ankerpunkt wechseln. Unzwar wenn der gerade angewählte Gegenstand ein horizontal oder vertikal gespiegelter Gegenstand ist. Wenn er -100% bei der Skalierung hat, oder 180 gedreht ist, oder beides. Dann wählt das Skript den zwar für das Objekt korrekten Anker, aber im Kopf erwartet man beim Tastendruck "Anker oben links" auch "oben links" und will nicht erst umdenken wie das Objekt gespiegelt ist. Smart ist das Skript, das einem das denken erspart. :)

Als Lösung könnte das Script vielleicht kurz die Auswahl aufheben, den Ankerpunkt wechseln und wieder das zuvor gehabte Objekt zurückanwählen?

Als andere Lösung stelle ich mir ein WENN/DANN Weiche vor. Zum beispiel für OBEN-LINKS:

IF (VERT_SKALIERUNG > 0%) dann wähle TOP_LEFT_ANCHOR;
IF (VERT_SKALIERUNG < 0%) dann wähle TOP_RIGHT_ANCHOR;
IF (VERT_SKALIERUNG < 0%) UND (ROTATION = 180) dann wähle BOTTOM_RIGHT

Schlimm kompliziert wird es für mich als Nichtmathematiker, wenn man das Skript perfekt haben will. Denn es müste für Rotationsbereiche und für Skalierungsbereiche anders reagieren - sich bei 45° und 225° rotation anders verhalten.

Mag mir jemand helfen? Das resultierende Script wäre doch sehr praktisch. Gibt's des schon? Ich hab schon gesucht.
...
Stephan_M
23. Jan 2008, 18:56
automatischer Textfluss
Hier die CS3-Version des obigen Skripts 'AppendPagesIfStoryOverflows.jsx':

Code
//AppendPagesIfStoryOverflows_CS3.jsx  
//
// thanks to Dave Saunders for the functions isText() and DumbRunPages()
// http://jsid.blogspot.com/2005/10/standard-methods-and-functions.html

Object.prototype.isText = function()
{
switch(this.constructor.name)
{
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}

if ((app.documents.length> 0) && (app.selection.length > 0) && (app.selection[0].isText())) {
var aStory = app.selection[0].parentStory;
var aDoc = app.documents[0];

DumbRunPages(aDoc, aStory)
}
else {
alert("Fehler\rBitte Text auswählen.")
}

function DumbRunPages(theDoc, theStory) {
// What makes this "dumb" is that default master pages are used.
var uRuler = theDoc.viewPreferences.rulerOrigin;
theDoc.viewPreferences.rulerOrigin = RulerOrigin.spreadOrigin;
while (theStory.textContainers[theStory.textContainers.length-1].overflows) {
//Seite nach der letzten Textrahmenseite einfügen
var backPage = aDoc.pages.add(LocationOptions.after, aStory.textContainers[theStory.textContainers.length-1].parent)

app.activeWindow.activePage = backPage;
backPage.appliedMaster = theDoc.pages[-2].appliedMaster;
var myPbounds = backPage.bounds;
var myNewTF = backPage.textFrames.add();
if ( (!theDoc.documentPreferences.facingPages) || (backPage.side == PageSideOptions.rightHand) ) {
myNewTF.geometricBounds =
[myPbounds[0] + backPage.marginPreferences.top,
myPbounds[1] + backPage.marginPreferences.left,
myPbounds[2] - backPage.marginPreferences.bottom,
myPbounds[3] - backPage.marginPreferences.right];
} else {
myNewTF.geometricBounds =
[myPbounds[0] + backPage.marginPreferences.top,
myPbounds[1] + backPage.marginPreferences.right,
myPbounds[2] - backPage.marginPreferences.bottom,
myPbounds[3] - backPage.marginPreferences.left];
}
myNewTF.itemLayer = theStory.textContainers[theStory.textContainers.length-1].itemLayer;
myNewTF.previousTextFrame = theStory.textContainers[theStory.textContainers.length-1];
myNewTF.textFramePreferences.textColumnCount = backPage.marginPreferences.columnCount;
myNewTF.textFramePreferences.textColumnGutter = backPage.marginPreferences.columnGutter;
if (myNewTF.characters.length == 0){
theDoc.viewPreferences.rulerOrigin = uRuler;
alert("Permanently overset"); // This indicates a permanent overset condition so break out of loop
}
}
theDoc.viewPreferences.rulerOrigin = uRuler;
}

...
Martin Fischer
22. Jan 2008, 05:38
Tabbellen aus Quark in InDesign automatisch umformatieren
 
Hallo,

von Martin Fischer gibt es ein Skript (für CS2), welches eine neue Tabelle aus einer markierten Tabelle erzeugt, bei der die Spalten-/Zeilenanordnung getauscht wird.

Allerdings gehen die Tabellen-/Zellformatierungen verloren.

Vielleicht als erster Ansatz verwendbar:
Code
// transposeTableCells.jsx 
//DESCRIPTION: Transponiert die Zellen einer Tabelle (Vertauschen von Reihen und Spalten)
var myCounter = 0;
// Objektdefinition Tabelle, je nach Auswahltyp  
if (app.selection.length > 0)
{
   switch (app.selection[0].constructor.name)
   {
      case "InsertionPoint": var myOldTable = app.selection[0].parent.parent; break;
      case "Text": var myOldTable = app.selection[0].parent.parent; break;
      case "Word": var myOldTable = app.selection[0].parent.parent; break;
      case "Character": var myOldTable = app.selection[0].parent.parent; break;
      case "Cell": var myOldTable = app.selection[0].parent; break;
      case "Table": var myOldTable = app.selection[0]; break;
      case "TextFrame": var myOldTable = app.selection[0].tables[0]; break;
   }
}

if ((myOldTable != undefined) && (myOldTable.constructor.name == "Table")) // nichts oder nichts, woraus sich eine Tabelle ableiten ließe, gewählt
{
   myOldTable.cells.everyItem().unmerge(); // es dürfen keine Zellen miteinander verbunden sein
   var  myNewInsPoint = myOldTable.storyOffset; // Einfügepunkt für neue Tabelle (direkt hinter der alten Tabelle)
   // Einfügen der neuen Tabelle mit Parametern für Spalten- und Zeilenzahl
   var myNewTable = myOldTable.parent.parentStory.insertionPoints[myNewInsPoint].tables.add({columnCount:myOldTable.bodyRowCount,  bodyRowCount:myOldTable.columnCount})
   // Schleife zum Verschieben der Zelleninhalte
   for (oneCol = 0; oneCol < myOldTable.columnCount; oneCol++)
   {
      for (oneRow = 0; oneRow < myOldTable.bodyRowCount; oneRow++)
      {
         // Verschieben der Zelleninhalte
         myOldTable.cells[oneRow * myOldTable.columnCount + oneCol].texts[0].move(LocationOptions.after, myNewTable.cells[myCounter].insertionPoints[0])
         myCounter+=1;
      }
   }
   myOldTable.remove(); // Löschen der alten Tabelle
   myNewTable.cells[0].insertionPoints[0].select(); // Plazieren des Cursors in der ersten Zelle der neuen Tabelle
}
else alert("Bitte Tabelle wählen.")

...
zaphodbeeblebroxx
11. Jan 2008, 12:34
Bestimmte Schrift in Pfade umwandeln
Chris,

das sollte damit gehen:
Code
// appliedCStoOutline.jsx 

app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences = NothingEnum.nothing;
app.findTextPreferences.appliedCharacterStyle = "Bold"; // hier Zeichenformat angeben
var myResult = app.activeDocument.findText();
for (i = myResult.length-1; i >= 0; i--)
myResult[i].createOutlines();

...
Martin Fischer
28. Nov 2007, 15:34
versionierung von dateien OHNE version cue?
Das Eventskript saveCopy.jsx für InDesign CS3 erstellt vor dem Sichern der aktuellen Datei automatisch eine Kopie der ursprünglichen Version in einem Unterordner namens "Sicherung", welcher bei Bedarf vom Skript angelegt wird.
...
Martin Fischer
9. Nov 2007, 18:34
Zeichen interaktiv finden
Hi all,

mal wieder etwas aus Onkel Geralds großem Gruselkabinett... Ich gehe gerade einen Text durch, in dem der Autor nach dem Doppelpunkt immer klein weitergeschrieben hat.

Per grep kann ich das nicht beheben, da ich beim Ersetzten in InDesign keinen case-modifier habe (Die Diskussion hatten wir kürzlich. Da fiel mir kein Beispiel ein, dies ist eins).

Ich könnte nach einem Doppelpunkt suchen, aber dann ist ja der Doppelpunkt markiert und nicht das Zeichen, das ich eigentlich ändern will.

Also gibt es dieses Script, das sich leicht an andere Bedürfnisse anpassen lassen sollte:
Code
set findThese to {":"} 
tell application "Adobe InDesign CS3"
set allSel to selection
try
set aSel to item 1 of allSel
on error
return
end try
if class of aSel is character or class of aSel is insertion point then
set aStory to parent story of aSel
set n to index of aSel
set myC to ""
repeat
set n to n + 1
set myC to contents of character n of aStory
try
if myC is in findThese then exit repeat
end try
--select character n of aStory
--my showCharacter
end repeat
if contents of character (n + 1) of aStory is " " then
select character (n + 2) of aStory
else
select character (n + 1) of aStory
end if
my showCharacter()
end if
end tell

on showCharacter()
tell application "Adobe InDesign CS3"
set aSel to a reference to item 1 of selection
set aFrame to item 1 of parent text frames of aSel
if class of parent of aFrame is text then
set aFrame to first item of parent text frames of parent of aFrame
end if
repeat until class of aFrame is page or class of aFrame is document
set aFrame to parent of aFrame
end repeat
if class of aFrame is page then
set active page of layout window 1 to aFrame
set zoom percentage of layout window 1 to 200
end if
end tell
end showCharacter


Und jetzt die Frage: Wenn ich diese Zeile
Code
			try 
if myC is in findThese then exit repeat
end try

nicht in einem try-Block einfasse, bricht das Script bei jeder verankerten Grafik mit "can't turn '?' into string" ab. Klar, der content ist ja auch kein ?, sondern ein Rahmen, aber wie bekomme ich raus (wenn ichs nicht weiß), ob das wirklich ein ? ist oder ein Rahmen? Bug in der Scripting Schnittstelle?

Schönes Wochenende wünscht

Onkel Gerald :)...
Gerald Singelmann
18. Sep 2007, 20:28
Tabellenbreite proportional skalieren
Hallo Gerald,

aus aktuellem Anlaß (weil ich's grad selbst so brauche), habe ich in Deinem Skript eine kleine Modifikation gemacht:

Wenn die Tabelle in einem Textrahmen platziert ist, wird im Dialogfeld die Breite des Textrahmens als Ziel für die Gesamtbreite der Tabelle vorgeschlagen.

Andernfalls (z.B. wenn die Tabelle in einer Tabellenzelle platziert ist) wird weiterhin, wie in Deinem Skript, die aktuelle Tabellenbreite eingeblendet.

Code
bGoOn = true; 
aTable = app.selection[0];
if (aTable.constructor.name != "Table") {
aTable = aTable.parent;
if (aTable.constructor.name != "Table") {
aTable = aTable.parent;
if (aTable.constructor.name != "Table") {
alert("Es muss ein Text in einer Zelle markiert sein");
bGoOn = false;
}
}
}
if (bGoOn) {
nc = aTable.columns.length;
tWidth = 0.0;
for (n=0; n < nc; n++) {
tWidth += aTable.columns[n].width;
}
// die Tabelle befindet sich in einem Textrahmen
if (aTable.parent.constructor.name == "TextFrame") {
tfBounds = aTable.parent.geometricBounds;
// vorgeschlagener Wert für die Gesamtbreite der Tabelle = Breite des Textrahmens
myValue = tfBounds[3] - tfBounds[1];
}
else {
// vorgeschlagener Wert für die Gesamtbreite der Tabelle = aktuelle Tabellenbreite
myValue = tWidth;
}
var myDialog = app.dialogs.add({name:"Tabellenbreite"});
with(myDialog.dialogColumns.add()){
var nuWidthField = measurementEditboxes.add({editValue:(2.83465 * myValue), editUnits:MeasurementUnits.millimeters, smallNudge:0.5});
}

var myResult = myDialog.show();
if(myResult == true){
var nuWidth = nuWidthField.editValue * 0.35278;
myDialog.destroy();
scaleClm = nuWidth / tWidth;
for (n=0; n < nc; n++) {
aTable.columns[n].width = scaleClm * aTable.columns[n].width;
}
}
else{
myDialog.destroy();
}
}

...
Martin Fischer
17. Sep 2007, 09:25
Skalieren von gruppierten Elementen in mm
Ah, wer lesen kann, ist ganz klar mal wieder im Vorteil. Ihr habt von Textrahmen geredet.

Stimmt, die können in Cs2 nicht nach Millimeter Angabe skaliert werden, egal, welche Optionen aktiviert sind oder nicht.
Es sei denn, man hat dieses Script installiert:

Code
tell application "Adobe InDesign CS2" 
set allSel to selection
set {minY, minX, maxY, maxX} to visible bounds of item 1 of allSel
repeat with n from 2 to count allSel
set {t, l, b, r} to visible bounds of item n of allSel
if t < minY then set minY to t
if l < minX then set minX to l
if b > maxY then set maxY to b
if r > maxX then set maxX to r
end repeat
set prevWidth to maxX - minX
set prevHeight to maxY - minY
set myDialog to make dialog with properties {name:"auf mm skalieren"}
tell myDialog
make dialog column
tell the result
make static text with properties {static label:"Neue Breite:"}
make static text with properties {static label:"Neue Höhe:"}
make static text with properties {static label:"Proportional:"}
end tell
make dialog column
tell the result
set nuXSizeField to make measurement editbox with properties {edit value:(prevWidth * 2.83465), edit units:millimeters}
set nuYSizeField to make measurement editbox with properties {edit value:prevHeight * 2.83465, edit units:millimeters}
set nuProp to make checkbox control with properties {checked state:true, static label:" "}
end tell
end tell
set nu to show myDialog
if nu is true then
set nuXSize to (edit value of nuXSizeField) * 0.35278
set nuYSize to (edit value of nuYSizeField) * 0.35278
if checked state of nuProp is true then
if prevWidth = nuXSize then
set xScale to nuYSize / prevHeight
set yscale to nuYSize / prevHeight
else
set xScale to nuXSize / prevWidth
set yscale to nuXSize / prevWidth
end if
else
set xScale to nuXSize / prevWidth
set yscale to nuYSize / prevHeight
end if
set xScale to xScale * 100
set yscale to yscale * 100
set fixPoint to transform reference point of layout window 1
set oben to {top left anchor, top center anchor, top right anchor}
set ymitte to {left center anchor, center anchor, right center anchor}
set unten to {bottom left anchor, bottom center anchor, bottom right anchor}
set myLinks to {top left anchor, left center anchor, bottom left anchor}
set xmitte to {top center anchor, center anchor, bottom center anchor}
set rechts to {top right anchor, right center anchor, bottom right anchor}
if fixPoint is in oben then
set aroundY to minY
else if fixPoint is in ymitte then
set aroundY to (maxY - minY) / 2 + minY
else
set aroundY to maxY
end if
if fixPoint is in myLinks then
set aroundX to minX
else if fixPoint is in xmitte then
set aroundX to (maxX - minX) / 2 + minX
else
set aroundX to maxX
end if
set fixPoint to {aroundX, aroundY}
repeat with aSel in allSel
resize aSel horizontal scale xScale vertical scale yscale around fixPoint
end repeat
-- destroy dialog
else
destroy myDialog
return
end if
end tell


Das funktioniert auch mit mehreren markierten Objekten, kann proportional (nur einen Wert ändern) oder unproportional skalieren und ist eine feine Übung, wie man mit sochen Situationen per Skript umgeht. :)
...
Gerald Singelmann
10. Sep 2007, 10:54
JSFindschange vereinfachen
Quarz,

fillColor ist schon richtig.
Aber Du bist einem Bug auf die Schliche gekommen.

Die Farbe, nach der Du im Dokument suchst, muß - für das Script - auch auf Programmebene vorhanden sein (also da, wo kein Dokument geöffnet ist).

Wenn sie auch dort vorhanden ist, kannst Du sie im Dokument suchen - wahrscheinlich auch mit JSFindChange.

Diesem Bug sind wir vor ca. 2 Wochen im InDesign Scripting-Forum auf die Schliche gekommen (Dave Saunders hat den workaround gefunden).
...
Martin Fischer
9. Aug 2007, 17:37
Eventskrips für CS3
Zitat aber Herr Singelmann hat gesagt

Holy smoke! Bitte meißelt meine Worte nicht in Marmor. Wenn überhaupt meißeln, dann in Vanillepudding, da kriegt man sie wenigstens wieder raus.

Ich habe nur den Scripting Guide zitiert (zu laden unter http://www.adobe.com/...scripting/index.html in der Mitte auf "Scripting resources" klicken), weil ich es plausibel finde, auch diesen Part unser Scripte sprachneutral zu halten.

Dort steht
Zitat in InDesign scripting, menuItems, menus, menuActions,and submenus are all referred to by name. Because of this, scripts need a method of locating these objects that is independent of the installed locale of the application. To do this, you can use an internal database of strings that refer to a specific item, regardless of locale

und
Zitat Note:It is much better to get the locale-independent name of a menuAction than of a menu, menuItem, or submenu, because the title of a menuAction is more likely to be a single string. Many of the other menu objects return multiple strings when you use the getKeyStrings method.


Das Beispielscript im Guide zum finden des neutralen Strings ist
Code
var myString = ""; 
var myMenuAction = app.menuActions.item("Convert to Note");
var myKeyStrings = app.findKeyStrings(myMenuAction.name);
if(myKeyStrings.constructor.name == "Array"){
for(var myCounter = 0; myCounter < myKeyStrings.length; myCounter ++){
myString += myKeyStrings[myCounter] + "\r";
}
}
else{
myString = myKeyStrings;
}
alert(myString);


Um daraus die momentan aktuelle Sprache zu machen
Code
var myString = app.translateKeyString("$ID/NotesMenu.ConvertToNote"); 


So, jetzt ist alles wieder schön relativiert und eingeebnet :)

Danke
...
Gerald Singelmann
28. Jun 2007, 23:09