おいしいAS3 -31ページ目

画像ファイル一覧のテキストファイルを作る

javascriptといってもAdobeのAPIの話

FlashではAIRとかじゃないと
Fileクラスがないので
フォルダ内のファイルを
まとめてロードとかはできない

じゃあフォルダ内のファイル名一覧の
テキストファイルをあらかじめ作っておこうという話


makeFileRef()
function makeFileRef(){
var fol=Folder.selectDialog ("対象のフォルダを選択")
var files=fol.getFiles ("*.jpg")
files=files.concat(fol.getFiles ("*.png"))
files=files.concat(fol.getFiles ("*.gif"))
var ref=new File(decodeURI(fol.absoluteURI)+"/ref.txt")
ref.open("w")
for(var i=0;i<files.length;i++){
ref.write(decodeURI(files[i].name)+String.fromCharCode (13))
}
ref.close("")
}



イラレで動かす用につくったけど
すごく基本的なクラスなので
もしかしたらローカルでjavascriptが動くなら
なんでもいいかもしれないです

DXFについて

現在DXF読み込みのクラスを作ってるわけなんですが
DXFについて知ってた事、調べてわかったこといろいろ


■知ってた事

CADとかに使うファイルで
イラレとか別のソフトに
CADからデータ持ってくるときに
使うファイルらしいってこと

3Dのソフトでテクスチャ抜きの
形状データを保存する簡単なファイルだってこと

だけです


■今回調べてわかったこと

CADではデファクトスタンダードなファイルである

基本的にASCIIファイル、要するにベースがTEXTファイル
(バイナリ形式もあるけどあまり使われない)

2行一組の順次処理のコマンドのファイルである

2行一組の2行の内の1行目は整数で
2行目の値の意味を定義するだけじゃなく
0はセクションや要素の開始を表したり
多少コマンド的な役割もしてるので
単純に『一行目=二行目』みたいに
考えるわけにはいかない

7つのセクションで構成されている








・HEADERファイルのバージョンとかの情報
・CLASSESアプリケーション定義のクラス
・TABLESレイヤーとか入れ物になるものの定義
・BLOCKS描画オブジェクトのグループ定義
・ENTITIES描画オブジェクト描画、配置する所 ←これが本体
・OBJECTSスタイルとかを定義してる(?)
・THUMBNAILIMAGE 多分名前の通りサムネールの指定


→DXF2006仕様

DXFを読み込み(完成?)

Pictクラスは基本がPointオブジェクトの配列なので
オーサリングで描いたものとかを持ってきて
変形させたりとかできません

かといってスクリプトで
イラスト描こうなんてのは無茶です

そこで白羽の矢が立ったのがDXFファイル

CADのデファクトスタンダードなファイル

DXFは基本ASCIIなファイルなんで
バイナリ扱えなくても簡単に
欲しい所だけ正則表現で抜き出したり
加工したりして転用できるのではないかと思います

こいつを元にPointオブジェクトの配列を
つくっていってやりたいと思います

実のところプロトタイプベースかオブジェクト指向の
高レベル(人間語に近い)言語しか使ったことなくて
順次処理型のものを使うのははじめてだったりします



とりあえず単純なPOLYLINEとSPLINEとHATCH、INSERTなら
Pictクラスにもっていけるようになったところまで



