Как узнать левая или правая страница?

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

hulk1776

Топикстартер
15 лет на форуме
Сообщения
738
Реакции
21
Такой вопрос.
Проверяю лев\прав страница через
If myPage.Side = idPageSideOptions.idLeftHand Then
Но результат зависит от масштаба отображения. Я подумал, что можно увеличить изображение до 200% (на месте курсора в тексте, или по выделению) и тогда страница определится правильно. Вот как можно увеличить изображение? (на то, что бы это выяснить потрачено строго 2 часа и безрезультатно, чередуются сообщения - Object doesn't support this method, Object Required. А закончилось этим:
Код:
myInDesign.ActiveDocument.ZeroPoint = Array(210, 0)
MyBounds = myInDesign.ActiveDocument.Selection.Item(1).GeometricBounds
MsgBox MyBounds(1) 'работает
Set myTextframe = myInDesign.ActiveWindow.Selection
[B]If MyBounds(1)[/B] < 0 - [COLOR=Red]Syntax Error!![/COLOR]
Хотел узнать вторую координату, что если она меньше нуля, то страница левая - куда ж проще, так нет же. Глухой стопор в теч. 2-х часов.
И никакой документации (справка в VB (по F2) не в счет, т.к. нет примера написания команды, а без такого примера, все пояснения о методах и свойствах - почти пустой звук, потому что непонятно же, к чему их прикреплять.
Поэтому метод тыка дает исключительно Object doesn't support this method, Object Required '8]
 
Ответ: Как узнать левая или правая страница?

Чет я не понял :)
Если задача определить лево-право, то Page.Side

idPageSideOptions.idRightHand = 1919382632
idPageSideOptions.idLeftHand = 1818653800
idPageSideOptions.idSingleSided = 1970496888
 
Ответ: Как узнать левая или правая страница?

Маленький FAQ.

hulk1776 сказал(а):
Поэтому метод тыка дает исключительно Object doesn't support this method, Object Required '8]
1. Для чего существует документация?
- Где взять?
- Поищите по форуму, ссылок приводилось множество.

2.
- У меня не работает то-то, что делать?
- Пользоваться ЕГО ВЕЛИЧЕСТВОМ ПОИСКОМ. На оба заданных вами за сегодня вопроса есть ответы в форуме, правда, не вчера это было, и даже не позавчера, а год, два, три назад.
Кто ищет, тот всегда найдет (С).
 
Ответ: Как узнать левая или правая страница?

IAMRAT сказал(а):
Чет я не понял :)
Если задача определить лево-право, то Page.Side

