Требуется помощью новичку! (автосоздания определенных рамок)

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

gauss_gauss

Участник
Топикстартер
Сообщения
39
Реакции
0
Всем привет! Решил упростить себе жизнь, пишу скрипт для создания трех типов рамок под объявления. С первыми двумя простыми рамками я разобрался быстро, а вот с третьим типом я застопорился.

Рамка должна быть следующей: серая заливка со скругленными углами и сзади текста (!). Как я собрался это сделать?
1. Конвертировать текст в таблицу
2. В ней создать прямоугольник и растянуть по ширине длине таблицы
3. Заякорить прямоугольник
4. Скруглить углы

Проблема в том, что заякоренный объект (anchored object) не хочет оказываться позади текста :( Вопрос номер один: есть ли способ запихнить anchored object позади рамки?

Я решил извернуться и вставить текст, который был конвертирован в таблицу, в серую рамку. Но не понял как обратиться к ней. Вопрос номер два: как обратиться к рамке этой, чтобы вставить текст?

Так же не могу толком понять почему ругается функция app.cut(). С самого начала я задаю переменную var mySelection = myDoc.selection[0]; это выделение преобразую в таблицу и потом это выделение вырезаю для последующей вставке, но функция говорит: "Cannot cut due to invalid selection state". Может выделение слетело? Вопрос номер три: Как обратиться заново к преобразованному тексту в таблице?

Еще один момент связан со скруглениями рамки. Я работаю в цс5, и данная конструкция в нем не работает.
myBorder.cornerOption = CornerOptions.ROUNDED_CORNER;
Если запустить от версии cs4 (создал version 6.0 scripts), то все пучком работает. В чем причина неработоспособности? Вроде (F1) говорит, что ничего не поменялось в цс5 с этим.

вообщем вот мой код для полноты картины

Код:
//Переменные документа
var myDoc = app.activeDocument;
var mySelection = myDoc.selection[0];
//Создаем таблицу и задаем параметры таблицы и ячейки
myTable = mySelection.convertToTable()
with (myTable) {
    spaceBefore = "2.5 mm";
    spaceAfter = "2.5 mm";
    }
with(myTable.cells[0]) {
    leftEdgeStrokeWeight = "0 pt"
    rightEdgeStrokeWeight = "0 pt"
    topEdgeStrokeWeight = "0 pt"
    bottomEdgeStrokeWeight = "0 pt"
    topInset = "1 mm";
    bottomInset = "1 mm";
    leftInset = "1 mm";
    rightInset = "0 mm";
    }
//Создаем серую рамку
myBorder = mySelection.insertionPoints[0].rectangles.add();
mySwatch = app.activeDocument.swatches.item("Grey");
myBorder.fillColor = mySwatch;
myBorder.sendToBack()
//Якорим
with(myBorder.anchoredObjectSettings)
        {
                anchoredPosition = AnchorPosition.anchored;
                anchorPoint = AnchorPoint.TOP_LEFT_ANCHOR
                horizontalReferencePoint = AnchoredRelativeTo.anchorLocation;
                horizontalAlignment = HorizontalAlignment.leftAlign;
                anchorXoffset = mySelection.firstLineIndent;
                verticalReferencePoint = VerticallyRelativeTo.lineBaseline;
                anchorYoffset = myTable.spaceBefore; 
                anchorSpaceAbove = 0;
         }
//Скругляем
myBorder.cornerOption = CornerOptions.ROUNDED_CORNER;
myBorder.cornerRadius = "2 mm";
//Растягиваем на всю ширину
var myH = myTable.height;
var myW = myTable.width;
var myStretch = myBorder.geometricBounds;
myStretch[2] = myStretch[0] + myH;
myStretch[3] = myStretch[1] + myW;
myBorder.geometricBounds = myStretch
//Копируем текст и вставляем в рамку
    mySelection.select();
    app.cut();
    myBorder.select();
    app.paste();
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

как обратиться к рамке этой, чтобы вставить текст?
Чтобы вставить текст в рамку, рамка должна быть текстовым фреймом.:)
Т.е. строка
Код:
myBorder = mySelection.insertionPoints[0].rectangles.add();
будет выглядеть так:
Код:
myBorder = mySelection.insertionPoints[0].textFrames.add();
После этого надо установить курсор в этот фрейм и только тогда вставлять текст:
Код:
myBorder.texts[0].insertionPoints[0].select();
app.paste();

С самого начала я задаю переменную var mySelection = myDoc.selection[0]; это выделение преобразую в таблицу и потом это выделение вырезаю
Сконвертируйте выделенный текст в таблицу вручную — у Вас сохранится выделение? Сделайте по верхнему образцу select() либо таблице, либо тексту в таблице: myTable.cells[0].texts[0].select();
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

