[AI CC-CC2022] Помогите грамотно совместить 2 скрипта 1 мой другой с простор сети

  • Автор темы Автор темы Dmitri_J
  • Дата начала Дата начала

Dmitri_J

Участник
Топикстартер
Сообщения
51
Реакции
0
Доброго времени суток
Сразу скажу я только начинаю изучать JavaScript
решил написать небольшой скрипт для отрисовки выкройки картона (коробка)
первая часть есть но нужно добавить размеры то есть показать сколько какая сторона длиной и т.д.
первые три окна с строкой ето размеры картона

JavaScript:
var docRef = app.activeDocument;
var Koef_mm = 2.834645
var Szer_1P = prompt('Wpisż znaczenie krótkiej strony', 100) ;
var Szer_2P = prompt('Wpisż znaczenie długej strony?', 100);
var Wys_1P = prompt('Wpisż wysokość kartonu?', '');
var Szer_kr = (Koef_mm*Szer_1P)
var Szer_dl = (Koef_mm*Szer_2P)
var Wysokość = (Koef_mm*Wys_1P)
var Wysokość_klapki = (Szer_kr/2)
//  Srodek kartonu
var Klap_smal1 = docRef.pathItems.rectangle(50, 10, Szer_kr, Wysokość);
var Klap_big1 = docRef.pathItems.rectangle(50, 10+Szer_kr, Szer_dl, Wysokość);
var Klap_smal2 = docRef.pathItems.rectangle(50, 10+Szer_kr+Szer_dl, Szer_kr, Wysokość);
var Klap_big2 = docRef.pathItems.rectangle(50, 10+Szer_kr+Szer_dl+Szer_kr, Szer_dl, Wysokość);
//  Dolne Klapki
var Klap_smal1 = docRef.pathItems.rectangle(50+Wysokość_klapki, 10, Szer_kr, Wysokość_klapki);
var Klap_big1 = docRef.pathItems.rectangle(50+Wysokość_klapki, 10+Szer_kr, Szer_dl, Wysokość_klapki);
var Klap_smal2 = docRef.pathItems.rectangle(50+Wysokość_klapki, 10+Szer_kr+Szer_dl, Szer_kr, Wysokość_klapki);
var Klap_big2 = docRef.pathItems.rectangle(50+Wysokość_klapki, 10+Szer_kr+Szer_dl+Szer_kr, Szer_dl, Wysokość_klapki);
//  Gorne Klapki
var Klap_smal1 = docRef.pathItems.rectangle(50-Wysokość, 10, Szer_kr, Wysokość_klapki);
var Klap_big1 = docRef.pathItems.rectangle(50-Wysokość, 10+Szer_kr, Szer_dl, Wysokość_klapki);
var Klap_smal2 = docRef.pathItems.rectangle(50-Wysokość, 10+Szer_kr+Szer_dl, Szer_kr, Wysokość_klapki);
var Klap_big2 = docRef.pathItems.rectangle(50-Wysokość, 10+Szer_kr+Szer_dl+Szer_kr, Szer_dl, Wysokość_klapki);

с выравниванием конечно еще пока проблемка но я работаю над этим
вторая часть кода возможно вы встречали такой скрипт под названием "specify" показывает размер выделенного обьекта
только вот я пока листал немного запутался что к чему в этом коде

если подскажете как можно проще и быстрее добавить размеры буду очень благодарен
 
В смысле нарисовать размерники с цифрами? Ну самый дубовый вариант - выделяйте программно по очереди все обьекты и вызывайте второй скрипт
 
В смысле нарисовать размерники с цифрами? Ну самый дубовый вариант - выделяйте программно по очереди все обьекты и вызывайте второй скрипт
просто проблема в том что при вызове второго скрипта сразу открывает окно с вопросм по какой стороне нарисовать размера мне нужно из второго скрипта вытянуть только часть кода что б без всяких вопросов сразу рисовал размер
и второй вопрос раз уж понеслась) как можно выровнять обьект относительно другого обьекта есть на то быстрый способ ?
 
Второй скрипт не смотрел, там вызов диалога есть? Так уберите его, вытащите код обработчика кнопки. А для скрипта выравнивания в этом разделе специальный топик был, поищите
 
 
Спасибо ушел шерстить форум )
 
