Скрипт для сканворда

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

Wital

Участник
Топикстартер
Сообщения
15
Реакции
0
Задача такая - есть две таблицы, находящиеся на разных слоях, размещенны по координатам одинаково и один текстовый фрейм. В первой таблице некоторые ячейки пронумерованны. Необходимо в первой таблице найти ячейку с номером, потом в текстовом фрейме найти текст соответствующий номеру и вставить этот текст в ячейку второй таблицы, соответствующей номеру из первой таблицы. (Верстается сканворд).

Я так понимаю алгоритм примерно следующий:
1. Выбираем необходимый слой (Layers?)
2. В нем выбираем текстовый фрейм с таблицей
3. В таблице делаем поиск на наличие цифр, запоминаем эту цифру, а также внутрений номер ячейки
4. Выбираем текстовый фрейм
5. Находим цифру и после, допустим, тире и пробела запоминаем всю строчку до символа "конец строки"
6. Выбираем таблицу в соответствующем слое
7. Ищем в ней соответствующую ячейку (по запомненному внутреннему номеру)
8. Вставляем туда текст
9. Цикл продолжается до тех пор, пока не будет достигнута последняя ячейка в таблице с номерами.

Кто силен в скриптах, подскажите, может еще какой пункт добавить? Какими объектами пользоваться?
 
Ответ: Скрипт для сканворда

Подскажите, как искать текст во фрэйме?

Начало скрипта (тестовый):

var myDocument = app.activeDocument;
var myPages=myDocument.pages.item(0);
var myLayer1=myDocument.layers.item(0);
var myLayer2=myDocument.layers.item(1);
var myTable1=myLayer1.textFrames.item(0).tables.item(0);
var myTable2=myLayer2.textFrames.item(0).tables.item(0);
var myTextFrame=myLayer1.textFrames.item(1);
var myNumber="";
var myCount=0;
var myNumberLine=0;

if (myTable1.cells.item(0).content="1") {
myNumber=myTable1.cells.item(0).contents;
myCount=myTable1.cells.item(0).index;
}

myNumberLine=myTextFrame.search(myNumber);


Последняя строчка вызывает ошибку Object is invalid
 
Ответ: Скрипт для сканворда

Ну че, никто помочь не может?
 
Ответ: Скрипт для сканворда

Торопиться не надо. Не все сидят в онлайне.
 
Ответ: Скрипт для сканворда

Wital сказал(а):
Подскажите, как искать текст во фрэйме?
var myTable1=myLayer1.textFrames.item(0).tables.item(0);
var myTable2=myLayer2.textFrames.item(0).tables.item(0);
var myTextFrame=myLayer1.textFrames.item(1);[/COLOR
Попробуйте задать нужным объектам имена не относительные, а в явном виде через label и обращаться к ним наподобие
var myTable2=myPages.textFrames.item('Table2').tables.item(0);
var myTextFrame=myPages.textFrames.item('Frame1');
Это позволит избежать путаницы, что откуда берет данные. В вашем варианте ошибка именно по этой причине.
А поиск текста, вставляемого по заданной цифре, ИМХО, лучше сразу организовывать по параграфам текста, это должно упростить задачу. Сразу же можно продумать про покраску ячеек в заданные цвета в зависимости от содержания и стрелки расставлять. В общем, делал я подобное года два назад. Если надо, обращайтесь ICQ 262-884-931
 
Ответ: Скрипт для сканворда

nis30, спасибо :)) че-то пока тебя в аське нету.

Дополненный код (тестовый):

Код:
var myDocument = app.activeDocument;
var myPages=myDocument.pages.item(0);
var myLayer1=myDocument.layers.item("Layer 1");
var myLayer2=myDocument.layers.item("Layer 2");
var myTable1=myLayer1.textFrames.item("TableFrame1").tables.item("Table1");
var myTable2=myLayer2.textFrames.item("TableFrame2").tables.item("Table2");
var myTextFrame=myLayer1.textFrames.item("Frame1");
var myNumber="";
var myCount=0;
var myLine="";

for (i=0; i < myTable2.cells.length; i++) {
	for (j=1; j < myTable2.cells.length; j++) {
		if (myTable2.cells.item(i).contents=toString(j)) {
			myNumber=myTable2.cells.item(i).contents;
			myCount=myTable2.cells.item(i).index;
		}
	}
	myLine=myTextFrame.lines.item(myNumber).contents;
	myTable1.cells.item(myCount).contents=myLine;
}

