var defUnit = preferences.rulerUnits; // Стартова мерна единица // preferences.rulerUnits = Units.PIXELS; // Обръщане в пиксели // var docRef = app.activeDocument; var layRef = docRef.activeLayer; var layPar = layRef.parent; // В тази пром. се поставя последния родител // var prev_next = true; // Флаг за предишен / следващ слой // var lastRb; // Последно натиснат радио-бутон // var lastPoint = lPoint (); var rel; try{ var selBnd = docRef.selection.bounds } catch(er){ var selBnd = false } //================================================================ //================================================================ function checkType ( lyr ){ // Проверка за типа на слоя // Целта е да се намери първия "ArtLayer" в зададената посока // if ( lyr.typename == "LayerSet" ){ // При намерена група // if ( lyr.layers.length === 0 ) { // В случай, че групата е празна // lastPar = lyr // Последен родител става текущата група // selectLay ( charIDToTypeID( prev_next ) ) // Селектиране на предходния слой/група още веднъж // return docRef.activeLayer; // Функцията подава новия намерен "ArtLayer" // } if ( prev_next == "Bckw" ){ // В случай, че флага е за следващ слой // lastPar = lyr // Последен родител става текущият // docRef.activeLayer = lyr.layers[ 0 ] // Активен слой/група става първия в текущата // checkType ( docRef.activeLayer ) // Проверка на новия активен // Ако е група процеса се повтаря // } else{ // В случай, че флага е за предишен слой // if ( lyr == lastPar ){ // Ако текущата група е зададения посл. родител // lastPar = lyr.parent // Последен родител става този на текущата група // selectLay ( charIDToTypeID( prev_next ) ) // Селектиране на предходния слой/група // Налага се повторно селектиране тъй като вече сме били в тази група и искаме да излезем // checkType ( docRef.activeLayer ) // Проверка на новия активен // Ако е група процеса се повтаря // } else{ // Ако текущата група не е зададения посл. родител // lastPar = lyr // Групата става последен родител // docRef.activeLayer = lyr.layers[ lyr.layers.length-1 ] // Влиза се в групата // Тъй като преглеждаме предходните слоеве се селектира последния в групата // checkType ( docRef.activeLayer ) } } } else{ // При намерен "ArtLayer" // lastPar = lyr.parent // Последен родител става родителя на текущия // } } function selectLay (dir){ // Селектира слоя под активния // Запис от "script listener" // var ref1 = new ActionReference (); ref1.putEnumerated ( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), dir ); var desc2 = new ActionDescriptor (); desc2.putReference ( charIDToTypeID( "null" ), ref1 ); desc2.putBoolean ( charIDToTypeID( "MkVs" ), true ); executeAction( charIDToTypeID( "slct" ), desc2, DialogModes.NO ); // Проверка за типа на слоя // Ако е група търсенето продължава // checkType ( docRef.activeLayer ) return docRef.activeLayer } function lPoint (){ // Изчисляване на горна-лява точка // var layBnds = layRef.bounds; var layW = layBnds[2].value - layBnds[0].value; var layH = layBnds[3].value - layBnds[1].value var layInfo = ""; layInfo += "," + "\t" + layBnds[0].value + "\t"; layInfo += "," + "\t" + layBnds[1].value + "\t"; layInfo += "," + "\t" + layW + "\t"; layInfo += "," + "\t" + layH; return layInfo; } function cPoint (){ // Изчисляване на горна-средна точка // var layBnds = layRef.bounds; var layW = layBnds[2].value - layBnds[0].value; var layH = layBnds[3].value - layBnds[1].value var layInfo = ""; // Широчината на слоя се разделя на две, закръгля надолу и се събира с координата на лявата точка // layInfo += "," + "\t" + ( layBnds[0].value + Math.floor ( layW / 2 ) ) + "\t"; layInfo += "," + "\t" + layBnds[1].value + "\t"; layInfo += "," + "\t" + layW + "\t"; layInfo += "," + "\t" + layH; return layInfo; } function rPoint (){ // Изчисляване на горна-дясна точка // var layBnds = layRef.bounds; var layW = layBnds[2].value - layBnds[0].value; var layH = layBnds[3].value - layBnds[1].value var layInfo = ""; layInfo += "," + "\t" + ( layBnds[2].value -1 ) + "\t"; layInfo += "," + "\t" + layBnds[1].value + "\t"; layInfo += "," + "\t" + layW + "\t"; layInfo += "," + "\t" + layH; return layInfo; } //{ ИЗГРАЖДАНЕ НА ИНТЕРФЕЙСА var w = new Window ( 'dialog', ' Layer Bounds' ); w.pnl = w.add ( 'panel', undefined, 'Bounds' ); // добавяне на панел с информация за слоя // w.pnl.spacing = 5; w.pnl.em = w.pnl.add ( 'statictext', undefined, 'h' ); // Добавяне на невидим статичен текст за създаване на дистанция м/у името на панела и ост. инф. // w.pnl.em.preferredSize = [ 5, 5 ]; w.pnl.em.visible = false; w.pnl.na = w.pnl.add ( 'statictext', undefined, 'Layer Name: ' + layRef.name ); // Добавяне на статичен текст с името на слоя // Това поле се ъпдейтва при смяна на слоя // w.pnl.na.preferredSize = [ 350, 15 ]; w.pnl.na.alignment = 'left'; w.pnl.g1 = w.pnl.add ( 'group' ); w.pnl.g1.st = w.pnl.g1.add ( 'statictext', undefined, 'Order: x, y, w, h' ); // Статичен текст за изписване реда на данните // w.pnl.g1.et = w.pnl.g1.add ( 'edittext', undefined, lPoint () ); // Поле за изписване на данните // w.pnl.g1.et.preferredSize = [ 220, 20 ]; w.pnl.g1.sep1 = w.pnl.g1.add ( 'panel', [undefined, undefined, 0, 20 ], '' ); // Добавяне на разделител (панел) за открояване на радиобутоните // w.pnl.g1.g2 = w.pnl.g1.add ( 'group' ); // Група, в която се поставят бутоните // w.pnl.g1.g2.spacing = 1; w.pnl.g1.g2.rb1 = w.pnl.g1.g2.add ( 'radiobutton', undefined, 'L' ); // Радио-бутон за лява точка // w.pnl.g1.g2.rb1.helpTip = "Upper left coordinate"; w.pnl.g1.g2.rb1.value = true; w.pnl.g1.g2.rb2 = w.pnl.g1.g2.add ( 'radiobutton', undefined, 'M' ); // Радио-бутон за средна точка // w.pnl.g1.g2.rb2.helpTip = "Upper middle coordinate"; w.pnl.g1.g2.rb3 = w.pnl.g1.g2.add ( 'radiobutton', undefined, 'R' ); // Радио-бутон за дясна точка // w.pnl.g1.g2.rb3.helpTip = "Upper right coordinate"; w.pnl.g1.sep2 = w.pnl.g1.add ( 'panel', [undefined, undefined, 0, 20 ], '' ); // Добавяне на втори разделител (панел) // w.pnl.g1.rel = w.pnl.g1.add ( 'button', undefined, 'Relative' ); w.pnl.g1.rel.helpTip = "Relative coordinates"; w.bg = w.add ( 'group' ); // Добавяне на група за бутоните за управление ( "Previous", "Next", "Ok" ) // w.bg.alignment = 'right'; w.bg.b1 = w.bg.add ( 'button', undefined, 'Previous' ); // Бутон "Previous" - маркира най- близкия "ArtLayer" ( нагоре от активния ) // w.bg.b2 = w.bg.add ( 'button', undefined, 'Next' ); // Бутон "Next" - маркира най- близкия "ArtLayer" ( надолу от активния ) // w.bg.b3 = w.bg.add ( 'button', undefined, 'Ok' ); // Бутон "Ok" - затваря диалоговия прозорец // //} //{ ФУНКЦИИ НА ЕЛЕМЕНТИТЕ ОТ ИНТЕРФЕЙСА // w.onShow = function (){ // При показване на прозореца // checkType ( docRef.activeLayer ) // Проверка за типа на слоя (ако е група се търси най-близкия "ArtLayer") // layRef = docRef.activeLayer // Ъпдейтване на пром. за активен слой // w.pnl.na.text = 'Layer Name: ' + layRef.name // Ъпдейтване името на слоя // lastRb = w.pnl.g1.g2.rb1 // По подразбиране за посл. нат. радио-бутон се слага този за лява точка // w.pnl.g1.et.text = lPoint () // По подразбиране в полето се изписва инф. за лява точка // w.pnl.g1.et.active = true // Полето се прави активно (лесно за копиране) // } w.pnl.g1.g2.rb1.onClick = function (){ // При маркиране на бут. за лява точка // lastRb = this // Ъпдейтване на пром. за посл. нат. радио-бутон // lastPoint = lPoint () w.pnl.g1.et.text = lastPoint // Ъпдейтване на полето с данните за лява точка // w.pnl.g1.et.active = true // Полето се прави активно (лесно за копиране) // } w.pnl.g1.g2.rb2.onClick = function (){ // При маркиране на бут. за средна точка // lastRb = this // Ъпдейтване на пром. за посл. нат. радио-бутон // lastPoint = cPoint () w.pnl.g1.et.text = lastPoint // Ъпдейтване на полето с данните за средна точка // w.pnl.g1.et.active = true // Полето се прави активно (лесно за копиране) // } w.pnl.g1.g2.rb3.onClick = function (){ // При маркиране на бут. за дясна точка // lastRb = this // Ъпдейтване на пром. за посл. нат. радио-бутон // lastPoint = rPoint () w.pnl.g1.et.text = lastPoint // Ъпдейтване на полето с данните за дясна точка // w.pnl.g1.et.active = true // Полето се прави активно (лесно за копиране) // } w.bg.b1.onClick = function (){ // При натискане на бут. за предишен слой // w.pnl.g1.et.text = "" // Полето временно се оставя празно ( за да се вижда по-добре ъпдейтването на данните) // prev_next = "Frwr" layRef = selectLay ( charIDToTypeID( prev_next ) ) // Селектиране на предишния слой // w.pnl.na.text = 'Layer Name: ' + layRef.name // Ъпдейтване името на слоя // switch ( lastRb ){ // Проверка на последния натиснат радио-бутон // Указва от коя точка да се вземат данните за новия слой // case w.pnl.g1.g2.rb1: // бут. лява точка // w.pnl.g1.et.text = lPoint () break; case w.pnl.g1.g2.rb2: // бут. централна точка // w.pnl.g1.et.text = cPoint () break; case w.pnl.g1.g2.rb3: // бут. дясна точка // w.pnl.g1.et.text = rPoint () break; } w.pnl.g1.et.active = true // Полето се прави активно (лесно за копиране) // } w.bg.b2.onClick = function (){ // При натискане на бут. за следващ слой // w.pnl.g1.et.text = "" // Полето временно се оставя празно ( за да се вижда по-добре ъпдейтването на данните) // prev_next = "Bckw" layRef = selectLay ( charIDToTypeID( prev_next ) ) // Селектиране на следващия слой // w.pnl.na.text = 'Layer Name: ' + layRef.name // Ъпдейтване името на слоя // switch ( lastRb ){ // Проверка на последния натиснат радио-бутон // Указва от коя точка да се вземат данните за новия слой // case w.pnl.g1.g2.rb1: // бут. лява точка // w.pnl.g1.et.text = lPoint () break; case w.pnl.g1.g2.rb2: // бут. централна точка // w.pnl.g1.et.text = cPoint () break; case w.pnl.g1.g2.rb3: // бут. дясна точка // w.pnl.g1.et.text = rPoint () break; } w.pnl.g1.et.active = true // Полето се прави активно (лесно за копиране) // } w.pnl.g1.rel.onClick = function (){ // При натискане на бут. за относителни координати // if ( selBnd ){ var tmpTxt = lastPoint.match( /\d+/g ) tmpTxt = [ parseInt ( tmpTxt[0], 10 ), parseInt ( tmpTxt[1], 10 ), parseInt ( tmpTxt[2], 10 ), parseInt ( tmpTxt[3], 10 ) ] if ( w.pnl.g1.g2.rb3.value ){ rel = ",\t" + ( (tmpTxt[0]+1) - selBnd[0].value ) + "\t" } else{ rel = ",\t" + ( tmpTxt[0] - selBnd[0].value ) + "\t" } rel += ",\t" + ( selBnd[1].value - tmpTxt[1]) + "\t" rel += ",\t" + tmpTxt[2] + "\t" rel += ",\t" + tmpTxt[3] w.pnl.g1.et.text = rel w.pnl.g1.et.active = true } else{ alert ("Please make a selection first") w.pnl.g1.et.text = lastPoint w.pnl.g1.et.active = true } } //} w.center (); w.show (); preferences.rulerUnits = defUnit;