Other Languages Support

Anyone, especially newbies, asking for help with Photoshop Scripting and Photoshop Automation - as opposed to those contributing to discussion about an aspect of Photoshop Scripting

Moderators: Tom, Kukurykus

mycort

Other Languages Support

Post by mycort »

My script does not seem to work with other languages of Photoshop like French.
Do I need to add a code snippet to support various languages so that my script can work?
Mike Hale

Other Languages Support

Post by Mike Hale »

You can use Adobe's Z-Strings to localize things like 'Background' as a layer name, the channel names, and some other items.

Really need to know more about why/where it is failing with a non-English version of Photoshop.
mycort

Other Languages Support

Post by mycort »

Here's the script and here's the error in french:)

Erreur 1302: Elément inexistant
Ligne: 343
App.activeDocument.pathItems.getByName('Work Path');

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

        Font-detection system updated by Maksim Izmaylov <me@kvakes.com> in 2012.

        ==========================================================================================
        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

    if (!documents.length) {
       alert('There are no documents open.', 'No Document');
}
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 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 font_content_detection = false;
        var font_content_detection_symbols = ['(', ')'];
        var TextLeading =true;
        var TextJustification =true;
        var RetinaRoundup = false;
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        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 {
            //Turns off layer before making measurements
            //app.activeDocument.activeLayer.visible = !app.activeDocument.activeLayer.visible;
              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 === 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[i][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) {
     if(size%2 == 1 && RetinaRoundup)
    size = size + 1;
          // =======================================================
          // 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();

              var fonts = getFonts(app.activeDocument.activeLayer);

              for (var i = 0; i < fonts.length; i++) {
                 
                /*[myLayer.bounds[0] + i * 150, myLayer.bounds[3] + 15]*/
               
                //Code for dynamically figuring out width hieght canvas size and placing the text objects accordingly//
             
                  //(myDoc.width > myDoc.height?[, ]:[])
                 
                  var x, y;
                  var topMargin = 20;
                 
                    if(myDoc.width > myDoc.height)
                   {
                       x = myLayer.bounds[0] + i * 130;
                       y = myLayer.bounds[3] + topMargin;
                    }
                    else
                    {
                        x = myLayer.bounds[0]+1;
                        y = myLayer.bounds[3] + (i * 80) + topMargin;
                     }
                 
                addTextLayer(
                  ((fonts.length > 1) ? fonts[i].text + ((fonts[i].text.length) ? "\r" : '') : '') + "Font: " + fonts[i].font + "\r" + "Size: " + fonts[i].size + "\r" + "Color: #" + fonts[i].color.rgb.hexValue + "\r" + ((i === 0 && fonts[i].leading !== '' && TextLeading == true) ? "Leading: " + fonts[i].leading + "\r" : '') + ((i === 0 && TextJustification == true) ? "Justify: " + theJustification + "\r" : ''),
                  "Font Info #" + (i + 1), [x,y]);
              }
            }
          }
        };

        // 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;


          //Move the newly created font layers into the existing "Pixel Spec" folder
          var doc = app.activeDocument;
          var srcLayer = doc.activeLayer;

          try {
            moveLayerToSet(doc, srcLayer, 'Pixel Specs');
          } catch (error) {
            false;
          }

          function moveLayerToSet(doc, srcLayer, toLayerName) {
            var destLayer = doc.layers[toLayerName];
            if (destLayer.layers) destLayer = destLayer.layers[0];
            srcLayer.move(destLayer, ElementPlacement.PLACEBEFORE);
          }



        };

        function getColorFromDescriptor(colorDesc, keyClass) {
          var colorObject = new SolidColor();
          switch (keyClass) {
          case "Grsc":
            colorObject.grey.grey = color.getDouble(charIDToTypeID('Gry '));
            break;
          case "RGBC":
            colorObject.rgb.red = colorDesc.getDouble(charIDToTypeID('Rd  '));
            colorObject.rgb.green = colorDesc.getDouble(charIDToTypeID('Grn '));
            colorObject.rgb.blue = colorDesc.getDouble(charIDToTypeID('Bl  '));
            break;
          case "CMYC":
            colorObject.cmyk.cyan = colorDesc.getDouble(charIDToTypeID('Cyn '));
            colorObject.cmyk.magenta = colorDesc.getDouble(charIDToTypeID('Mgnt'));
            colorObject.cmyk.yellow = colorDesc.getDouble(charIDToTypeID('Ylw '));
            colorObject.cmyk.black = colorDesc.getDouble(charIDToTypeID('Blck'));
            break;
          case "LbCl":
            colorObject.lab.l = colorDesc.getDouble(charIDToTypeID('Lmnc'));
            colorObject.lab.a = colorDesc.getDouble(charIDToTypeID('A   '));
            colorObject.lab.b = colorDesc.getDouble(charIDToTypeID('B   '));
            break;
          default:
            return null;
          }
          return colorObject;
        };
        // get fonts and other parameters used in type layer
        function getFonts(textLayer) {

          function markReturnedContentText(text) {
            if (font_content_detection) {
              return font_content_detection_symbols[0] + text + font_content_detection_symbols[1] + "\r";
            } else {
              return '';
            }
          }

          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 fonts = [];

            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'));
              if (m > 0) {
                if (rangeList.getObjectValue(m - 1)
                  .getInteger(stringIDToTypeID('from')) == aFrom && rangeList.getObjectValue(m - 1)
                  .getInteger(stringIDToTypeID('to')) == aTo) continue;
              }
              var theLetters = app.activeDocument.activeLayer.textItem.contents.substring(aFrom, aTo);

              var aFont = styleDesc.getString(stringIDToTypeID('fontPostScriptName'));

              //var aSize = styleDesc.getUnitDoubleValue(stringIDToTypeID('size')) + " " + typeIDToCharID(styleDesc.getUnitDoubleType(stringIDToTypeID('size')));
              var aSize = new UnitValue(styleDesc.getUnitDoubleValue(stringIDToTypeID('size')), "px");
              //Check if font has been transformed
                if (textDesc.hasKey(stringIDToTypeID('transform'))) {
                    var mFactor = textDesc.getObjectValue(stringIDToTypeID('transform')).getUnitDoubleValue (stringIDToTypeID("yy") );
                    aSize = Math.round(aSize * mFactor);
                    }
              var aColor = getColorFromDescriptor(styleDesc.getObjectValue(charIDToTypeID("Clr ")), typeIDToCharID(styleDesc.getClass(charIDToTypeID("Clr "))));
           
              if (styleDesc.hasKey(stringIDToTypeID('leading'))) {
                var aLeading = new UnitValue(styleDesc.getUnitDoubleValue(stringIDToTypeID('leading')), "px");
              } else {
                var aLeading = "";
              }

              var txt = theLetters.replace(/^\s+/, '').replace(/\s+$/, '');
              var merged = false;

              if (txt.length > 0) {
                for (var x = 0; x < m; x++) {
                  try {
                    if (fonts[x].font === aFont && fonts[x].size === aSize && fonts[x].color.rgb.hexValue === aColor.rgb.hexValue && fonts[x].leading === aLeading) {
                      // It's a hack!!!
                      if (fonts[x].text !== txt) {
                        fonts[x].text += markReturnedContentText(txt);
                      }
                      merged = true;
                    }
                  } catch (e) {}
                }

                if (!merged) {
                  fonts.push({
                    text: markReturnedContentText(txt),
                    font: aFont,
                    size: aSize,
                    color: aColor,
                    leading: aLeading
                  });
                }
              }

            };

            return fonts;

          }
        };




