[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Koordinaten einer Tabellenzelle

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

Koordinaten einer Tabellenzelle

Gerald Singelmann
  
Beiträge gesamt: 6269

23. Jul 2022, 09:47
Beitrag # 1 von 14
Bewertung:
(9201 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo in die Runde,

hat einer der hier Mitlesenden irgendwann mal einen guten Weg ertüftelt, die Koordinaten einer Tabellenzelle zu ermitteln?

Es geht nicht, näherungsweise den Text in Pfade umuzuwandeln, weil eine Zelle leer sein kann.

cell.row und cell.column haben immerhin eine Höhe/Breite und einen Index innerhalb der Tabelle, aber damit verschiebt sich das Problem lediglich dahin, dass ich rausfinden muss, wo die Tabelle liegt.
Dafür müsste ich die Ausrichtung des umgebenden Absatzes, sowie die Position und Spaltigkeit des Textrahmens ermitteln. Und vermutlich noch zwei, drei Sachen mehr, die ich grad übersehe.

Klingt zwar machbar, aber aufwändig, also wüsste ich gern, ob ich was totaaal einfaches übersehe...

danke und Gruß
Gerald
X

Koordinaten einer Tabellenzelle

WernerPerplies
Beiträge gesamt: 2762

23. Jul 2022, 10:05
Beitrag # 2 von 14
Beitrag ID: #584000
Bewertung:
(9183 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
moin,

ohne es ausprobiert zu haben und ein wenig "von hinten durch den Kopf":
Rahmen verankern, Koordinaten auslesen?


als Antwort auf: [#583998]

Koordinaten einer Tabellenzelle

Gerald Singelmann
  
Beiträge gesamt: 6269

23. Jul 2022, 15:39
Beitrag # 3 von 14
Beitrag ID: #584003
Bewertung:
(9136 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Interessanter Ansatz.
Hat aber das selbe Problem wie createOutlines(): Wenn die gesamte Zelle im Überlauf ist, ist auch der verankerte Rahmen im Überlauf.

Mein Denkansatz von oben ist kniffliger als gedacht, da eine Tabelle ja über mehrere Spalten gehen kann und ich nicht ohne weiteres weiß, in welcher Spalte die betreffende Zelle steckt.

Erstaunlich, dass es da keinen Hook in der API gibt, eigentlich.


als Antwort auf: [#584000]

Koordinaten einer Tabellenzelle

WernerPerplies
Beiträge gesamt: 2762

23. Jul 2022, 16:24
Beitrag # 4 von 14
Beitrag ID: #584004
Bewertung:
(9118 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich vergaß, ich würde natürlich den Anker direkt beim Tabellenzeichen (Tabellenanker) setzen und von da die Zellenposition berechnen.

Aber auch da gilt natürlich, der Ausgangspunkt darf sich nicht im Überlauf befinden.

Zitat Erstaunlich, dass es da keinen Hook in der API gibt, eigentlich.


Na ja, da fallen wir schon einige weitere Wünsche ein. :-)


als Antwort auf: [#584003]

Koordinaten einer Tabellenzelle

Gerald Singelmann
  
Beiträge gesamt: 6269

24. Jul 2022, 10:31
Beitrag # 5 von 14
Beitrag ID: #584005
Bewertung:
(9022 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat direkt beim Tabellenzeichen

Auch eine interessante Idee.
Allerdings kann ein Anker nicht in der selben Zeile wie eine Tabelle stehen, soweit ich weiß. Das bringt eine Unschärfe rein, die man kompensieren muss.
Plus: Eine Tabelle kann über x Spalten gehen. Man müsste also zusätzlich die Seite und die X-Koordinate irgendwie ermitteln.


als Antwort auf: [#584004]

Koordinaten einer Tabellenzelle

Gerald Singelmann
  
Beiträge gesamt: 6269

24. Jul 2022, 10:32
Beitrag # 6 von 14
Beitrag ID: #584006
Bewertung:
(9013 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich hätte schwören konnen, dass ich gestern schon die für mich ausreichende Lösung gepostet hätte. Da gibt es noch eine Menge zu fritzeln, aber vielleicht braucht's der eine oder andere als Ausgangspunkt...

Code
  function get_cell_coordinates( cell ) { 

cell.insertionPoints[0].contents = ".\n";
cell.characters.itemByRange(0,1).pointSize = 2;
cell.characters.itemByRange(0,1).leading = 2;

var w = cell.columns[0].width;
var h = cell.rows[0].height;
var dx = cell.leftInset;
var _j = cell.insertionPoints[0].justification
if ( _j.toString().search(/CENTER/) != -1 ) dx = dx + (w - cell.leftInset - cell.rightInset ) / 2;
if ( _j.toString().search(/RIGHT/) != -1 ) dx = dx + (w - cell.leftInset - cell.rightInset );
var dy = cell.topInset;
if ( cell.verticalJustification == VerticalJustification.CENTER_ALIGN ) dy = dy + ( h - cell.topInset - cell.bottomInset ) / 2;
if ( cell.verticalJustification == VerticalJustification.BOTTOM_ALIGN ) dy = dy + ( h - cell.topInset - cell.bottomInset );

var c = cell.characters[0];
var o = c.createOutlines( false )[0];
var gb = o.geometricBounds;
var r = doc.pages[0].rectangles.add({
strokeColor: "Cyan",
strokeWeight: 2,
geometricBounds: [
gb[0] - dy,
gb[1] - dx,
gb[0] + h - dy,
gb[1] + w - dx,
]
})
cell.characters.itemByRange(0,1).remove();
return r.geometricBounds;
}



als Antwort auf: [#583998]

Koordinaten einer Tabellenzelle

Uwe Laubender
Beiträge gesamt: 5318

25. Jul 2022, 10:53
Beitrag # 7 von 14
Beitrag ID: #584008
Bewertung:
(8895 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerald,
ich hätte da noch eine andere Idee gehabt:

[1] Höhe der Zelle festzurren.
[2] Text-Inhalt auslagern.
[3] Zelle in eine Grafikzelle wandeln.
Geometrie des Inhalts der Grafikzelle sollte die Position ausreichend abbilden.
[1]-[3] rückgängig machen.


als Antwort auf: [#584006]

Koordinaten einer Tabellenzelle

Gerald Singelmann
  
Beiträge gesamt: 6269

25. Jul 2022, 11:45
Beitrag # 8 von 14
Beitrag ID: #584009
Bewertung:
(8872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

auch eine gute Idee.
Ich hab allerdings immer Bauchschmerzen mit jedem Ansatz, der "Undo" enthält.
Bin nicht ganz sicher, warum. Ich glaub, ich rechne immer mit Nebeneffekten oder Fällen, in denen das dann nicht funzt.

Danke
Gerald


als Antwort auf: [#584008]

Koordinaten einer Tabellenzelle

Thomas Richard
Beiträge gesamt: 19334

25. Jul 2022, 11:48
Beitrag # 9 von 14
Beitrag ID: #584010
Bewertung:
(8871 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Dann halt duplizieren, Duplikat auswerten und anschliessend entsorgen.


als Antwort auf: [#584009]

Koordinaten einer Tabellenzelle

Uwe Laubender
Beiträge gesamt: 5318

25. Jul 2022, 12:23
Beitrag # 10 von 14
Beitrag ID: #584011
Bewertung:
(8841 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat von Uwe Laubender [3] Zelle in eine Grafikzelle wandeln.
Geometrie des Inhalts der Grafikzelle sollte die Position ausreichend abbilden.


Ja, sollte.

Macht sie aber nicht ausreichend, denn wir müssen ja noch die Stärke der Zellenkonturen mit einberechnen. Was nicht ganz einfach ist, wenn angrenzende Zellen eine unterschiedliche Konturenstärke haben.

Geralds Methode hat auch dieses Problem.


als Antwort auf: [#584008]

Koordinaten einer Tabellenzelle

Uwe Laubender
Beiträge gesamt: 5318

25. Jul 2022, 17:57
Beitrag # 11 von 14
Beitrag ID: #584012
Bewertung:
(8756 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hier mal die vereinfachte Version meiner Idee:

Code
/** 
* @@@BUILDINFO@@@ 220725-GetBoundingBoxOfCell-UL-v0.jsx !Version! Mon Jul 25 2022 17:40:31 GMT+0200
*/

/*
Discussed suggestion at HDS:

Koordinaten einer Tabellenzelle
25. Jul 2022, 12:23
https://www.hilfdirselbst.ch/gforum/gforum.cgi?post=584008#584008

ISSUES:
[1] NOT CALCULATED: Stroke weights of cell strokes.
[2] Table is transformed: rotated, sheared, rotated & sheared.
[3] Adjacent cells with different stroke weights.

*/

/*
ANWENDUNG DER FUNKTION getCellBoundingBox( cell )
Erstellt ein Rechteck mit Füllfarbe "Yellow" über der Tabellenzelle.

VORAUSSETZUNG:
Eine Tabellenzelle ist ausgewählt
*/


var tableCell = app.selection[0];


var result = getCellBoundingBox( tableCell );


result[1].rectangles.add
(
{
strokeWeight : 0 ,
strokeColor : "None" ,
geometricBounds : result[0] ,
fillColor : "Yellow"
}
);

/*
Function returns array of
[ geometric bounds , spread ]
*/


function getCellBoundingBox( cell )
{
var autoGrow = cell.autoGrow;
cell.autoGrow = false ;


if( cell.cellType == CellTypeEnum.GRAPHIC_TYPE_CELL )
{
// Get geometric bounds of table cell:
var gBs = cell.pageItems[0].geometricBounds;
cell.autoGrow = autoGrow ;

// Get spread of table cell:
var tmpGraphicFrame = cell.pageItems[0].duplicate();
var spread = tmpGraphicFrame.parent;
tmpGraphicFrame.remove();

return [ gBs , spread ];
};

if( cell.cellType == CellTypeEnum.TEXT_TYPE_CELL )
{
var tmpFrame = app.documents[0].textFrames.add();
cell.texts[0].move
( LocationOptions.AT_BEGINNING , tmpFrame.parentStory );
cell.convertCellType( CellTypeEnum.GRAPHIC_TYPE_CELL );

// Get geometric bounds of table cell:
var gBs = cell.pageItems[0].geometricBounds;

// Get spread of table cell:
var tmpGraphicFrame = cell.pageItems[0].duplicate();
var spread = tmpGraphicFrame.parent;
tmpGraphicFrame.remove();

cell.convertCellType( CellTypeEnum.TEXT_TYPE_CELL );
tmpFrame.parentStory.texts[0].move
( LocationOptions.AT_BEGINNING , cell.texts[0].insertionPoints[0] );

cell.autoGrow = autoGrow ;
tmpFrame.remove();

return [ gBs , spread ] ;
};
};


Folgende Einschränkungen sind zu beachten:

Die zurückgegebenen Werte der Funktion was die geometric bounds angeht, beziehen die Zellenkonturen nicht mit ein.
Auch werden Transformationswerte wie Drehen oder Scheren eines Textrahmens nicht berechnet, der die Tabelle enthält.

Transformationen des Textrahmens der Tabelle wie Skalieren werden beachtet!


als Antwort auf: [#584011]

Koordinaten einer Tabellenzelle

Uwe Laubender
Beiträge gesamt: 5318

1. Aug 2022, 11:44
Beitrag # 12 von 14
Beitrag ID: #584038
Bewertung:
(8343 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
ich hab' mich noch mal rangesetzt und eine Lösung für Transformationen wie Drehen und Scheren erarbeitet.
Diesmal gibt das Skript keine geometricBounds aus, sondern eine rechteckige Form, die dieselben Transformationen aufweist wie der Textrahmen der Tabelle.

Was nicht einberechnet ist, sind die Zellenkonturen.

Die erzeugte Form entspricht also der Form, die beim Erzeugen einer Grafikzelle entsteht, bereinigt in eine Rechteckfrom.
Weshalb ist eine Bereinigung notwendig?

Bei gedrehten und gescherten Textrahmen gibt es einen Bug mit der Konvertierung von Textzellen zu Grafikzellen.
Da wird nämlich ein seltsames Polygon erzeugt und kein Rechteckrahmen, der den Flächeninhalt der Zelle abbildet.

Hier nun der Code, getestet mit InDesign 2022 auf Windows 10:

Code
/** 
* @@@BUILDINFO@@@ 220801-1-Return-TRANSFORMED-ShapeOfCell-Function()-SELECTION.jsx !Version! Mon Aug 01 2022 11:36:43 GMT+0200
*/

/*
Code by Uwe Laubender

RETURN TRANSFORMED SHAPE OF CELL:

Returns
Polygon of shape of cell, could be transformed if table is transformed

POSSIBLE ISSUES:
A graphic cell contains a form field or a group object.

TESTED OK WITH:
InDesign 2022 on Windows 10
*/

/*
Discussed suggestion at HDS:

Koordinaten einer Tabellenzelle
Gerald Singelmann
23. Jul 2022, 09:47
https://www.hilfdirselbst.ch/gforum/gforum.cgi?post=583998#583998

FORMER ISSUES:
Table transformed: rotated, sheared, rotated & sheared.
Is resolved with this version.

STILL NOT SOLVED:
Stroke weights are not calculated.
Apecial issue with that: Adjacent cells with different stroke weights.

SOLUTION BASED ON THIS IDEA:
Do a duplicate of the object of a graphic cell.
Move it back to the original position.
Convert shape to rectangle.
*/

tableCell = app.selection[0];

var shapeObject = returnTRANSFORMEDShapeOfCell( tableCell );

shapeObject.properties =
{
strokeWeight : 0 ,
strokeColor : "None" ,
fillColor : "Yellow"
};


/*
returnTRANSFORMEDShapeOfCell( cell )

Returns polygon of shape of cell, could be transformed if table is transformed.
Does not return the exact shape, because the cell strokes are not calculated.
*/

function returnTRANSFORMEDShapeOfCell( cell )
{
var autoGrow = cell.autoGrow ;
cell.autoGrow = false ;

if( cell.cellType == CellTypeEnum.GRAPHIC_TYPE_CELL )
{
var originalPosition = cell.pageItems[0].paths[0].pathPoints[0].anchor;

var dup = cell.pageItems[0].duplicate();
var dupPosition = dup.paths[0].pathPoints[0].anchor;

dup.pageItems.everyItem().remove();

dup.move( undefined , [ ( originalPosition[0] - dupPosition[0] ) , ( originalPosition[1] - dupPosition[1] ) ] );
dup.convertShape( ConvertShapeOptions.CONVERT_TO_RECTANGLE );

cell.autoGrow = autoGrow;

return dup ;
};

if( cell.cellType == CellTypeEnum.TEXT_TYPE_CELL )
{
var tmpTextFrame = app.documents[0].textFrames.add();
cell.texts[0].move( LocationOptions.AT_BEGINNING , tmpTextFrame.parentStory );
cell.convertCellType( CellTypeEnum.GRAPHIC_TYPE_CELL );

cell.pageItems[0].convertShape( ConvertShapeOptions.CONVERT_TO_RECTANGLE );

var originalPosition = cell.pageItems[0].paths[0].pathPoints[0].anchor;

var dup = cell.pageItems[0].duplicate();
var dupPosition = dup.paths[0].pathPoints[0].anchor;

dup.move( undefined , [ ( originalPosition[0] - dupPosition[0] ) , ( originalPosition[1] - dupPosition[1] ) ] );

cell.convertCellType( CellTypeEnum.TEXT_TYPE_CELL );
tmpTextFrame.parentStory.texts[0].move( LocationOptions.AT_BEGINNING , cell.insertionPoints[0] );

cell.autoGrow = autoGrow ;
tmpTextFrame.remove();

return dup ;
}
}


Meine Testdatei ist diese hier:
https://www.dropbox.com/...Table-2022.indd?dl=1

Mal sehen, vielleicht meldet sich auch Marc Autret, der auf dieses Problem hier aufmerksam wurde.
Er hat sein Skript TableCellBox.jsx auf Github eingestellt:

https://github.com/...nip/TableCellBox.jsx

Danke, Marc!

Muss das gleich mal testen…


als Antwort auf: [#584012]

Koordinaten einer Tabellenzelle

Uwe Laubender
Beiträge gesamt: 5318

1. Aug 2022, 13:18
Beitrag # 13 von 14
Beitrag ID: #584045
Bewertung:
(8312 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Marc,
ran TableCellBox.jsx on a selection of two cells on page 2 of my test document.
The resulting objects' position was wrong. They landed at the bottom edge of the pasteboard:

https://www.dropbox.com/...ePasteBoard.PNG?dl=0

Also had this issue with duplicate() in my initial code that is not posted here.
Tried duplicate( undefined , [0,0] ) to no avail.

Now my solution is to fetch the anchor array of the first path point of the shape inside the cell and to move the duplicate accordingly back to its original position.

Code
		var originalPosition = cell.pageItems[0].paths[0].pathPoints[0].anchor; 

var dup = cell.pageItems[0].duplicate();
var dupPosition = dup.paths[0].pathPoints[0].anchor;

dup.pageItems.everyItem().remove();

dup.move( undefined , [ ( originalPosition[0] - dupPosition[0] ) , ( originalPosition[1] - dupPosition[1] ) ] );



als Antwort auf: [#584038]

Koordinaten einer Tabellenzelle

Uwe Laubender
Beiträge gesamt: 5318

16. Aug 2022, 20:37
Beitrag # 14 von 14
Beitrag ID: #584184
Bewertung:
(7816 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo miteinander,

Marc Autret hat mittlerweile eine elegante Lösung des Problems auf seiner Website in einem Artikel gepostet. Sein Script TableCellBox.jsx ist nun in der Version 2 daran angepasst:

https://github.com/...nip/TableCellBox.jsx

Ich hatte leider noch nicht die Gelegenheit es ausführlich zu testen, werde das aber möglichst bald nachholen!
Hier geht's zum Artikel:

The Magic Parent Bounding Box
Marc Autret, August 04, 2022
https://www.indiscripts.com/...-parent-bounding-box


als Antwort auf: [#584045]
X