おいしいAS3 -7ページ目

Pictクラス

このブログのAS3のネタにしょっちゅう登場しながら
機能をつめこみすぎてソースが1500行近くて公開できなかったクラス

解体するにあたってまずPictクラス自体は
形状、スタイル、アニメーションの3つを
引数にしてグラフィックを描画するスプライト
という役割だけに絞り込みました

オブジェクトメソッドも以前は
線とか塗りとかで別々にしてましたが
コンストラクタで形状、スタイル、アニメーションの
設定オブジェクトの配列を渡すだけでいいようにしました

■Pictクラス




/*
■使い方

形状を表すPointオブジェクトの2次配列と
色やグラデーションの設定のオブジェクトの配列
フレーム毎にPointオブジェクトの配列を加工して返す関数の配列
の3つから動的にグラフィックを描画するSpriteの拡張クラスです


■パブリックプロパティ

verts
style
trans

onFrame

■パブリックメソッド

destroy()

*/
package{

import flash.display.Sprite
import flash.display.Shape
import flash.geom.Point
import flash.geom.Matrix
import flash.events.Event

public class Pict extends flash.display.Sprite {

public var verts:Array
public var style:Array
public var trans:Array

public var onFrame:Function=function(){}

public function Pict(verts:Array=null,style:Array=null,trans:Array=null) {
this["verts"]=verts||[]
this["style"]=style||[]
this["trans"]=trans||[]
addEventListener(Event.ADDED_TO_STAGE,function(e){addEventListener(Event.ENTER_FRAME,frameTick)})
addEventListener(Event.REMOVED_FROM_STAGE,function(e){removeEventListener(Event.ENTER_FRAME,frameTick)})
addEventListener("destroy",function(e){removeEventListener(Event.ENTER_FRAME,frameTick);frameTick=null;})
function frameTick(e){
e.target.onFrame()
var grp=e.target.graphics
grp.clear()
for(var i=0;i<e.target.verts.length;i++){
var vrt:Array=e.target.verts[i]
var stl:Object=e.target.style[i%e.target.style.length]||{}
var trs:Function=e.target.trans[i%e.target.trans.length]||null
var isLine:Boolean=((stl.fillColor==null)&&(stl.fillAlpha==null)&&(stl.fillGradient==null))
var isGradientLine:Boolean=(stl.lineGradient!=null)
if(trs!=null){
e.target.verts[i]=trs(vrt)
}
if(stl.modify!=null)vrt=stl.modify(vrt)
if(!isGradientLine){
grp.lineStyle(stl.lineWeight||(isLine?1:0),stl.lineColor||0,stl.lineAlpha||(isLine?1:0))
}
if(stl.fillGradient==null){
if(!isLine)grp.beginFill(stl.fillColor||0,stl.fillAlpha||((stl.fillAlpha==0)?0:1))
}else{
grp.beginGradientFill(this.syle[i].fillGradient.type,stl.fillGradient.colors,stl.fillGradient.alphas,stl.fillGradient.ratios,stl.fillGradient.matrix,"pad","rgb",stl.fillGradient.focal)
}
grp.moveTo(vrt[0].x,vrt[0].y);
for(var j=1;j<vrt.length-1;j+=2){
if(vrt[j]==null){
j++;
grp.moveTo(vrt[j].x,vrt[j].y);
}
grp.curveTo(vrt[j].x,vrt[j].y,vrt[j+1].x,vrt[j+1].y)
}
grp.endFill()
}
}
}
public function destroy(){
graphics.clear()
this.verts=null
this.style=null
this.trans=null
dispatchEvent(new Event("destroy"))
}
}
}




基本は

