画像ファイル一覧のテキストファイルを作る
javascriptといってもAdobeのAPIの話
FlashではAIRとかじゃないと
Fileクラスがないので
フォルダ内のファイルを
まとめてロードとかはできない
じゃあフォルダ内のファイル名一覧の
テキストファイルをあらかじめ作っておこうという話
イラレで動かす用につくったけど
すごく基本的なクラスなので
もしかしたらローカルでjavascriptが動くなら
なんでもいいかもしれないです
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つのセクションで構成されている
→DXF2006仕様
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クラスにもっていけるようになったところまで
大体はいけてるんだけど穴空きHATCHの読み込みが上手くいかない
というか、どうやって穴開けてるのかわからない
しかしどの道使い道であるPictクラスでも
穴空きの描画なんてできないから
べつにこのままでもいい気がするので
未完成だけどとりあえず完成ってことで
MTEXTも放置しちゃったけど
これも同じくPictクラスでは
テキストは扱わないから放置
あと、一応言っておくと
このクラスってのはPictクラスで使うための
Pointオブジェクトの配列を作るものなので
PictクラスみたいにPointの配列をつかって描画するような
クラスとか関数がないと意味ないです
Pictクラス、ダメモトで公開してみようか…?
もう1000行超えてるけど…
オーサリングで描いたものとかを持ってきて
変形させたりとかできません
かといってスクリプトで
イラスト描こうなんてのは無茶です
そこで白羽の矢が立ったのが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行超えてるけど…