Второй скрипт не смотрел, там вызов диалога есть? Так уберите его, вытащите код обработчика кнопки.
как все же убрать из этого скрипта окно с выбором функции и вообще убрать обработчик кнопки
а то я уже сног до головы перебрал код но видимо что-то остаеться и код не работает вообще когда удаляю первую часть с окном
Код:
// Create an empty dialog window near the upper left of the screen
var dlg = new Window('dialog', 'Spec');
dlg.frameLocation = [100,100];
dlg.size = [250,250];

dlg.intro = dlg.add('statictext', [20,20,150,40] );
dlg.intro.text = 'First select 1 or 2 items';

dlg.where = dlg.add('dropdownlist', [20,40,150,60] );
dlg.where.selection = dlg.where.add('item', 'top');
dlg.where.add('item', 'bottom');
dlg.where.add('item', 'left');
dlg.where.add('item', 'right');

dlg.btn = dlg.add('button', [20,70,150,90], 'Specify', 'spec');



// document
var doc = activeDocument;

// spec layer
try {
    var speclayer =doc.layers['spec'];
} catch(err) {
    var speclayer = doc.layers.add();
    speclayer.name = 'spec';
}

// measurement line color
var color = new RGBColor;
color.green = 255;
color.blue = 0;

// gap between measurement lines and object
var gap = 2;

// size of measurement lines.
var size = 10;

// number of decimal places
var decimals = 0;

// pixels per inch
var dpi = 72;

/**
    Start the spec
*/
function startSpec() {
    
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds, dlg.where.selection.text );
    } else if (doc.selection.length==2) {
        specDouble( doc.selection[0], doc.selection[1], dlg.where.selection.text );
    } else {
            alert('please select 1 or 2 items');
    }

    dlg.close ();
}




/**
    Spec the gap between 2 elements
*/
function specDouble( item1, item2, where ) {
    
    var bound = new Array(0,0,0,0);

    var a =  item1.geometricBounds;
    var b =  item2.geometricBounds;
    
    if (where=='top' || where=='bottom') {
        
        if (b[0]>a[0]) { // item 2 on right,
            
            if (b[0]>a[2]) { // no overlap
                bound[0] =a[2];
                bound[2] = b[0];
            } else { // overlap
                bound[0] =b[0];
                bound[2] = a[2];
            }
        } else if (a[0]>=b[0]){ // item 1 on right
            
            if (a[0]>b[2]) { // no overlap
                bound[0] =b[2];
                bound[2] = a[0];
            } else { // overlap
                bound[0] =a[0];
                bound[2] = b[2];
            }
        }

        bound[1] = Math.max (a[1], b[1]);
        bound[3] = Math.min (a[3], b[3]);
        
    } else {
        
        if (b[3]>a[3]) { // item 2 on top
            if (b[3]>a[1]) { // no overlap
                bound[3] =a[1];
                bound[1] = b[3];
            } else { // overlap
                bound[3] =b[3];
                bound[1] = a[1];
            }
        } else if (a[3]>=b[3]){ // item 1 on top
            
            if (a[3]>b[1]) { // no overlap
                bound[3] =b[1];
                bound[1] = a[3];
            } else { // overlap
                bound[3] =a[3];
                bound[1] = b[1];
            }
        }
        
        bound[0] = Math.min(a[0], b[0]);
        bound[2] = Math.max (a[2], b[2]);
    }
    specSingle(bound, where );
}


