将图层移动到文本文件中的坐标 - Photoshop 脚本

Move layers to coordinates from text file - Photoshop scripting

  1. 我有一个基础图层 - 一张欧洲地图。
  2. 一堆代表每个国家的“国家”层位于基础层之上。
  3. 我有一个文本文件,其中 x/y 坐标是每个国家要放置的位置的左上角,与基础层相关。坐标列表是用逗号分隔的像素值。有些值也是负数。

所以我想做的是根据坐标列表移动每个国家图层。

使用 Javascript 我已经能够加载文本文件,但我不知道如何将坐标传递给每个图层并将图层实际移动到位。 我似乎无法在此处添加图片甚至 link - 只是收到一条错误消息。 尝试 hyper link:[Link 图像][1] Sergey Kritskiy,Ghoul Fool - 感谢您的耐心等待和帮助。

这就是我目前拥有的“代码”- 很多东西都不见了..

main();

var originalUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

function main(){
   //declare listFile variable, prompt to browse for text file
   var listFile = File.openDialog("Open list of coordinates","text(*.txt):*.txt;"); 
   //if no file selected, return
   if(listFile == null) return;
   //read the selected text file (listFile) to a string(listString)  - read coordinates from text File
   listFile.open('r') ; 
   var listString = listFile.read();
   listFile.close(); 
   //splitting at line breaks, convert into array of strings
   fileList = listString.split(' ');
   
   //Need to tell what is X-value and what is Y-value
 
   // call the source document
   var srcDoc = app.activeDocument;
   var numOfLayers = srcDoc.layers.length;

   // main loop
   for (var i = numOfLayers -1; i >= 0  ; i--)
      {

   //select that layer as you go along
   srcDoc.activeLayer = srcDoc.artLayers[i];
  
  // Here is where each layer should be paired to its coordinate from the text file - But how to do it? 

   // move the layer
   moveLayer(moveX , moveY);
   }
  }

   //iterate array of strings (coordinates), move layers  acording to coordinates in the loaded text document                 
   //for(var i=0; i<=fileList.length; i++){
   //    var theFile =new File(fileList[i]);
   }
};```


 [1]: https://www.mediafire.com/view/oms4kv7kt6l6zsf/coordinates_list_and_layers.JPG/file

基本上你想要一个函数来平移一个图层(从它的原始位置到它的预期位置)

您还需要以像素为单位工作,这会让生活更轻松。

您将在一组国家/地区及其各自的偏移量上拥有一个对象。

遍历所有层。查看图层名称是否与国家匹配。是吗?然后移动那个图层。

这会给你一个大概的想法,但只适用于 1883 年的地图,当时列支敦士登是世界上唯一已知的国家,这自然使制图变得更容易。

var originalUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;


// call the source document
var srcDoc = app.activeDocument;
var numOfLayers = srcDoc.layers.length;

// main loop
for (var i = numOfLayers -1; i >= 0  ; i--)
{

  //select that layer as you go along
  srcDoc.activeLayer = srcDoc.artLayers[i];

  if (srcDoc.artLayers[i].name == "Lichtenstein")
  {
    var moveX = 100;
    var moveY =  40;

    // move the layer
    moveLayer(moveX , moveY);
  }
}



// Put unit preferences back
app.preferences.rulerUnits = originalUnits;


// FUNCTION moveLayer (dx, dy) translates layer by dx, dy
function moveLayer(dx, dy)
{
  // =======================================================
  var id9297 = charIDToTypeID( "move" );
  var desc2040 = new ActionDescriptor();
  var id9298 = charIDToTypeID( "null" );
  var ref1412 = new ActionReference();
  var id9299 = charIDToTypeID( "Lyr " );
  var id9300 = charIDToTypeID( "Ordn" );
  var id9301 = charIDToTypeID( "Trgt" );
  ref1412.putEnumerated( id9299, id9300, id9301 );
  desc2040.putReference( id9298, ref1412 );
  var id9302 = charIDToTypeID( "T   " );
  var desc2041 = new ActionDescriptor();
  var id9303 = charIDToTypeID( "Hrzn" );
  var id9304 = charIDToTypeID( "#Pxl" );
  desc2041.putUnitDouble( id9303, id9304, dx );
  var id9305 = charIDToTypeID( "Vrtc" );
  var id9306 = charIDToTypeID( "#Pxl" );
  desc2041.putUnitDouble( id9305, id9306, dy );
  var id9307 = charIDToTypeID( "Ofst" );
  desc2040.putObject( id9302, id9307, desc2041 );
  executeAction( id9297, desc2040, DialogModes.NO );
}

所以把它们放在一起你想要这样的东西:

// Switch off any dialog boxes
displayDialogs = DialogModes.ERROR; // OFF 

var originalUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;


main();



function main()
{
   //declare listFile variable, prompt to browse for text file
   var listFile = File.openDialog("Open list of coordinates","text(*.txt):*.txt;"); 
   //if no file selected, return
   if(listFile == null) return;
   //read the selected text file (listFile) to a string(listString)  - read coordinates from text File
   listFile.open('r') ; 
   var listString = listFile.read();
   listFile.close(); 
   //splitting at line breaks, convert into array of strings
   fileList = listString.split("\n");

   
   //Need to tell what is X-value and what is Y-value
 
   // call the source document
   var srcDoc = app.activeDocument;
   var numOfLayers = srcDoc.layers.length;

   // main loop
   var c = 0;
   // ignore the background? Start at numOfLayers -2
   for (var i = numOfLayers -2; i >= 0  ; i--)
   {

      //select that layer as you go along
      srcDoc.activeLayer = srcDoc.artLayers[i];
      var theLayerName = srcDoc.artLayers[i].name;
      var line = fileList[c].split(",");
      var moveX = line[0];
      var moveY = line[1];

      // alert(theLayerName + " : " + moveX + ", " + moveY);


     // Here is where each layer should be paired to its coordinate from the text file - But how to do it? 

      // move the layer
      moveLayer(moveX , moveY);

      // increment the file list counter
      c+=1;
   }
}

// set ruler units back to how it was
app.preferences.rulerUnits = originalUnits;


// Set Display Dialogs back to normal
displayDialogs = DialogModes.ALL; // NORMAL


// FUNCTION moveLayer (dx, dy) translates layer by dx, dy
function moveLayer(dx, dy)
{
  // =======================================================
  var id9297 = charIDToTypeID( "move" );
  var desc2040 = new ActionDescriptor();
  var id9298 = charIDToTypeID( "null" );
  var ref1412 = new ActionReference();
  var id9299 = charIDToTypeID( "Lyr " );
  var id9300 = charIDToTypeID( "Ordn" );
  var id9301 = charIDToTypeID( "Trgt" );
  ref1412.putEnumerated( id9299, id9300, id9301 );
  desc2040.putReference( id9298, ref1412 );
  var id9302 = charIDToTypeID( "T   " );
  var desc2041 = new ActionDescriptor();
  var id9303 = charIDToTypeID( "Hrzn" );
  var id9304 = charIDToTypeID( "#Pxl" );
  desc2041.putUnitDouble( id9303, id9304, dx );
  var id9305 = charIDToTypeID( "Vrtc" );
  var id9306 = charIDToTypeID( "#Pxl" );
  desc2041.putUnitDouble( id9305, id9306, dy );
  var id9307 = charIDToTypeID( "Ofst" );
  desc2040.putObject( id9302, id9307, desc2041 );
  executeAction( id9297, desc2040, DialogModes.NO );

}