2016-09-15 44 views
1

我正在爲Adobe Illustrator編寫腳本以使用所選顏色填充對象。用顏色填充對象的腳本 - 均勻分佈,但沒有可辨別的模式

我有32個物體和12個顏色色板。我想用兩種顏色填充32個對象,然後用隨機選擇填充剩餘的8個對象。我想以不可辨別的模式填充對象,因此只需遍歷每個對象並將其分配給下一個樣本顏色就行不通。

這是我迄今爲止,但它不是至少兩次使用每種顏色和隨機填充。

myObjects = app.activeDocument.selection; 
myDocument = app.activeDocument; 

if (myObjects instanceof Array) { 
    colourSwatches = myDocument.swatches.getSelected(); 

    //if there are swatches 
    if (colourSwatches.length != 0) { 
     for (i = 0; i < myObjects.length; i++) { 

      //if the selection is a path or compound path 
      if (myObjects[i].typename == "PathItem" || myObjects[i].typename == "CompoundPathItem") { 

       selItem = myObjects[i]; 
       selItem.filled = true; 

       //select colour from swatches at random and then fill 
       swatchIndex = Math.round(Math.random() * (colourSwatches.length - 1)); 

       if (selItem.typename == "PathItem") { 
        selItem.fillColor = colourSwatches[swatchIndex].color; 
       } else { 
        selItem.pathItems[0].fillColor = colourSwatches[swatchIndex].color; 
       } 
      } 
     } 
    } 
} 

回答

1

而是隨機挑選樣本(這就是你失去控制)的,這樣做:

  1. 建立你的目標尺寸(32)的陣列,並使用所需樣本填充( 12)。你不必隨機化這個數組。
  2. 對於每個對象,選擇一個隨機條目。
  3. 從陣列中刪除選取的條目。
  4. 循環直到滿意。

即,未經檢驗的,但這樣的事情:

var targetArray = []; 
// fill with the set of required colors, times 2 
for (i=0; i < 12; i++) 
{ 
    targetArray[2*i] = i; 
    targetArray[2*i+1] = i; 
} 
// fill up to contain 32 items 
for (i=24; i<32; i++) 
    targetArray[i] = Math.floor(Math.random() * colourSwatches.length); 

(見Getting random value from an arrayrandom表達。)

現在你有一個包含指標爲樣本使用數組。遍歷你的對象和數組挑隨機項目,直至完成(這將是一件好事),或者你用完了項目的挑選(這將表明您的項目,以填補數是不正確的):

for (i = 0; i < myObjects.length; i++) 
{ 
    arrayIndex = Math.floor(Math.random() * targetArray.length); 
    swatchIndex = targetArray[arrayIndex]; 
    targetArray.splice (arrayIndex,1); 
    selItem.fillColor = colourSwatches[swatchIndex].color; 
} 
+0

非常感謝! – user1876246

0

32對象:

32 boxes

12層的顏色:

12 colors

var document  = app.activeDocument; 
var objects  = document.selection; // 32 objects 
var swatchColors = document.swatches.getSelected(); // 12 colors 
var colors  = swatchColors; // 12 colors 
colors   = colors.concat(swatchColors); // duplicate the 12 colors, 12*2 colors 

// add 8 random colors 
for (var i = 0; i < 8; i++) { 
    // create random index in [0, 11] 
    var randomIndex = Math.floor(Math.random() * swatchColors.length); 
    // add the random color to colors array 
    colors.push(swatchColors[randomIndex]); 
    // remove the added color from the swatches so no extra duplicates 
    swatchColors.splice(randomIndex, 1); 
} 

// now we have 32 objects and 32 colors 
// in colors array, there are (12 * 2) + 8 random colors 
for (var i = 0; i < objects.length; i++) { 
    objects[i].fillColor = colors[i].color; 
} 

執行後:

Objects colored

對象被從頂部到底部迭代,從左到右。這是document.selection訂單。因此,前24種顏色以與樣片相同的順序應用。如果您想隨機訂購,您可以洗牌colors