[AI CC-CC2022] Вопрос по скриптописанию

  • Автор темы Автор темы ACTPOHOM
  • Дата начала Дата начала
Как можно передавать в функцию то, чего еще нет? Сначала вызов функции, а потом создание объекта, который должен быть внутри функции? Программа выполняется с конца или вообще в произвольном порядке?
 
  • Спасибо
Реакции: ACTPOHOM
И потом, функция возвращает объект, а в "вызове" возвращаемое значение ничему не присваивается. Для чего тогда вообще этот "вызов", если результат не используется?

Может стОит начать с основ?
 
Поменял местами создание объекта и вызов функции, вроде заработало.
частично.
 
Поменял местами создание объекта и вызов функции, вроде заработало.
частично.
Пока что все вышеперечисленные ошибки не от кривизны иллюстраторовской модели, а от твоего незнания основ матчасти.
 
Как можно передавать в функцию то, чего еще нет? Сначала вызов функции, а потом создание объекта, который должен быть внутри функции? Программа выполняется с конца или вообще в произвольном порядке?
спасибо, ценное замечание. Просто думал что объекту все равно где находиться.
 
Пока что все вышеперечисленные ошибки не от кривизны иллюстраторовской модели, а от твоего незнания основ матчасти.
Это первый скрипт который пишу с нуля, прошу простить и понять :)
для этого и создал тему, если есть возможность ткнуть носом в ошибки, буду рад. 'alil'
 
не, переменной конечно не все равно.
 
  • Спасибо
Реакции: ACTPOHOM
obj1 - это переменная и есть, до тех пор пока ты ее не инициализировал она undefined по моему вполне логично?
да, логично.
Вот скажи, как оптимально задавать цвет, я вот такую шляпу собрал, для определения.

Код:
var newcolor = new CMYKColor();
usercolor(newcolor, 100, 0,0,0);

var newcolor2 = new CMYKColor();
usercolor(newcolor2, 100, 100, 0, 0);

var newcolor3 = new CMYKColor();
usercolor(newcolor3, 0, 0, 0, 50);



//рисуем объект
var obj1 = myDocument.pathItems.polygon (50, 188, 72.0, 5);
parametrShape(obj1, true, newcolor, true, newcolor, true, true)

var obj2 = myDocument.pathItems.polygon (150, 288, 72.0, 6);
parametrShape(obj2, true, newcolor3, true, newcolor2, true, true, )


function parametrShape(obj, strok, strcolor, filled, fillcolor, strOver, fillOver)
{
    obj.stroked = strok;
    obj.strokeColor = strcolor;
    obj.filled = filled;
    obj.strokeOverprint = strOver;
    obj.fillOverprint = fillOver ;
    obj.fillColor = fillcolor;

}


// конструктор цвета
function usercolor(colorname, cyan, magenta, yellow, black) {
    colorname.cyan = cyan;
    colorname.magenta = magenta;
    colorname.yellow = yellow;
    colorname.black = black;


}
 
Это у тебя не конструктор вовсе
Хотя бы примерно так:
Код:
// конструктор цвета
function usercolor(cyan, magenta, yellow, black) {
    var colorname= new CMYKColor();
    colorname.cyan = cyan;
    colorname.magenta = magenta;
    colorname.yellow = yellow;
    colorname.black = black;
    return colorname;
}

var color=usercolor(0, 0,0,0);
 
только colorname тоже надо аргументом передавать ?

Код:
var COLOR_RED = usercolor (COLOR_RED, 0, 100,100,0);



// конструктор цвета

