Два вопроса по скриптованию таблиц

  • Автор темы Автор темы Меф
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Меф

Участник
Топикстартер
Сообщения
7
Реакции
0
Лет десять не занимался программированием, а тут решил, в связи с переходом с Кварка на InDesign CS облегчить себе работу. Засел за изучение JS и объектов InDesign. Узнал много нового:) На данный момент после мучительных ковыряний и поиска по форумам осталось два вопроса.

1. Задача: часть ячеек таблицы необходимо слить (merge) по вертикали, часть - по горизонтали.

Анамнез: проводя адресацию ячеек через myTable.columns.cells[j] столкнулся с тем, что после слияния меняется не только визуальное, но и логическое количество строк и столбцов. Например, если слить в первой строке все ячейки по вертикали, то для первого столбца при j=3 визуально попадаем на четвертую строку, для остальных колонок - на пятую. И вся дальнейшая адресация летит фтуман, что выглядит нелогично и сильно усложняет алгоритм нахождения нужной ячейки.

Вопрос: есть ли способ для скрипта однозначно ориентироваться в любой таблице не заморачиваясь на то, сколько и каких ячеек слито (т.е. на column и row span)?

2. Задача (только не смейтесь):
a) создать внутри ячейки прямоугольный графический фрейм
b) подогнать его размеры под ячейку (с учетом отступов)
c) поместить в этот фрейм картинку из файла
d) ну и сделать всякие myObject.fit(FitOptions.*) - это я уже умею:)

Анамнез похоже == диагноз. Я, видимо, совсем тупой и не могу ни создать фрейм в ячейке, ни запихать картинку в существующий. Бился целый день - проблемы у меня с объектным программированием, поэтому так и не нашел нужный конструктор. При этом файловый дескриптор создается, проверка наличия файла на диске проходит, а потом при попытке .place() или .add() выдаются разнообразные ошибки.

Вопрос(ы):
а) В какой объект (cell, paragraph,...) и каким методом в табличные ячейки вставляются фреймы и как в полученные фреймы вставляются картинки из файла?

б) Можно ли при этом обойти абсолютные .geometricalBounds - типа "просто поместить фрейм заданной ширины и высоты в заданную ячейку (или в пустой абзац в этой ячейке)"?

Буду благодарен как за прямой ответ здесь, так и в тыкание носом в хорошие тематические примеры JS-скриптов. Перерыв этот форум, форум на Adobe и остальной интернет ничего подходящего не нашел.. но, может, плохо искал?

InDesignCS 3.01, JavaScript
 
Ответ: Два вопроса по скриптованию таблиц

По поводу вставки фрейма в таблицу. Проследил иерархию вручную созданного такого фрейма:

Table -> Cell -> Character -> Rectangle

То есть фрейм вставляется не в абзац, а в символ? Бред какой-то.. Тем не менее бред подтверждается практикой - в пустую ячейку (.paragraphs[0].contents=="") фрейм не вставляется. Если в ячейке текст есть (хоть пробел) - вставляется. Но это явно неспортивный вариант.

Есть впечатление, что наступаю на какие-то стандартные грабли, но третий день не могу понять где они. Помогите, однако.. Не дайте умереть за дебагером.
 
Ответ: Два вопроса по скриптованию таблиц

myCell.insertionPoints[0] попробовать? :)
 
Ответ: Два вопроса по скриптованию таблиц

А я делаю так:
PHP:
	for (i = 2; i < tab1.columns[3].cells.length; i = i + 2) {
		for (z = 0; z < pogoda.length; z++) {
			if (tab1.columns[3].cells[i].contents == pogoda[z]) {
				tab2.rows[2].cells[i/2].contents = "";
				if (File("D:/Konteyner/Символы/погода/" + myPogoda[z]).exists) {
					tab2.rows[2].cells[i/2].insertionPoints[0].place(File("D:/Konteyner/Символы/погода/" + myPogoda[z]));
				}
				else {
					alert ("Отсутствует файл погоды для " + tab1.columns[3].cells[i].contents);
				}
			}
			
		}
	}
 
Ответ: Два вопроса по скриптованию таблиц

Меф сказал(а):
1. Задача: часть ячеек таблицы необходимо слить (merge) по вертикали, часть - по горизонтали.

Анамнез: проводя адресацию ячеек через myTable.columns.cells[j] столкнулся с тем, что после слияния меняется не только визуальное, но и логическое количество строк и столбцов...

Вопрос: есть ли способ для скрипта однозначно ориентироваться в любой таблице не заморачиваясь на то, сколько и каких ячеек слито (т.е. на column и row span)?

В свое время, когда писал скрипт генерации календарной сетки с этим столкнулся. И с "хитрой" нумерацией ячеек и с перерасчетом при слиянии.

Значит для вычисления номера ячейки по координатам (Col, Row) написал функцию:

Function NumItemCells(CCell, RCell As Variant) As Variant
NumItemCells = CCell + ((RCell - 1) * myTable.ColumnCount)
End Function

А чтобы делать пересчет после слияния - просто (тупо) помнил число "исчезнувших" ячеек и минусовал из вычесленного номера ячейки.