Попытавшись провернуть Ваш алгоритм, я наконец понял Вашу задумку. И вот, что у меня получилось.

Во-первых, все те куски с параметрами таблицы и рамки рекомендую выкинуть на фиг в стили (таблицы и объекта соответственно).

Во-вторых:
как обратиться к рамке этой, чтобы вставить текст?
Вставлять в рамку планировалось не текст, а таблицу, так ведь? Для этого вырежем ее в отдельный фрейм, и уже его вставим в рамку методом Paste Into (в стиле рамки, конечно же, у Вас будет настроен fitting как надо, правда?).

И тогда скрипт примет, на мой взгляд, такой вид:
Код:
//Переменные документа
var myDoc = app.activeDocument;
var mySelection = myDoc.selection[0];
//Создаем таблицу и задаем параметры таблицы и ячейки
var myTable = mySelection.convertToTable();
myTable.appliedTableStyle = "ramka_gray";

//Создаем серую рамку
var myBorder = app.activeWindow.activePage.rectangles.add({appliedObjectStyle:myDoc.objectStyles.item("ramka_gray")});

//Растягиваем на всю ширину
var myH = myTable.height;
var myW = myTable.width;
var myStretch = myBorder.geometricBounds;
myStretch[2] = myStretch[0] + myH;
myStretch[3] = myStretch[1] + myW;
myBorder.geometricBounds = myStretch

//Копируем текст и вставляем в рамку

//Для этого надо выделить таблицу...
    myTable.select();

    //...скопировать в буфер...
    app.copy();

    //...приготовить текстовый фрейм (размеры пока возьмем от фонаря, так, для секундной красоты)))...

    var myTF = app.activeWindow.activePage.textFrames.add({geometricBounds:myStretch});

    //...установить курсор в этот фрейм...
    myTF.texts[0].insertionPoints[0].select();

    //... вставить таблицу...
    app.paste();

    //... ну и окончательно подогнать размер фрейма.
    myTF.fit(FitOptions.FRAME_TO_CONTENT);
    
    //Теперь выделяем этот фрейм, вырезаем и вставляем в нашу рамку методом Paste Into...
    myTF.select();
    app.cut();
    myBorder.select();
    app.pasteInto();
    
    //... Которую в свою очередь вырезаем и вставляем в абзац, в котором наша таблица, вместо символов в диапазоне "первый - предпоследний",
    //т.к. последний символ абзаца - это символ конца абзаца
    app.cut();
    myTable.storyOffset.paragraphs[0].characters.itemByRange(0,-2).select();
    app.paste();
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

Любезнейше благодарю! Скрипт работает как надо! :y)
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

Eugenyus,
Не забывай свои творения в файлообменник заливать. Заранее спасибо.
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)


Не по теме:
GeorgeS, данное творение мне не принадлежит, я всего лишь оказал помощь. Да и случай мне (имхо) не видится универсальным для всех в таком виде. Но напоминание учту непеременно.:)
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

Продолжаю тему автоматического создания рамок. Благодаря Eugenyus'у все три вида рамок ставятся по нажатию горячих клавиш.
Иду дальше - задача становится интереснее.
Цель: полное автоматическое расставление рамок у объявлений.
Логика примерно следующая
1. Объявления поступают в xls файле. Каждое объявление в отдельной ячейке. Объявление, которое требует определенного типа рамок, помечаем какой-нибудь меткой (например, если черная рамка, то метка <black> в начале строки)
2. Выделяем столбец со всеми объявлениями и копируем в ворд, где таблица конвертируется в текст (разделитель абзац), сохраняем ворд файл и размещаем в индизайне
3. Ищем в текстовом фрейме все метки по запросу "<black>.+" удаляем метку и к остаточному тексту объявления применяем черную рамочку.

Так вот, как правильно реализовать 3-ий вариант?
Мое первое решение было выделение всего текста, где будет производиться замена, поиск по регулярному выражению, выделение, удаление метки в выделенном и применение скрипта с рамкой. Однако, таким образом можно поменять только одно объявление, так как выделение со всего текста перемещается на определенный кусочек. И вот вопрос: Каким образом можно искать циклично Grep'ом по фрейму метку? Может просто надо обратиться к Story?