function usercolor (colorname, cyan, magenta, yellow, black) {

    var colorname = new CMYKColor;

    colorname.cyan = cyan;

    colorname.magenta = magenta;

    colorname.yellow = yellow;

    colorname.black = black;

    return colorname;
 
да, что-то я глупость сморозил.

но тогда как названия цвета прописывать в Swatch ?
 
Ты swatch с color не путай
Это два совершенно разных класса
118824
 
  • Спасибо
Реакции: ACTPOHOM
И Spot, обрати внимание, тоже совсем отдельный класс
118825
 
  • Спасибо
Реакции: ACTPOHOM
спасибо. тогда понятно.
 
После рисования фигур возникает желание начать их выравнивать. Вот мой скрипт, который делает выравнивание. Закомментировал для лучшего понимания.
В параметрах функции передаются первыми два объекта, которые надо выровнять. Выравнивание происходит относительно второго передаваемого объекта newRect2. 3 и 4 параметры это текстовые переменные, как выравнивать (TOP, BOTTOM,LEFT,RIGHT,CENTER). Функция реализована так, что не имеет значение в какой последовательности передавать эти переменные. Можно передавать одну переменную, если выранивание нужно только по одной стороне. Но при передаче только одного параметра CENTER, будет центрировано и по вертикали и по горизонтали.

JavaScript:
function falign(newRect,newRect2, type,type2){

   var stayObj = newRect2.geometricBounds; //left, top, right, bottom -- это примечание в каком порядке хранятся координаты в массиве (крайние точки).
   var moveObj = newRect.geometricBounds;

    if(type2===undefined) {type2=type;}  // проверка есть ли второй параметр
    type=type.toUpperCase();type2=type2.toUpperCase(); // перевести значения параметров в верхний регистр. Это делает независимым, как напечатаны параметры
    var horiz=''; var vertikal=''; // далее обнаруживаем какие выравнивания присутствуют в параметрах
    if(type=='TOP' || type=='BOTTOM') vertikal=type;
    if(type=='LEFT' || type=='RIGHT') horiz=type;
    if(type2=='TOP' || type2=='BOTTOM') vertikal=type2;
    if(type2=='LEFT' || type2=='RIGHT') horiz=type2;
     if(type=='CENTER' && type2=='CENTER') {   horiz=vertikal=type;  }
      if(type=='CENTER' && type2!='CENTER') {  if(!horiz)  {horiz=type;} else if(!vertikal)  vertikal=type; }
        if(type2=='CENTER' && type!='CENTER') {  if(!horiz)  {horiz=type2;} else if(!vertikal)  vertikal=type2; }

    switch(horiz){ // проверяем какое у нас гориз. выравнивание и расчитываем дельту на которую надо сместить первый объект
        case 'CENTER': var cntr=stayObj[0]+(stayObj[2]-stayObj[0])/2; var cntrMov=moveObj[0]+(moveObj[2]-moveObj[0])/2;  var delt =cntr-cntrMov;      break;
        case 'LEFT':   delt =stayObj[0]-moveObj[0];     break;
        case 'RIGHT': delt =stayObj[2]-moveObj[2];   break;    
         default:delt=0; break;
        }
    switch(vertikal){ // здесь тоже самое про вертикальное выравнивание и расчет дельты
        case 'CENTER':  var cntr=stayObj[1]+(stayObj[3]-stayObj[1])/2; var cntrMov=moveObj[1]+(moveObj[3]-moveObj[1])/2;   var  delt2 =cntr-cntrMov;   break;
       case 'TOP':  delt2=stayObj[1]-moveObj[1];    break;
       case 'BOTTOM':  delt2 =stayObj[3]-moveObj[3];  break;
       
         default:delt2=0; break;
        }
    newRect.translate(delt,delt2); //двигаем объект

    }
 
Последнее редактирование:
  • Спасибо
Реакции: ACTPOHOM
К
После рисования фигур возникает желание начать их выравнивать. Вот мой скрипт, который делает выравнивание. Закомментировал для лучшего понимания.
В параметрах функции передаются первыми два объекта, которые надо выровнять. Выравнивание происходит относительно второго передаваемого объекта newRect2. 3 и 4 параметры это текстовые переменные, как выравнивать (TOP, BOTTOM,LEFT,RIGHT,CENTER). Функция реализована так, что не имеет значение в какой последовательности передавать эти переменные. Можно передавать одну переменную, если выранивание нужно только по одной стороне. Но при передаче только одного параметра CENTER, будет центрировано и по вертикали и по горизонтали.

JavaScript:
function falign(newRect,newRect2, type,type2){

   var stayObj = newRect2.geometricBounds; //left, top, right, bottom -- это примечание в каком порядке хранятся координаты в массиве (крайние точки).
   var moveObj = newRect.geometricBounds;

    if(type2===undefined) {type2=type;}  // проверка есть ли второй параметр
    type=type.toUpperCase();type2=type2.toUpperCase(); // перевести значения параметров в верхний регистр. Это делает независимым, как напечатаны параметры
    var horiz=''; var vertikal=''; // далее обнаруживаем какие выравнивания присутствуют в параметрах
    if(type=='TOP' || type=='BOTTOM') vertikal=type;
    if(type=='LEFT' || type=='RIGHT') horiz=type;
    if(type2=='TOP' || type2=='BOTTOM') vertikal=type2;
    if(type2=='LEFT' || type2=='RIGHT') horiz=type2;
     if(type=='CENTER' && type2=='CENTER') {   horiz=vertikal=type;  }
      if(type=='CENTER' && type2!='CENTER') {  if(!horiz)  {horiz=type;} else if(!vertikal)  vertikal=type; }
        if(type2=='CENTER' && type!='CENTER') {  if(!horiz)  {horiz=type2;} else if(!vertikal)  vertikal=type2; }

    switch(horiz){ // проверяем какое у нас гориз. выравнивание и расчитываем дельту на которую надо сместить первый объект
        case 'CENTER': var cntr=stayObj[0]+(stayObj[2]-stayObj[0])/2; var cntrMov=moveObj[0]+(moveObj[2]-moveObj[0])/2;  var delt =cntr-cntrMov;      break;
        case 'LEFT':   delt =stayObj[0]-moveObj[0];     break;
        case 'RIGHT': delt =stayObj[2]-moveObj[2];   break;    
         default:delt=0; break;
        }
    switch(vertikal){ // здесь тоже самое про вертикальное выравнивание и расчет дельты
        case 'CENTER':  var cntr=stayObj[1]+(stayObj[3]-stayObj[1])/2; var cntrMov=moveObj[1]+(moveObj[3]-moveObj[1])/2;   var  delt2 =cntr-cntrMov;   break;
       case 'TOP':  delt2=stayObj[1]-moveObj[1];    break;
       case 'BOTTOM':  delt2 =stayObj[3]-moveObj[3];  break;
       
         default:delt2=0; break;
        }
    newRect.translate(delt,delt2); //двигаем объект

    }
Когда обьект рисуется по коррдинатам - зачем его выравнивать, когда можно сразу нарисовать в нужном месте? Другое дело, если читать обьект из файла (как проще и правильнее) Кстати, интересная идея - для корела был макрос, переводящий шейп в массив координат, которые можно использовать в другом макросе. А вот для иллюстратора такого нету, а, возможно, пригодилось бы кому то.