/**
    spec a single object
    @param bound item.geometricBound
    @param where 'top', 'bottom', 'left,' 'right'
*/
function specSingle( bound, where ) {

    
    // width and height
    var w = bound[2]-bound[0];
    var h = bound[1]-bound[3];

    // a & b are the horizontal or vertical positions that change
    // c is the horizontal or vertical position that doesn't change
    var a = bound[0];
    var b = bound[2];
    var c = bound[1];
    
    // xy='x' (horizontal measurement), xy='y' (vertical measurement)
    var xy = 'x';
    
    // a direction flag for placing the measurement lines.
    var dir = 1;
    
    switch( where ) {
    
        case 'top':
            a = bound[0];
            b = bound[2];
            c = bound[1];
            xy = 'x';
            dir = 1;
            break;
        
        case 'bottom':
            a = bound[0];
            b = bound[2];
            c = bound[3];
            xy = 'x';
            dir = -1;
            break;
            
        case 'left':
            a = bound[1];
            b = bound[3];
            c = bound[0];
            xy = 'y';
            dir = -1;
            break;
            
        case 'right':
            a = bound[1];
            b = bound[3];
            c = bound[2];
            xy = 'y';
            dir = 1;
            break;
        
    }

    // create the measurement lines
    var lines = new Array();
    
    // horizontal measurement
    if (xy=='x') {
        
        // 2 vertical lines
        lines[0]= new Array( new Array(a, c+(gap)*dir) );
        lines[0].push ( new Array(a, c+(gap+size)*dir) );
        lines[1]= new Array( new Array(b, c+(gap)*dir) );
        lines[1].push( new Array(b, c+(gap+size)*dir) );
        
        // 1 horizontal line
        lines[2]= new Array( new Array(a, c+(gap+size/2)*dir ) );
        lines[2].push( new Array(b, c+(gap+size/2)*dir ) );
        
        // create text label
        if (where=='top') {
            var t = specLabel( w, (a+b)/2, lines[0][1][1] );
            t.top += t.height;
        } else {
            var t = specLabel( w, (a+b)/2, lines[0][0][1] );
            t.top -= t.height;
        }
        t.left -= t.width/2;
        
    // vertical measurement
    } else {
        
        // 2 horizontal lines
        lines[0]= new Array( new Array( c+(gap)*dir, a) );
        lines[0].push ( new Array( c+(gap+size)*dir, a) );
        lines[1]= new Array( new Array( c+(gap)*dir, b) );
        lines[1].push( new Array( c+(gap+size)*dir, b) );
        
        //1 vertical line
        lines[2]= new Array( new Array(c+(gap+size/2)*dir, a) );
        lines[2].push( new Array(c+(gap+size/2)*dir, b) );
        
        // create text label
        if (where=='left') {
            var t = specLabel( h, lines[0][1][0], (a+b)/2 );
            t.left -= t.width;
        } else {
            var t = specLabel( h, lines[0][0][0], (a+b)/2 );
            t.left += size;
        }
        t.top += t.height/2;
    }
    
    // draw the lines
    var specgroup = new Array(t);
    
    for (var i=0; i<lines.length; i++) {
        var p = doc.pathItems.add();
        p.setEntirePath ( lines[i] );
        setLineStyle( p, color );
        specgroup.push( p );
    }

    group(speclayer, specgroup );

}


/**
    Create a text label that specify the dimension
*/
function specLabel( val, x, y) {
        
        var t = doc.textFrames.add();
        t.textRange.characterAttributes.size = 8;
        t.textRange.characterAttributes.alignment = StyleRunAlignmentType.center;

        var v = val;
        switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
                
            default:
                v = v.toFixed (decimals);
        }
        
        t.contents = v;
        t.top = y;
        t.left = x;
        
        return t;
    
}

function setLineStyle(path, color) {
        path.filled = false;
        path.stroked = true;
        path.strokeColor = color;
        path.strokeWidth = 0.5;
        
        return path;
}

/**
* Group items in a layer
*/
function group( layer, items, isDuplicate) {
    
    // create new group
    var gg = layer.groupItems.add();

    // add to group
    // reverse count, because items length is reduced as items are moved to new group
    for(var i=items.length-1; i>=0; i--) {
    
        if (items[i]!=gg) { // don't group the group itself
            if (isDuplicate) {
                newItem = items[i].duplicate (gg, ElementPlacement.PLACEATBEGINNING);
            } else {
                items[i].move( gg, ElementPlacement.PLACEATBEGINNING );
            }
        }
    }
    
    return gg;
}

dlg.btn.addEventListener ('click', startSpec );
dlg.show();
 
JavaScript:
function startSpec(where) {
    
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds, where );
    } else if (doc.selection.length==2) {
        specDouble( doc.selection[0], doc.selection[1], where );
    } else {
            alert('please select 1 or 2 items');
    }
}

Последние две строки удалить.
Вызывать функцию startSpec с указанием стороны, где отрисовывать.
 
JavaScript:
function startSpec(where) {
   
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds, where );
    } else if (doc.selection.length==2) {
        specDouble( doc.selection[0], doc.selection[1], where );
    } else {
            alert('please select 1 or 2 items');
    }
}

Последние две строки удалить.
Вызывать функцию startSpec с указанием стороны, где отрисовывать.
Не знаю может что-то осталось лишнее
вобщем не хочет работать (
подскажите что может тут еще лишнее
Код вообще должен рисовать размерку вьіделенного обьекта только по верхней части (top)
JavaScript:
// document
var doc = activeDocument;

// spec layer
try {
    var speclayer =doc.layers['WYMIARY'];
} catch(err) {
    var speclayer = doc.layers.add();
    speclayer.name = 'WYMIARY';
}

// measurement line color
var color = new CMYKColor;
color.cyan = 100;
color.black = 35;

// gap between measurement lines and object
var gap = 10;

// size of measurement lines.
var size = 30;

// number of decimal places
var decimals = 0;

// pixels per inch
var dpi = 72;

/**
    Start the spec
*/
function startSpec(where) {
    
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds, where );
        }  else {
            alert('please select 1 or 2 items');
    }

}