Так же подумал, какой же алгоритм можно придумать для накручивания рамок?
Подумал, что конструкция do...while подойдет, однако не совсем понял, как установить для неё условие: заменять до тех пор, пока...можно что-либо найти по конструкции "<black>.+"?
Код:
do
    app.findGrepPreferences.findWhat  = "• <grey>.+"
    app.changeGrepPreferences.changeTo = "Welldone"
    var myF = mySelection.findGrep();
    myF[0].select();
    myTable = CreateBorderFunction()
while (app.findGrepPreferences.findWhat  = "• <grey>.+")
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

Пользоваться первым вариантом, только по массиву найденных элементов идти с конца. И, возможно метку <...> удалять уже из таблицы, но это надо практически смотреть, может можно и сразу.
Ну, как-то так:
Код:
for (i=myF.length-1;i>=0;i--){
//do something with myF[i]
}

PS. И кстати, черная рамка это технически что: таблица, якорь?...
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

Точно! Благодарю, Eugenyus! myF же массив! Как я недогадался сразу) ладно все приходит с опытом!
Все работает! вот готовый сценарий для расстановки рамочек)

Код:
var myDoc = app.activeDocument;
var mySelection = myDoc.selection[0]
app.findGrepPreferences.findWhat  = "<grey>.+"
var myF = mySelection.findGrep();
for (i=myF.length-1; i>=0;i--)
    {
     myF[i].select()
     mySelection = myDoc.selection[0]
     app.findTextPreferences = app.changeTextPreferences = null; 
     app.findTextPreferences.findWhat = "<"; 
     app.changeTextPreferences.changeTo = "!"; 
     myTable = mySelection.convertToTable()
     with (myTable) {

        spaceBefore = "2.5 mm";
        spaceAfter = "2.5 mm";

        }
     with(myTable.cells[0]) {
        topInset = "1.5 mm"
        bottomInset = "1.5 mm"
        leftInset = "1 mm"
        rightInset = "1 mm"
    
        height = "20 mm"
    
        fillColor = "Paper"
    
        autoGrow = false
    
        leftEdgeStrokeWeight = "1 pt"
        rightEdgeStrokeWeight = "1 pt"
        topEdgeStrokeWeight = "1 pt"
        bottomEdgeStrokeWeight = "1 pt"
      }

     }

PS. И кстати, черная рамка это технически что: таблица, якорь?...
черная рамка (черный фон, белый текст), белая рамка (Белый фон, черный текст, черная окантовка)- это таблица
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

Проверьте параметры удержания абзаца, выключку во фрейме по вертикали.
Возникла еще проблема. Между инлайн объектом и таблцей идущей после инлайн объекта образуется большое пустое пространство. Как быть? Тоже самое происходит между заякоренным объектом и таблицей.
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

Между инлайн объектом и таблцей идущей после инлайн объекта образуется большое пустое пространство.
Файл в студию.
 
Ответ: Требуется помощью новичку! (автосоздания определенных рамок)

вот ссылка на результат. В текстовом фрейме находятся серые, белые, черные рамки.
http://ifolder.ru/22234517
но только вот между серой(якорный объект) и черной(табличеая рамка) , серой и белой(табличная) рамкой большой отступ.
Нашел какой-то невероятный способ лечения. В начале строки, где стоит табличная рамка, поставить знак конца абзаца (enter то есть нажать), расстояние сократится. Однако пространство все равно надо сжимать. Кстати между серыми рамками (якорные которые) тоже большие пустоты образуются. Как регулировать отступы таких объектов (якорных, инлайн). Можно подсмотреть первые сообщения, там javascript код серой рамки.
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

Ошибка
К сожалению, в данный момент сервер не может обработать ваш запрос.
Пожалуйста повторите его позже.

Вот зачем использовать "левый" файлообменник, когда на форуме есть свой?
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

gauss_gauss,
1. В свойствах таблицы - space before 2.5 мм стоит - можно хоть до 0;
2. anchored object options - position: custom - вот это главная ошибка. Сделайте Inline or above line, и будет Вам счастье.
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

GeorgeS, дело в том, что рамки выставляются скриптом)) там я устанавливал якорный объект - это особенность создания серой рамки. Но если я поставлю инлайн, то он может наплыть на текст. Кстати не подскажете как скриптом этот якорь в инлайн обратить?
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

дело в том, что рамки выставляются скриптом))
Посты перемещены в соответствующую тему.


не подскажете как скриптом
Нет. Я продвинутый юзверь, до программирования руки не доходят.
 
Ответ: Всем кто пытается освоить InDesign с нуля. Вопросы из help'a постить ТОЛЬКО здесь.

gauss_gauss,
http://forum.rudtp.ru/showthread.php?t=18178 - попробуйте вот это. Правда платно. Но не надо придумывать.
 
Статус
Закрыто для дальнейших ответов.