[GastForen Programme Print/Bildbearbeitung Adobe InDesign Abfragen, ob Element eine Tabelle ist

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

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

19. Okt 2006, 14:03
Beitrag # 1 von 15
Bewertung:
(4613 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, hätte da nochmal ne Frage. Ich will jeder Tabelle ein SmartStyle-Object zuweisen. Da ich aber nur jedem PageItem ein SmartStyle zuweisen kann, will ich eine Abfrage einbauen, dass er es nur dann anwendet, wenn es eine Tabelle ist.
Hat da irgendwer ne Lösung?
X

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

19. Okt 2006, 14:25
Beitrag # 2 von 15
Beitrag ID: #257488
Bewertung:
(4610 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

frage nach dem constructor.name (theItem.constructor.name == "Table").

Gegenfrage: ist eine Tabelle denn überhaupt ein pageItem?
Ich fürchte nicht. Tabellen können keine children einer page sein (nicht ungebunden auf einer Seite erscheinen), sondern sind Objekte innerhalb eines Textflusses oder einer Tabellenzelle.

Ich würde die stories abklappern (oneStory.tables).
Eventuell auch noch die cells der tables (falls Tabellen in Zellen enthalten sind).

Wessen children können tables denn sonst noch sein?


als Antwort auf: [#257479]
(Dieser Beitrag wurde von Martin Fischer am 19. Okt 2006, 14:26 geändert)

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

19. Okt 2006, 14:33
Beitrag # 3 von 15
Beitrag ID: #257491
Bewertung:
(4604 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Habe mir den zweiten Teil Deiner Frage nochmal genauer angesehen.

Du kannst einen SmartStyle nicht direkt auf eine Tabelle anwenden, sondern nur auf eine Texrahmen (Textfluß?), in dem eine oder mehrere Tabellen enthalten sind.
Schau mal hier rein: Tabellen automatisch mit SmartStyles formatieren.
Hier findest Du ein Beispielskript und ein paar theoretische Überlegungen ...


als Antwort auf: [#257488]

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

19. Okt 2006, 15:01
Beitrag # 4 von 15
Beitrag ID: #257504
Bewertung:
(4591 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mein Problem war, dass ich die Tabelle nicht erst zuerst markieren wollte, sondern, dass alle Tabellen automatisch demObjekt zugwiesen werden. Hab das jetzt so gelöst:

Code
var myDoc = app.activeDocument; 
var myLib = app.libraries.item(0).assets.item(0);
for(i = 0; i < myDoc.pageItems.length; i++) {

if(myDoc.stories.item(i).tables.everyItem().textFrames) {
var myItems = [myDoc.pageItems.item(i)];
myLib.applySmartStyle(myItems);
}
}



als Antwort auf: [#257491]

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

19. Okt 2006, 15:15
Beitrag # 5 von 15
Beitrag ID: #257509
Bewertung:
(4589 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mit allPageItems anstelle von pageItems bekommst Du auch die verschachtelten Textrahmen zu fassen.


als Antwort auf: [#257504]

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

25. Okt 2006, 10:27
Beitrag # 6 von 15
Beitrag ID: #258405
Bewertung:
(4539 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich muss jetzt da nochmal nachhaken, weil das so noch nicht ganz funktioniert.
Zitat var myDoc = app.activeDocument;
var myLib = app.libraries.item(0).assets.item(0);
for(i = 0; i < myDoc.pageItems.length; i++) {
if(myDoc.stories.item(i).tables.everyItem().textFrames) {
var myItems = [myDoc.pageItems.item(i)];
myLib.applySmartStyle(myItems);
}
}

Weil ja die stories was anderes sind als die PageItems (was ist da eigentlich der genaue Unterschied?)
Ich will halt abfragen ob ein bestimmtes Element eine Tabelle ist und dann dementsprechend das SmartStyle darauf zuweisen. Irgendwo hab ich glaub ich mal gelesen, dass man die Tabelle in einen Layer stecken muss und dann das SmartStyle dem Layer zuweisen. Kann das ssein. Wüsste sonst nicht, wie ich die Tabelle sonst eindeutig finden kann.


als Antwort auf: [#257509]

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

25. Okt 2006, 11:07
Beitrag # 7 von 15
Beitrag ID: #258416
Bewertung:
(4529 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

> Weil ja die stories was anderes sind als die PageItems (was ist da eigentlich
> der genaue Unterschied?)

PageItems sind, wie der Name fast schon nahelegt, Dinge, die auf einer Seite liegen.
Also Textrahmen, Bildrahmen, Rechtecke, Ovale, Linien ...
Eine Story liegt nicht auf der Seite, sondern schlängelt sich durch die Textrahmen.
Eine Tabellle liegt ebenfalls nie(!) direkt auf einer Seite, sondern ist stets in einer Story eingebunden (und wird in einem PageItem, nämlich dem Textrahmen, angezeigt).

> Ich will halt abfragen ob ein bestimmtes Element eine Tabelle ist
Die Tabellen findest Du über myStory.tables bzw. myStory.tables.everyItem(), nicht aber über myStory.pageItems(). Mit letzterem findest Du lediglich eingebundene Textrahmen, Graphikrahmen, Rechtecke, Ovale, Linien ...
Den Typ der Tabellen kannst Du in einer Schleife mit dem Zähler k mit myStory.tables[k].constructor.name abfragen. ;-)
Den Typ der pageItems einer Story kannst Du über myStory.pageItems[k].constructor.name abfragen. Du wirst hier jedoch nie eine "Table" zu Gesicht bekommen.


Aber das führt in die Irre.
Ich habe schon mehrfach darauf hingewiesen – und auch den Support von WoodWing zitiert:

Zitat von WoodWing It is only possible to apply styles to page items so if you need to apply a styles to a table you will have to apply the style to the page item containing the table. This means that the item in the Smart Styles library will also have to be applied to the page item insead of the table itself.

http://www.hilfdirselbst.ch/..._P227628.html#227628

> Irgendwo hab ich glaub ich mal gelesen, dass man die Tabelle in einen Layer
> stecken muss und dann das SmartStyle dem Layer zuweisen.

Nochmal: Tabellen sind keine PageItems und wenn Du sie auf neun Ebenen legst. ;-)
SmartStyles arbeitet anders als TableStyles und ist nicht ausschließlich ein Instrument zur Formatierung von Tabellen, sondern von PageItems. Und in diesen PageItems (Textrahmen) können Tabellen enthalten sein und die werden alle in einem Rutsch formatiert. Eine individuelle Formatierung einer Tabelle ist nicht möglich. Es sei denn, sie wäre die einzige Tabelle im PageItem (Textrahmen).

Wie sollte man eine Tabelle in einen Layer stecken können?
Du kannst eine Tabelle ausschneiden und in einem neuen Textrahmen auf einem neuen Layer ablegen. Aber eben innerhalb(!) eines Textrahmens. Dem kannst Du ein SmartStyle zuweisen. Nicht dem Layer. Ein Layer ist genausowenig ein PageItem wie die Tabelle.
Aber Du kannst da leicht die Probe auf's Exempel machen: myLib.applySmartStyle(app.activeDocument.layers[0])

Es steht Dir frei, Dir diese Ausführung nochmals vom Support von WoodWing bestätigen zu lassen oder dort mit den Füßen zu stampfen. SmartStyles zeichnet keine einzelnen Tabellen aus, sondern imme alle Tabellen in einem PageItem.


als Antwort auf: [#258405]

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

25. Okt 2006, 12:11
Beitrag # 8 von 15
Beitrag ID: #258439
Bewertung:
(4521 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ] Es steht Dir frei, Dir diese Ausführung nochmals vom Support von WoodWing bestätigen zu lassen oder dort mit den Füßen zu stampfen. SmartStyles zeichnet keine einzelnen Tabellen aus, sondern imme alle Tabellen in einem PageItem.


Okay, Deine Erklärungen bringen mich schon weiter.
Aber ich will eh gar nicht einzelne Tabellen in einem PageItem zuweisen, sondern jedes PageItem, in dem eine oder mehrere Tabellen drinnen sind. Also müsste ich nur wissen, in welchem PageItem Tabellen drin sind und die dann zuweisen. Du schreibst doch, dass Stories in einem Textrahmen liegen, und Textrahmen in PageItems. Also müsste ich doch auch auslesen können, ob sich in einem bestimmten PageItem eine Tabelle befindet und diesem PageItem möchte ich dann das SmartStyle zuweisen.
Oder bin ich da komplett auf dem Holzweg und es gibt da gar keine Möglichkeit??


als Antwort auf: [#258416]

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

25. Okt 2006, 12:41
Beitrag # 9 von 15
Beitrag ID: #258450
Bewertung:
(4518 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mike,

> Du schreibst doch, dass Stories in einem Textrahmen liegen,
> und Textrahmen in PageItems.

Textrahmen liegen nicht in PageItems, Textrahmen sind PageItems, so wie Äpfel Obst sind.

> Also müsste ich doch auch auslesen können, ob sich in einem bestimmten PageItem
> eine Tabelle befindet und diesem PageItem möchte ich dann das SmartStyle zuweisen.

Ja, das geht über myTable.parent: parent einer Tabelle ist der Textrahmen.
Und dem kannst Du das SmartStyle zuweisen.

SmartStyles können PageItems zugewiesen werden.
Textrahmen sind PageItems.
Also können SmartStyles (den) Textrahmen zugewiesen werden.
Und (den) Textrahmen können SmartStyles zugewiesen werden. ;-)


als Antwort auf: [#258439]

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

25. Okt 2006, 13:59
Beitrag # 10 von 15
Beitrag ID: #258480
Bewertung:
(4505 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ja, das geht schon, das habe ich auch schon gelöst. Aber ich will in einer Schleife alle pageItems durchgehen und alle pageItems, in denen eine Tabelle drin ist dann mit dem SmartStyle verknüpfen. Mein Problem ist, dass der Wert "i" in meiner Abfrage natürlich nicht übereinstimmt:
Code
for(i = 0; i < myDoc.pageItems.length; i++) {  
if(myDoc.[b]stories.item([b]i).tables.everyItem().textFrames) {
var myItems = [myDoc.[b]pageItems.item([b]i)];
myLib.applySmartStyle(myItems);
}
}


Ich hoffe, Du hast verstanden, was ich meine.


als Antwort auf: [#258450]
(Dieser Beitrag wurde von mike123 am 25. Okt 2006, 13:59 geändert)

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

25. Okt 2006, 14:08
Beitrag # 11 von 15
Beitrag ID: #258485
Bewertung:
(4500 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Du brauchst nicht auf das pageItem (Obst) zugreifen, sondern kannst gleich auf die textFrames (Äpfel) gehen, weil Du weißt, daß die Tabellen (Apfelfliegen?) nur in Textrahmen, nicht aber in Rechtecken, graphischen Rahmen, Ovalen und Linien enthalten sein können.

Und die Textrahmen kannst Du daraufhin prüfen, ob in hnen Tabellen enthalten sind.

Dein Code könnte in etwa so aussehen (ungetestet):
Code
for (i = 0; i < myDoc.textFrames.length; i++) {   
if(myDoc.textFrames.item(i).tables.length > 0) {
myLib.applySmartStyle(myDoc.textFrames.item(i));
}
}



als Antwort auf: [#258480]

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

25. Okt 2006, 14:38
Beitrag # 12 von 15
Beitrag ID: #258491
Bewertung:
(4495 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ja es funzt, vielen Dank.
Eigentlich gar ned so schwierig, aber ich seh den Wald vor lauter Bäumen nicht. Man muss halt nur mal die ganzen Elemente von InDesign und dem Scripting checken, dann wird da einiges klarer.
Also vielen dank nochmal, vielleicht kann ich Dir ja auch mal bei irgendwas helfen.


als Antwort auf: [#258485]

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

25. Okt 2006, 15:26
Beitrag # 13 von 15
Beitrag ID: #258502
Bewertung:
(4482 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Prima.

> Man muss halt nur mal die ganzen Elemente von InDesign und dem Scripting checken,
> dann wird da einiges klarer.

Schau Dir mal das Script Dictionary (PDF) von Peter Kahrel an: http://www.kahrel.plus.com/indesignscripts.html

Vom selben Autor gibt es auch eine gute Einführung ins JavaSkripten:
Scripting InDesign with JavaScript


als Antwort auf: [#258491]

Abfragen, ob Element eine Tabelle ist

mike123
Beiträge gesamt: 26

27. Okt 2006, 12:29
Beitrag # 14 von 15
Beitrag ID: #258958
Bewertung:
(4417 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Huhu, ich schon wieder. Ein neues Problem. Ich muss jetzt das ganze nur Abschnittsweise machen. Also nur in dem Abschnitt, in dem ich mich gerade befinde sollen die Tabellen formatiert werden.
Habs so versucht, aber da wird nur die erste Seite verwendet, aber ein page-Objekt scheint es nicht zu geben
Code
var myDoc = app.activeWindow.activePage.appliedSection.startPage;  

var myLib = app.libraries.item("Bibliothek.indl").assets.item("Tabelle-Haupt");

for (i = 0; i < myDoc.textFrames.length; i++) {
if(myDoc.textFrames.item(i).tables.length > 0) {
var myTable = myDoc.textFrames.item(i).tables.everyItem();

myLib.applySmartStyle(myDoc.textFrames.item(i));

}
}


Also ich suche sowas in der Art von: app.activeWindow.activePage.appliedSection.pageItems.item(i)


als Antwort auf: [#258502]

Abfragen, ob Element eine Tabelle ist

Martin Fischer
  
Beiträge gesamt: 12783

27. Okt 2006, 13:49
Beitrag # 15 von 15
Beitrag ID: #258980
Bewertung:
(4407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich würde folgendermaßen vorgehen:

1. Auslesen der Startseiten (pageStart) des aktiven und des folgenden Abschnitts;
2. Bestimmung des Seitenumfangs des aktiven Abschnittes (von bis [= eins weniger als die Startseite des nächsten Abschnitts]);
3. die pageItems über ein Range-Objekt der Seiten definieren: app.activeDocuments.pages.itemByRange(myFirstPage, myLastPage).pageItems.


als Antwort auf: [#258958]
(Dieser Beitrag wurde von Martin Fischer am 27. Okt 2006, 13:54 geändert)
X