Подскажите, как преобразовать строку в число?
 
Ответ: Скрипт для сканворда

Wital сказал(а):
Подскажите, как преобразовать строку в число?
PHP:
N = Number("Строка");
 
Ответ: Скрипт для сканворда

Смотря в какое число. Например, существует хорошая функция: parseInt(string[, radix]). Есть также parseFloat(string)...

AirGraph.
 
Ответ: Скрипт для сканворда

AirGraph, sakhar, спасибо :)

Код на текущий момент:

Код:
var myDocument = app.activeDocument;
var myPages=myDocument.pages.item(0);
var myLayer1=myDocument.layers.item("Layer 1");
var myLayer2=myDocument.layers.item("Layer 2");
var myTable1=myLayer1.textFrames.item("TableFrame1").tables.item("Table1");
var myTable2=myLayer2.textFrames.item("TableFrame2").tables.item("Table2");
var myTextFrame=myLayer1.textFrames.item("Frame1");
var myNumber="";
var myLine="";
var k="";

for (i=0; i < myTable2.cells.length; i++) {
		myNumber=myTable2.cells.item(i).contents;
			for (j=1; j < myTable2.cells.length+1; j++) {
				k=""+j;
				if (myNumber==k) {
					myLine=myTextFrame.lines.item(j-1).contents;
					myTable1.cells.item(i).contents=myLine;
				}
			}
}

На данный момент скрипт делает следующее:

1. Ищет в таблице "Номеров" номер.
2. По найденному номеру ищет строчку во Фрэйме (загадки для сканворда формата: n - "загадка")
3. Вставляет эту строчку в таблицу "Заполнения загадками"

Помогите разобраться, как в найденной строчке удалить, например, первые три символа? Нужно из строчки формата: n - "загадка"; удалить символы "n - ", а оставшуюся строчку уже вставлять.
 
Ответ: Скрипт для сканворда

Wital сказал(а):
Помогите разобраться, как в найденной строчке удалить, например, первые три символа? Нужно из строчки формата: n - "загадка"; удалить символы "n - ", а оставшуюся строчку уже вставлять.
Способов много, вот например:
PHP:
myString = myString.slice(2);
 
Ответ: Скрипт для сканворда

sakhar, спасибо, но это маленько не то. У меня строчка следующего вида:

Код:
	1	Ядро - Старинный орудийный снаряд
	2	Прут – Тонкая ветка без листьев
	3	Ишак – Осел, лошак или мул
	4	Тавр – Горы на юге Турции
	5	Потомки – Люди будущих поколений
	6	Видик – Видеомагнитофон (прост.)
	7	Поиск – Действие, имеющее целью найти

т.е. [tab][номер ячейки][tab][разгадка][пробел][тире][пробел][загадка]

вот как убрать все до [загадка], ведь длина символов там везде разная?
 
Ответ: Скрипт для сканворда

Все, я закончил скрипт!!! Всем спасибо, кто откликнулся

Код:
myDocument = app.activeDocument;
var myPages=myDocument.pages.item(0);
var myLayer1=myDocument.layers.item("Заполнение");
var myLayer2=myDocument.layers.item("Номера");
var myTable1=myLayer1.textFrames.item("TableFrame1").tables.item("Table1");
var myTable2=myLayer2.textFrames.item("TableFrame2").tables.item("Table2");
var myTextFrame=myLayer1.textFrames.item("Frame1");
var myNumber="";
var myLine="";
var k="";

for (i=0; i < myTable2.cells.length; i++) {
		myNumber=myTable2.cells.item(i).contents;
			for (j=1; j < myTable2.cells.length+1; j++) {
				k=""+j;
				if (myNumber==k) {
					myLine=myTextFrame.lines.item(j-1).contents;
					for (l=0; l < myLine.length; l++) {
						if (myLine[l]=="–") {
							myLine=myLine.slice(l+2, -1);
							myTable1.cells.item(i).contents=myLine;
						}
					}
				}
			}
}

Подскажите, как теперь можно оптимизировать скрипт, что бы он быстрее работал. Я слышал, если на С++ написать, то он в разы будет быстрее работать. Кто что может сказать по этому поводу?
 