/**
    spec a single object
    @param bound item.geometricBound
    @param where 'top', 'bottom', 'left,' 'right'
*/
function specSingle( bound, where ) {
    
    // width and height
    var w = bound[2]-bound[0];
    var h = bound[1]-bound[3];

    // a & b are the horizontal or vertical positions that change
    // c is the horizontal or vertical position that doesn't change
    var a = bound[0];
    var b = bound[2];
    var c = bound[1];
    
    // xy='x' (horizontal measurement), xy='y' (vertical measurement)
    var xy = 'x';
    
    // a direction flag for placing the measurement lines.
    var dir = 1;
    
             a = bound[0];
            b = bound[2];
            c = bound[1];
            xy = 'x';
            dir = 1;   
    }

    // create the measurement lines
    var lines = new Array();
    
    // horizontal measurement
if (xy=='x') {
        
        // 2 vertical lines
        lines[0]= new Array( new Array(a, c+(gap)*dir) );
        lines[0].push ( new Array(a, c+(gap+size)*dir) );
        lines[1]= new Array( new Array(b, c+(gap)*dir) );
        lines[1].push( new Array(b, c+(gap+size)*dir) );
        
        // 1 horizontal line
        lines[2]= new Array( new Array(a, c+(gap+size/2)*dir ) );
        lines[2].push( new Array(b, c+(gap+size/2)*dir ) );
        
        // create text label
        
            var t = specLabel( w, (a+b)/2, lines[0][1][1] );
        }

    // draw the lines
    var specgroup = new Array(t);
    
    for (var i=0; i<lines.length; i++) {
        var p = doc.pathItems.add();
        p.setEntirePath ( lines[i] );
        setLineStyle( p, color );
        specgroup.push( p );
    }

    group(speclayer, specgroup );

/**
    Create a text label that specify the dimension
*/
function specLabel( val, x, y) {
        
        var t = doc.textFrames.add();
        t.textRange.characterAttributes.size = 18;
        t.textRange.characterAttributes.alignment = StyleRunAlignmentType.center;

        var v = val;
        switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
                
            default:
                v = v.toFixed (decimals);
        }
        
        t.contents = v;
        t.top = y;
        t.left = x;
        
        return t;
    
}

function setLineStyle(path, color) {
        path.filled = false;
        path.stroked = true;
        path.strokeColor = color;
        path.strokeWidth = 0.5;
        
        return path;
}


/**
* Group items in a layer
*/
function group( layer, items, isDuplicate) {
    
    // create new group
    var gg = layer.groupItems.add();

    // add to group
    // reverse count, because items length is reduced as items are moved to new group
    for(var i=items.length-1; i>=0; i--) {
    
        if (items[i]!=gg) { // don't group the group itself
            if (isDuplicate) {
                newItem = items[i].duplicate (gg, ElementPlacement.PLACEATBEGINNING);
            } else {
                items[i].move( gg, ElementPlacement.PLACEATBEGINNING );
            }
        }
    }

    return gg;
}
 
Чтото у вас вообще какая то путаница с фигурными скобками
Мозгами не понять что из чего вызываться должно? %8
 
По смыслу вроде должно быть примерно как то так:
JavaScript:
// document
var doc = activeDocument;

// spec layer
try {
    var speclayer =doc.layers['WYMIARY'];
} catch(err) {
    var speclayer = doc.layers.add();
    speclayer.name = 'WYMIARY';
}

// measurement line color
var color = new CMYKColor;
color.cyan = 100;
color.black = 35;

// gap between measurement lines and object
var gap = 10;

// size of measurement lines.
var size = 30;

// number of decimal places
var decimals = 0;

// pixels per inch
var dpi = 72;

/**
    Start the spec
*/

    
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds, where );
        }  else {
            alert('please select 1 or 2 items');
    }



