// ЗАТАЛКИВАЕТ АКТИВНЫЙ СЛОЙ АКТИВНОГО ДОКУМЕНТА
// В ГРАНИЦЫ СЕЛЕКЦИИ ЦЕЛЕВОГО ДОКУМЕНТА КОТОРЫЙ
// ДОЛЖЕН БЫТЬ В СПИСКЕ Window ПЕРВЫМ
// ДЛЯ ФШ ВЕРСИИ CS2!!!
#target photoshop
app.bringToFront();
// целевой документ должен быть первым с списке Window
// если он активный то скрипт не выполняется
if (documents[0] != app.activeDocument) {
// целевой документ
var doc0 = documents[0];
// remember unit settings and change to pixels
var originalRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
var bnds = getSelectionBounds(doc0); // габариты
var w = bnds[2]-bnds[0]; // ширина
var h = bnds[3]-bnds[1]; // высота
// активный документ
var doc = app.activeDocument;
doc.changeMode(ChangeMode.RGB);
// имя файла без расширения
var docName = doc.name.substring(0, doc.name.lastIndexOf("."));
var l = doc.activeLayer.duplicate(doc0,ElementPlacement.PLACEATBEGINNING);
doc.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument = doc0;
l.name = docName;
var lbnd = l.bounds;
for (var i = 0; i < lbnd.length; i++) {
lbnd[i] = lbnd[i].value;
}
var lw = lbnd[2]-lbnd[0]; // ширина слоя
var lh = lbnd[3]-lbnd[1]; // высота слоя
var kw = (w/lw)*100;
var kh = (h/lh)*100;
// коэффициент масштабирования:
// по короткой стороне выделения: kw > kh
// по длинной: kw < kh
if (kw < kh) { var km = kh} else { var km = kw};
l.resize(km, km, AnchorPosition.TOPLEFT);
var k = 72/doc0.resolution; // из-за бага translate в ЦС2
l.translate((bnds[0]-lbnd[0])*k, (bnds[1]-lbnd[1])*k);
// добавить слоевую маску по селекции
addMaskFromSelection();
// снять связь с маской (unlink)
linkLayerMask(false);
// restore original unit setting
preferences.rulerUnits = originalRulerUnits;
} else {
alert("Целевой документ не имеет селекции");
}
function getSelectionBounds(doc) {
var doc0 = app.activeDocument;
app.activeDocument = doc;
var l = doc.artLayers.add();
doc.selection.fill(app.foregroundColor);
var bnds = l.bounds;
l.remove();
for (var i = 0; i < bnds.length; i++) {
bnds[i] = bnds[i].value;
}
app.activeDocument = doc0;
return bnds;
}
function addMaskFromSelection() {
var desc = new ActionDescriptor();
desc.putClass( 1316429856, 1130917484 );
var ref = new ActionReference();
ref.putEnumerated( 1130917484, 1130917484, 1299409696 );
desc.putReference( 1098129440, ref );
desc.putEnumerated( 1433628263, 1433629261, 1383492691 );
executeAction( 1298866208, desc, DialogModes.NO );
}
function linkLayerMask(bool){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated( 1283027488, 1332896878, 1416783732 );
desc.putReference( 1853189228, ref );
var desc1 = new ActionDescriptor();
desc1.putBoolean( 1433629299, bool );
desc.putObject( 1411391520, 1283027488, desc1 );
executeAction( 1936028772, desc, DialogModes.NO );
returnToLayer();
}
function returnToLayer() {
var savedLayerRef = app.activeDocument.activeLayer;
app.activeDocument.activeLayer = app.activeDocument.artLayers[app.activeDocument.artLayers.length - 1];
app.activeDocument.activeLayer = savedLayerRef;
}