Ответ: Скрипт для сканворда

vbatushev, дак а выше я че выложил? :) Вот он весь скрипт и есть. 155 ячеек заполняет минут за 10. А на VisualBasic'e скрипт быстрее будет работать? Стоит ли переделывать?
 
Ответ: Скрипт для сканворда

Код оптимизировал, за что огромное спасибо nis30, который направил на путь истинный :)
Код скрипта:

Код:
var myDocument = app.activeDocument;
var myLayer1=myDocument.layers.item("Заполнение");
var myLayer2=myDocument.layers.item("Номера");
var myTable1=myLayer1.textFrames.item("TableFrame1").tables.item("Table1");
var myTable2=myLayer2.textFrames.item("TableFrame2").tables.item("Table2");
var myTextFrame=myLayer1.textFrames.item("Frame1");
var myNumber="";
var myLine="";


for (i=0; i < myTable2.cells.length; i++) {
		myNumber=myTable2.cells.item(i).contents;
		if (myNumber!="") {
			myLine=myTextFrame.lines.item(Number(myNumber)-1).contents;
			for (l=0; l < myLine.length; l++) {
						if ((myLine[l]=="–") || (myLine[l]=="-")) {
							myLine=myLine.slice(l+2, -1);
							myTable1.cells.item(i).contents=myLine;
						}
					}
		}
			
}

86 ячеек в таблице заполняются секунд за 10!!! Задача на данный момент полностью выполнена.
 
Ответ: Скрипт для сканворда

Wital сказал(а):
Код оптимизировал, за что огромное спасибо nis30, который направил на путь истинный :)

86 ячеек в таблице заполняются секунд за 10!!! Задача на данный момент полностью выполнена.

Неудержался. Если все что было написано выше истенно, тоесть незаморачиватся на отловах опечаток, то данный код будет работать быстрее

Код:
with (app) {
	
	var myDoc = activeDocument;
	var myFrame = myDoc.textFrames.item ("tabl");
	var myTabl = myFrame.tables.item (0);
	var voprosFrame = myDoc.selection[0];
	var baz = new Array ();
	var str = "";
	
	i = voprosFrame.paragraphs.count();	
	for (k=0; k<i; k++)
	  {
		 s = voprosFrame.paragraphs.item (k).contents; 
		 ind = s.indexOf(" ", 0); 
		 str = s.slice (ind+3, s.length);
		 baz.push (str);
	  };
  
    i = myTabl.cells.count();	
	for (k=0; k<i; k++)
	  {
		 s = myTabl.cells.item (k).contents;
         if (s != "") { myTabl.cells.item (k).contents=baz[parseInt(s,10)-1]; }
	  };

	alert ("Ok");

exit ()

Фрейм с таблицей должен иметь label "table"
Выделяешь фрейм с текстом и запускаешь.
Непонимаю зачем всетаки две таблицы?
Писано под CS3.

Совершенству нет приделов ;))
 
Ответ: Скрипт для сканворда

toa1 сказал(а):
Непонимаю зачем всетаки две таблицы?

У меня газета состоит из 8 полос, 6 видов сеток (всегда постоянно). Полоса состоит из трех слоев:
1. Это сетка с закрашенными ячейками и со стрелками
2. Это сетка с номерами соответствующими закрашенным ячейкам
3. Это сетка с заполнением

Мне дают заполнения в вердовском файле, в формате:
[tab][номер ячейки][tab][разгадка][пробел][тире][пробел][загадка]

Ну вот :)
Твой код постараюсь в ближайшее время опробовать :)
 
Ответ: Скрипт для сканворда

toa1, код пока не опробовал, но по первому взгляду возник вопрос:

т.е. получается у меня одна и та же сетка, где храняться и номера и где будут находиться загадки? Не очень удобно, если это так :)

Скоро, обещаю, опробую :) щас пока материала нет на новую газету.
 
Ответ: Скрипт для сканворда

Wital сказал(а):
toa1, код пока не опробовал, но по первому взгляду возник вопрос:

т.е. получается у меня одна и та же сетка, где храняться и номера и где будут находиться загадки? Не очень удобно, если это так :)
Ничто не мешает добавить еще одну таблицу. Анализировать одну, текст вставлять во вторую. Это две строки кода :)
 
Статус
Закрыто для дальнейших ответов.