/**
    spec a single object
    @param bound item.geometricBound
    @param where 'top', 'bottom', 'left,' 'right'
*/
function specSingle( bound, where ) {
    
    // width and height
    var w = bound[2]-bound[0];
    var h = bound[1]-bound[3];

    // a & b are the horizontal or vertical positions that change
    // c is the horizontal or vertical position that doesn't change
    var a = bound[0];
    var b = bound[2];
    var c = bound[1];
    
    // xy='x' (horizontal measurement), xy='y' (vertical measurement)
    var xy = 'x';
    
    // a direction flag for placing the measurement lines.
    var dir = 1;
    
             a = bound[0];
            b = bound[2];
            c = bound[1];
            xy = 'x';
            dir = 1;   
    

    // create the measurement lines
    var lines = new Array();
    
    // horizontal measurement
if (xy=='x') {
        
        // 2 vertical lines
        lines[0]= new Array( new Array(a, c+(gap)*dir) );
        lines[0].push ( new Array(a, c+(gap+size)*dir) );
        lines[1]= new Array( new Array(b, c+(gap)*dir) );
        lines[1].push( new Array(b, c+(gap+size)*dir) );
        
        // 1 horizontal line
        lines[2]= new Array( new Array(a, c+(gap+size/2)*dir ) );
        lines[2].push( new Array(b, c+(gap+size/2)*dir ) );
        
        // create text label
        
            var t = specLabel( w, (a+b)/2, lines[0][1][1] );
        }

    // draw the lines
    var specgroup = new Array(t);
    
    for (var i=0; i<lines.length; i++) {
        var p = doc.pathItems.add();
        p.setEntirePath ( lines[i] );
        setLineStyle( p, color );
        specgroup.push( p );
    }

    group(speclayer, specgroup );
}
/**
    Create a text label that specify the dimension
*/
function specLabel( val, x, y) {
        
        var t = doc.textFrames.add();
        t.textRange.characterAttributes.size = 18;
        t.textRange.characterAttributes.alignment = StyleRunAlignmentType.center;

        var v = val;
        switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
                
            default:
                v = v.toFixed (decimals);
        }
        
        t.contents = v;
        t.top = y;
        t.left = x;
        
        return t;
    
}

function setLineStyle(path, color) {
        path.filled = false;
        path.stroked = true;
        path.strokeColor = color;
        path.strokeWidth = 0.5;
        
        return path;
}


/**
* Group items in a layer
*/
function group( layer, items, isDuplicate) {
    
    // create new group
    var gg = layer.groupItems.add();

    // add to group
    // reverse count, because items length is reduced as items are moved to new group
    for(var i=items.length-1; i>=0; i--) {
    
        if (items[i]!=gg) { // don't group the group itself
            if (isDuplicate) {
                newItem = items[i].duplicate (gg, ElementPlacement.PLACEATBEGINNING);
            } else {
                items[i].move( gg, ElementPlacement.PLACEATBEGINNING );
            }
        }
    }

    return gg;
}
 
Сейчас вьідает ошибку
Тут
Код:
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds, where );
        }  else {
            alert('please select 1 or 2 items');
    }
specSingle( doc.selection[0].geometricBounds, where );
тут spec может нужно заменить на название лейера ? потомучто изначально он назьівался именно как spec
но всеравно не помогает
 
Последнее редактирование:
Я просто логики вашего скрипта не особо понимаю. Что есть параметр where и какой он должен быть?
 
А понял, он и не используется - какой то рудимент. Уберите его вообще
JavaScript:
// document
var doc = activeDocument;

// spec layer
try {
    var speclayer =doc.layers['WYMIARY'];
} catch(err) {
    var speclayer = doc.layers.add();
    speclayer.name = 'WYMIARY';
}

// measurement line color
var color = new CMYKColor;
color.cyan = 100;
color.black = 35;

// gap between measurement lines and object
var gap = 10;

// size of measurement lines.
var size = 30;

// number of decimal places
var decimals = 0;

// pixels per inch
var dpi = 72;

/**
    Start the spec
*/

    
    if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds );
        }  else {
            alert('please select 1 or 2 items');
    }