addChild(new Pict(形状配列、スタイル配列、アニメーション配列)



形状配列=flash.geom.Pointオブジェクトの二次配列
スタイル配列=lineWeightやfillColorプロパティを持つオブジェクトの配列
アニメーション配列=flash.geom.Pointオブジェクト配列を加工して返す関数の配列

なので別にこのPictクラス用に用意された
形状、スタイル、アニメーションの専用のクラスを
使わなくてもPictクラスを使うことはできます

ついでにアメブロでは this.style って文字列が不正になるみたいですね
しかたないのでちょっと書き直しました

バッファローのNASで使えない文字

? [ ] / \ = + < > ; : ” , | *


これらの文字がMacOSXからの接続の場合に
バッファローのNASでは使えない

にもかかわらずなんかウチの周辺には
更新があった画像のファイル名に
*をつけるという習慣がある

マジ勘弁

画像を敷き詰める

$おいしいAS3

InDesignで画像をこんなカンジで敷き詰めるスクリプト

210の幅で高さは成り行きになってますが
main()を書き換えるとちょっとは融通効きます

使い道はよくわかりません

なんとなくやりたかったから作りました



var zeroPoint=getZeroPoint()

main()


function getZeroPoint(){
var testRect=app.activeDocument.rectangles.add()
testRect.transform(CoordinateSpaces.SPREAD_COORDINATES,[0,0],[9/10,0,0,9/10,0,0])
var newBnd=testRect.geometricBounds
testRect.remove()
return [newBnd[1]*-10,newBnd[0]*-10]
}

function main(){
var doc=app.activeDocument
var sel=app.activeDocument.selection
var files=getAllImageFiles(Folder.selectDialog ("対象フォルダを選択"))
var imgArr=new Array()
var imgArrX2=new Array()
for(var i=0;i<files.length;i++){
imgArr.push(doc.rectangles.add())
with(imgArr[imgArr.length-1]){
geometricBounds=[0,0,297,210]
place(files[i])
fit(FitOptions.PROPORTIONALLY)
fit(FitOptions.FRAME_TO_CONTENT)
}
}
var len=Math.ceil(Math.sqrt (imgArr.length))
for(i=0;i<imgArr.length;i++){
if(i+1>imgArrX2.length*imgArr.length/len)imgArrX2.push(new Array())
imgArrX2[imgArrX2.length-1].push(imgArr[i])
}
fitImagesX2(imgArrX2,{x:0,y:0},210,true)
}

function getAllImageFiles(fol){
var rtn=fol.getFiles (isFile)
var fols=fol.getFiles(isFolder)
for(var i=0;i<fols.length;i++){
rtn=rtn.concat(getAllImageFilesMirror (fols[i]))
}
return rtn
}

function getAllImageFilesMirror(fol){
return getAllImageFiles(fol)
}

function isFile(f){
try{
f.getFiles ()
return false
}
catch(e){
if(f.name.search(/\.[(jpg)(jpeg)(gif)(png)(eps)(ai)(psd)]/)!=-1){
return true
}
else{
return false
}
}
}

function isFolder(f){
try{
f.getFiles ()
return true
}
catch(e){
return false
}
}

function fitImagesX2(imgsX2,org,len,hor){
var crrOrg={x:org.x,y:org.y}
var totalLen=0
for(var i=0;i<imgsX2.length;i++){
var resultLen=fitImagesX1(imgsX2[i],crrOrg,len,!hor)
if(hor){
crrOrg.x+=resultLen
}
else{
crrOrg.y+=resultLen
}
totalLen+=resultLen
}
var scl=len/totalLen
for(var j=0;j<imgsX2.length;j++){
for(var k=0;k<imgsX2[j].length;k++){
scaleImage(imgsX2[j][k],org,scl)
}
}
return len*scl
}

function fitImagesX1(imgsX1,org,len,hor){
var crrOrg={x:org.x,y:org.y}
var totalLen=0
for(var i=0;i<imgsX1.length;i++){
slideImage(imgsX1[i],crrOrg)
var resultLen
if(hor){
scaleImage(imgsX1[i],crrOrg,len/getHeight(imgsX1[i])/imgsX1.length)
crrOrg.x+=resultLen=getWidth(imgsX1[i])
}
else{
scaleImage(imgsX1[i],crrOrg,len/getWidth(imgsX1[i])/imgsX1.length)
crrOrg.y+=resultLen=getHeight(imgsX1[i])
}
totalLen+=resultLen
}
var scl=len/totalLen
for(var j=0;j<imgsX1.length;j++){
scaleImage(imgsX1[j],org,scl)
}
return (len/imgsX1.length)*scl
}

function slideImage(img,org){
img.move([org.x,org.y])
}

function scaleImage(img,org,scl){
var bnd=img.geometricBounds
img.transform(CoordinateSpaces.SPREAD_COORDINATES,zeroPoint,[scl,0,0,scl,0,0],MatrixContent.SCALE_VALUES)
img.move([org.x+(bnd[1]-org.x)*scl,org.y+(bnd[0]-org.y)*scl])
}

function getWidth(img){
var bnd=img.geometricBounds
return bnd[3]-bnd[1]
}

function getHeight(img){
var bnd=img.geometricBounds
return bnd[2]-bnd[0]
}