just following up on this....this is truly a great breakthrough, knowing how hard and nearly impossible to achieve this....is it possible to better format this based on my attached guide?
Appreciate a lot on your help so far....thx!
Script for Adding Text Info Details
-
mycort
Script for Adding Text Info Details
Can anyone help better format this script for me?
Here's the attachment again.
Here's the attachment again.
-
pfaffenbichler
Script for Adding Text Info Details
I mentioned
Key 14 = color: DescValueType.OBJECTTYPE
in a previous post, so you should be able to get the color for the various elements.
Setting up if-clauses to only present textStyleRanges’ size etc. if they differ from the first letter’s should be no big problem, either.
Placing the texts beneath the respective textStyleRanges poses a problem, as their positions within the canvas are not immediately accessible.
Workarounds seem conceivable (possibly via »Create Work Path« or by recreating the text layer with other colors, but that would necessitate a more complete assessment of all type features, or by Color Range selection, but that could be tricky if a color is being used for several parts).
Maybe you should start a new thread to attract others’ attention.
Key 14 = color: DescValueType.OBJECTTYPE
in a previous post, so you should be able to get the color for the various elements.
Setting up if-clauses to only present textStyleRanges’ size etc. if they differ from the first letter’s should be no big problem, either.
Placing the texts beneath the respective textStyleRanges poses a problem, as their positions within the canvas are not immediately accessible.
Workarounds seem conceivable (possibly via »Create Work Path« or by recreating the text layer with other colors, but that would necessitate a more complete assessment of all type features, or by Color Range selection, but that could be tricky if a color is being used for several parts).
Maybe you should start a new thread to attract others’ attention.
-
mycort
Script for Adding Text Info Details
Thanks for replying back.......
I'm not really good enough to append these Key functions to the code properly, , especially color .
If the position is not doable, what about atleast just displaying the different font styles as seperate font layers....I will then just manually move them to the appropriate place....
Can I get your help on atleast doing this?
Thx alot.
I'm not really good enough to append these Key functions to the code properly, , especially color .
If the position is not doable, what about atleast just displaying the different font styles as seperate font layers....I will then just manually move them to the appropriate place....
Can I get your help on atleast doing this?
Thx alot.
-
pfaffenbichler
Script for Adding Text Info Details
I have other work to do.
Maybe you can attract someone else’s attention better if you start a new thread.
Maybe you can attract someone else’s attention better if you start a new thread.
-
mycort
Script for Adding Text Info Details
Howdy,
No problem man and thank you for all your effort on this....I will try to get someone else to help me with this, maybe someone at my work.....Tried pinging PaulMR to help with this but seems like this is beyond his skills.....
Take care man and thanks again!
No problem man and thank you for all your effort on this....I will try to get someone else to help me with this, maybe someone at my work.....Tried pinging PaulMR to help with this but seems like this is beyond his skills.....
Take care man and thanks again!
-
pfaffenbichler
Script for Adding Text Info Details
Tried pinging PaulMR to help with this but seems like this is beyond his skills.....
I very much doubt that, the task is of limited appeal though, I guess, if one does not work with text in Photoshop a lot.
I very much doubt that, the task is of limited appeal though, I guess, if one does not work with text in Photoshop a lot.
-
Paul MR
Script for Adding Text Info Details
For some reason, the more I look at text layers the less I know, as an example here is a PSD with three text layers.
If you select each layer in turn and run:-
alert(activeDocument.activeLayer.textItem.size);
Only one of the layers returns a size, the others error as there is no size key.
If you select each layer in turn and run:-
alert(activeDocument.activeLayer.textItem.size);
Only one of the layers returns a size, the others error as there is no size key.
-
mycort
Script for Adding Text Info Details
Just following up on this if anyOne can help me format this text script better.....greatly appreciate the help.
-
mycort
Script for Adding Text Info Details
Hi pfaffenbichler and others who can help,
I found someone at work to help me with this but he has a question about something, below is his quote:
So, I'm stuck here. In your UltimateMeasure_blahblahblah.jsx on line 968 there is a loop that iterates through different fonts in the text layer. There are properties like
textStyle
from
to
fontPostScriptName
I cannot find information on what other properties exist on this object. I need something like 'from' property, but now it returns the number of letter in the text layer where the new font starts. But i need it in pixels. Can someone point me to the list of properties that exist on that object?
Script:
Code: Select all /*
DISCLAIMER / TERMS & CONDITIONS / CREDITS
---------------------------------------------------------------------------------------------------------------------------------------------------
Pixel Measure v0.04 - Photoshop script for adding pixel measurements to your mockups
Copyright (C) 2009 Nikolaj Selvik
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
---------------------------------------------------------------------------------------------------------------------------------------------------
Updated by Bezzy Weitz (Magical Coder - a million thx for his time) & Mycort (GUI Artist & Idea Man)
Creators of functions 3 -> 7 (4/15/2012 - v0.05). Specifc code edits and additions include:
- 4 measures using "L"shaped selection
- 2 measures using crosshair selections
- 6 measures of inner/outer box
- Simultaneous Measure (Vert & Horiz -All at once)
- Arrow edge drawing (toggle function)
- Adding "var" section for easier editing of toggled functions
- Long extended edge line (8 point Detection Function)
Code snippets and advice help courtesy of (bb/)
- Working code for converting selection to paths to detect values of simultaneous measures
- Centering of labels/cut line
- Making the code faster with the addition of Script Listener
- In multiple measures mode, new function to link both lines/label together for easier movement
- Font analyzer, creation of text layer info, multiple selection
==========================================================================================
Got questions or suggestions for further improvement?
- Contact me at: mycort@yahoo.com
- A little plug for my portfolio site: mycort.deviantart.com/gallery
==========================================================================================
Great many thanks to Nikolaj Selvik, the developer who first and initially created this time saving tool.
- Original creator of functions 1 & 2 (Horizontal & vertical "single" selection)
- Uncentered Label
- Line edge drawing
---------------------------------------------------------------------------------------------------------------------------------------------------
*/
#target photoshop
// =======================================================
// Toggle functions (put true or false here to turn on/off features)
// =======================================================
var make_arrows = true;
var make_centered_labels = true;
var make_bold_labels = true;
var use_fast_draw = false;
var LinkLayers =false;
var font_size = 10;
var arrow_size = 3;
// =======================================================
var mainLayerSet;
var layerSetRef;
var rectInfo;
var rectangleList;
var originalUnit = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
var myDocument = app.activeDocument;
var theLayer = myDocument.activeLayer;
var myDoc = app.activeDocument;
var myLayer = myDoc.activeLayer;
var origResolution = myDocument.resolution;
myDocument.resizeImage(undefined, undefined, 72, ResampleMethod.NONE);
app.displayDialogs = DialogModes.NO;
if(validateState()){
app.activeDocument.suspendHistory("Pixel Specs", "pm();");
};
myDocument.resolution = origResolution;
////////////////////////////////////
function pm()
{
// =======================================================
// Create Layer Sets
// =======================================================
try
{
mainLayerSet = app.activeDocument.layerSets.getByName("Pixel Specs");
}
catch(error)
{
mainLayerSet = app.activeDocument.layerSets.add();
mainLayerSet.name = "Pixel Specs";
}
layerSetRef = mainLayerSet.layerSets.add();
// Determine how many independent rectangles exist in the selection
rectInfo = getRectangles();
rectangleList = rectInfo.bounds;
if ( rectangleList.length == 2 && ( is_inside( rectangleList[0], rectangleList[1] ) || is_inside( rectangleList[1], rectangleList[0] ) ) )
createMeasure();
else if ( rectangleList.length == 1 )
{
if ( rectInfo.longinfo[0] === false )
createMeasure();
else
createLongLabel( rectInfo.longinfo[0] );
} else if ( rectangleList.length > 1 )
createMultipleMeasures();
app.activeDocument.selection.deselect();
if(rectangleList.length > 1){
layerSetRef.name = "Multiple Measures";
}
}
//Linking function of multiple measures
if (LinkLayers){
if(activeDocument.activeLayer.typename != "LayerSet"){
if(activeDocument.activeLayer.parent.typename = "LayerSet"){
activeDocument.activeLayer = activeDocument.activeLayer.parent;
}
if(rectangleList.length > 1){
var doc = activeDocument;
var thisSet = doc.activeLayer;
var LayerList = new Array();
for(var a =0 ;a<thisSet.layers.length;a++){
activeDocument.activeLayer= thisSet.layers[a];
LayerList.push(getActiveLayerIndex());
}
while(LayerList.length>0){
selectLayerByIndex(Number(LayerList.shift()));
selectLayerByIndex(Number(LayerList.shift()),true);
linkSelectedLayers();
}
}
}
}
function validateState()
{
if (app.documents.length == 0)
{
alert("No document open");
return false;
}
if(!hasSelection(app.activeDocument))
{
if (myLayer.kind == LayerKind.TEXT) {multiselectfontreader(); return false}
else {loadTransparency()}
}
return true;
}
function is_inside( r1, r2 )
{
return r1[0] <= r2[0] && r1[1] <= r2[1] && r1[2] >= r2[2] && r1[3] >= r2[3];
}
function createMultipleMeasures()
{
for( var i=0; i<rectangleList.length; i++ )
{
if ( rectInfo.longinfo[ i ] === false )
{
if ( rectangleList[2] - rectangleList[0] > rectangleList[3] - rectangleList[1] )
createLabel( rectangleList[0], parseInt(rectangleList[1]+(rectangleList[3]-rectangleList[1])/2)-5, rectangleList[2], parseInt(rectangleList[1]+(rectangleList[i][3]-rectangleList[i][1])/2)+5, true );
else
createLabel( parseInt(rectangleList[i][0]+(rectangleList[i][2]-rectangleList[i][0])/2)-5, rectangleList[i][1], parseInt(rectangleList[i][0]+(rectangleList[i][2]-rectangleList[i][0])/2)+5, rectangleList[i][3], false );
} else
{
createLongLabel( rectInfo.longinfo[ i ] );
}
}
}
function createMeasure()
{
var docRef = app.activeDocument;
var selRef = docRef.selection;
var channelRef;
var is_rect = false;
// =======================================================
// Set Up Selection
// =======================================================
var fx1 = selRef.bounds[0].value;
var fy1 = selRef.bounds[1].value;
var fx2 = selRef.bounds[2].value;
var fy2 = selRef.bounds[3].value;
try
{
channelRef = docRef.channels.getByName("Pixel Specs");
} catch(error)
{
channelRef = docRef.channels.add();
channelRef.name = "Pixel Specs";
channelRef.kind = ChannelType.SELECTEDAREA;
}
docRef.selection.store(docRef.channels["Pixel Specs"], SelectionType.EXTEND);
var shapeRef = [ [fx1,fy1],[fx2,fy1],[fx2,fy2],[fx1,fy2] ];
selRef.select( shapeRef, SelectionType.EXTEND );
selRef.load( docRef.channels["Pixel Specs"], SelectionType.DIMINISH );
channelRef.remove();
try
{
var x1 = selRef.bounds[0].value;
var y1 = selRef.bounds[1].value;
var x2 = selRef.bounds[2].value;
var y2 = selRef.bounds[3].value;
} catch(error)
{
// No selection bound - this means getting the inverse resulted in no selection,
// so assume negative shape did not exist (original selection was rectangle)
selRef.select( shapeRef );
is_rect = true;
x1 = fx1; y1 = fy1; x2 = fx2; y2 = fy2;
}
rectInfo = getRectangles();
var inverseRectList = rectInfo.bounds;
docRef.selection.deselect();
// =======================================================
// Draw Labels
// =======================================================
var inner = { 'top':false,'bottom':false,'left':false,'right':false };
// Look for left measurement
if ( fx1 < x1 )
{
inner.left = true;
if ( fy1 == y1 )
createLabel( fx1, fy1-11, x1, fy1, true );
else if ( fy2 == y2 )
createLabel( fx1, fy2, x1, fy2+10, true );
else
createLabel( fx1, parseInt(fy1+(fy2-fy1)/2)-5, x1, parseInt(fy1+(fy2-fy1)/2)+5, true );
}
// Look for right measurement
if ( fx2 > x2 )
{
if ( ! inner.left )
inner.right = true;
if ( fy1 == y1 )
createLabel( x2, fy1-11, fx2, fy1, true );
else if ( fy2 == y2 )
createLabel( x2, fy2, fx2, fy2+10, true );
else
createLabel( x2, parseInt(fy1+(fy2-fy1)/2)-5, fx2, parseInt(fy1+(fy2-fy1)/2)+5, true );
}
// Look for top measurement
if ( fy1 < y1 )
{
inner.top = true;
if ( fx1 == x1 )
createLabel( fx1-11, fy1, fx1, y1, false );
else if ( fx2 == x2 )
createLabel( fx2, fy1, fx2+10, y1, false );
else
createLabel( parseInt(fx1+(fx2-fx1)/2)-5, fy1, parseInt(fx1+(fx2-fx1)/2)+5, y1, false );
}
// Look for bottom measurement
if ( fy2 > y2 )
{
if ( ! inner.top )
inner.bottom = true;
if ( fx1 == x1 )
createLabel( fx1-11, y2, fx1, fy2, false );
else if ( fx2 == x2 )
createLabel( fx2, y2, fx2+10, fy2, false );
else
createLabel( parseInt(fx1+(fx2-fx1)/2)-5, y2, parseInt(fx1+(fx2-fx1)/2)+5, fy2, false );
}
if ( is_rect )
{
// Only label the longest dimension when selection is a single rectangle
if ( fx2 - fx1 > fy2 - fy1 )
createMultipleMeasures(true);
else
createMultipleMeasures(false);
// Select containing folder (select was left on text layer, first item in folder)
if(activeDocument.activeLayer.parent.typename = "LayerSet"){
activeDocument.activeLayer = activeDocument.activeLayer.parent;
}
} else
{
// Label both dimensions of negative space when it exists
if ( inner.left )
createLabel( x1, y1, x1+10, y2, false );
if ( inner.right )
createLabel( x2-11, y1, x2, y2, false );
if ( inner.top )
createLabel( x1, y1, x2, y1+10, true );
if ( inner.bottom )
createLabel( x1, y2-11, x2, y2, true );
if ( !inner.left && !inner.right && !inner.top && !inner.bottom )
{
if ( inverseRectList.length == 4 )
{
// Horizontal bar: Q1.x2, Q1.y1, Q4.x1, Q4.y2
createLabel( inverseRectList[0][0], inverseRectList[0][3], inverseRectList[3][2], inverseRectList[3][1], true );
// Vertical bar: Q1.x1, Q1.y2, Q4.x2, Q4.y1
createLabel( inverseRectList[0][2], inverseRectList[0][1], inverseRectList[3][0], inverseRectList[3][3], false );
} else
{
// Normal rectangle (no negative inner space)
createLabel( x1, y1, x2, y2, true );
createLabel( x1, y1, x2, y2, false );
}
}
}
app.preferences.rulerUnits = originalUnit;
}
function getRectangles()
{
Array.prototype.numericSort = function() {
return this.sort( function (a,b) { return a-b; } );
};
makeWorkPath( .4 );
var tempPath = app.activeDocument.pathItems.getByName('Work Path');
var subPathCount = tempPath.subPathItems.length;
var subPathBounds = [];
var dirs = [];
for( sp = 0; sp<subPathCount;sp++ )
{
var b =[];
var xValues = [];
var yValues = [];
var pointCount = tempPath.subPathItems[sp].pathPoints.length;
var points = [];
for( var p=0;p<pointCount;p++ )
{
xValues.push( tempPath.subPathItems[sp].pathPoints[p].anchor[0] );
yValues.push( tempPath.subPathItems[sp].pathPoints[p].anchor[1] );
// Pull off the last point (x,y) and add to the list
points.push( [ xValues[xValues.length-1], yValues[yValues.length-1] ] );
}
xValues.numericSort();
yValues.numericSort();
var xMin = xValues[0];
var xMax = xValues[xValues.length-1];
var yMin = yValues[0];
var yMax = yValues[yValues.length-1];
subPathBounds.push([xMin,yMin,xMax,yMax]);
// Special case for 8 points - assume it's a rect with a cutout on one side. Cutout indicates
// we're in long side mode, and the label/line should be drawn on the opposing (to the cutout)
// side.
if ( pointCount == 8 )
{
var lines = [];
var label;
for( var p=0; p<points.length; p++ )
{
// Looking for a point that is along one side but not on a corner - that point is on the
// side opposite where the label will be drawn.
if ( (points[ p ][ 0 ] == xMin || points[ p ][ 0 ] == xMax) && points[ p ][ 1 ] != yMin && points[ p ][ 1 ] != yMax )
{
// Matching point is an x, so point is on a vertical side (either x1 or x2) and long lines are horizontal
lines.push( [ [ xMin, yMin ], [ xMax-( use_fast_draw ? 0 : 1 ), yMin ] ] );
lines.push( [ [ xMin, yMax-1 ], [ xMax-( use_fast_draw ? 0 : 1 ), yMax-1 ] ] );
if ( points[ p ][ 0 ] == xMin )
{
// Cut out is on the left line, so draw right line (inset for the arrow)
lines.push( [ [ xMax - arrow_size - 1, yMin ], [ xMax - arrow_size - 1, yMax - 1 ] ] );
label = [ xMax - 9, yMin ];
} else
{
// Cut out is on the right line, so draw left line (inset for the arrow)
lines.push( [ [ xMin + arrow_size, yMin ], [ xMin + arrow_size, yMax - 1 ] ] );
if (yMax - yMin < 30) {
label = [ xMin-38, yMin ];
} else {
label = [ xMin-2, yMin];
}
}
dirs.push( { 'lines':lines, 'horizontal':false, 'label':label } );
break;
} else if ( (points[ p ][ 1 ] == yMin || points[ p ][ 1 ] == yMax) && points[ p ][ 0 ] != xMin && points[ p ][ 0 ] != xMax )
{
// Matching point is a y, so point is on a horizontal side (either y1 or y2) and long lines are vertical
lines.push( [ [ xMin, yMin ], [ xMin, yMax-( use_fast_draw ? 0 : 1 ) ] ] );
lines.push( [ [ xMax-1, yMin ], [ xMax-1, yMax-( use_fast_draw ? 0 : 1 ) ] ] );
if ( points[ p ][ 1 ] == yMin )
{
// Cut out is on the top line, so draw bottom line (inset for the arrow)
lines.push( [ [ xMin, yMax - arrow_size - 1 ], [ xMax - 1, yMax - arrow_size - 1 ] ] );
label = [ xMin, yMax - 9 ];
} else
{
// Cut out is on the bottom line, so draw top line (inset for the arrow)
lines.push( [ [ xMin, yMin + arrow_size ], [ xMax - 1, yMin + arrow_size ] ] );
// Get the top left for the "region" for the label - this is used to plug into the old createLabel()
// style when calling drawTextLabels()
if (xMax - xMin < 45) {
label = [ xMin, yMin - 24 ];
} else {
label = [ xMin, yMin - 2 ];
}
}
dirs.push( { 'lines':lines, 'horizontal':true, 'label':label } );
break;
}
}
} else
{
dirs.push( false );
}
}
tempPath.makeSelection(0);
tempPath.remove();
return { 'bounds':subPathBounds, 'longinfo':dirs };
}
function createLongLabel( info )
{
app.activeDocument.selection.deselect();
var linesLayerRef = layerSetRef.artLayers.add();
linesLayerRef.name = "Line ";
drawLine( info.lines[0][0], info.lines[0][1], 1 ); // long side
drawLine( info.lines[1][0], info.lines[1][1], 1 ); // long side
drawLine( info.lines[2][0], info.lines[2][1], 1 ); // label side
drawArrows( info.lines[2][0], info.lines[2][1], info.horizontal );
drawTextLabels( info.horizontal, info.horizontal ? info.lines[2][1][0] - info.lines[2][0][0] + 1 : info.lines[2][1][1] - info.lines[2][0][1] + 1, info.label[0], info.label[1] )
}
function drawArrows( p1, p2, horizontal )
{
if ( !make_arrows )
return true;
for( var i=1; i<=arrow_size; i++ )
{
if ( horizontal )
{
drawLine( [p1[0] + 1 + i, p1[1] - i], [p1[0] + 1 + i, p1[1] + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
drawLine( [p2[0] - 1 - i, p1[1] - i], [p2[0] - 1 - i, p1[1] + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
} else
{
drawLine( [p1[0] - i, p1[1] + 1 + i], [p1[0] + i + ( use_fast_draw ? 1 : 0 ) , p1[1] + 1 + i], 1 );
drawLine( [p1[0] - i, p2[1] - 1 - i], [p1[0] + i + ( use_fast_draw ? 1 : 0 ) , p2[1] - 1 - i], 1 );
}
}
}
function createLabel( x1, y1, x2, y2, horizontal )
{
app.activeDocument.selection.deselect();
var linesLayerRef = layerSetRef.artLayers.add();
var width = x2 - x1;
var height = y2 - y1;
// =======================================================
// Draw Lines
// =======================================================
if (horizontal)
{
linesLayerRef.name = "Line ";
drawLine([x1,y1],[x1,y1+10 + ( use_fast_draw ? 1 : 0 )],1);
drawLine([x2-1,y1],[x2-1,y1+10 + ( use_fast_draw ? 1 : 0 )],1);
drawLine([x1,y1+5],[x2-1,y1+5],1);
if ( make_arrows )
{
for( var i=1; i<=arrow_size; i++ )
{
drawLine( [x1 + 1 + i, y1 + 5 - i], [x1 + 1 + i, y1 + 5 + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
drawLine( [x2 - 2 - i, y1 + 5 - i], [x2 - 2 - i, y1 + 5 + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
}
}
}
else
{
linesLayerRef.name = "Line ";
drawLine([x1,y1],[x1+10 + ( use_fast_draw ? 1 : 0 ),y1],1);
drawLine([x1,y2-1],[x1+10 + ( use_fast_draw ? 1 : 0 ),y2-1],1);
drawLine([x1+5,y1],[x1+5,y2-1],1);
if ( make_arrows )
{
for( var i=1; i<=arrow_size; i++ )
{
drawLine( [x1 + 5 - i, y1 + 1 + i], [x1 + 5 + i + ( use_fast_draw ? 1 : 0 ) , y1 + 1 + i], 1 );
drawLine( [x1 + 5 - i, y2 - 2 - i], [x1 + 5 + i + ( use_fast_draw ? 1 : 0 ) , y2 - 2 - i], 1 );
}
}
}
drawTextLabels( horizontal, horizontal ? width : height, x1, y1 );
}
function drawTextLabels( horizontal, size, x, y )
{
// =======================================================
// Draw Text
// =======================================================
var textLayerRef = layerSetRef.artLayers.add();
textLayerRef.kind = LayerKind.TEXT;
var textItemRef = textLayerRef.textItem;
if(rectangleList.length == 1){
textItemRef.contents = size + "px";
layerSetRef.name = textItemRef.contents;
}
if (horizontal)
{
if ( size<45 || !make_centered_labels )
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.justification = Justification.CENTER;
textItemRef.position = Array(Math.floor(x + (size/2)),y+20);
textItemRef.contents = size + "px";
} else
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.justification = Justification.CENTER;
textItemRef.position = Array(Math.floor(x + (size/2)),y+8);
textItemRef.contents = size + "px";
loadTransparency();
app.activeDocument.selection.expand( 4 );
selectLayerBelow();
app.activeDocument.selection.cut();
}
} else
{
if ( size<30 || !make_centered_labels )
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.position = Array(x+12,Math.floor(y + 4 + (size/2)));
textItemRef.contents = size + "px";
} else
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.justification = Justification.CENTER;
textItemRef.position = Array(x+5,Math.floor(y + 4 + (size/2)));
textItemRef.contents = size + "px";
loadTransparency();
app.activeDocument.selection.expand( 4 );
selectLayerBelow();
app.activeDocument.selection.cut();
}
}
}
function makeWorkPath( tolerance )
{
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass( charIDToTypeID('Path') );
desc.putReference( charIDToTypeID('null'), ref );
var ref2 = new ActionReference();
ref2.putProperty( charIDToTypeID('csel'), charIDToTypeID('fsel') );
desc.putReference( charIDToTypeID('From'), ref2 );
desc.putUnitDouble( charIDToTypeID('Tlrn'), charIDToTypeID('#Pxl'),tolerance );
executeAction( charIDToTypeID('Mk '), desc, DialogModes.NO );
}
function makeSelectionF()
{
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Chnl'), charIDToTypeID('fsel') );
desc.putReference( charIDToTypeID('null'), ref );
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Path'), charIDToTypeID('WrPt') );
desc.putReference( charIDToTypeID('T '), ref );
desc.putInteger( charIDToTypeID('Vrsn'), 1 );
desc.putBoolean( stringIDToTypeID('vectorMaskParams'), true );
executeAction( charIDToTypeID('setd'), desc, DialogModes.NO );
};
function drawLine_slower( x1, y1, x2, y2 )
{
var pointArray = new Array();
var pointA = new PathPointInfo();
pointA.kind = PointKind.CORNERPOINT;
pointA.anchor = Array(x1, y1);
pointA.leftDirection = pointA.anchor;
pointA.rightDirection = pointA.anchor;
pointArray.push(pointA);
var pointB = new PathPointInfo();
pointB.kind = PointKind.CORNERPOINT;
pointB.anchor = Array(x2, y2);
pointB.leftDirection = pointB.anchor;
pointB.rightDirection = pointB.anchor;
pointArray.push(pointB);
var line = new SubPathInfo();
line.operation = ShapeOperation.SHAPEXOR;
line.closed = false;
line.entireSubPath = pointArray;
var lineSubPathArray = new Array();
lineSubPathArray.push(line);
var linePath = app.activeDocument.pathItems.add("TempPath", lineSubPathArray);
linePath.strokePath(ToolType.PENCIL, false);
app.activeDocument.pathItems.removeAll();
};
function drawLine( startXY, endXY, width )
{
if ( !use_fast_draw )
return drawLine_slower( startXY[0], startXY[1], endXY[0], endXY[1] );
var desc = new ActionDescriptor();
var lineDesc = new ActionDescriptor();
var startDesc = new ActionDescriptor();
startDesc.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Pxl'), startXY[0] );
startDesc.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Pxl'), startXY[1] );
lineDesc.putObject( charIDToTypeID('Strt'), charIDToTypeID('Pnt '), startDesc );
var endDesc = new ActionDescriptor();
endDesc.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Pxl'), endXY[0] );
endDesc.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Pxl'), endXY[1] );
lineDesc.putObject( charIDToTypeID('End '), charIDToTypeID('Pnt '), endDesc );
lineDesc.putUnitDouble( charIDToTypeID('Wdth'), charIDToTypeID('#Pxl'), width );
desc.putObject( charIDToTypeID('Shp '), charIDToTypeID('Ln '), lineDesc );
desc.putBoolean( charIDToTypeID('AntA'), false );
executeAction( charIDToTypeID('Draw'), desc, DialogModes.NO );
};
function hasSelection(doc)
{
var res = false;
var as = doc.activeHistoryState;
doc.selection.deselect();
if (as != doc.activeHistoryState)
{
res = true;
doc.activeHistoryState = as;
}
return res;
}
function selectLayerBelow(){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Bckw" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
};
function selectLayerAbove(){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Frwr" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
};
function loadTransparency(Invert){
if(Invert == undefined) Invert = false;
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putProperty( charIDToTypeID( "Chnl" ), charIDToTypeID( "fsel" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
var ref1 = new ActionReference();
ref1.putEnumerated( charIDToTypeID( "Chnl" ), charIDToTypeID( "Chnl" ), charIDToTypeID( "Trsp" ) );
desc.putReference( charIDToTypeID( "T " ), ref1 );
desc.putBoolean( charIDToTypeID('Invr'), Invert);
executeAction( charIDToTypeID( "setd" ), desc, DialogModes.NO );
};
function selectLayerByIndex(index,add){
add = (add == undefined) ? add = false : add;
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), index);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref );
if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
try{
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
}catch(e){}
};
function getActiveLayerIndex() {
var ref = new ActionReference();
ref.putProperty( 1349677170 , 1232366921 );
ref.putEnumerated( 1283027488, 1332896878, 1416783732 );
try{
activeDocument.backgroundLayer;
var res = executeActionGet(ref).getInteger( 1232366921 )-1;
}catch(e){
var res = executeActionGet(ref).getInteger( 1232366921 ) ;
}
return res;
};
function linkSelectedLayers() {
var desc221 = new ActionDescriptor();
var ref142 = new ActionReference();
ref142.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
desc221.putReference( charIDToTypeID('null'), ref142 );
executeAction( stringIDToTypeID('linkSelectedLayers'), desc221, DialogModes.NO );
};
function loadVectorMask () {
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc14 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref9 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref9.putProperty( idChnl, idfsel );
desc14.putReference( idnull, ref9 );
var idT = charIDToTypeID( "T " );
var ref10 = new ActionReference();
var idPath = charIDToTypeID( "Path" );
var idPath = charIDToTypeID( "Path" );
var idvectorMask = stringIDToTypeID( "vectorMask" );
ref10.putEnumerated( idPath, idPath, idvectorMask );
var idLyr = charIDToTypeID( "Lyr " );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref10.putEnumerated( idLyr, idOrdn, idTrgt );
desc14.putReference( idT, ref10 );
var idVrsn = charIDToTypeID( "Vrsn" );
desc14.putInteger( idVrsn, 1 );
var idvectorMaskParams = stringIDToTypeID( "vectorMaskParams" );
desc14.putBoolean( idvectorMaskParams, true );
executeAction( idsetd, desc14, DialogModes.NO );
};
function loadLayerMask () {
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc21 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref14 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref14.putProperty( idChnl, idfsel );
desc21.putReference( idnull, ref14 );
var idT = charIDToTypeID( "T " );
var ref15 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref15.putEnumerated( idChnl, idChnl, idMsk );
desc21.putReference( idT, ref15 );
executeAction( idsetd, desc21, DialogModes.NO );
};
///////////////////////////////////////////////////////////////////////////////
// Function: hasVectorMask
// Usage: see if there is a vector layer mask
// Input: <none> Must have an open document
// Return: true if there is a vector mask
///////////////////////////////////////////////////////////////////////////////
function hasVectorMask() {
var hasVectorMask = false;
try {
var ref = new ActionReference();
var keyVectorMaskEnabled = app.stringIDToTypeID( 'vectorMask' );
var keyKind = app.charIDToTypeID( 'Knd ' );
ref.putEnumerated( app.charIDToTypeID( 'Path' ), app.charIDToTypeID( 'Ordn' ), keyVectorMaskEnabled );
var desc = executeActionGet( ref );
if ( desc.hasKey( keyKind ) ) {
var kindValue = desc.getEnumerationValue( keyKind );
if (kindValue == keyVectorMaskEnabled) {
hasVectorMask = true;
}
}
}catch(e) {
hasVectorMask = false;
}
return hasVectorMask;
};
function multiselectfontreader(){
// by paul riggott; MULTI-SELECT Function
app.bringToFront();
main();
function main(){
if(!documents.length) return;
var selLayers=[];
selLayers= getSelectedLayersIdx();
for (var a in selLayers){
makeActiveByIndex( selLayers[a], false );
//amend to suit.
readTextLayer ()
}
}
function getSelectedLayersIdx(){
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref);
if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){
desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
var c = desc.count
var selectedLayers = new Array();
for(var i=0;i<c;i++){
try{
activeDocument.backgroundLayer;
selectedLayers.push( desc.getReference( i ).getIndex() );
}catch(e){
selectedLayers.push( desc.getReference( i ).getIndex()+1 );
}
}
}else{
var ref = new ActionReference();
ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
try{
activeDocument.backgroundLayer;
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ))-1);
}catch(e){
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" )));
}
}
return selectedLayers;
};
function makeActiveByIndex( idx, visible ){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIndex(charIDToTypeID( "Lyr " ), idx)
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), visible );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
};
};
// Read one or more selected fonts
function readTextLayer() {
if (app.documents.length > 0) {
var myDoc = app.activeDocument;
var myLayer = myDoc.activeLayer;
if (myLayer.kind == LayerKind.TEXT) {
var thisText = myLayer.textItem;
// Renaming the Justifcation info from Justification.CENTER - > Center;
try {var theJustification = String(thisText.justification).replace("Justification.", "")}
catch(e) {var theJustification = "LEFT"};
theJustification = theJustification[0]+theJustification.slice(1, theJustification.length).toLowerCase();
// collect properties in a string;
try {var theLeading = thisText.leading}
catch (e) {var theLeading = "Auto"};
try {var theTracking = thisText.tracking}
catch (e) {var theTracking = "auto"};
var theString = "Font: " + thisText.font+"\rSize: "+thisText.size+"\rColor: #"+thisText.color.rgb.hexValue+ ((theLeading === 'Auto') ? '' : "\rLine Spacing: "+theLeading) +((theTracking === 0) ? '' : "\rTracking: "+theTracking)+"\rJustify: "+theJustification+"\r"+getFonts (app.activeDocument.activeLayer).join("\r");
addTextLayer (theString, "Font Info", [myLayer.bounds[0], myLayer.bounds[3] + 15])
}
}
};
//Add's a text layer which contains the content of the read string above
function addTextLayer (theText, theName, thePosition) {
var aTextLayer = app.activeDocument.artLayers.add();
aTextLayer.kind = LayerKind.TEXT;
aTextLayer.name = theName;
var aTextLayerRef = aTextLayer.textItem;
aTextLayerRef.kind = TextType.POINTTEXT;
aTextLayerRef.size = 10;
aTextLayerRef.font = "Arial-BoldMT";
aTextLayerRef.color = app.foregroundColor;
aTextLayerRef.justification = Justification.LEFT;
aTextLayerRef.position = thePosition;
aTextLayer.blendMode = BlendMode.NORMAL;
aTextLayer.opacity = 100;
aTextLayer.fillOpacity = 100;
aTextLayerRef.useAutoLeading = true;
aTextLayerRef.leading = 0;
aTextLayerRef.horizontalScale = 100;
aTextLayerRef.verticalScale = 100;
aTextLayerRef.contents = theText;
aTextLayerRef.antiAliasMethod = AntiAlias.SHARP;
};
////// get fonts and other parameters used in type layer //////
function getFonts (textLayer) {
if (textLayer.kind == LayerKind.TEXT) {
app.activeDocument.activeLayer = textLayer;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var layerDesc = executeActionGet(ref);
var textDesc = layerDesc.getObjectValue(stringIDToTypeID('textKey'));
var rangeList = textDesc.getList(stringIDToTypeID('textStyleRange'));
var theFonts = new Array;
for (var m = 0; m < rangeList.count; m++) {
var styleDesc = rangeList.getObjectValue(m).getObjectValue(stringIDToTypeID('textStyle'));
var aFrom = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('from'));
var aTo = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('to'));
var aFont = styleDesc.getString(stringIDToTypeID('fontPostScriptName'));
var theLetters = app.activeDocument.activeLayer.textItem.contents.slice(aFrom, aTo);
try {var aSize = styleDesc.getUnitDoubleValue(stringIDToTypeID('size')) + " " +typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('size')))}
catch (e) {var aSize = "default"};
try {var aTracking = styleDesc.getUnitDoubleValue(stringIDToTypeID('leading')) + " " +typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('leading')))}
catch (e) {var aTracking = "default"};
try {var aLeading = styleDesc.getInteger(stringIDToTypeID('tracking'))}
catch (e) {var aLeading = "default"};
theFonts.push("»"+theLetters+"«: font "+aFont+"; size "+aSize+"; tracking "+aTracking+"; leading "+aLeading+"; justify "+aLeading)
};
return (theFonts);
}
};
I found someone at work to help me with this but he has a question about something, below is his quote:
So, I'm stuck here. In your UltimateMeasure_blahblahblah.jsx on line 968 there is a loop that iterates through different fonts in the text layer. There are properties like
textStyle
from
to
fontPostScriptName
I cannot find information on what other properties exist on this object. I need something like 'from' property, but now it returns the number of letter in the text layer where the new font starts. But i need it in pixels. Can someone point me to the list of properties that exist on that object?
Script:
Code: Select all /*
DISCLAIMER / TERMS & CONDITIONS / CREDITS
---------------------------------------------------------------------------------------------------------------------------------------------------
Pixel Measure v0.04 - Photoshop script for adding pixel measurements to your mockups
Copyright (C) 2009 Nikolaj Selvik
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
---------------------------------------------------------------------------------------------------------------------------------------------------
Updated by Bezzy Weitz (Magical Coder - a million thx for his time) & Mycort (GUI Artist & Idea Man)
Creators of functions 3 -> 7 (4/15/2012 - v0.05). Specifc code edits and additions include:
- 4 measures using "L"shaped selection
- 2 measures using crosshair selections
- 6 measures of inner/outer box
- Simultaneous Measure (Vert & Horiz -All at once)
- Arrow edge drawing (toggle function)
- Adding "var" section for easier editing of toggled functions
- Long extended edge line (8 point Detection Function)
Code snippets and advice help courtesy of (bb/)
- Working code for converting selection to paths to detect values of simultaneous measures
- Centering of labels/cut line
- Making the code faster with the addition of Script Listener
- In multiple measures mode, new function to link both lines/label together for easier movement
- Font analyzer, creation of text layer info, multiple selection
==========================================================================================
Got questions or suggestions for further improvement?
- Contact me at: mycort@yahoo.com
- A little plug for my portfolio site: mycort.deviantart.com/gallery
==========================================================================================
Great many thanks to Nikolaj Selvik, the developer who first and initially created this time saving tool.
- Original creator of functions 1 & 2 (Horizontal & vertical "single" selection)
- Uncentered Label
- Line edge drawing
---------------------------------------------------------------------------------------------------------------------------------------------------
*/
#target photoshop
// =======================================================
// Toggle functions (put true or false here to turn on/off features)
// =======================================================
var make_arrows = true;
var make_centered_labels = true;
var make_bold_labels = true;
var use_fast_draw = false;
var LinkLayers =false;
var font_size = 10;
var arrow_size = 3;
// =======================================================
var mainLayerSet;
var layerSetRef;
var rectInfo;
var rectangleList;
var originalUnit = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;
var myDocument = app.activeDocument;
var theLayer = myDocument.activeLayer;
var myDoc = app.activeDocument;
var myLayer = myDoc.activeLayer;
var origResolution = myDocument.resolution;
myDocument.resizeImage(undefined, undefined, 72, ResampleMethod.NONE);
app.displayDialogs = DialogModes.NO;
if(validateState()){
app.activeDocument.suspendHistory("Pixel Specs", "pm();");
};
myDocument.resolution = origResolution;
////////////////////////////////////
function pm()
{
// =======================================================
// Create Layer Sets
// =======================================================
try
{
mainLayerSet = app.activeDocument.layerSets.getByName("Pixel Specs");
}
catch(error)
{
mainLayerSet = app.activeDocument.layerSets.add();
mainLayerSet.name = "Pixel Specs";
}
layerSetRef = mainLayerSet.layerSets.add();
// Determine how many independent rectangles exist in the selection
rectInfo = getRectangles();
rectangleList = rectInfo.bounds;
if ( rectangleList.length == 2 && ( is_inside( rectangleList[0], rectangleList[1] ) || is_inside( rectangleList[1], rectangleList[0] ) ) )
createMeasure();
else if ( rectangleList.length == 1 )
{
if ( rectInfo.longinfo[0] === false )
createMeasure();
else
createLongLabel( rectInfo.longinfo[0] );
} else if ( rectangleList.length > 1 )
createMultipleMeasures();
app.activeDocument.selection.deselect();
if(rectangleList.length > 1){
layerSetRef.name = "Multiple Measures";
}
}
//Linking function of multiple measures
if (LinkLayers){
if(activeDocument.activeLayer.typename != "LayerSet"){
if(activeDocument.activeLayer.parent.typename = "LayerSet"){
activeDocument.activeLayer = activeDocument.activeLayer.parent;
}
if(rectangleList.length > 1){
var doc = activeDocument;
var thisSet = doc.activeLayer;
var LayerList = new Array();
for(var a =0 ;a<thisSet.layers.length;a++){
activeDocument.activeLayer= thisSet.layers[a];
LayerList.push(getActiveLayerIndex());
}
while(LayerList.length>0){
selectLayerByIndex(Number(LayerList.shift()));
selectLayerByIndex(Number(LayerList.shift()),true);
linkSelectedLayers();
}
}
}
}
function validateState()
{
if (app.documents.length == 0)
{
alert("No document open");
return false;
}
if(!hasSelection(app.activeDocument))
{
if (myLayer.kind == LayerKind.TEXT) {multiselectfontreader(); return false}
else {loadTransparency()}
}
return true;
}
function is_inside( r1, r2 )
{
return r1[0] <= r2[0] && r1[1] <= r2[1] && r1[2] >= r2[2] && r1[3] >= r2[3];
}
function createMultipleMeasures()
{
for( var i=0; i<rectangleList.length; i++ )
{
if ( rectInfo.longinfo[ i ] === false )
{
if ( rectangleList[2] - rectangleList[0] > rectangleList[3] - rectangleList[1] )
createLabel( rectangleList[0], parseInt(rectangleList[1]+(rectangleList[3]-rectangleList[1])/2)-5, rectangleList[2], parseInt(rectangleList[1]+(rectangleList[i][3]-rectangleList[i][1])/2)+5, true );
else
createLabel( parseInt(rectangleList[i][0]+(rectangleList[i][2]-rectangleList[i][0])/2)-5, rectangleList[i][1], parseInt(rectangleList[i][0]+(rectangleList[i][2]-rectangleList[i][0])/2)+5, rectangleList[i][3], false );
} else
{
createLongLabel( rectInfo.longinfo[ i ] );
}
}
}
function createMeasure()
{
var docRef = app.activeDocument;
var selRef = docRef.selection;
var channelRef;
var is_rect = false;
// =======================================================
// Set Up Selection
// =======================================================
var fx1 = selRef.bounds[0].value;
var fy1 = selRef.bounds[1].value;
var fx2 = selRef.bounds[2].value;
var fy2 = selRef.bounds[3].value;
try
{
channelRef = docRef.channels.getByName("Pixel Specs");
} catch(error)
{
channelRef = docRef.channels.add();
channelRef.name = "Pixel Specs";
channelRef.kind = ChannelType.SELECTEDAREA;
}
docRef.selection.store(docRef.channels["Pixel Specs"], SelectionType.EXTEND);
var shapeRef = [ [fx1,fy1],[fx2,fy1],[fx2,fy2],[fx1,fy2] ];
selRef.select( shapeRef, SelectionType.EXTEND );
selRef.load( docRef.channels["Pixel Specs"], SelectionType.DIMINISH );
channelRef.remove();
try
{
var x1 = selRef.bounds[0].value;
var y1 = selRef.bounds[1].value;
var x2 = selRef.bounds[2].value;
var y2 = selRef.bounds[3].value;
} catch(error)
{
// No selection bound - this means getting the inverse resulted in no selection,
// so assume negative shape did not exist (original selection was rectangle)
selRef.select( shapeRef );
is_rect = true;
x1 = fx1; y1 = fy1; x2 = fx2; y2 = fy2;
}
rectInfo = getRectangles();
var inverseRectList = rectInfo.bounds;
docRef.selection.deselect();
// =======================================================
// Draw Labels
// =======================================================
var inner = { 'top':false,'bottom':false,'left':false,'right':false };
// Look for left measurement
if ( fx1 < x1 )
{
inner.left = true;
if ( fy1 == y1 )
createLabel( fx1, fy1-11, x1, fy1, true );
else if ( fy2 == y2 )
createLabel( fx1, fy2, x1, fy2+10, true );
else
createLabel( fx1, parseInt(fy1+(fy2-fy1)/2)-5, x1, parseInt(fy1+(fy2-fy1)/2)+5, true );
}
// Look for right measurement
if ( fx2 > x2 )
{
if ( ! inner.left )
inner.right = true;
if ( fy1 == y1 )
createLabel( x2, fy1-11, fx2, fy1, true );
else if ( fy2 == y2 )
createLabel( x2, fy2, fx2, fy2+10, true );
else
createLabel( x2, parseInt(fy1+(fy2-fy1)/2)-5, fx2, parseInt(fy1+(fy2-fy1)/2)+5, true );
}
// Look for top measurement
if ( fy1 < y1 )
{
inner.top = true;
if ( fx1 == x1 )
createLabel( fx1-11, fy1, fx1, y1, false );
else if ( fx2 == x2 )
createLabel( fx2, fy1, fx2+10, y1, false );
else
createLabel( parseInt(fx1+(fx2-fx1)/2)-5, fy1, parseInt(fx1+(fx2-fx1)/2)+5, y1, false );
}
// Look for bottom measurement
if ( fy2 > y2 )
{
if ( ! inner.top )
inner.bottom = true;
if ( fx1 == x1 )
createLabel( fx1-11, y2, fx1, fy2, false );
else if ( fx2 == x2 )
createLabel( fx2, y2, fx2+10, fy2, false );
else
createLabel( parseInt(fx1+(fx2-fx1)/2)-5, y2, parseInt(fx1+(fx2-fx1)/2)+5, fy2, false );
}
if ( is_rect )
{
// Only label the longest dimension when selection is a single rectangle
if ( fx2 - fx1 > fy2 - fy1 )
createMultipleMeasures(true);
else
createMultipleMeasures(false);
// Select containing folder (select was left on text layer, first item in folder)
if(activeDocument.activeLayer.parent.typename = "LayerSet"){
activeDocument.activeLayer = activeDocument.activeLayer.parent;
}
} else
{
// Label both dimensions of negative space when it exists
if ( inner.left )
createLabel( x1, y1, x1+10, y2, false );
if ( inner.right )
createLabel( x2-11, y1, x2, y2, false );
if ( inner.top )
createLabel( x1, y1, x2, y1+10, true );
if ( inner.bottom )
createLabel( x1, y2-11, x2, y2, true );
if ( !inner.left && !inner.right && !inner.top && !inner.bottom )
{
if ( inverseRectList.length == 4 )
{
// Horizontal bar: Q1.x2, Q1.y1, Q4.x1, Q4.y2
createLabel( inverseRectList[0][0], inverseRectList[0][3], inverseRectList[3][2], inverseRectList[3][1], true );
// Vertical bar: Q1.x1, Q1.y2, Q4.x2, Q4.y1
createLabel( inverseRectList[0][2], inverseRectList[0][1], inverseRectList[3][0], inverseRectList[3][3], false );
} else
{
// Normal rectangle (no negative inner space)
createLabel( x1, y1, x2, y2, true );
createLabel( x1, y1, x2, y2, false );
}
}
}
app.preferences.rulerUnits = originalUnit;
}
function getRectangles()
{
Array.prototype.numericSort = function() {
return this.sort( function (a,b) { return a-b; } );
};
makeWorkPath( .4 );
var tempPath = app.activeDocument.pathItems.getByName('Work Path');
var subPathCount = tempPath.subPathItems.length;
var subPathBounds = [];
var dirs = [];
for( sp = 0; sp<subPathCount;sp++ )
{
var b =[];
var xValues = [];
var yValues = [];
var pointCount = tempPath.subPathItems[sp].pathPoints.length;
var points = [];
for( var p=0;p<pointCount;p++ )
{
xValues.push( tempPath.subPathItems[sp].pathPoints[p].anchor[0] );
yValues.push( tempPath.subPathItems[sp].pathPoints[p].anchor[1] );
// Pull off the last point (x,y) and add to the list
points.push( [ xValues[xValues.length-1], yValues[yValues.length-1] ] );
}
xValues.numericSort();
yValues.numericSort();
var xMin = xValues[0];
var xMax = xValues[xValues.length-1];
var yMin = yValues[0];
var yMax = yValues[yValues.length-1];
subPathBounds.push([xMin,yMin,xMax,yMax]);
// Special case for 8 points - assume it's a rect with a cutout on one side. Cutout indicates
// we're in long side mode, and the label/line should be drawn on the opposing (to the cutout)
// side.
if ( pointCount == 8 )
{
var lines = [];
var label;
for( var p=0; p<points.length; p++ )
{
// Looking for a point that is along one side but not on a corner - that point is on the
// side opposite where the label will be drawn.
if ( (points[ p ][ 0 ] == xMin || points[ p ][ 0 ] == xMax) && points[ p ][ 1 ] != yMin && points[ p ][ 1 ] != yMax )
{
// Matching point is an x, so point is on a vertical side (either x1 or x2) and long lines are horizontal
lines.push( [ [ xMin, yMin ], [ xMax-( use_fast_draw ? 0 : 1 ), yMin ] ] );
lines.push( [ [ xMin, yMax-1 ], [ xMax-( use_fast_draw ? 0 : 1 ), yMax-1 ] ] );
if ( points[ p ][ 0 ] == xMin )
{
// Cut out is on the left line, so draw right line (inset for the arrow)
lines.push( [ [ xMax - arrow_size - 1, yMin ], [ xMax - arrow_size - 1, yMax - 1 ] ] );
label = [ xMax - 9, yMin ];
} else
{
// Cut out is on the right line, so draw left line (inset for the arrow)
lines.push( [ [ xMin + arrow_size, yMin ], [ xMin + arrow_size, yMax - 1 ] ] );
if (yMax - yMin < 30) {
label = [ xMin-38, yMin ];
} else {
label = [ xMin-2, yMin];
}
}
dirs.push( { 'lines':lines, 'horizontal':false, 'label':label } );
break;
} else if ( (points[ p ][ 1 ] == yMin || points[ p ][ 1 ] == yMax) && points[ p ][ 0 ] != xMin && points[ p ][ 0 ] != xMax )
{
// Matching point is a y, so point is on a horizontal side (either y1 or y2) and long lines are vertical
lines.push( [ [ xMin, yMin ], [ xMin, yMax-( use_fast_draw ? 0 : 1 ) ] ] );
lines.push( [ [ xMax-1, yMin ], [ xMax-1, yMax-( use_fast_draw ? 0 : 1 ) ] ] );
if ( points[ p ][ 1 ] == yMin )
{
// Cut out is on the top line, so draw bottom line (inset for the arrow)
lines.push( [ [ xMin, yMax - arrow_size - 1 ], [ xMax - 1, yMax - arrow_size - 1 ] ] );
label = [ xMin, yMax - 9 ];
} else
{
// Cut out is on the bottom line, so draw top line (inset for the arrow)
lines.push( [ [ xMin, yMin + arrow_size ], [ xMax - 1, yMin + arrow_size ] ] );
// Get the top left for the "region" for the label - this is used to plug into the old createLabel()
// style when calling drawTextLabels()
if (xMax - xMin < 45) {
label = [ xMin, yMin - 24 ];
} else {
label = [ xMin, yMin - 2 ];
}
}
dirs.push( { 'lines':lines, 'horizontal':true, 'label':label } );
break;
}
}
} else
{
dirs.push( false );
}
}
tempPath.makeSelection(0);
tempPath.remove();
return { 'bounds':subPathBounds, 'longinfo':dirs };
}
function createLongLabel( info )
{
app.activeDocument.selection.deselect();
var linesLayerRef = layerSetRef.artLayers.add();
linesLayerRef.name = "Line ";
drawLine( info.lines[0][0], info.lines[0][1], 1 ); // long side
drawLine( info.lines[1][0], info.lines[1][1], 1 ); // long side
drawLine( info.lines[2][0], info.lines[2][1], 1 ); // label side
drawArrows( info.lines[2][0], info.lines[2][1], info.horizontal );
drawTextLabels( info.horizontal, info.horizontal ? info.lines[2][1][0] - info.lines[2][0][0] + 1 : info.lines[2][1][1] - info.lines[2][0][1] + 1, info.label[0], info.label[1] )
}
function drawArrows( p1, p2, horizontal )
{
if ( !make_arrows )
return true;
for( var i=1; i<=arrow_size; i++ )
{
if ( horizontal )
{
drawLine( [p1[0] + 1 + i, p1[1] - i], [p1[0] + 1 + i, p1[1] + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
drawLine( [p2[0] - 1 - i, p1[1] - i], [p2[0] - 1 - i, p1[1] + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
} else
{
drawLine( [p1[0] - i, p1[1] + 1 + i], [p1[0] + i + ( use_fast_draw ? 1 : 0 ) , p1[1] + 1 + i], 1 );
drawLine( [p1[0] - i, p2[1] - 1 - i], [p1[0] + i + ( use_fast_draw ? 1 : 0 ) , p2[1] - 1 - i], 1 );
}
}
}
function createLabel( x1, y1, x2, y2, horizontal )
{
app.activeDocument.selection.deselect();
var linesLayerRef = layerSetRef.artLayers.add();
var width = x2 - x1;
var height = y2 - y1;
// =======================================================
// Draw Lines
// =======================================================
if (horizontal)
{
linesLayerRef.name = "Line ";
drawLine([x1,y1],[x1,y1+10 + ( use_fast_draw ? 1 : 0 )],1);
drawLine([x2-1,y1],[x2-1,y1+10 + ( use_fast_draw ? 1 : 0 )],1);
drawLine([x1,y1+5],[x2-1,y1+5],1);
if ( make_arrows )
{
for( var i=1; i<=arrow_size; i++ )
{
drawLine( [x1 + 1 + i, y1 + 5 - i], [x1 + 1 + i, y1 + 5 + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
drawLine( [x2 - 2 - i, y1 + 5 - i], [x2 - 2 - i, y1 + 5 + i + ( use_fast_draw ? 1 : 0 ) ], 1 );
}
}
}
else
{
linesLayerRef.name = "Line ";
drawLine([x1,y1],[x1+10 + ( use_fast_draw ? 1 : 0 ),y1],1);
drawLine([x1,y2-1],[x1+10 + ( use_fast_draw ? 1 : 0 ),y2-1],1);
drawLine([x1+5,y1],[x1+5,y2-1],1);
if ( make_arrows )
{
for( var i=1; i<=arrow_size; i++ )
{
drawLine( [x1 + 5 - i, y1 + 1 + i], [x1 + 5 + i + ( use_fast_draw ? 1 : 0 ) , y1 + 1 + i], 1 );
drawLine( [x1 + 5 - i, y2 - 2 - i], [x1 + 5 + i + ( use_fast_draw ? 1 : 0 ) , y2 - 2 - i], 1 );
}
}
}
drawTextLabels( horizontal, horizontal ? width : height, x1, y1 );
}
function drawTextLabels( horizontal, size, x, y )
{
// =======================================================
// Draw Text
// =======================================================
var textLayerRef = layerSetRef.artLayers.add();
textLayerRef.kind = LayerKind.TEXT;
var textItemRef = textLayerRef.textItem;
if(rectangleList.length == 1){
textItemRef.contents = size + "px";
layerSetRef.name = textItemRef.contents;
}
if (horizontal)
{
if ( size<45 || !make_centered_labels )
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.justification = Justification.CENTER;
textItemRef.position = Array(Math.floor(x + (size/2)),y+20);
textItemRef.contents = size + "px";
} else
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.justification = Justification.CENTER;
textItemRef.position = Array(Math.floor(x + (size/2)),y+8);
textItemRef.contents = size + "px";
loadTransparency();
app.activeDocument.selection.expand( 4 );
selectLayerBelow();
app.activeDocument.selection.cut();
}
} else
{
if ( size<30 || !make_centered_labels )
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.position = Array(x+12,Math.floor(y + 4 + (size/2)));
textItemRef.contents = size + "px";
} else
{
textItemRef.color = app.foregroundColor;
{
if ( make_bold_labels )
{
textItemRef.font = "Arial-BoldMT";
} else
{
textItemRef.font = "ArialMT";
}
}
textItemRef.size = font_size;
textItemRef.antiAliasMethod = AntiAlias.SHARP;
textItemRef.autoKerning = AutoKernType.OPTICAL;
textItemRef.justification = Justification.CENTER;
textItemRef.position = Array(x+5,Math.floor(y + 4 + (size/2)));
textItemRef.contents = size + "px";
loadTransparency();
app.activeDocument.selection.expand( 4 );
selectLayerBelow();
app.activeDocument.selection.cut();
}
}
}
function makeWorkPath( tolerance )
{
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putClass( charIDToTypeID('Path') );
desc.putReference( charIDToTypeID('null'), ref );
var ref2 = new ActionReference();
ref2.putProperty( charIDToTypeID('csel'), charIDToTypeID('fsel') );
desc.putReference( charIDToTypeID('From'), ref2 );
desc.putUnitDouble( charIDToTypeID('Tlrn'), charIDToTypeID('#Pxl'),tolerance );
executeAction( charIDToTypeID('Mk '), desc, DialogModes.NO );
}
function makeSelectionF()
{
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Chnl'), charIDToTypeID('fsel') );
desc.putReference( charIDToTypeID('null'), ref );
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Path'), charIDToTypeID('WrPt') );
desc.putReference( charIDToTypeID('T '), ref );
desc.putInteger( charIDToTypeID('Vrsn'), 1 );
desc.putBoolean( stringIDToTypeID('vectorMaskParams'), true );
executeAction( charIDToTypeID('setd'), desc, DialogModes.NO );
};
function drawLine_slower( x1, y1, x2, y2 )
{
var pointArray = new Array();
var pointA = new PathPointInfo();
pointA.kind = PointKind.CORNERPOINT;
pointA.anchor = Array(x1, y1);
pointA.leftDirection = pointA.anchor;
pointA.rightDirection = pointA.anchor;
pointArray.push(pointA);
var pointB = new PathPointInfo();
pointB.kind = PointKind.CORNERPOINT;
pointB.anchor = Array(x2, y2);
pointB.leftDirection = pointB.anchor;
pointB.rightDirection = pointB.anchor;
pointArray.push(pointB);
var line = new SubPathInfo();
line.operation = ShapeOperation.SHAPEXOR;
line.closed = false;
line.entireSubPath = pointArray;
var lineSubPathArray = new Array();
lineSubPathArray.push(line);
var linePath = app.activeDocument.pathItems.add("TempPath", lineSubPathArray);
linePath.strokePath(ToolType.PENCIL, false);
app.activeDocument.pathItems.removeAll();
};
function drawLine( startXY, endXY, width )
{
if ( !use_fast_draw )
return drawLine_slower( startXY[0], startXY[1], endXY[0], endXY[1] );
var desc = new ActionDescriptor();
var lineDesc = new ActionDescriptor();
var startDesc = new ActionDescriptor();
startDesc.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Pxl'), startXY[0] );
startDesc.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Pxl'), startXY[1] );
lineDesc.putObject( charIDToTypeID('Strt'), charIDToTypeID('Pnt '), startDesc );
var endDesc = new ActionDescriptor();
endDesc.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Pxl'), endXY[0] );
endDesc.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Pxl'), endXY[1] );
lineDesc.putObject( charIDToTypeID('End '), charIDToTypeID('Pnt '), endDesc );
lineDesc.putUnitDouble( charIDToTypeID('Wdth'), charIDToTypeID('#Pxl'), width );
desc.putObject( charIDToTypeID('Shp '), charIDToTypeID('Ln '), lineDesc );
desc.putBoolean( charIDToTypeID('AntA'), false );
executeAction( charIDToTypeID('Draw'), desc, DialogModes.NO );
};
function hasSelection(doc)
{
var res = false;
var as = doc.activeHistoryState;
doc.selection.deselect();
if (as != doc.activeHistoryState)
{
res = true;
doc.activeHistoryState = as;
}
return res;
}
function selectLayerBelow(){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Bckw" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
};
function selectLayerAbove(){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Frwr" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
};
function loadTransparency(Invert){
if(Invert == undefined) Invert = false;
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putProperty( charIDToTypeID( "Chnl" ), charIDToTypeID( "fsel" ) );
desc.putReference( charIDToTypeID( "null" ), ref );
var ref1 = new ActionReference();
ref1.putEnumerated( charIDToTypeID( "Chnl" ), charIDToTypeID( "Chnl" ), charIDToTypeID( "Trsp" ) );
desc.putReference( charIDToTypeID( "T " ), ref1 );
desc.putBoolean( charIDToTypeID('Invr'), Invert);
executeAction( charIDToTypeID( "setd" ), desc, DialogModes.NO );
};
function selectLayerByIndex(index,add){
add = (add == undefined) ? add = false : add;
var ref = new ActionReference();
ref.putIndex(charIDToTypeID("Lyr "), index);
var desc = new ActionDescriptor();
desc.putReference(charIDToTypeID("null"), ref );
if(add) desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
try{
executeAction(charIDToTypeID("slct"), desc, DialogModes.NO );
}catch(e){}
};
function getActiveLayerIndex() {
var ref = new ActionReference();
ref.putProperty( 1349677170 , 1232366921 );
ref.putEnumerated( 1283027488, 1332896878, 1416783732 );
try{
activeDocument.backgroundLayer;
var res = executeActionGet(ref).getInteger( 1232366921 )-1;
}catch(e){
var res = executeActionGet(ref).getInteger( 1232366921 ) ;
}
return res;
};
function linkSelectedLayers() {
var desc221 = new ActionDescriptor();
var ref142 = new ActionReference();
ref142.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
desc221.putReference( charIDToTypeID('null'), ref142 );
executeAction( stringIDToTypeID('linkSelectedLayers'), desc221, DialogModes.NO );
};
function loadVectorMask () {
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc14 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref9 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref9.putProperty( idChnl, idfsel );
desc14.putReference( idnull, ref9 );
var idT = charIDToTypeID( "T " );
var ref10 = new ActionReference();
var idPath = charIDToTypeID( "Path" );
var idPath = charIDToTypeID( "Path" );
var idvectorMask = stringIDToTypeID( "vectorMask" );
ref10.putEnumerated( idPath, idPath, idvectorMask );
var idLyr = charIDToTypeID( "Lyr " );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref10.putEnumerated( idLyr, idOrdn, idTrgt );
desc14.putReference( idT, ref10 );
var idVrsn = charIDToTypeID( "Vrsn" );
desc14.putInteger( idVrsn, 1 );
var idvectorMaskParams = stringIDToTypeID( "vectorMaskParams" );
desc14.putBoolean( idvectorMaskParams, true );
executeAction( idsetd, desc14, DialogModes.NO );
};
function loadLayerMask () {
// =======================================================
var idsetd = charIDToTypeID( "setd" );
var desc21 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref14 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref14.putProperty( idChnl, idfsel );
desc21.putReference( idnull, ref14 );
var idT = charIDToTypeID( "T " );
var ref15 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idChnl = charIDToTypeID( "Chnl" );
var idMsk = charIDToTypeID( "Msk " );
ref15.putEnumerated( idChnl, idChnl, idMsk );
desc21.putReference( idT, ref15 );
executeAction( idsetd, desc21, DialogModes.NO );
};
///////////////////////////////////////////////////////////////////////////////
// Function: hasVectorMask
// Usage: see if there is a vector layer mask
// Input: <none> Must have an open document
// Return: true if there is a vector mask
///////////////////////////////////////////////////////////////////////////////
function hasVectorMask() {
var hasVectorMask = false;
try {
var ref = new ActionReference();
var keyVectorMaskEnabled = app.stringIDToTypeID( 'vectorMask' );
var keyKind = app.charIDToTypeID( 'Knd ' );
ref.putEnumerated( app.charIDToTypeID( 'Path' ), app.charIDToTypeID( 'Ordn' ), keyVectorMaskEnabled );
var desc = executeActionGet( ref );
if ( desc.hasKey( keyKind ) ) {
var kindValue = desc.getEnumerationValue( keyKind );
if (kindValue == keyVectorMaskEnabled) {
hasVectorMask = true;
}
}
}catch(e) {
hasVectorMask = false;
}
return hasVectorMask;
};
function multiselectfontreader(){
// by paul riggott; MULTI-SELECT Function
app.bringToFront();
main();
function main(){
if(!documents.length) return;
var selLayers=[];
selLayers= getSelectedLayersIdx();
for (var a in selLayers){
makeActiveByIndex( selLayers[a], false );
//amend to suit.
readTextLayer ()
}
}
function getSelectedLayersIdx(){
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var desc = executeActionGet(ref);
if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){
desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
var c = desc.count
var selectedLayers = new Array();
for(var i=0;i<c;i++){
try{
activeDocument.backgroundLayer;
selectedLayers.push( desc.getReference( i ).getIndex() );
}catch(e){
selectedLayers.push( desc.getReference( i ).getIndex()+1 );
}
}
}else{
var ref = new ActionReference();
ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
try{
activeDocument.backgroundLayer;
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ))-1);
}catch(e){
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" )));
}
}
return selectedLayers;
};
function makeActiveByIndex( idx, visible ){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIndex(charIDToTypeID( "Lyr " ), idx)
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), visible );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
};
};
// Read one or more selected fonts
function readTextLayer() {
if (app.documents.length > 0) {
var myDoc = app.activeDocument;
var myLayer = myDoc.activeLayer;
if (myLayer.kind == LayerKind.TEXT) {
var thisText = myLayer.textItem;
// Renaming the Justifcation info from Justification.CENTER - > Center;
try {var theJustification = String(thisText.justification).replace("Justification.", "")}
catch(e) {var theJustification = "LEFT"};
theJustification = theJustification[0]+theJustification.slice(1, theJustification.length).toLowerCase();
// collect properties in a string;
try {var theLeading = thisText.leading}
catch (e) {var theLeading = "Auto"};
try {var theTracking = thisText.tracking}
catch (e) {var theTracking = "auto"};
var theString = "Font: " + thisText.font+"\rSize: "+thisText.size+"\rColor: #"+thisText.color.rgb.hexValue+ ((theLeading === 'Auto') ? '' : "\rLine Spacing: "+theLeading) +((theTracking === 0) ? '' : "\rTracking: "+theTracking)+"\rJustify: "+theJustification+"\r"+getFonts (app.activeDocument.activeLayer).join("\r");
addTextLayer (theString, "Font Info", [myLayer.bounds[0], myLayer.bounds[3] + 15])
}
}
};
//Add's a text layer which contains the content of the read string above
function addTextLayer (theText, theName, thePosition) {
var aTextLayer = app.activeDocument.artLayers.add();
aTextLayer.kind = LayerKind.TEXT;
aTextLayer.name = theName;
var aTextLayerRef = aTextLayer.textItem;
aTextLayerRef.kind = TextType.POINTTEXT;
aTextLayerRef.size = 10;
aTextLayerRef.font = "Arial-BoldMT";
aTextLayerRef.color = app.foregroundColor;
aTextLayerRef.justification = Justification.LEFT;
aTextLayerRef.position = thePosition;
aTextLayer.blendMode = BlendMode.NORMAL;
aTextLayer.opacity = 100;
aTextLayer.fillOpacity = 100;
aTextLayerRef.useAutoLeading = true;
aTextLayerRef.leading = 0;
aTextLayerRef.horizontalScale = 100;
aTextLayerRef.verticalScale = 100;
aTextLayerRef.contents = theText;
aTextLayerRef.antiAliasMethod = AntiAlias.SHARP;
};
////// get fonts and other parameters used in type layer //////
function getFonts (textLayer) {
if (textLayer.kind == LayerKind.TEXT) {
app.activeDocument.activeLayer = textLayer;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );
var layerDesc = executeActionGet(ref);
var textDesc = layerDesc.getObjectValue(stringIDToTypeID('textKey'));
var rangeList = textDesc.getList(stringIDToTypeID('textStyleRange'));
var theFonts = new Array;
for (var m = 0; m < rangeList.count; m++) {
var styleDesc = rangeList.getObjectValue(m).getObjectValue(stringIDToTypeID('textStyle'));
var aFrom = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('from'));
var aTo = rangeList.getObjectValue(m).getInteger(stringIDToTypeID('to'));
var aFont = styleDesc.getString(stringIDToTypeID('fontPostScriptName'));
var theLetters = app.activeDocument.activeLayer.textItem.contents.slice(aFrom, aTo);
try {var aSize = styleDesc.getUnitDoubleValue(stringIDToTypeID('size')) + " " +typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('size')))}
catch (e) {var aSize = "default"};
try {var aTracking = styleDesc.getUnitDoubleValue(stringIDToTypeID('leading')) + " " +typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('leading')))}
catch (e) {var aTracking = "default"};
try {var aLeading = styleDesc.getInteger(stringIDToTypeID('tracking'))}
catch (e) {var aLeading = "default"};
theFonts.push("»"+theLetters+"«: font "+aFont+"; size "+aSize+"; tracking "+aTracking+"; leading "+aLeading+"; justify "+aLeading)
};
return (theFonts);
}
};