var len; var docRef = app.activeDocument; var layRef; var layNam; // Името на слоя се поставя тук // Чекбокса за име съответно го включва/изключва // var prev_next = "Bckw"; // Флаг за предишен/следващ слой // "Bckw" = следващ, "Frwr" = предишен // var lastRb; // Последно натиснат радио-бутон // L, C, R // var autoNd; // Стопиращия слой се поставя тук // var autoNam = ""; // Ново име при авт. кръщаване // var autoNum = 0; // Пореден номер при авт. кръщаване // var renamMod = "renm"; // Указва режима на автоматичното кръщаване // Възможни са: кръщаване, представка, наставка и заместване // var ndAutoNum; // Краен номер при авт. кръщаване, опционален // var аutoReplace; // Текст, който да се замести в името на слоя при авт. заместване, опционално // var autoPreSufx; // Представка / наставка при авт. кръщаване // var autoFlag; // Флаг за броя на заместванията // var longestTip = 17; // помощната информация с най-голяма дължина // var tipNum = longestTip; // Определя коя помощна информация да се зареди // var lastTip = undefined; // Последната използвана информация // // hidCmnd[0] - Добавяне/Изтриване на редове (при открит знак -) // // hidCmnd[1] - Записване на PNG // // hidCmnd[2] - Показване на хелп инфото в полето, ще се показва след командата // // hidCmnd[3] - Откриване на съвпадение, данните се поставят след съвпадението // var hidCmnd = "//add\\d+rows" + "," + "//export png" + "," + "//show help" + "," + "//apply match"; var rowNum = 1; // Брой редове // var helpReg = /-+(.+\n+)+-+/ // Експрешън за намиране на помощната информация ако е показана в полето // var maxWinH; // Максимална възможна височина на текстовото поле, определя се от височината на монитора // //var hisStat = docRef.activeHistoryState; // Текущ хистори стейт // След затваряне на прозореца се подава като нов // //================================================================ // ОСНОВНИ ФУНКЦИИ // СЕЛЕКТИРАНЕ НА СЛОЙ, ВЗИМАНЕ НА ДАННИ... // //================================================================ function txtSelectionLength (etField){ // Проверяа дали има текстова селекция // // The textselection can be edit only in time of assignment etField.textselection = etField.textselection.replace( /.+/g, // Instead of string the second argument can be anonymous function with n number of arguments // The first argument (a in this case) is the entire match // The following arguments will be the backreferences (characters enclosed with parentheses) used in the regular expression // In this case we need the entire textselection so there is no need of backreferences // function(a){ // 23 ){ layNam = layNam.slice (0,23) + "...;" layInfo += layNam } else{ layInfo += layNam } 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; if ( layNam.length > 23 ){ layNam = layNam.slice (0,23) + "...;" layInfo += layNam } else{ layInfo += layNam } 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; if ( layNam.length > 23 ){ layNam = layNam.slice (0,23) + "...;" layInfo += layNam } else{ layInfo += layNam } return layInfo; } function takeInfo (){ // Функцията подава на текстовото поле информацията за текущата точка (L, C, R) // switch ( dlg.pn1.g4.cb1.value ){ case true: layNam = "\t" + "#" + layRef.name + ";" break; case false: layNam = "" break; } switch ( lastRb ){ // Проверка на последния натиснат радио-бутон // Указва от коя точка да се вземат данните за новия слой // case dlg.pn1.g2.rb1: // бут. лява точка // return lPoint () break; case dlg.pn1.g2.rb2: // бут. централна точка // return cPoint () break; case dlg.pn1.g2.rb3: // бут. дясна точка // return rPoint () break; } } String.prototype.repeat = function(n) { // Определяне на брой редове // return new Array(1 + n).join(this); } function clearSpecialChars ( str, flg, sharp ){ var reg = str // Специални символи, сет1 [ ] . + * ? / ( ) $ ^ | // пред тях се поставя наклонена черта за разпознаване в експрешъна // reg = reg.replace ( /\[|\]|\\|\.|\+|\*|\?|\/|\(|\)|\$|\^|\|/g, function (a){ return "\\" + a } ) // Специални символи, сет2 цифри, думи, бели полета... // Между тях се поставя интервал съществуващ 0 или повече пъти за да не се разпознават кадо специален символ // reg = reg.replace ( /\\b|\\d|\\s|\\w|\\n|\\f|\\r|\\t|\\v|\\0|\\n|\\cX|\\xhh|\\uhhhh/gi, function (a){ return a.replace(/\\/,"\\ \*") } ) // Ако има диез се замества със знака за една или повече цифри // // Това се прави за намиране на неизвестно число в името на слоя // if ( sharp ) { reg = reg.replace (/#+/, "\\d+") } // Обръщане на зам. текст в експрешън // reg = new RegExp (reg,flg) return reg } function loadTip (num1, num2){ // Зарежда помощната информация в третия панел // var tipArray = [] tipArray.push ( "Бутони \"Слой -\" и \"Слой +\" селектират съответно предишен и следващ слой" ) tipArray.push ( "Бутон \"Авто\" стартира автоматичен режим като селектира и слоеве в подпапки" ) tipArray.push ( "Бутон \"Добави\" добавя данните на текущия слой" ) tipArray.push ( "Бутон \"И. Име\" (Alt + Q) изтрива имената" ) tipArray.push ( "Команда \"//add...rows\" задава брой редове за добавяне" ) tipArray.push ( "Команда \"//add...rows\" с отрицателно число задава брой редове за отнемане" ) tipArray.push ( "Бутон \"Д/И. Ред\" (Alt + N) добавя/отнема зададения брой редове" ) tipArray.push ( "\"Ctrl + Enter\" създава нов ред" ) tipArray.push ( "Бутон \"Относ.\" изчислява относителни координати. Първите x и y се взимат за база" ) tipArray.push ( "Относителни координати се изчисляват по параграфи ако са с тагове //< и //>" ) tipArray.push ( "Бутон \"Обърни\" обръща последователността на редовете" ) tipArray.push ( "Последователността се обръща по параграфи ако са с тагове //< и //>" ) tipArray.push ( "От полето за \"Авт. кръщаване\" се задава ново име за слоевете, важи само за..." ) tipArray.push ( "автоматичен режим. Отметки \"П\", \"Н\" и \"З\" указват режима на кръщаване... " ) tipArray.push ( "и означават: \"П\" - представка, \"Н\" - наставка, \"З\" - заместващ текст..." ) tipArray.push ( "Във второто поле се записва текста за заместване, а от падащото меню... " ) tipArray.push ( "до него се задава типа на заместване..." ) tipArray.push ( "При наличие на диез (#) в полето за кръщаване/заместване се стартира номерация... " ) tipArray.push ( "Последователна номерация може да бъде зададена като стартов и краен номер..." ) tipArray.push ( "от полето за номериране. Непоследователни номера се задават като се разделят с..." ) tipArray.push ( "точка и запетая ( важи само за полето за име )" ) tipArray.push ( "Команда \"//show help\" показва помощната информация в полето" ) tipArray.push ( "\"Ctrl + Tab\" създава табулация" ) tipArray.push ( "\"Alt + 0\" изтрива текста (без командите)" ) tipArray.push ( "\"Alt + =\" прибавя 15px към текущата височина на полето" ) tipArray.push ( "\"Alt + -\" отнема 15px от текущата височина на полето" ) tipArray.push ( "\"Alt + M\" разпъва полето до максималната му височина" ) tipArray.push ( "\"Alt + R\" свива полето до стартовата му височина" ) if ( num2 > 0 ){ // Ако трябва да се покаже повече от един ред (при команда //show help) return tipArray.slice(num1, num2).join( "\n" ) } else{ if ( num1 < 0 ) { tipNum = tipArray.length-1 } else if ( num1 > tipArray.length-1 ) { tipNum = 0 } return tipArray [ tipNum ] } } function placeTip ( what, byWhat ){ // Помества бутоните спрямо текстовото поле // what.location.x = byWhat.location.x + Math.round ( ( byWhat.bounds.width - what.bounds.width ) /2) } function placeBtns (){ // Помества бутоните за помощна информация спрямо текстовото поле // dlg.pn3.g1.location.x = dlg.pn2.titleEt.location.x dlg.pn3.g2.location.x = ( ( dlg.pn2.titleEt.location.x + dlg.pn2.titleEt.bounds.width ) - dlg.pn3.g2.bounds.width ) -2 } //================================================================ // ИЗГРАЖДАНЕ НА ИНТЕРФЕЙСА // //================================================================ //{ // Панел 1 // Настройки var dlg = new Window ( 'dialog', '\u00A0'.repeat (2) + 'Данни за слоевете' + " ".repeat(28) + "X,"+" ".repeat(19)+"Y,"+" ".repeat(19)+ "W,"+" ".repeat(19)+"H,"+" ".repeat(6) + "#Име" ); dlg.alignChildren = 'fill'; //================================================================= // Панел за настройки // //================================================================= dlg.pn1 = dlg.add ( 'panel', undefined, 'Настройки'); dlg.pn1.orientation = 'row'; //================================================================= // Радио бутони за взимане на координати // //================================================================= dlg.pn1.g2 = dlg.pn1.add ( 'group' ); dlg.pn1.g2.alignment = "fill" dlg.pn1.g2.spacing = 5; dlg.pn1.g2.st1 = dlg.pn1.g2.add ( 'statictext', undefined, 'Координати:' ); // Разделител // dlg.pn1.g2.sep1 = dlg.pn1.g2.add ( 'panel', undefined, '' ); dlg.pn1.g2.sep1.alignment = 'fill'; // Горна лява точка // dlg.pn1.g2.rb1 = dlg.pn1.g2.add ( 'radiobutton', undefined, 'Л' ); dlg.pn1.g2.rb1.helpTip = "Горна лява точка"; dlg.pn1.g2.rb1.value = true; // Горна средна точка // dlg.pn1.g2.rb2 = dlg.pn1.g2.add ( 'radiobutton', undefined, 'С' ); dlg.pn1.g2.rb2.helpTip = "Горна средна точка"; // Горна дясна точка // dlg.pn1.g2.rb3 = dlg.pn1.g2.add ( 'radiobutton', undefined, 'Д' ); dlg.pn1.g2.rb3.helpTip = "Горна дясна точка"; // Разделител // dlg.pn1.g2.sep2 = dlg.pn1.g2.add ( 'panel', undefined, '' ); dlg.pn1.g2.sep2.alignment = 'fill'; //================================================================= // Автоматично кръщаване на слоевете // //================================================================= dlg.pn1.g3 = dlg.pn1.add ( 'group' ); dlg.pn1.g3.alignment = ["center", "center" ]; dlg.pn1.g3.spacing = 7; // Чекбокс за отключване на опцията // dlg.pn1.g3.st1 = dlg.pn1.g3.add ( 'checkbox', undefined, '\u00A0' + 'Авт. кръщаване:' ); dlg.pn1.g3.st1.helpTip = "Ново име за слоевете"; // Разделител // dlg.pn1.g3.sep1 = dlg.pn1.g3.add ( 'panel', undefined, '' ); dlg.pn1.g3.sep1.alignment = 'fill'; // Поле за новото име // dlg.pn1.g3.еt1 = dlg.pn1.g3.add ( 'edittext', undefined, '' ); dlg.pn1.g3.еt1.preferredSize = [ 80, 22 ]; dlg.pn1.g3.еt1.alignment = ["fill", "center"]; dlg.pn1.g3.еt1.enabled = false; // Три чекбокса, за представка, наставка и заместване // dlg.pn1.g3.rbg = dlg.pn1.g3.add ( 'group' ); dlg.pn1.g3.rbg.spacing = 0; dlg.pn1.g3.rbg.rb0 = dlg.pn1.g3.rbg.add ( 'checkbox', undefined, 'П' ); dlg.pn1.g3.rbg.rb0.helpTip = "Представка"; dlg.pn1.g3.rbg.rb1 = dlg.pn1.g3.rbg.add ( 'checkbox', undefined, 'н' ); dlg.pn1.g3.rbg.rb1.helpTip = "Наставка"; dlg.pn1.g3.rbg.rb2 = dlg.pn1.g3.rbg.add ( 'checkbox', undefined, 'З' + '\u00A0' ); dlg.pn1.g3.rbg.rb2.helpTip = "Замести с"; dlg.pn1.g3.rbg.et1 = dlg.pn1.g3.rbg.add ( 'edittext', undefined, "" ) dlg.pn1.g3.rbg.et1.preferredSize = [80, 22 ]; dlg.pn1.g3.rbg.et1.enabled = false; // Падащо меню за настройка на заместването // dlg.pn1.g3.rbg.dd1 = dlg.pn1.g3.rbg.add ( 'dropdownlist', undefined, [ "1", "i", "g", "gi" ] ) dlg.pn1.g3.rbg.dd1.preferredSize = [44, 22 ]; dlg.pn1.g3.rbg.dd1.helpTip = "Тип на заместването:" +"\n" + "1: веднъж" + "\n" + " i: веднъж малки и главни" + "\n" + "g: всички" + "\n" + "gi: всички, малки и главни"; dlg.pn1.g3.rbg.dd1.selection = 0; dlg.pn1.g3.rbg.dd1.enabled = false; dlg.pn1.g3.rbg.enabled = false; // Поле за задаване на стартов и краен номер // dlg.pn1.g3.ng = dlg.pn1.g3.add ( 'group' ); dlg.pn1.g3.ng.spacing = 1; dlg.pn1.g3.ng.st1 = dlg.pn1.g3.ng.add ( 'statictext', undefined, '#:' ); dlg.pn1.g3.ng.st1.helpTip = "Стартов и краен номер #-#"; dlg.pn1.g3.ng.еt1 = dlg.pn1.g3.ng.add ( 'edittext', undefined, autoNum + 1 ); dlg.pn1.g3.ng.еt1.preferredSize = [ 45, 22 ]; dlg.pn1.g3.ng.enabled = false; dlg.pn1.g3.sep2 = dlg.pn1.g3.add ( 'panel', undefined, '' ); dlg.pn1.g3.sep2.alignment = 'fill'; //================================================================= // Включване / изключване името на слоя // //================================================================= dlg.pn1.g4 = dlg.pn1.add ( 'group' ); dlg.pn1.g4.alignment = [ 'right', 'fill' ]; dlg.pn1.g4.spacing = '5'; dlg.pn1.g4.st1 = dlg.pn1.g4.add ( 'statictext', undefined, 'Други:' ); dlg.pn1.g4.sep1 = dlg.pn1.g4.add ( 'panel', undefined, '' ); dlg.pn1.g4.sep1.alignment = 'fill'; dlg.pn1.g4.cb1 = dlg.pn1.g4.add ( 'checkbox', undefined, "Включи име" ); dlg.pn1.g4.cb1.helpTip = "Името на слоя се включва в данните "; dlg.pn1.g4.cb1.value = true; dlg.pn1.g4.sep2 = dlg.pn1.g4.add ( 'panel', undefined, '' ); dlg.pn1.g4.sep2.alignment = 'fill'; //} //{ // Панел 2 // Информация за слоевете //================================================================= // Панел за информацията на слоевете // //================================================================= dlg.pn2 = dlg.add ( 'panel', undefined, 'Данни' ); dlg.pn2.orientation = 'row'; //================================================================= // Група с бутони за редакция на текстовото поле // //================================================================= dlg.pn2.g1 = dlg.pn2.add ( 'group' ); dlg.pn2.g1.orientation = 'column'; dlg.pn2.g1.alignment = [ 'left', 'fill' ]; // Група с два скрити бутона // // N: симулира натискане на бутон Enter като маха фокуса от текстовото поле // // D: изчиства текста от полето // Използва шорткът Alt + 0 // dlg.pn2.g1.btg = dlg.pn2.g1.add ( 'group' ); dlg.pn2.g1.btg.bt1 = dlg.pn2.g1.btg.add ( 'button', undefined, "N", {name:'Ok'} ); dlg.pn2.g1.btg.bt1.preferredSize = [0,0]; dlg.pn2.g1.btg.bt2 = dlg.pn2.g1.btg.add ( 'button', undefined, "D", ); dlg.pn2.g1.btg.bt2.preferredSize = [0,0]; dlg.pn2.g1.btg.bt2.shortcutKey = '0'; //================================================================= // Група с бутони манипулиращи текстови селекции // //================================================================= dlg.pn2.g1.btg2 = dlg.pn2.g1.add ( 'group' ) dlg.pn2.g1.btg2.orientation = 'column' dlg.pn2.g1.btg2.alignment = [ 'center', 'bottom' ]; // Бутон за обръщане последователността на редовете (с тагове го прави по параграфи) // //dlg.pn2.g1.btg2.bt0 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'Reverse' ); dlg.pn2.g1.btg2.bt0 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'Обърни' ); dlg.pn2.g1.btg2.bt0.helpTip = "Обръща последователността на редовете"; dlg.pn2.g1.btg2.bt0.shortcutKey = "i"; // Бутон за изчисляване на разлика // // Изчислява се разликата на всеки ред с първия в полето // // Изчисляват се по параграфи ако са отделени със съответните тагове // //dlg.pn2.g1.btg2.bt1 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'Relative' ); dlg.pn2.g1.btg2.bt1 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'Относ.' ); dlg.pn2.g1.btg2.bt1.helpTip = "Изчислява относителни координати"; // Бутон за премахване на имената // //dlg.pn2.g1.btg2.bt2 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'C. Names' ); dlg.pn2.g1.btg2.bt2 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'И. Име' ); dlg.pn2.g1.btg2.bt2.helpTip = "Изчиства имената"; dlg.pn2.g1.btg2.bt2.shortcutKey = "q"; // Бутон за добавяне на допълнителен ред/редове // //dlg.pn2.g1.btg2.bt3 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'A. Rows' ); dlg.pn2.g1.btg2.bt3 = dlg.pn2.g1.btg2.add ( 'button', undefined, 'Д. Ред' ); dlg.pn2.g1.btg2.bt3.helpTip = "Добавя редове"; dlg.pn2.g1.btg2.bt3.shortcutKey = "n"; dlg.pn2.sep1 = dlg.pn2.add ( 'panel', undefined, '' ); dlg.pn2.sep1.alignment = 'fill'; // Група с бутони за разтегляне и свиване на текстовото поле // dlg.pn2.g2 = dlg.pn2.add ( 'group' ); dlg.pn2.g2.orientation = 'column'; dlg.pn2.g2.alignment = 'fill'; dlg.pn2.g2.bt1 = dlg.pn2.g2.add ( 'button', undefined, "-" ) dlg.pn2.g2.bt1.alignment = ['center', 'top']; dlg.pn2.g2.bt1.preferredSize = [20, 20]; dlg.pn2.g2.bt1.shortcutKey = '-'; dlg.pn2.g2.bt2 = dlg.pn2.g2.add ( 'button', undefined, "+" ) dlg.pn2.g2.bt2.alignment = ['center', 'bottom']; dlg.pn2.g2.bt2.preferredSize = [20, 20]; dlg.pn2.g2.bt2.shortcutKey = '+'; //================================================================= // Текстово поле за изписване даните на слоевете // //================================================================= dlg.pn2.titleEt = dlg.pn2.add ('edittext', undefined, "//add1rows" + "\n\n", { multiline:true} ) dlg.pn2.titleEt.preferredSize = [ 650, 200 ]; //[ 650, 120 ]; // Група с бутони за разтегляне и свиване на текстовото поле // dlg.pn2.g3 = dlg.pn2.add ( 'group' ); dlg.pn2.g3.orientation = 'column'; dlg.pn2.g3.alignment = 'fill'; dlg.pn2.g3.bt1 = dlg.pn2.g3.add ( 'button', undefined, "-" ) dlg.pn2.g3.bt1.alignment = ['center', 'top']; dlg.pn2.g3.bt1.preferredSize = [20, 20]; dlg.pn2.g3.bt1.shortcutKey = 'r'; dlg.pn2.g3.bt2 = dlg.pn2.g3.add ( 'button', undefined, "+" ) dlg.pn2.g3.bt2.alignment = ['center', 'bottom']; dlg.pn2.g3.bt2.preferredSize = [20, 20]; dlg.pn2.g3.bt2.shortcutKey = 'm'; dlg.pn2.sep2 = dlg.pn2.add ( 'panel', undefined, '' ); dlg.pn2.sep2.alignment = 'fill'; //================================================================= // Група с бутони за манипулиране на слоевете // //================================================================= dlg.pn2.btg = dlg.pn2.add ( 'group' ); dlg.pn2.btg.orientation = 'column'; dlg.pn2.btg.alignment = 'bottom'; //dlg.pn2.btg.bt0 = dlg.pn2.btg.add ( 'button', undefined, "Auto" ); // Автоматичен режим // dlg.pn2.btg.bt0 = dlg.pn2.btg.add ( 'button', undefined, "Авто" ); dlg.pn2.btg.bt0.helpTip = "Автоматичен режим"; //dlg.pn2.btg.bt1 = dlg.pn2.btg.add ( 'button', undefined, "Previous" ); // Предишен слой // dlg.pn2.btg.bt1 = dlg.pn2.btg.add ( 'button', undefined, "Слой -" ); dlg.pn2.btg.bt1.helpTip = "Селектира предишен слой"; //dlg.pn2.btg.bt2 = dlg.pn2.btg.add ( 'button', undefined, "Next" ); // Следващ слой // dlg.pn2.btg.bt2 = dlg.pn2.btg.add ( 'button', undefined, "Слой +" ); dlg.pn2.btg.bt2.helpTip = "Селектира следващ слой"; //dlg.pn2.btg.bt3 = dlg.pn2.btg.add ( 'button', undefined, "Add" ); // Добавяне данните на текущия слой // dlg.pn2.btg.bt3 = dlg.pn2.btg.add ( 'button', undefined, "Добави" ) dlg.pn2.btg.bt3.helpTip = "Добавя данните на текущия слой"; //} //{ // Панел 3 // Помощна информация //================================================================= // Панел с помощна информация // //================================================================= dlg.pn3 = dlg.add ( 'panel', undefined, 'Помощ' ); dlg.pn3.alignChildren = [ 'center', 'center' ] dlg.pn3.orientation = 'row'; // Група с бутон за предишна помощна информация // dlg.pn3.g1 = dlg.pn3.add ( 'group' ); dlg.pn3.g1.spacing = 4; dlg.pn3.g1.bt1 = dlg.pn3.g1.add ( 'button', undefined, "<" ); dlg.pn3.g1.bt1.preferredSize = [ 30, 20 ]; dlg.pn3.g1.sep1 = dlg.pn3.g1.add ( 'panel',undefined, '' ); dlg.pn3.g1.sep1.alignment = 'fill'; // Група съдържаща текстово поле за информацията // // Групата е необходима за да се постави текста в едно и също поле всеки път // // При повикване на layout manager-а групата запазва размера си и новият текст се помества спрямо нея // //dlg.pn3.tg = dlg.pn3.add ( 'panel', undefined, '' ); dlg.pn3.tg = dlg.pn3.add ( 'group' ); dlg.pn3.tg.alignChildren = [ 'center', 'fill' ]; dlg.pn3.tg.st1 = dlg.pn3.tg.add ( 'statictext', undefined, loadTip (longestTip,0) ); // Група с бутон за следваща помощна информация // dlg.pn3.g2 = dlg.pn3.add ( 'group' ); dlg.pn3.g2.spacing = 4; dlg.pn3.g2.sep1 = dlg.pn3.g2.add ( 'panel',undefined, '' ); dlg.pn3.g2.sep1.alignment = 'fill'; dlg.pn3.g2.bt2 = dlg.pn3.g2.add ( 'button', undefined, ">" ); dlg.pn3.g2.bt2.preferredSize = [ 30, 20 ]; //} //==================================================== // ФУНКЦИИ НА ЕЛЕМЕНТИТЕ ОТ ИНТЕРФЕЙСА //==================================================== dlg.onShow = function (){ // При показване на прозореца // // Бутоните за помощна информация се подравняват с текстовото поле // placeBtns () // По подразбиране е маркиран бутон за лява точка // lastRb = dlg.pn1.g2.rb1 // Взимане максималната височина на прозореца // // Височината_на_екрана - ( Абсолютната_височина_на_прозореца - Дифолтната_височина_на_текстовото поле ) // !!! Височината на екрана не включва таскбара // maxWinH = ( $.screens[0].bottom - (dlg.frameBounds.height - dlg.pn2.titleEt.preferredSize[1]) ) - 15 // Взимане на стартовата мерна единица // // Задаване на пиксели // defUnits = app.preferences.rulerUnits; app.preferences.rulerUnits = Units.PIXELS; // Симулиране на клик за изчистване на имена // // Предпазва от изтриване на текстовата селекция при първо повикване // txtSelectionLength (dlg.pn2.titleEt) // Симулиране на клик за редове // // Предпазва от изтриване на текстовата селекция при първо повикване // dlg.pn2.g1.btg2.bt3.notify () // Симулиране на клик за предишна помощна информация // // Зарежда първа помощна информация // // При създаването си в полето се зарежда най-големия текст за да определи размерите на групата // tipNum = 1 dlg.pn3.g1.bt1.notify () // Проверка за типа на слоя (ако е група се търси най-близкия "ArtLayer") // // Ъпдейтване на пром. за активен слой // checkType ( docRef.activeLayer ) layRef = docRef.activeLayer layNam = layRef.name } //{ // Панел 1 // dlg.pn1.g2.rb1.onClick = function (){ // При маркиране на бут. за лява точка // lastRb = this } dlg.pn1.g2.rb2.onClick = function (){ // При маркиране на бут. за средна точка // lastRb = this } dlg.pn1.g2.rb3.onClick = function (){ // При маркиране на бут. за дясна точка // lastRb = this } dlg.pn1.g3.st1.onClick = function (){ // При маркиране на чекбокс за автоматично кръщаване // dlg.pn1.g3.еt1.enabled = !dlg.pn1.g3.еt1.enabled dlg.pn1.g3.ng.enabled = !dlg.pn1.g3.ng.enabled dlg.pn1.g3.rbg.enabled = !dlg.pn1.g3.rbg.enabled } dlg.pn1.g3.rbg.rb0.onClick = function (){ // При маркиране на чекбокс за автоматичнa представка // if ( this.value == false ){ renamMod = "renm" } else{ renamMod = "prefx" // размаркиране на другите два чекбокса // dlg.pn1.g3.rbg.rb1.value = false dlg.pn1.g3.rbg.rb2.value = false // Изключввне на полето за заместване // dlg.pn1.g3.rbg.et1.enabled = false // Изключввне на падащото меню за флаг на заместването // dlg.pn1.g3.rbg.dd1.enabled = false } } dlg.pn1.g3.rbg.rb1.onClick = function (){ // При маркиране на чекбокс за автоматичнa наставка // if ( this.value == false ){ renamMod = "renm" } else{ renamMod = "sufx" // размаркиране на другите два чекбокса // dlg.pn1.g3.rbg.rb0.value = false dlg.pn1.g3.rbg.rb2.value = false // Изключввне на полето за заместване // dlg.pn1.g3.rbg.et1.enabled = false // Изключввне на падащото меню за флаг на заместването // dlg.pn1.g3.rbg.dd1.enabled = false } } dlg.pn1.g3.rbg.rb2.onClick = function (){ // При маркиране на чекбокс за автоматично заместване // if ( this.value == false ){ renamMod = "renm" // Включване на полето за заместване // dlg.pn1.g3.rbg.et1.enabled = false // Включване на падащото меню за настрока на заместването // dlg.pn1.g3.rbg.dd1.enabled = false } else{ // размаркиране на другите два чекбокса // dlg.pn1.g3.rbg.rb0.value = false dlg.pn1.g3.rbg.rb1.value = false // Включване на полето за заместване // dlg.pn1.g3.rbg.et1.enabled = true // Включване на падащото меню за флаг на заместването // dlg.pn1.g3.rbg.dd1.enabled = true } } dlg.pn1.g3.rbg.dd1.onChange = function (){ // При избор на флаг за заместване // // Текста от полето се записва като флаг // // Ако е единица става празен стринг, във всеки друг случай се записва по същия начин // autoFlag = this.selection.text.replace (/1/,"") } dlg.pn1.g3.ng.еt1.onChanging = function (){ // При писане в полето за стартов и краен номер // // Премахване на всичко което не е цифра или минус // this.text = this.text.replace ( /[^\d-]/g, "" ) // Премахване на излишните минуси, ако има повече от един // this.text = this.text.replace ( /-+/g, "-" ) // В случай, че потребителят изтрие стойността // if ( this.text === "" ){ autoNum = 0 } } //} //{ // Панел 2 // dlg.pn2.g2.bt1.onShortcutKey = function (){ // При шорткът на бут. - // Клик // this.notify () } dlg.pn2.g2.bt1.onClick = function (){ // При натискане на бут. - // -15 единици // if ( dlg.pn2.titleEt.bounds.height > dlg.pn2.titleEt.preferredSize[1] ){ lastTip = tipNum tipNum = longestTip dlg.pn2.titleEt.bounds.height -= 15 dlg.pn3.g2.bt2.notify () dlg.layout.layout (true) tipNum = lastTip dlg.pn3.g2.bt2.notify () placeBtns () lastTip = undefined } } dlg.pn2.g2.bt2.onShortcutKey = function (){ // При шорткът на бут. + //Клик // this.notify () } dlg.pn2.g2.bt2.onClick = function (){ // При натискане на бут. + // +15 единици // if ( dlg.pn2.titleEt.bounds.height < maxWinH ){ lastTip = tipNum tipNum = longestTip dlg.pn2.titleEt.bounds.height += 15 dlg.pn3.g2.bt2.notify () dlg.layout.layout (true) tipNum = lastTip dlg.pn3.g2.bt2.notify () placeBtns () lastTip = undefined } } dlg.pn2.g3.bt1.onShortcutKey = function (){ // При шорткът на втори бут. - // Стартов размер // if ( dlg.pn2.titleEt.bounds.height != dlg.pn2.titleEt.preferredSize[1] ){ lastTip = tipNum tipNum = 8 // Задаване стандартния размер на полето // dlg.pn2.titleEt.bounds.height = dlg.pn2.titleEt.preferredSize[1] dlg.pn3.g2.bt2.notify () dlg.layout.layout (true) tipNum = lastTip dlg.pn3.g2.bt2.notify () placeBtns () dlg.frameLocation.y = Math.round ( ( $.screens[0].bottom - dlg.frameBounds.height ) / 2 ) lastTip = undefined } } dlg.pn2.g3.bt1.onClick = function (){ // При натискане на втори бут. - // Клик // dlg.pn2.g2.bt1.notify () } dlg.pn2.g3.bt2.onShortcutKey = function (){ // При шорткът на втори бут. + // Максимално разпъване // lastTip = tipNum tipNum = longestTip dlg.pn2.titleEt.bounds.height = maxWinH //- 15 dlg.pn3.g2.bt2.notify () dlg.layout.layout (true) tipNum = lastTip dlg.pn3.g2.bt2.notify () placeBtns () dlg.frameLocation.y = Math.round ( ( $.screens[0].bottom - dlg.frameBounds.height ) / 2 ) lastTip = undefined } dlg.pn2.g3.bt2.onClick = function (){ // При натискане на втори бут. + // Клик // dlg.pn2.g2.bt2.notify () } dlg.pn2.btg.bt0.onClick = function (){ // При натискане на бут. Auto // // Взимане на текста за ново име на слоя, ако има такъв // autoNam = dlg.pn1.g3.еt1.text // Взимане на стартов и краен номер // // Стойността се записва с една единица по-малко защото се инкрементира при кръщаване // autoNum = parseInt (dlg.pn1.g3.ng.еt1.text, 10 ) - 1 ndAutoNum = Math.abs ( parseInt ( /-\d+/.exec ( dlg.pn1.g3.ng.еt1.text ), 10 ) ) // Проверка дали има произволни номера при авт. кръщаване // var randNum = autoNam.match (/\d+(?=;\d+|$)/g) // Взимане на заместващият текст, ако има такъв // аutoReplace = dlg.pn1.g3.rbg.et1.text // Ако има заместващ текст // if ( autoNam && dlg.pn1.g3.rbg.rb2.value ){ autoNam = clearSpecialChars ( autoNam, autoFlag, true ) } // Ако е зададено автоматично заместване // if ( dlg.pn1.g3.st1.value && autoNam instanceof RegExp ){ layRef.name = layRef.name.replace ( autoNam, аutoReplace.replace ( /#+/, function (a){ autoNum++; return autoNum } ) ) } // Ако е зададено автоматично кръщаване // else if ( dlg.pn1.g3.st1.value && autoNam !== "" ){ // Ако са зададени случайни числа за номериране // if ( randNum != null && randNum.length >= 2 ){ var ranCnt = 0 // Заместване на групата от числа с диез // autoNam = autoNam.replace ( /(\d+;)+\d*/, "#" ) autoNum = parseInt ( randNum [ ranCnt ], 10) - 1 } switch ( renamMod ){ case "prefx" : autoPreSufx = autoNam autoNam = autoPreSufx + layRef.name; break; case "sufx" : autoPreSufx = autoNam autoNam = layRef.name + autoPreSufx; break; } layRef.name = autoNam.replace( /#+/, function (a){ autoNum++; return autoNum } ) if ( autoNum === ndAutoNum ){ autoNam = "" } } // Промяна на името и състоянието на бут. Auto // //this.text = "Process" this.text = "Процес" this.enabled = false // В този режим винаги се маркира следващ слой // prev_next = "Bckw" // Стопиращ слой става последния видим в родителя // // В случай, че стопиращия е група при достигането му се задава последния за групата // var par = docRef.activeLayer.parent autoEnd (par, layRef.parent.layers.length-1) // Взимане информацията на текущия слой // var nfo = takeInfo () + "\n" // Стартиране на автоматичния цикъл // while ( docRef.activeLayer != autoNd ){ layRef = selectLay () // Ако е зададено автоматично заместване // if ( dlg.pn1.g3.st1.value && autoNam instanceof RegExp ){ layRef.name = layRef.name.replace ( autoNam, аutoReplace.replace ( /#+/, function (a){ autoNum++; return autoNum } ) ) } // Ако е зададено автоматично кръщаване // else if ( dlg.pn1.g3.st1.value && autoNam !== "" ){ switch ( renamMod ){ case "prefx" : autoNam = autoPreSufx + layRef.name; break; case "sufx" : autoNam = layRef.name + autoPreSufx; break; } // Ако са зададени случайни числа за номериране // if ( randNum != null && randNum.length >= 2 ){ if ( ranCnt < randNum.length-1 ){ ranCnt ++ autoNum = parseInt ( randNum [ ranCnt ], 10) - 1 } // Ако случайните номера са свършили, името на слоя трябва да се запази // else { autoNam = "" } } layRef.name = autoNam.replace( /#+/, function (a){ autoNum++; return autoNum } ) if ( autoNum === ndAutoNum ){ autoNam = "" } } // Взимане информацията на слоя // nfo += takeInfo () + "\n" } layRef = docRef.activeLayer dlg.pn2.titleEt.text += nfo autoNd = null // Ако чекбокса за автоматично кръщаване е маркиран, if ( dlg.pn1.g3.st1.value ) { if ( !autoNum ) { autoNum++ } // Ъпдейтване на полето за стартов и краен номер // dlg.pn1.g3.ng.еt1.text = autoNum // Симулиране на клик за автоматично кръщаване (изключва опцията) // dlg.pn1.g3.st1.notify () } // Връщане състоянието и името на бутона // //this.text = "Auto" this.text = "Авто" this.enabled = true } dlg.pn2.btg.bt1.onClick = function (){ // При натискане на бут. Previous // prev_next = "Frwr" layRef = selectLay () // Селектиране на предишния слой // } dlg.pn2.btg.bt2.onClick = function (){ // При натискане на бут. Next // prev_next = "Bckw" layRef = selectLay () // Селектиране на следващия слой // } dlg.pn2.btg.bt3.onClick = function (){ // При натискане на бут. Add // dlg.pn2.titleEt.text += takeInfo () + "\n" //dlg.pn2.titleEt.text += "\n" + takeInfo () } dlg.pn2.g1.btg.bt1.onClick = function (){ // При натискане на бут. N // (Симулира натискане на Enter) Активира/Деактивира полето // dlg.pn2.titleEt.active = !dlg.pn2.titleEt.active } dlg.pn2.g1.btg.bt2.onShortcutKey = function (){ // При шорткът за изчистване не полето // // Премахване съдържанието на хелпа в случай, че го има // Това се прави защото в съдържанието участват символи от командите // dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( /\-+\n+(.+\n+)+\-+\n+/,"") // Оставяне само на командите // dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.match ( /(\/\/(?!<|>).+\n{0,2})/g).join ("") } dlg.pn2.g1.btg2.children[0].onClick = function (){ // При обръщане последователността на редовете // // Проверка за тагове // Ако има поне един чифт // if ( new RegExp ( "\n+\\/\\/<", "g").test (dlg.pn2.titleEt.text) == true && new RegExp ( "\n+\\/\\/>", "g").test (dlg.pn2.titleEt.text) == true ) { var txtBlocks = dlg.pn2.titleEt.text.match ( /\/\/<\n*(,.+\n+)+(?=\/\/>)/g) for ( x=0; x", "g").test (dlg.pn2.titleEt.text) == true ) { var txtBlocks = dlg.pn2.titleEt.text.match ( /\/\/<\n*((,\t\-*\d+\t*){4}.*\n+)+(?=\/\/>)/g) //alert ( txtBlocks.join ("\n") ); return for (x=0; x< txtBlocks.length; x++){ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace (clearSpecialChars ( txtBlocks[x], "" ), function (a){ var x = parseInt ( a.match ( /\-*\d+(?=\t,)/g)[0] ) var y = parseInt ( a.match ( /\-*\d+(?=\t,)/g)[1] ) // 2-ри ред // // Изчисляване разликата на всеки x с базовия // // Изчисляване разликата на всеки y с базовия // a = a.replace (/(\-*\d+(?=(\t,\t\-*\d+){3}))/g, function(m){return parseInt(m)-x}) a = a.replace (/(\-*\d+(?=(\t,\t\-*\d+){2}(\t#|\n)))/g, function(n){ return parseInt(n)-y}) // 1-ви ред // // Връщане на базовите стойности a = a.replace (/(\-*\d+(?=(\t,\t\d+){3}))/, x) a = a.replace (/(\-*\d+(?=(\t,\t\d+){2}(\t#|\n)))/, y) return a; } ) // replace > } } else{ // Ако няма информация за слоевете се излиза от функцията // if ( !/,.+\n+/g.test (dlg.pn2.titleEt.text) ){ return } //Цялостно изчисляване dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace(/(.+\n+)+/g, function(a){ //F1< var x = parseInt ( a.match ( /\-*\d+(?=\t,)/g)[0] ) var y = parseInt ( a.match ( /\-*\d+(?=\t,)/g)[1] ) // 2-ри ред // // Изчисляване разликата на всеки x с базовия // // Изчисляване разликата на всеки y с базовия // a = a.replace (/(\-*\d+(?=(\t,\t\-*\d+){3}))/g, function(m){return parseInt(m)-x}) a = a.replace (/(\-*\d+(?=(\t,\t\-*\d+){2}(\t#|\n)))/g, function(n){ return parseInt(n)-y}) // 1-ви ред // // Връщане на базовите стойности a = a.replace (/(\-*\d+(?=(\t,\t\d+){3}))/, x) a = a.replace (/(\-*\d+(?=(\t,\t\d+){2}(\t#|\n)))/, y) return a; }//F1> )// main replace } } dlg.pn2.g1.btg2.bt2.onShortcutKey = function (){ // При шорткът за изчистване на имената // txtSelectionLength (dlg.pn2.titleEt) txtSelectionLength (dlg.pn2.titleEt) if (len){ dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( /\t(#.*;)/g, '' ) dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( /\t(#.*;)/g, '' ) } else{ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( /\t(#.*;)/g, '' ) } // Изчистване на променливата за следващата проверка // len = undefined } dlg.pn2.g1.btg2.bt2.onClick = function (){ // При натискане на бутон за изчистване на имената // txtSelectionLength (dlg.pn2.titleEt) txtSelectionLength (dlg.pn2.titleEt) if (len){ dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( /\t(#.*;)/g, '' ) dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( /\t(#.*;)/g, '' ) } else{ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( /\t(#.*;)/g, '' ) } // Изчистване на променливата за следващата проверка // len = undefined } dlg.pn2.g1.btg2.bt3.onShortcutKey = function (){ // При шорткът за допълнителен ред/редове // txtSelectionLength (dlg.pn2.titleEt) txtSelectionLength (dlg.pn2.titleEt) // В случай, че ще се добавят редове // if ( dlg.pn2.g1.btg2.bt3.text == "Д. Ред" ){ // От намерената команда се изважда само цифрата // // hidCmnd.split(",")[0] дава команда //add1rows // rowNum = parseInt ( dlg.pn2.titleEt.text.match ( hidCmnd.split(",")[0] )[0].replace (/[^\d]/g, ""), 10 ) if (len){ // Търси се комб. от ( Един или повече редове_( един или повече символи_нов ред ) ) // dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( /(\n+(?=.+\n))/g, "\n".repeat ( rowNum ) + '$1' ) this.notify () } else{ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( /(,\t\d+.+(?=\n+,))/g, '$1' + "\n".repeat ( rowNum ) ) } } // В случай, че ще се отнемат редове // else if ( dlg.pn2.g1.btg2.bt3.text == "И. Ред" ){ // При търсенето в скритата команда се добавя знак -, след което се изважда само цифрата // var delRw = parseInt ( dlg.pn2.titleEt.text.match ( hidCmnd.split(",")[0].replace(/add/, "add-") )[0].replace (/[^\d]/g, ""), 10 ) var reg = new RegExp ( "(,\\t.+\\n)(\\n{"+delRw+"})(?=\\n*.+\\n+)", "g" ) if (len){ dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( reg, "$1" ) this.notify () } else{ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( reg, "$1" ) } } // Изчистване на променливата за следващата проверка // len = undefined } dlg.pn2.g1.btg2.bt3.onClick = function (){ // При натискане на бутон за допълнителен ред/редове // txtSelectionLength (dlg.pn2.titleEt) txtSelectionLength (dlg.pn2.titleEt) // В случай, че ще се добавят редове // if ( dlg.pn2.g1.btg2.bt3.text == "Д. Ред" ){ // От намерената команда се изважда само цифрата // // hidCmnd.split(",")[0] дава команда //add1rows // rowNum = parseInt ( dlg.pn2.titleEt.text.match ( hidCmnd.split(",")[0] )[0].replace (/[^\d]/g, ""), 10 ) if (len){ // Търси се комб. от ( Един или повече редове_( един или повече символи_нов ред ) ) // dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( /(\n+(?=.+\n))/g, "\n".repeat ( rowNum ) + '$1' ) this.notify () } else{ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( /(,\t\d+.+(?=\n+,))/g, '$1' + "\n".repeat ( rowNum ) ) } } // В случай, че ще се отнемат редове // else if ( dlg.pn2.g1.btg2.bt3.text == "И. Ред" ){ // При търсенето в скритата команда се добавя знак -, след което се изважда само цифрата // var delRw = parseInt ( dlg.pn2.titleEt.text.match ( hidCmnd.split(",")[0].replace(/add/, "add-") )[0].replace (/[^\d]/g, ""), 10 ) var reg = new RegExp ( "(,\\t.+\\n)(\\n{"+delRw+"})(?=\\n*.+\\n+)", "g" ) if (len){ dlg.pn2.titleEt.textselection = dlg.pn2.titleEt.textselection.replace ( reg, "$1" ) this.notify () } else{ dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( reg, "$1" ) } } // Изчистване на променливата за следващата проверка // len = undefined } dlg.pn2.titleEt.onActivate = function (){ // При маркиране на текстовото поле от потребителя // // Тези действия предотвратяват маркирането на текста в синьо при кликване в полето // this.text += '.' this.text = this.text.replace ( /\.$/, '' ) } dlg.pn2.titleEt.onChanging = function (){ // При писане в полето // //* // В случай, че ще се добавят редове // if (dlg.pn2.titleEt.text.search (hidCmnd.split(",")[0] ) != -1 && dlg.pn2.g1.btg2.bt3.text != "Д. Ред" ){ dlg.pn2.g1.btg2.bt3.text = "Д. Ред" dlg.pn2.g1.btg2.bt3.helpTip = "Добавя редове" } // В случай, че ще се отнемат редове // else if (dlg.pn2.titleEt.text.search ( hidCmnd.split(",")[0].replace(/add/, "add-") ) != -1 && dlg.pn2.g1.btg2.bt3.text != "И. Ред" ){ dlg.pn2.g1.btg2.bt3.text = "И. Ред" dlg.pn2.g1.btg2.bt3.helpTip = "Отнема редове" } //*/ // При команда за хелп // if (dlg.pn2.titleEt.text.search ( hidCmnd.split (",")[2] ) !== -1 && !helpReg.test (dlg.pn2.titleEt.text) ){ $.sleep (200) var nfo = "-".repeat(125) + "\n"+ loadTip(0,100) + "\n" + "-".repeat(125) + "\n" dlg.pn2.titleEt.text = dlg.pn2.titleEt.text.replace ( hidCmnd.split (",")[2], "//showed help" + "\n" + nfo ) } } //} //{ // Панел 3 // dlg.pn3.g1.bt1.onClick = function (){ // При натискане на бут. за предишна помощна информация // if ( lastTip == undefined ) { tipNum -- } dlg.pn3.tg.remove (0) dlg.pn3.tg.st1 = dlg.pn3.tg.add ( 'statictext', undefined, loadTip (tipNum,0) ) dlg.pn3.tg.layout.layout (true) dlg.pn3.tg.st1.location.x = Math.round ( (dlg.pn3.tg.bounds.width - dlg.pn3.tg.st1.bounds.width) / 2 ) placeBtns () } dlg.pn3.g2.bt2.onClick = function (){ // При натискане на бут. за следваща помощна информация // // Ako в lastTip има стойност брояча не се инкрементира // // Необходимо е при макс. разпъване и свиване защото се симулира клик на бутона// if ( lastTip == undefined ) { tipNum ++ } dlg.pn3.tg.remove (0) dlg.pn3.tg.st1 = dlg.pn3.tg.add ( 'statictext', undefined, loadTip (tipNum,0) ) dlg.pn3.tg.layout.layout (true) dlg.pn3.tg.st1.location.x = Math.round ( (dlg.pn3.tg.bounds.width - dlg.pn3.tg.st1.bounds.width) / 2 ) placeBtns () } //} dlg.center (); dlg.show (); // Връщане на стартовия хистори стейт // //docRef.activeHistoryState = hisStat; // Връщане на стартовата мерна единица // app.preferences.rulerUnits = defUnits;