txuku

Other Languages Support

Post by txuku »

Bonjour !

Hum.... I often have this problem !!!



"Work Path" = "Tracé de travail"
Mikaeru

Other Languages Support

Post by Mikaeru »

mycort wrote:Here's the script and here's the error in french:)

Erreur 1302: Elément inexistant
Ligne: 343
App.activeDocument.pathItems.getByName('Work Path');

Since it doesn't seem possible to explicitely select the current work path using the DOM, I would suggest saving the work path as a named path right after creating it:

Code: Select all  makeWorkPath(.4);
  saveWorkPath('Temp Path');
  var tempPath = app.activeDocument.pathItems.getByName('Temp Path');

using the following function:

Code: Select allfunction saveWorkPath (pathName)
{
   var desc = new ActionDescriptor ();
   var ref = new ActionReference ();
   ref.putClass (stringIDToTypeID ("path"));
   desc.putReference (stringIDToTypeID ("target"), ref);
   var ref2 = new ActionReference ();
   ref2.putProperty (stringIDToTypeID ("path"), stringIDToTypeID ("workPath"));
   desc.putReference (stringIDToTypeID ("from"), ref2);
   desc.putString (stringIDToTypeID ("name"), pathName);
   executeAction (stringIDToTypeID ("make"), desc, DialogModes.NO);
}
xbytor

Other Languages Support

Post by xbytor »

Try this:

Code: Select all   zWorkPath = localize("$$$/Actions/Key/Document/WorkPath=Work Path");

   app.activeDocument.pathItems.getByName(zWorkPath);

-X
mycort

Other Languages Support

Post by mycort »

xbytor wrote:Try this:

Code: Select all   zWorkPath = localize("$$$/Actions/Key/Document/WorkPath=Work Path");

   app.activeDocument.pathItems.getByName(zWorkPath);

-X


So how do I add this code above line 343 or do I replace the existing code for work path?
xbytor

Other Languages Support

Post by xbytor »

Replace line 343 (which I assume is):
Code: Select all       var tempPath = app.activeDocument.pathItems.getByName('Work Path');

with this:
Code: Select all       zWorkPath = localize("$$$/Actions/Key/Document/WorkPath=Work Path");

       var tempPath = app.activeDocument.pathItems.getByName(zWorkPath);
mycort

Other Languages Support

Post by mycort »

Perfect and completely solved the problem, it now works! thx alot!
Mike Hale

Other Languages Support

Post by Mike Hale »

And the great thing about Z-Strings is it will now work for all the languages that Photoshop supports, not just French.