Удаление пустых графических фреймов

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

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Здравствуйте,
Помогите пожалуйста написать простейший скрипт по удалению из публикации пустых Графических фреймов.
С текстовыми по учебнику разобрался быстро.
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Удаление пустых графичкеских фреймов

Эскиз может быть таким:
Код:
var myPI = app.activeDocument.pageItems;
for (i = myPI.length; i >= 0; i--){
	try{
		if ((myPI[i].contentType == ContentType.GRAPHIC_TYPE)&&(myPI[i].pageItems.length==0)&&(myPI[i].allGraphics.length==0)){
			myPI[i].remove();
			}
		}catch(e){}
	}
Проверяем на копии.
 

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Ответ: Удаление пустых графичкеских фреймов

Object does not support the property or method 'contentType'

Не желает, для пробы взял 3 пустых, 3 eps, 3 tif да 3 текстовых.
Работаю в версии CS2
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Удаление пустых графичкеских фреймов

А, если CS2, то не подскажу, не помню. Начиная с CS3 сработает.

PS. Попробуйте разве что "GRAPHIC_TYPE" заменить на "graphicType"
 

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Ответ: Удаление пустых графичкеских фреймов

Пробовал сразу:y), пытался через allGraphics, но не срабатывает.
Что то тут не так, и в учебники простейшее действие обходится молчанием, с упоминанием что с изображениями все сложнее и усе.
а про текст от содержимого зашли.

app.scriptingVersion=4.0
myDocument = app.activeDocument;
myTextFrames = myDocument.textFrames
searchString = "[а-я0-9]"
for (i=0; i<myTextFrames.length; i++) {
if (myTextFrames.contents.match(searchString)== null){
myTextFrames.remove()
i--
}
}
 

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Ответ: Удаление пустых графических фреймов

Михаил Борисов Скрипты в индизайне.
(руководство для умных дизайнеров и ленивых верстальщиков)
Слишком кратко начальные вещи даны.
Дается листинг сижу говорится что делает, сиди и разбирай по словам кто что делает.
Хотелось бы более подробно по складам.
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Удаление пустых графичкеских фреймов

но не срабатывает.
Значит надо эксперименты ставить: pageItems заменить на rectangles, конструкцию try/catch выкинуть (всё равно не срабатывает), ContentType.graphicType заменить на нумератор 1735553140 и т.д. Просто у меня ЦС2 под рукой нет, сам не могу всё это проверить.
 

boriskasmoscow

15 лет на форуме
Сообщения
343
Реакции
410
Ответ: Удаление пустых графичкеских фреймов

На Adobe Exchenge я раскопал старый скрипт MB_FindImagesByDPI.js для ID CS2 (автор Matevz Bradac), который ищет и затем показывает растровые изображения в документе с разрешением ниже заданного. Так вот для того, чтобы определить, содержит ли PageItem изображение или нет, автор использует выражение:
if (typeof currPageItem.images != 'undefined')...,
сам же называя эту конструкцию идиотизмом: "// idiotic... pageItem.images is undefined when a pageItem doesn't contain any images"
Попробуйте сыграть на этом.
 

Sho Nuff

Участник
Сообщения
50
Реакции
143
Ответ: Удаление пустых графичкеских фреймов

Попробуйте такой вариант:

Код:
var allPageItems = app.activeDocument.allPageItems;

for (var i = allPageItems.length; i--;){
	var pageItem = allPageItems[i];
	
	// пропустим PageItem-ы содержащие текст
	if ('contents' in pageItem && (pageItem.contents.length || pageItem.overflows)) { 
		continue;
	}
	
	try {
		// проверим наличие вложенных объектов и картинок
		if (pageItem.allPageItems.length == 0 && pageItem.allGraphics.length == 0) { 
			pageItem.remove(); // пустой удаляем
		}
	} catch (e) {}
}
 
  • Спасибо
Реакции: karlotta_off

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Ответ: Удаление пустых графичкеских фреймов

Sho Nuff
Спасибо, ваш скрипт сработал, прибил правда просто пустые квадраты (фреймы не текстовые и не графические) что плохо надо их оставить иогда они с обводками и пр., но заодно пустые текстовые что хорошо.
 

Sho Nuff

Участник
Сообщения
50
Реакции
143
Ответ: Удаление пустых графических фреймов