/**
    spec a single object
    @param bound item.geometricBound
    @param where 'top', 'bottom', 'left,' 'right'
*/
function specSingle( bound ) {
    
    // width and height
    var w = bound[2]-bound[0];
    var h = bound[1]-bound[3];

    // a & b are the horizontal or vertical positions that change
    // c is the horizontal or vertical position that doesn't change
    var a = bound[0];
    var b = bound[2];
    var c = bound[1];
    
    // xy='x' (horizontal measurement), xy='y' (vertical measurement)
    var xy = 'x';
    
    // a direction flag for placing the measurement lines.
    var dir = 1;
    
             a = bound[0];
            b = bound[2];
            c = bound[1];
            xy = 'x';
            dir = 1;   
    

    // create the measurement lines
    var lines = new Array();
    
    // horizontal measurement
if (xy=='x') {
        
        // 2 vertical lines
        lines[0]= new Array( new Array(a, c+(gap)*dir) );
        lines[0].push ( new Array(a, c+(gap+size)*dir) );
        lines[1]= new Array( new Array(b, c+(gap)*dir) );
        lines[1].push( new Array(b, c+(gap+size)*dir) );
        
        // 1 horizontal line
        lines[2]= new Array( new Array(a, c+(gap+size/2)*dir ) );
        lines[2].push( new Array(b, c+(gap+size/2)*dir ) );
        
        // create text label
        
            var t = specLabel( w, (a+b)/2, lines[0][1][1] );
        }

    // draw the lines
    var specgroup = new Array(t);
    
    for (var i=0; i<lines.length; i++) {
        var p = doc.pathItems.add();
        p.setEntirePath ( lines[i] );
        setLineStyle( p, color );
        specgroup.push( p );
    }

    group(speclayer, specgroup );
}
/**
    Create a text label that specify the dimension
*/
function specLabel( val, x, y) {
        
        var t = doc.textFrames.add();
        t.textRange.characterAttributes.size = 18;
        t.textRange.characterAttributes.alignment = StyleRunAlignmentType.center;

        var v = val;
        switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
                
            default:
                v = v.toFixed (decimals);
        }
        
        t.contents = v;
        t.top = y;
        t.left = x;
        
        return t;
    
}

function setLineStyle(path, color) {
        path.filled = false;
        path.stroked = true;
        path.strokeColor = color;
        path.strokeWidth = 0.5;
        
        return path;
}


/**
* Group items in a layer
*/
function group( layer, items, isDuplicate) {
    
    // create new group
    var gg = layer.groupItems.add();

    // add to group
    // reverse count, because items length is reduced as items are moved to new group
    for(var i=items.length-1; i>=0; i--) {
    
        if (items[i]!=gg) { // don't group the group itself
            if (isDuplicate) {
                newItem = items[i].duplicate (gg, ElementPlacement.PLACEATBEGINNING);
            } else {
                items[i].move( gg, ElementPlacement.PLACEATBEGINNING );
            }
        }
    }

    return gg;
}
 
  • Спасибо
Реакции: Dmitri_J
А понял, он и не используется - какой то рудимент. Уберите его вообще

Супер ! спасибо огромное все работает только я не до конца еще понимаю все части кода например что дает єтот переключатель switch

Код:
switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
               
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
               
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
               
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
               
            default:
                v = v.toFixed (decimals);
        }
       
        t.contents = v;
        t.top = y;
        t.left = x;
       
        return t;
   
}

Он смотрит в настройках какая еденица измерения выбрана и соответственно записивает уже в актуальной еденице измерения?
поясните пожалуйста как для совсем чайника )) потому что я пока не совсем понимаю как думает програма )

и например пока не разобрался как выставить отступ текста от линии
 
Последнее редактирование:
И можно ли теперь весь этот код взять в function дать имя и вызывать например после выделения нужного обьекта
например:
JavaScript:
function wymiarTop () {
...
...   
}

document.getSelection(name pathItems) // выделение обьекта 
    wymiarTop () // вызов функции
 
Супер ! спасибо огромное все работает только я не до конца еще понимаю все части кода например что дает єтот переключатель switch

Код:
switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
               
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
               
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
               
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
               
            default:
                v = v.toFixed (decimals);
        }
       
        t.contents = v;
        t.top = y;
        t.left = x;
       
        return t;
   
}

Он смотрит в настройках какая еденица измерения выбрана и соответственно записивает уже в актуальной еденице измерения?
Да.
И можно ли теперь весь этот код взять в function дать имя и вызывать например после выделения нужного обьекта
например:
JavaScript:
function wymiarTop () {
...
...   
}

document.getSelection(name pathItems) // выделение обьекта 
    wymiarTop () // вызов функции
Не совсем понял, что вы хотите, кусок кода выглядит совсем безумно и не поясняет но только запутыаает
 
Да.

