[GastForen Programme Print/Bildbearbeitung Adobe InDesign Indesign Plugin oder -Script zum Kalkulieren in Indesign

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

Indesign Plugin oder -Script zum Kalkulieren in Indesign

jagitoni
Beiträge gesamt: 10

14. Jan 2006, 10:34
Beitrag # 1 von 37
Bewertung:
(13242 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo, ich suche ein plugin oder script, mit dem man in indesign rechnen kann... z.b. ich habe 12 zahlen untereinander und ich möchte diese marktieren und zu allen zahlen 13,4% draufrechnen und damit die vorherigen zahlen überschreiben..

kennt jemand ne lösung hierfür..
X

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

14. Jan 2006, 11:50
Beitrag # 2 von 37
Beitrag ID: #204861
Bewertung:
(13226 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo jagitoni,

so etwas ähnliches hatten wir schon mal:
http://www.hilfdirselbst.ch/..._P196784.html#196784

Für Deine Zwecke könnte ein entsprechendes Skript entwickelt werden.
Nur müßte das Skript wissen, wo eine zu berechnende Zahl anfängt und wo sie aufhört.

Für ähnliche Operationen hat es sich bewährt, die zu behandelnden Zahlen mit einer eindeutigen Formatierung auszuzeichnen, z.B. einem Zeichenformat.


... ach, weg mit dem Konjunktiv!

Folgendes Skript ersetzt in einer Auswahl alle Zahlen, die mit dem Zeichenformat "number" ausgezeichnet sind, durch eine neue Zahl, die sich aus der alten Zahl multipliziert mit dem Faktor "myFactor" ergibt.

Der Faktor "myFactor" kann im Skript angepaßt werden.
Hier steht er auf 13.4%.

Unbedingt darauf achten, daß nur Zahlen mit den Zeichenformat ausgezeichnet sind und nicht auch noch die Absatz- oder Zeilenschaltungen! In einer erweiterten Version könnte man diesen Fall auch ausschalten, indem man alle in der Auswahl vorhandenen Absatz- und Zeilenschaltungen durch das Zeichenformat "[Keine]" ersetzt. Im Moment ist dies jedoch nicht berücksichtigt.

Code
// einfacheBerechnung.jsx 
//
var myFactor = 13.4/100; // Faktor, BITTE ANPASSEN
var myDoc = app.documents[0];
var mySel = app.selection[0];
var myStyle = "number";

// die Berechnung erfolgt nur, wenn das notwendige Zeichenformat vorhanden ist
if (myCheckCharStyle(myStyle) && app.selection.length > 0)
{
app.findPreferences = null; app.changePreferences = null;
var myNumbers = mySel.search("", false, false, undefined, {appliedCharacterStyle:myDoc.characterStyles.item(myStyle)}, );

for (oneNum = myNumbers.length-1; oneNum >= 0; oneNum--)
{
// Funktionsaufruf zu Berechnung und
// Zuweisung des neuen Inhats
myNumbers[oneNum].contents = theCalculation(myNumbers[oneNum].contents)
}
// Auswahl aufheben
app.selection[0].insertionPoints[0].select();
}

// Berechnungsfunktion
function theCalculation(theData){
var theOldNumber = theData.split(",").join(".") // Komma wird ggf. durch Punkt ersetzt
var theNewNumber = (parseFloat(theOldNumber) * myFactor) + ""; // Berechnung der neuen Zahl
var theNewString = (theNewNumber + "").split(".").join(","); // Umwandlung in String, Punkt wird Komma
return theNewString;
}

// Prüfroutine zum Vorhandensein des Zeichenformats
function myCheckCharStyle(oneStyle){
try {
// prüfe, ob Zeichenformat myCharStyle vorhanden ist
var myCharStyle = myDoc.characterStyles.item(oneStyle);
myCharStyle.name;
var theCheck = true;
}
catch (e) {
alert("Error!\rCharacterStyle \"" + oneStyle + "\" is not available \rin the active document.");
var theCheck = false;
}
return theCheck;
}



Bei der Anpassung des Faktors ist darauf zu achten, daß ein Dezimalpunkt statt eines Kommas verwendet wird.

Der Faktor könnte auch über einen Dialog mit einem vorgegebennen Wert eingegeben werden.

Die Suche kann auf das ganze Dokument ausgeweitet werden durch Ersetzen von "var myNumbers = mySel.search" durch
Code
var myNumbers = myDoc.search 


Oder auf den ausgewählten Textfluß durch Ersetzen von "var myNumbers = mySel.search" durch
Code
var myNumbers = mySel.parent.search 


Letzterem sollte allerdings noch eine Prüfung zugesellt werden, ob das entsprechende Objekt eine "story" ist (so wie dem Skript oben eigentlich noch eine Überprüfung beigefügt werden sollte, ob es sich bei der Auswahl um Text handelt).

Geht das in Deine Richtung?


als Antwort auf: [#204858]
(Dieser Beitrag wurde von Martin Fischer am 14. Jan 2006, 11:56 geändert)

Indesign Plugin oder -Script zum Kalkulieren in Indesign

jagitoni
Beiträge gesamt: 10

14. Jan 2006, 13:47
Beitrag # 3 von 37
Beitrag ID: #204868
Bewertung:
(13206 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
wau - das sieht ja schon gut aus - wie würde man da nun noch einen dialog einbauen? ich hab noch nie ein script gebaut, deshalb ist mir das neu...

vielen dank


als Antwort auf: [#204861]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

14. Jan 2006, 17:23
Beitrag # 4 von 37
Beitrag ID: #204901
Bewertung:
(13195 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Was soll im Dialog drin stehen?

Faktor?
Verwendetes Zeichenformat zur Auswahl (aus DropDown-Liste)?


als Antwort auf: [#204868]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

jagitoni
Beiträge gesamt: 10

14. Jan 2006, 17:58
Beitrag # 5 von 37
Beitrag ID: #204914
Bewertung:
(13184 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
ja - der faktor wäre wichtig und das zeichenformat - exakt korrekt!


als Antwort auf: [#204901]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

15. Jan 2006, 08:59
Beitrag # 6 von 37
Beitrag ID: #204938
Bewertung:
(13168 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Unten ein ausgearbeitetes konkretes Beispiel.
Es bearbeitet die Auswahl (das erste Element, z.B. Textrahmen, Textauswahl).

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

var myDoc = app.documents[0];
var mySel = app.selection[0];
var theStyles = myDoc.characterStyles.everyItem().name; // Zeichenformate in Array
theStyles.shift(); // Abschneiden von Zeichenformat [Keine]

// es muß etwas ausgewählt sein und das erste Element der Auswahl muß zu Klasse Text gehören.
if ((app.selection.length > 0) && (mySel.isText()))
{
var theData = myDisplayDialog(); // Funktionsaufruf
var myFactor = theData[0];
if (myFactor != undefined)
{
var myStyle = theData[1];
app.findPreferences = null; app.changePreferences = null;
var myNumbers = mySel.search("", false, false, undefined, {appliedCharacterStyle:myDoc.characterStyles.item(myStyle)}, );

for (oneNum = myNumbers.length-1; oneNum >= 0; oneNum--)
{
// Funktionsaufruf zu Berechnung und
// Zuweisung des neuen Inhats
if (isNaN(myNumbers[oneNum].contents.split(",").join(".") )){}
else
{
myNumbers[oneNum].contents = theCalculation(myNumbers[oneNum].contents)
}
}
}
}
else
{
if (app.selection.length == 0) alert("Nichts ausgewählt!")
else alert("Bitte Text auswählen!")
}

// Dialog
function myDisplayDialog()
{
var myFieldWidth = 80;

var myDialog = app.dialogs.add({name:"Berechnung"});
with(myDialog.dialogColumns.add())
{
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Faktor:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myFacTextEditbox = textEditboxes.add({editContents:"0,134", minWidth:140});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Zeichenformat:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myStylesDropDown = dropdowns.add({stringList:theStyles, selectedIndex:0, minWidth:140});
}
}
}
var myResult = myDialog.show();
if(myResult == true)
{
var aFactor = myFacTextEditbox.editContents.split(",").join(".")*1;
var aStyle = theStyles[myStylesDropDown.selectedIndex];
//Remove the dialog box from memory.
myDialog.destroy();
}
else
{
myDialog.destroy();
}
return [aFactor, aStyle];
}


// Berechnungsfunktion
function theCalculation(theData){
var theOldNumber = theData.split(",").join(".") // Komma wird ggf. durch Punkt ersetzt
var theNewNumber = (parseFloat(theOldNumber) * myFactor) + ""; // Berechnung der neuen Zahl
var theNewString = (theNewNumber + "").split(".").join(","); // Umwandlung in String, Punkt wird Komma
return theNewString;
}


Die Methode zur Prüfung des Typs des ausgewählten Objekts habe ich mir von Dave Saunders ausgeliehen. Sie erspart einige lästige Tipparbeit, erlaubt einen übersichtlicheren Code und läßt sich einfach anwenden. ;-)


als Antwort auf: [#204914]
(Dieser Beitrag wurde von Martin Fischer am 15. Jan 2006, 09:04 geändert)

Indesign Plugin oder -Script zum Kalkulieren in Indesign

jagitoni
Beiträge gesamt: 10

15. Jan 2006, 09:56
Beitrag # 7 von 37
Beitrag ID: #204939
Bewertung:
(13156 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
das sieht super aus :-)

letzte frage dazu, was muss ich nun tun, um das mit meinem, mac-indesign cs 2 laufen lassen zu können - also wie bringe ich das script nun "ins indesign" - danke vielmals!


als Antwort auf: [#204938]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

15. Jan 2006, 11:05
Beitrag # 8 von 37
Beitrag ID: #204942
Bewertung:
(13150 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen


als Antwort auf: [#204939]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Ulrich Clasen
Beiträge gesamt: 12

16. Mai 2006, 10:45
Beitrag # 9 von 37
Beitrag ID: #229368
Bewertung:
(12918 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,


Dein Skript ist genau das, was ich brauche -- nur leider bekomme ich es nicht ans Laufen :-(

Beim Aktivieren geht der Indesign Debugger auf und die erste Befehlszeile Object.prototype.isText = function() ist gelb markiert. Wenn ich den Debugger schließe bekomme ich die Dialogbox mit dem Faktor und dem Zeichenformat angezeigt, der Klick auf OK bewirkt aber keine Änderung an meiner Zahl.

Kann es sein, dass das Skript nur mit Indesign 2 funktioniert?

Ich habe auch mal Dein erstes, einfacheres Skript ausprobiert; dort werden zwar die Zahlen geändert, aber nicht mit dem gewünschten Ergebnis: aus 10 wird 1,34; aus 20 wird 2,68 usw.


Für Hilfe wäre ich sehr dankbar!!

Gruß,
Uli


als Antwort auf: [#204942]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

16. Mai 2006, 12:26
Beitrag # 10 von 37
Beitrag ID: #229422
Bewertung:
(12904 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uli,

das Skript "BerechnungMitDialog.jsx" ist für InDesign CS2 entwickelt worden (erkennbar an der Endung ".jsx") und funktioniert nur dort.
Allerdings steckt noch ein Fehler drin:
JavaScript verlangt zur Berechnung von Kommazahlen den Punkt als "Komma".
In der Routine zum Austauch von Komma gegen Punkt hat sich ein Fehler (Leerzeichen) eingeschlichen.

Die Zeile
Code
var aFactor = myFacTextEditbox.editContents.split(", ").join(".")*1; 

muß ersetzt werden durch
Code
var aFactor = myFacTextEditbox.editContents.split(",").join(".")*1; 


Mist, jetzt wo ich mir den korrigierten Code in der Vorschau ansehe, erkenne ich, daß sich hinter dem Komma ein Leerzeichen eingeschlichen hat, das von mir nicht so eingegeben worden war. Wahrscheinlich ersetzt die Forensoftware das Komma gegen Komma mit Leerzeichen.
Also: Hinter dem Komma innerhalb "split(",")" darf kein Leerzeichen folgen!

Das Skript "einfacheBerechnung.jsx" ist ebenfalls für InDesign CS2 entwickelt worden, könnte aber auch unter CS funktionieren.

> dort werden zwar die Zahlen geändert, aber nicht mit dem gewünschten Ergebnis:
Was wäre denn das gewünschte Ergebnis?

> aus 10 wird 1,34; aus 20 wird 2,68 usw.
Das kommt bei mir (unter CS2) raus.


als Antwort auf: [#229368]
(Dieser Beitrag wurde von Martin Fischer am 16. Mai 2006, 12:40 geändert)

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Ulrich Clasen
Beiträge gesamt: 12

16. Mai 2006, 12:43
Beitrag # 11 von 37
Beitrag ID: #229430
Bewertung:
(12889 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich hatte das so verstanden, das das Skript die Zahl um den Faktor (z.B. 13.4%) erhöht (aus 10 wird 11,34) und nicht den Wert der Erhöhung ausrechnet (aus 10 wird 1,34).

Da das Skript bei Dir zu dem gleichen Ergebnis kommt wie bei mir, schätze ich mal, dass ich wohl die Funktion des Skripts falsch interpretiert habe :-)

Kannst Du mir die fehlende Addition (alte Zahl + berechnete neue Zahl) im Skript ergänzen? Meine Kenntnisse in JScript sind leider äußerst gering..


Gruß,
Uli


als Antwort auf: [#229422]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

16. Mai 2006, 13:43
Beitrag # 12 von 37
Beitrag ID: #229469
Bewertung:
(12877 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Uli,

ich war es, der die Aufgabenstellung falsch verstanden hat.
Wahrscheinlich hat sich jagitoni deswegen nach der Skriptinstallation nicht mehr gemeldet.

Richtig müßte die Zeile
var theNewNumber = (parseFloat(theOldNumber) * myFactor) + ""; // Berechnung der neuen Zahl

folgendermaßen lauten:
Code
	var theNewNumber = (parseFloat(theOldNumber) + parseFloat(theOldNumber) * myFactor) + ""; // Berechnung der neuen Zahl 



als Antwort auf: [#229430]

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Ulrich Clasen
Beiträge gesamt: 12

18. Mai 2006, 12:41
Beitrag # 13 von 37
Beitrag ID: #229921
Bewertung:
(12842 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

ich hab's zwischenzeitlich widererwarten selber hinbekommen, das die Zahl richtig berechnet wird. JavaScript ist doch nicht so kompliziert wie gedacht :-)
(Hatte dummerweise gar nicht gemerkt, dass Du noch was dazu geschrieben hattest.)

Als nützliche Ergänzung habe ich auch noch folgenden (geklauten) Codeschnipsel eingebaut (gehört direkt nach die Berechnung):

Code
// Rundung bzw. Ergänzung auf zwei Nachkommastellen 
var k = (Math.round(theNewNumber * 100) / 100).toString();
k += (k.indexOf('.') == -1)? '.00' : '00';
var theNewNumber = k.substring(0, k.indexOf('.') + 3);


Nochmals Danke für Dein Skript!

Gruß,
Uli


als Antwort auf: [#229469]
(Dieser Beitrag wurde von Ulrich Clasen am 18. Mai 2006, 12:42 geändert)

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Martin Fischer
  
Beiträge gesamt: 12783

31. Mär 2008, 16:55
Beitrag # 14 von 37
Beitrag ID: #343879
Bewertung:
(12329 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Aufgrund einer entsprechenden Anfrage hier eine an InDesing CS3 angepaßte Version des Skripts BerechnungMitDialog.jsx:

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

var myDoc = app.documents[0];
var myObj = (app.selection.length > 0)
? app.selection[0]
: app.activeDocument;
var theStyles = myDoc.characterStyles.everyItem().name; // Zeichenformate in Array
theStyles.shift(); // Abschneiden von Zeichenformat [Keine]

var theData = myDisplayDialog(); // Funktionsaufruf
var myFactor = theData.factor;
if (myFactor != undefined)
{
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.appliedCharacterStyle = theData.style;
var myNumbers = myObj.findText();

for (oneNum = myNumbers.length-1; oneNum >= 0; oneNum--)
{
// Funktionsaufruf zu Berechnung und
// Zuweisung des neuen Inhats
if (isNaN(myNumbers[oneNum].contents.split(",").join(".") )){}
else
{
myNumbers[oneNum].contents = theCalculation(myNumbers[oneNum].contents)
}
}
}


// Dialog
function myDisplayDialog()
{
var myFieldWidth = 80;

var myDialog = app.dialogs.add({name:"Berechnung"});
with(myDialog.dialogColumns.add())
{
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Faktor:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myFacTextEditbox = textEditboxes.add({editContents:"0,134", minWidth:140});
}
}
with(dialogRows.add())
{
with(dialogColumns.add())
{
staticTexts.add({staticLabel:"Zeichenformat:", minWidth:myFieldWidth});
}
with(dialogColumns.add())
{
var myStylesDropDown = dropdowns.add({stringList:theStyles, selectedIndex:0, minWidth:140});
}
}
}
var myResult = myDialog.show();
if(myResult == true)
{
var aFactor = myFacTextEditbox.editContents.split(",").join(".")*1;
var aStyle = theStyles[myStylesDropDown.selectedIndex];
//Remove the dialog box from memory.
myDialog.destroy();
}
else
{
myDialog.destroy();
}
return {factor:aFactor, style:aStyle};
}


// Berechnungsfunktion
function theCalculation(theData){
var theOldNumber = theData.split(",").join(".") // Komma wird ggf. durch Punkt ersetzt
var theNewNumber = (parseFloat(theOldNumber) * myFactor) + ""; // Berechnung der neuen Zahl
var theNewString = (theNewNumber + "").split(".").join(","); // Umwandlung in String, Punkt wird Komma
return theNewString;
}



als Antwort auf: [#204938]
(Dieser Beitrag wurde von Martin Fischer am 31. Mär 2008, 21:31 geändert)

Indesign Plugin oder -Script zum Kalkulieren in Indesign

Kai Rübsamen
  
Beiträge gesamt: 4684

31. Mär 2008, 21:05
Beitrag # 15 von 37
Beitrag ID: #343904
Bewertung:
(12254 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hm, was kann man sinnvolles damit tun? Ein erster Test brachte nichts sinnvolles ... ;-)


als Antwort auf: [#343879]
X