З.Ы.
Делал слияния ТОЛЬКО по горизонтали.
 
Ответ: Два вопроса по скриптованию таблиц

vbatushev сказал(а):
myCell.insertionPoints[0] попробовать? :)
Гениально!:) Спасибо.

Теперь прямоугольники вставляются. Но появилась другая беда, и я, изведя кучу времени, снова вынужден просить помощи колег.

При любой попытке увеличения или уменьшения (без разницы) получившегося после .add() прямоугольника - "This value would cause one or more objects to leave the pasteboard". Вручную в дебагере исполняю ту же команду, скопированную из редактора:

myFrame.resize (hPercent, vPercent, AnchorPoint.centerAnchor, false, true, false);

или даже просто
myFrame.resize (hPercent, vPercent);

и все проходит! Получаю внутри ячейки прямоугольник с заданными свойствами, в который нормальным образом вставляется графика. Но в обычном режиме работы скрипта и при его пошаговом выполнении в дебагере - "This value...".

Дополнительный симптом: свойства фрейма absoluteHorizontalScale и absoluteVerticalScale после создания равны 100, но при попытке присвоить им то же самое значение (myFrame.absoluteHorizontalScale = 100) получаю то же самое сообщение.

Код:
// Файл картинки для помещения в ячейку
myPictureFile = File (myFileName);

// Уничтожаем весь текст в текущей ячейке
currentCell = myTable.columns[picColumn].cells[j];
currentCell.contents = '';

// Рожаем прямоугольник
myFrame = currentCell.insertionPoints[0].rectangles.add();

// Вычисляем на сколько процентов его масштабировать
// чтобы результат был на 1 мм уже и 0.3 мм ниже
// размеров текущей ячейки.
// Все внутриячеечные отступы равны нулю.
myFrame.strokeWeight = 0;
y1 = myFrame.geometricBounds[0];
x1 = myFrame.geometricBounds[1];
y2 = myFrame.geometricBounds[2];
x2 = myFrame.geometricBounds[3];
hPercent = 100 * (currentCell.width - 1) / (x2 - x1);
vPercent = 100 * (currentCell.height - 0.3) / (y2 - y1);

// Делаем из новичка человека

with (myFrame) {
          contentType = ContentType.graphicType;
          fillColor = activeDocument.swatches.item(0);
          strokeColor = activeDocument.swatches.item(0);
          strokeWeight = 0;

// Вот она ниже, эта долбаная строчка.
// последние четыре параметра могут быть абсолютно
// любыми - результат один и тот же (т.е. отсутствует)
          resize (hPercent, vPercent, AnchorPoint.centerAnchor, false, true, false);

          place( myPicture );
          fit ( FitOptions.proportionally );
          fit ( FitOptions.centerContent );
}
// ...и так далее

Еще один вопрос, который я так и не решил. Как спозиционировать полученный фрейм внутри ячейки? Фрейм рождается с произвольным отступом от верхней части строки и становиться по центру между верхом и низом ячейки не хочет (вертикальное выравнивание в текущем стиле включено. как и горизонтальное, впрочем). После успешного масштабирования он может встать как надо, а может - со сдвигом вниз. Все параметры отступов абзаца, в котором живет фрейм, - по нулям, все выравнивания, как я уже сказал выше, - по центру. Вообще, абсолютные координаты currentCell можно как-нибудь узнать?
 
Ответ: Два вопроса по скриптованию таблиц

Или я задал совершенно ламерский вопрос или никто не знает ответ или знают, но затаились:) Пожалуйста, опытные коллеги, подскажите что я делаю не так в описанном в предыдущем посте случае?

Откуда могут расти ноги у описанной проблемы с масштабированием объекта внутри ячейки?

Почему ручная команда через инспектор выполняется, а в скрипте - нет?

Как позиционировать фрейм внутри ячейки по вертикали, если этот фрейм рождается с произвольным сдвигом относительно ячейки?

Уже умаялся изучать мануал по скриптованию. Все похоже на то, что заход сделан с неправильной стороны - не знаю волшебного объекта, свойства или метода, как до этого не подозревал про то, что фрейм в пустую ячейку надо вставлять через .insertionPoint...
 
Ответ: Два вопроса по скриптованию таблиц

Фокус с неоднозначностью восприятия InDesign масштабирования фрейма в ячейке действительно существует. Решение - ниже.

Как правильно масштабировать фрейм до размеров myWidth x myHeight:

Код:
myBounds = myFrame.geometricBounds;
myNewBounds = [myBounds[2] - myHeight, myBound[1], myBound[2], myBounds[1] +myWidth];
myFrame.geometricBounds = myNewBounds;
А вот такое, казалось бы совершенно логичное, задание myNewBounds приводит к указанной выше ошибке:

myNewBounds = [myBounds[0], myBounds[1], myBounds[0] + myHeight, myBounds[1] + myWidth];

То есть масштабировать фрейм в ячейке таблицы по вертикали надо строго "снизу вверх". По горизонтали - можно в любую сторону.
 
Статус
Закрыто для дальнейших ответов.