Не совсем понял, что вы хотите, кусок кода выглядит совсем безумно и не поясняет но только запутыаает
ну то есть
JavaScript:
var docRef = app.activeDocument;
var Koef_mm = 2.834645
var Szer_1P = prompt('Wpisż znaczenie krótkiej strony', 100) ;
var Szer_2P = prompt('Wpisż znaczenie długej strony?', 100);
var Wys_1P = prompt('Wpisż wysokość kartonu?', '');
var Szer_kr = (Koef_mm*Szer_1P)
var Szer_dl = (Koef_mm*Szer_2P)
var Wysokość = (Koef_mm*Wys_1P)
var Wysokość_klapki = (Szer_kr/2)
var noColor = new NoColor();

try {
    var speclayer =doc.layers['WYMIARY'];
} catch(err) {
    var speclayer = doc.layers.add();
    speclayer.name = 'WYMIARY';
}

// measurement line color
var color = new CMYKColor;
color.cyan = 100;
color.black = 35;

// gap between measurement lines and object
var gap = 10;

// size of measurement lines.
var size = 30;

// number of decimal places
var decimals = 0;

// pixels per inch
var dpi = 72;


if ( app.documents.length > 0 ) {
var spotCount = app.activeDocument.spots.length;
  if (spotCount > 0) {
    app.activeDocument.spots.removeAll();
  }
}

var newSpot = doc.spots.add();
// Define the new color value
var newColor = new CMYKColor();
newColor.magenta = 100;
newColor.yellow = 100;
newSpot.name = "SIATKA";
newSpot.colorType = ColorModel.SPOT;
newSpot.color = newColor;
var newSpotColor = new SpotColor();
newSpotColor.spot = newSpot;
newSpotColor.tint = 100;

//  Srodek kartonu

var Klap_smal1 = docRef.pathItems.rectangle(100, 100, Szer_kr, Wysokość);
Klap_smal1.fillColor = noColor;
Klap_smal1.strokeColor = newColor;
redraw();
var Klap_big1 = docRef.pathItems.rectangle(100, 100+Szer_kr, Szer_dl, Wysokość);
Klap_big1.fillColor = noColor;
Klap_big1.strokeColor = newColor;
redraw();
var Klap_smal2 = docRef.pathItems.rectangle(100, 100+Szer_kr+Szer_dl, Szer_kr, Wysokość);
Klap_smal2.fillColor = noColor;
Klap_smal2.strokeColor = newColor;
redraw();
var Klap_big2 = docRef.pathItems.rectangle(100, 100+Szer_kr+Szer_dl+Szer_kr, Szer_dl, Wysokość);
Klap_big2.fillColor = noColor;
Klap_big2.strokeColor = newColor;
redraw();

//  Gorne Klapki

var Klap_smal1_1 = docRef.pathItems.rectangle(100+Wysokość_klapki, 100, Szer_kr, Wysokość_klapki);
Klap_smal1_1.fillColor = noColor;
Klap_smal1_1.strokeColor = newColor;
redraw();
var Klap_big1_1 = docRef.pathItems.rectangle(100+Wysokość_klapki, 100+Szer_kr, Szer_dl, Wysokość_klapki);
Klap_big1_1.fillColor = noColor;
Klap_big1_1.strokeColor = newColor;
redraw();
var Klap_smal1_2 = docRef.pathItems.rectangle(100+Wysokość_klapki, 100+Szer_kr+Szer_dl, Szer_kr, Wysokość_klapki);
Klap_smal1_2.fillColor = noColor;
Klap_smal1_2.strokeColor = newColor;
redraw();
var Klap_big1_2 = docRef.pathItems.rectangle(100+Wysokość_klapki, 100+Szer_kr+Szer_dl+Szer_kr, Szer_dl, Wysokość_klapki);
Klap_big1_2.fillColor = noColor;
Klap_big1_2.strokeColor = newColor;
redraw();

//  Dolne Klapki

var Klap_smal2_1 = docRef.pathItems.rectangle(100-Wysokość, 100, Szer_kr, Wysokość_klapki);
Klap_smal2_1.fillColor = noColor;
Klap_smal2_1.strokeColor = newColor;
redraw();
var Klap_big2_1 = docRef.pathItems.rectangle(100-Wysokość, 100+Szer_kr, Szer_dl, Wysokość_klapki);
Klap_big2_1.fillColor = noColor;
Klap_big2_1.strokeColor = newColor;
redraw();
var Klap_smal2_2 = docRef.pathItems.rectangle(100-Wysokość, 100+Szer_kr+Szer_dl, Szer_kr, Wysokość_klapki);
Klap_smal2_2.fillColor = noColor;
Klap_smal2_2.strokeColor = newColor;
redraw();
var Klap_big2_2 = docRef.pathItems.rectangle(100-Wysokość, 100+Szer_kr+Szer_dl+Szer_kr, Szer_dl, Wysokość_klapki);
Klap_big2_2.fillColor = noColor;
Klap_big2_2.strokeColor = newColor;
redraw();