Видимо придется определиться, что такое пустой фрейм?

Каких-либо специальных "не текстовых и не графических" элементов нет. Есть абстрактный класс объектов PageItem, и от него наследуют часть своих свойств классы FormField, GraphicLine, Group, Oval, Polygon, Rectangle, and TextFrame. Которые могут содержать текст, картинки или другие объекты, а могут и не содержать ничего.
 

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Ответ: Удаление пустых графических фреймов

Понятно почему обходят стороной.:)
Упростим задачу до 2 этапов.
1 удалим все пустые классы Rectangle
Вопрос что делаю не правильно:

app.scriptingVersion=4.0
myDocument = app.activeDocument;
myrectangles = myDocument.rectangles
for (i=0; i<myrectangles.length; i++) {
if (myrectangles.ContentType.(?????/ как правильно сделать/))== null){
myrectangles.remove()
i--
}
}

2. удалить все пустые кроме имеющих заливку фона, например красного цвета.
rectangle.FillColor(red) != 0
Правильно или нет ?

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

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Удаление пустых графических фреймов

if (myrectangles.ContentType.(?????/ как правильно сделать/))== null){

Adobe InDesign CS2 Scripting Reference.pdf гласит:

contentType
The content type of the object.
NameDecimal
ContentType.unassigned1970168179
ContentType.graphicType1735553140
ContentType.textType1952412773
Так что, видимо так:
Код:
if (myrectangles[i].contentType == 1970168179){//Do Something}

rectangle.FillColor(red) != 0
Сверх-универсально как-то так:
Код:
if (rectangle.fillColor.name == app.activeDocument.swatches.itemByName("red").name){}
Но может быть достаточно будет и:
Код:
if (rectangle.fillColor.name == "red"){}
 

Sho Nuff

Участник
Сообщения
50
Реакции
143
Ответ: Удаление пустых графических фреймов

Код:
myrectangles = myDocument.rectangles

Не очень удачно, потому что так вы пропустите Rectangle, размещенные внутри групп и текстовых фреймов.

Кроме того некоторые Polygon моут быть очень похожи на Rectangle.

Я бы сделал что-нибудь вроде такого:

Код:
var allPageItems = app.activeDocument.allPageItems;

for (var i = allPageItems.length; i--;){
    var pageItem = allPageItems[i];

    switch (pageItem.constructor.name) {
        case 'Oval':
        case 'Polygon':
        case 'Rectangle':
            // здесь делаем что-то полезное
            alert('Мы нашли подходящий объект: ' + pageItem);
            
            break;
        default:
            // можно что-то делать со всеми остальными pageItem
            alert(pageItem + ' нам не подходит!');
    }
}
 

Andrey_68

Участник
Топикстартер
Сообщения
44
Реакции
0
Ответ: Удаление пустых графических фреймов

спасибо за помощь
Eugenyus
Сработала только конструкция : if (rectangle.fillColor.name == "red"){}
Sho Nuff
Спасибо за простоту, сижу разбираю что к чему.
Вопрос если можете посоветуйте еще какой нибудь учебник на русском по азам написания скриптов.
 

Sho Nuff

Участник
Сообщения
50
Реакции
143
Ответ: Удаление пустых графических фреймов

посоветуйте еще какой нибудь учебник на русском по азам написания скриптов

Почитайте про Javascript. Это сравнительно компактный, но невероятно гибкий и мощный язык. Попробуйте
http://bonsaiden.github.com/JavaScript-Garden/ru/
если окажется сложновато, то сначала стОит прочитать что-нибудь "для чайников".

Разыщите и изучите документацию Adobe:
InDesign CS2 Scripting Guide.pdf
InDesign CS2 Scripting Reference.pdf
Русских переводов я не встречал. Там много примеров, разберитесь хотя бы в них.

Вам часто будет необходима информация о свойствах и методах различных объектов. Самый простой вариант - использовать Object Model Viewer, встроенный в уже предустановленную программу ExtendScript Toolkit.
Последний кроме того, удобен для написания написания небольших этюдов. Их нередко приходится делать что бы что-нибудь проверить/попробовать не портя вашу основную программу.

Обязательно изучайте чужие скрипты. Часто в них можно найти что-то новое для себя.
 
Статус
Закрыто для дальнейших ответов.