Так если отображается разворот, то всегда будет Left :-( (а рисовать например, надо на правой странице).

А про поиск я понял. Попробуем поискать. Спасибо.
 
Ответ: Как узнать левая или правая страница?

Ну если все время искать через activeWindow.activePage без использования переменной, то и черта с рогами найти можно. Активная страница - это не такое простое свойство, чтобы с ним так вольно обращаться. Значение этого свойства зависит от массы различных факторов: что выделено на развороте, как у выделенного определены anchorPoint ну и так далее.
Чтобы получить конкретную страницу (и узнать, левая, правая или вообще средняя), нужно переменной присвоить значение:
Set myPage = myInDesign.ActiveWindow.ActivePage
...blablabla...
MsgBox myPage.PageSide

Set myTextframe = myInDesign.ActiveWindow.Selection
и должно вызывать ошибку, если было определено
Dim myTextframe as InDesign.TextFrame
В документации ясно сказано, что объект Selection - массив, а потому при выполнении возникает ошибка несоответствия типов.

Говорю сразу как опытный товарищ: если хотите заниматься скриптами для InDesign, забудьте VB как страшный сон. Ничего, кроме мозгового геморроя не получите. В CS3 вовсе неслучайно нет документации отдельно для VB.
 
Ответ: Как узнать левая или правая страница?

hulk1776 сказал(а):
Так если отображается разворот, то всегда будет Left :-( (а рисовать например, надо на правой странице).

А про поиск я понял. Попробуем поискать. Спасибо.

Что значит \отображается разворот\? Есть объект Page у него свойство Side - левая страница или правая, или документ без разворотов.
Только что проверил все работает. Какая разница что отображается?
 
Ответ: Как узнать левая или правая страница?

Пока вот так делаю:
Код:
Set MyApp = CreateObject("InDesign.Application.CS3")
MyApp.ActiveDocument.ZeroPoint = Array(0, 0)
[COLOR=DarkGreen]'это для того, что бы можно было узнать лев/прав по знаку х-координаты(<,> 0) (если вдруг начну таким образом "узнавать" [/COLOR]
Set myTextFrame = MyApp.ActiveWindow.ActivePage.Rectangles.Add
    Set myPage = MyApp.ActiveWindow.ActivePage
    Set myMarginPreferences = myPage.MarginPreferences
MyY = (0 - myPage.MarginPreferences.Top)
        If myPage.Side = idPageSideOptions.idLeftHand Then
x1 = 0
x2 = 210
        Else
x1 = 210
x2 = 420
        End If
        
myTextFrame.GeometricBounds = Array(0, x1, -MyY, x2) 'сначала идет y, потом х
myTextFrame.FillColor = "Paper"
myTextFrame.SendBackward
Так вот, если курсор находится на правой странице, но отображются обе, то плашка рисуется все равно на левой странице. А надо бы, что бы рисовалась на той, где курсор (или просто выделен текстблок).
Вот в РageMaker было так (вроде просто):
gettextselection >> sel 'массив параметров, где первый - id-номер выделенного объекта, где находится курсор
select sel(1) 'выделили этот объект
getselectinfo >> x1, y1, x2, y2 'узнали координаты углов
if x1 < 0 'значит левая страница... и дальше уже исходя из этого.
(хотя может быть и громоздко с точки зрения VBA, JS и др.
Т.е. надо найти чем "измеряется/фиксируется" выделение, либо чем фиксируется место(положение) курсора.
А потом надо придумать, как пробежать по всем страницам, и где есть Заг1, там нарисовать плашку, или даже лучше "посмотрев" в содержание, запомнить все страницы, где сидит Заг1 и на них опять же нарисовать плашки. Но это в будущем, если хватит мозгов, сил и времени 'alil'. Зато как оно все само... потом 'cofe1'

Если получится, напишу как.
 
Ответ: Как узнать левая или правая страница?

Итак, на данный момент имеем время 22 ч 20 мин. (15 марта 2008 г. ;-)). С момента моего предыдущего поста прошло больше 2-х часов. Ни по хелпу, ни по справке по объектной модели, ни поиском по форуму не нашел никакой информации, о том, как выделить текстблок (в котором находится курсор) и узнать хотя бы координаты этого текстблока. А VBA однообразно, и как мне показалось, устало, повторяет гнусавым металлизированным голосом - "метод не поддерживается/требуется объект"...
Может кто подскажет? (если не авторская тайна, ессно ':(8').

'Oo'
 
Ответ: Как узнать левая или правая страница?

Oleg Butrin сказал(а):
...если хотите заниматься скриптами для InDesign, забудьте VB как страшный сон. Ничего, кроме мозгового геморроя не получите. В CS3 вовсе неслучайно нет документации отдельно для VB.
У меня процесс верстки начинается с обработки документа в Ворде. Там он обрабатывается, ессно, в VBA. Поэтому логично в этом же редакторе все и дописывать. А кроме того, вот имеющийся у меня список скачанных "мануалов":
E:\inDesigne Books\03 InDesign CS3 Tutorial Scripts\
E:\inDesigne Books\05 InDesign CS3 Sample Scripts\
E:\inDesigne Books\10 indesign_cs3_guide_scripts\
E:\inDesigne Books\09 InDesignCS3_ScriptingGuide_VB.pdf
E:\inDesigne Books\08 InDesignCS3_ScriptingGuide_JS.pdf
E:\inDesigne Books\07 InDesignCS3_ScriptingGuide_AS.pdf
E:\inDesigne Books\06 indesign_cs3_scripting_read_me.pdf
E:\inDesigne Books\04 InDesignCS3_Sample_Scripts_ReadMe.pdf
E:\inDesigne Books\02 indesign_cs3_scripting_tutorial.pdf
E:\inDesigne Books\01 Adobe_Intro_to_Scripting1.pdf
И объем файлов что для VB, что для Js, что для AS примерно одинаковые. Из чего я заключаю, что объем и суть информации для разных языков однотипны (в этом печальном списке я не нашел ответа на простейший вопрос, как узнать номер текстблока, в котором стоит курсор. Там не встречается даже такая частая команда как "SelectAll" - поразительно)

Но может быть есть какие-то еще материалы по скриптам?.

Буду признателен за подсказку.
 
Ответ: Как узнать левая или правая страница?

Ничего не логично дописывать в InDesign на VB.
Повторяю громко и отчётливо:НИЧЕГО! Простейший пример: некоторые скрипты от самой компании-производителя, написанные на VB, работают с вызовом основной части, которая написана на JS. Это уже значит многое.

Что такое номер текстового блока - совершенно не ясно. Порядковый номер в связке нескольких текстовых фреймов, уникальный номер текстового фрема или еще что?
SelectAll в InDesign в принципе не используется, поскольку в качестве параметра методу app.select() передаётся массив объектов, которые нужно выделить. Сделано это потому, что объекты бывают сильно разного типа и не все можно выделить одновременно.

Что касается нахождения стороны страницы.
Вот простейший пример скрипта, который делает текстовый фрейм на активной странице в верхнем левом или правом углу в зависимости от стороны страницы.
Код:
var myWidth = 60;
var myHeight = 40;
with (app) {
	var myDoc = activeDocument;
	var myPage = activeWindow.activePage;
	var myY = myPage.bounds[0] + myPage.marginPreferences.right;
	if (myPage.side == PageSideOptions.RIGHT_HAND) {
		var myX = myPage.bounds[3] - myPage.marginPreferences.right;
		var myBounds = [myY, myX - myWidth, myY + myHeight, myX];
		} else {
			var myX = myPage.bounds[1] + myPage.marginPreferences.left;
			var myBounds = [myY, myX, myY + myHeight, myX + myWidth];
			}
		var myTextFrame = myPage.textFrames.add({visibleBounds:myBounds})
	}

Всего 16 строк, но при необходимости уложился бы в пять!
 
Ответ: Как узнать левая или правая страница?

Боюсь утомить (поэтому может быть в порядке свободной полемики в свободное время если есть интерес). Так вот, это я уже пробовал. Именно в операторе
var myPage = activeWindow.activePage
или как у меня
Set myPage = MyApp.ActiveWindow.ActivePage
и происходит "разночтение". Если отображается разворот то activePage всегда оказывается левой. Поэтому я подумал, что можно хотя бы в начале выполнения скрипта ставить размер отображения в 200%, тогда активная страница автоматически станет та, где курсор. Но пока и с увеличением экрана не разобрался. Как увеличивать картинку (например MyInd.idViewZoomStyle = idZoomIn ругается). Поэтому хочу покопаться в скриптах-примерах, может что-то найду наводящее (хотя слово zoom не встретилось - уже плохо.).

А номер текстблока - по идее, просто порядковый номер объекта на данном развороте (или в данной публикации). Т.е. какой-нить уникальный номер в каком-нить наборе чего-нить. А потом по этому номеру уже и работать (выделять, перемещать, изменять размер и пр.).

"Ничего не логично дописывать в InDesign на VB." - может быть. Но мне проще cдвинуться с места с VB, т.к. хоть что-то уже в нем сделано. А js выглядит как-то "си-образно" (т.е. пугающе заумно, особенное оформление циклов - брр, страшна ввязываться в разборки 'hmmm' ).

В любом случае спасибо за отзывы.
 
Ответ: Как узнать левая или правая страница?

Итак, если кому нужно, вот так можно узнать номер страницы под текстовым курсором и левая она или правая (наверное можно было и покрасивее сделать, но уж как вышло).

Код:
Sub GetMyPage()
Set MyInd = CreateObject("InDesign.Application.CS3")
Set myInsertionPoint = MyInd.Selection.Item(1)
Set myStory = myInsertionPoint.ParentTextFrames
myPage = myStory.Item(1).Parent [COLOR=DarkGreen][B]'номер страницы, если нужен[/B][/COLOR]
MyInd.ActiveDocument.ZeroPoint = Array(210, 0)
MyBounds = myStory.Item(1).GeometricBounds
If MyBounds(1) > 0 Then MsgBox "Правая" Else MsgBox "левая"
End sub

И вся недолга (2-х недель копания как и не было '%)' )
 
Ответ: Как узнать левая или правая страница?

А вот так выглядит окончательный скриптик, рисующий забеливающую плашку по верху текстблока (если кому опять же надо, или для примера)
Код:
Set MyApp = CreateObject("InDesign.Application.CS3")
MyApp.ActiveDocument.ZeroPoint = Array(0, 0)
Set myInsertionPoint = MyApp.Selection.Item(1)
Set myStory = myInsertionPoint.ParentTextFrames
    Set myPage1 = MyApp.ActiveWindow.ActivePage
myPage = myStory.Item(1).Parent 'номер страницы, если нужно
MyApp.ActiveDocument.ZeroPoint = Array(210, 0)
MyLeftRight = myStory.Item(1).GeometricBounds
If MyLeftRight(1) > 0 Then
x1 = 0
x2 = 210
        Else
x1 = -210
x2 = 0
        End If
Set myTextFrame = MyApp.ActiveWindow.ActivePage.Rectangles.Add
MyY = (0 - myPage1.MarginPreferences.Top)
myTextFrame.GeometricBounds = Array(0, x1, -MyY, x2) 'сначала идет y, потом х
myTextFrame.FillColor = "Paper"
myTextFrame.SendBackward

А вот насколько короче это выглядит в Пижамкере:
Код:
textselect +char
gettextcursor >> lloc --фиксируем, где и "в чем" сидит курсор
select loc(1)
getselectinfo >> xl, yt, xr, yb --определяем лев-правая страница
If xl<0 --если левая
box -123.10, 10, -17.5, 16.5
Else 
box 18.00, 10, 120.5, 16.5
EndIf
fillandline 1, "dontcare", 0, 0, 0, -2, 0, "dontcare", 1, -2, -2
Tool 1

Небо и земля (правда по возможностям - тоже небо и земля, но в другую сторону ;-))
 
Ответ: Как узнать левая или правая страница?

Вот как получилась "полная и окончательная" ( '%))' ) проверка на левая/правая страница с номером (поставить курсор в текст или выделить что-нить стрелкой).
Код:
Sub left_right()
Set MyInd = CreateObject("InDesign.Application.CS3")
Set myIP = MyInd.Selection.Item(1)
On Error Resume Next 'не останаливаемся на ошибках
Set myStory = myIP.ParentTextFrames 'если вдруг тексткурсор
myPageNum = myIP.Parent 'номер страницы, если выделен объект
myPageNum = myStory.Item(1).Parent ' а тут, если курсор в тексте
MyLR = myIP.Parent.Side
MyLR = myStory.Item(1).Parent.Side
If MyLR = idPageSideOptions.idLeftHand Then MsgBox "Левая, с номером " & myPageNum Else MsgBox "Правая, с номером " & myPageNum
End Sub

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