потом вставить часть кода с размеркой

JavaScript:
  if (doc.selection.length==1) {
        specSingle( doc.selection[0].geometricBounds );
        }  else {
            alert('please select 1 or 2 items');
    }



/**
    spec a single object
    @param bound item.geometricBound
    @param where 'top', 'bottom', 'left,' 'right'
*/
function specSingle( bound ) {
    
    // width and height
    var w = bound[2]-bound[0];
    var h = bound[1]-bound[3];

    // a & b are the horizontal or vertical positions that change
    // c is the horizontal or vertical position that doesn't change
    var a = bound[0];
    var b = bound[2];
    var c = bound[1];
    
    // xy='x' (horizontal measurement), xy='y' (vertical measurement)
    var xy = 'x';
    
    // a direction flag for placing the measurement lines.
    var dir = 1;
    
             a = bound[0];
            b = bound[2];
            c = bound[1];
            xy = 'x';
            dir = 1;   
    

    // create the measurement lines
    var lines = new Array();
    
    // horizontal measurement
if (xy=='x') {
        
        // 2 vertical lines
        lines[0]= new Array( new Array(a, c+(gap)*dir) );
        lines[0].push ( new Array(a, c+(gap+size)*dir) );
        lines[1]= new Array( new Array(b, c+(gap)*dir) );
        lines[1].push( new Array(b, c+(gap+size)*dir) );
        
        // 1 horizontal line
        lines[2]= new Array( new Array(a, c+(gap+size/2)*dir ) );
        lines[2].push( new Array(b, c+(gap+size/2)*dir ) );
        
        // create text label
        
            var t = specLabel( w, (a+b)/2, lines[0][1][1] );
        }

    // draw the lines
    var specgroup = new Array(t);
    
    for (var i=0; i<lines.length; i++) {
        var p = doc.pathItems.add();
        p.setEntirePath ( lines[i] );
        setLineStyle( p, color );
        specgroup.push( p );
    }

    group(speclayer, specgroup );
}
/**
    Create a text label that specify the dimension
*/
function specLabel( val, x, y) {
        
        var t = doc.textFrames.add();
        t.textRange.characterAttributes.size = 18;
        t.textRange.characterAttributes.alignment = StyleRunAlignmentType.center;

        var v = val;
        switch (doc.rulerUnits) {
            case RulerUnits.Inches:
                v = val/dpi;
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Centimeters:
                v = val/(dpi/2.54);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Millimeters:
                v = val/(dpi/25.4);
                v = v.toFixed (decimals);
                break;
                
            case RulerUnits.Picas:
                v = val/(dpi/6);
                var vd = v - Math.floor (v);
                vd = 12*vd;
                v =  Math.floor(v)+'p'+vd.toFixed (decimals);
                break;
                
            default:
                v = v.toFixed (decimals);
        }
        
        t.contents = v;
        t.top = y;
        t.left = x;
        
        return t;
    
}

function setLineStyle(path, color) {
        path.filled = false;
        path.stroked = true;
        path.strokeColor = color;
        path.strokeWidth = 0.5;
        
        return path;
}


/**
* Group items in a layer
*/
function group( layer, items, isDuplicate) {
    
    // create new group
    var gg = layer.groupItems.add();

    // add to group
    // reverse count, because items length is reduced as items are moved to new group
    for(var i=items.length-1; i>=0; i--) {
    
        if (items[i]!=gg) { // don't group the group itself
            if (isDuplicate) {
                newItem = items[i].duplicate (gg, ElementPlacement.PLACEATBEGINNING);
            } else {
                items[i].move( gg, ElementPlacement.PLACEATBEGINNING );
            }
        }
    }

    return gg;
}

и в это место (// Gorne Klapki) нужно добавить на эти 4 прямоугольника размеры
то есть для Klap_smal1_1, Klap_big1_1, Klap_smal1_2, Klap_big1_2
я так понимаю им нужно дать имя то есть присвоить name и потом через селект выделить и запустить
функцию с второй частью кода
или это я сильно намудрил и можно сделать все намного проще ?