package simplizer.graphic{
import flash.events.*
import flash.net.URLLoader
import flash.net.URLRequest
import flash.geom.Point

public class DXF extends EventDispatcher{

private var orgData
public var data:Object={}
public var objects:Array=new Array()

public function DXF(url:String){
load(url)
}

public function load(url:String){
with(new URLLoader()){
load(new URLRequest(url))
addEventListener(Event.COMPLETE,onComp)
}
function onComp(e){
orgData=e.target.data
orgData=orgData.replace(new RegExp("\r\n|\r","gn"),"\n")
orgData=orgData.replace(new RegExp(" *","gn"),"")
orgData=orgData.replace(new RegExp("\{.+?\}","gsn"),repFnc)
function repFnc(str,ind,allStr){return str.replace(new RegExp("\n","gn")," ")}
data.header=arrToObj(orgData.match(new RegExp("0\nSECTION\n2\nHEADER\n.*?ENDSEC","gsn"))[0].split("\n").slice(4,-2))
data.classes=arrToObj(orgData.match(new RegExp("0\nSECTION\n2\nCLASSES\n.*?ENDSEC","gsn"))[0].split("\n").slice(4,-2))
data.tables=arrToObj(orgData.match(new RegExp("0\nSECTION\n2\nTABLES\n.*?ENDSEC","gsn"))[0].split("\n").slice(4,-2))
data.blocks=arrToObj(orgData.match(new RegExp("0\nSECTION\n2\nBLOCKS\n.*?ENDSEC","gsn"))[0].split("\n").slice(4,-2))
data.entities=arrToObj(orgData.match(new RegExp("0\nSECTION\n2\nENTITIES\n.*?ENDSEC","gsn"))[0].split("\n").slice(4,-2))
data.objects=arrToObj(orgData.match(new RegExp("0\nSECTION\n2\nOBJECTS\n.*?ENDSEC","gsn"))[0].split("\n").slice(4,-2))
function arrToObj(orgArr):Array{
var tmpArr:Array=[]
for(var i=0;i if(orgArr[i]==0)tmpArr.push(new Object())
if(tmpArr.length==0)tmpArr.push(new Object())
if(!(orgArr[i] in tmpArr[tmpArr.length-1])){
tmpArr[tmpArr.length-1][orgArr[i]]=new Array()
}
tmpArr[tmpArr.length-1][orgArr[i]].push(orgArr[i+1])
}
return tmpArr
}
for each (var arr in ["header","classes","tables","blocks","entities","objects"]){
trace("\n▼▼▼ "+arr+" ▼▼▼")
for each(var obj in data[arr]){
trace("\n")
for(var fname in obj){
trace(fname+" = "+obj[fname])
}
}
trace("▲▲▲ "+arr+" ▲▲▲\n")
}
objects=readCode(data)
dispatchEvent(new Event(Event.COMPLETE))
}
}
private function readCode(dxfData):Array{
var rtn:Array=new Array()
var endCode:String="NONE"
var h:Number=400
for each(var obj in data.tables){
if(obj[0]=="VPORT")h=obj[40]
}
for each(obj in data.entities){
var crrObj:Object
var i
var len
switch(obj[0][0]){
case "POLYLINE":
crrObj=new Object()
crrObj.verts=new Array()
crrObj.task=new Object()
rtn.push(crrObj)
endCode="SEQEND"
try{crrObj.task.color=obj[420][0]}catch(e){crrObj.task.color=0}
break;
case "VERTEX":
crrObj.verts.push(new Point(obj[10][0],h-obj[20][0]))
break;
case "SPLINE":
rtn.push(readSpline(obj))
break;
case "HATCH":
rtn.push(readHatch(obj))
break;
case "INSERT":
rtn=rtn.concat(readInsert(obj[2][0]))
break;
}
}
function readInsert(bname:String):Array{
var rtn:Array=new Array()
var frg:Boolean=false
for each(var obj in data.blocks){
if(obj[0][0]=="BLOCK"&&obj[2][0]==bname)frg=true
if(obj[0][0]=="ENDBLK")frg=false
if(frg){
switch(obj[0][0]){
case "POLYLINE":
crrObj=new Object()
crrObj.verts=new Array()
crrObj.task=new Object()
rtn.push(crrObj)
endCode="SEQEND"
try{crrObj.task.color=obj[420][0]}catch(e){crrObj.task.color=0}
break;
case "VERTEX":
crrObj.verts.push(new Point(obj[10][0],h-obj[20][0]))
break;
case "SPLINE":
rtn.push(readSpline(obj))
break;
case "HATCH":
rtn.push(readHatch(obj))
break;
}
}
}
return rtn
}
function readSpline(obj):Object{
var rtn=new Object()
rtn.verts=new Array()
rtn.task=new Object()
for(var i=0;i rtn.verts.push(new Point(obj[10][i],h-obj[20][i]))
if((i%3==0)&&(i>0)){
len=rtn.verts.length
rtn.verts[len-3]=Point.interpolate(rtn.verts[len-3],rtn.verts[len-4],3/4)
rtn.verts[len-2]=Point.interpolate(rtn.verts[len-2],rtn.verts[len-1],3/4)
rtn.verts.splice(-2,2,Point.interpolate(rtn.verts[len-3],rtn.verts[len-2],1/2),rtn.verts[len-2],rtn.verts[len-1])
}
}
rtn.task.curve=true
try{rtn.task.color=obj[420][0]}catch(e){rtn.task.color=0}
return rtn
}
function readHatch(obj):Object{
var rtn=new Object()
rtn.verts=new Array()
rtn.task=new Object()
for(var i=1;i rtn.verts.push(new Point(obj[10][i],h-obj[20][i]))
if((i%3==1)&&(i>1)){
len=rtn.verts.length
rtn.verts[len-3]=Point.interpolate(rtn.verts[len-3],rtn.verts[len-4],3/4)
rtn.verts[len-2]=Point.interpolate(rtn.verts[len-2],rtn.verts[len-1],3/4)
rtn.verts.splice(-2,2,Point.interpolate(rtn.verts[len-3],rtn.verts[len-2],1/2),rtn.verts[len-2],rtn.verts[len-1])
}
}
rtn.task.curve=true
try{rtn.task.color=obj[420][0]}catch(e){rtn.task.color=0}
return rtn
}
return rtn
}
}
}



大体はいけてるんだけど穴空きHATCHの読み込みが上手くいかない
というか、どうやって穴開けてるのかわからない

しかしどの道使い道であるPictクラスでも
穴空きの描画なんてできないから
べつにこのままでもいい気がするので
未完成だけどとりあえず完成ってことで

MTEXTも放置しちゃったけど
これも同じくPictクラスでは
テキストは扱わないから放置



あと、一応言っておくと
このクラスってのはPictクラスで使うための
Pointオブジェクトの配列を作るものなので
PictクラスみたいにPointの配列をつかって描画するような
クラスとか関数がないと意味ないです

Pictクラス、ダメモトで公開してみようか…?
もう1000行超えてるけど…