インタフェース: MemStream

gMax 1.0 で最初に導入された MemStream コア インタフェースを 3ds Max 5 以降、MAXScript で利用できるようになりました。

MemStream は、ファイル全体をメモリに読み込むことで、高速のストリーム解析を可能にします。

memStreamMgr インタフェースおよび memStream インタフェースには、ストリームを解析するためのさまざまなメソッドが用意されています。

memStreamMgr - インタフェース

メソッド

<Interface>MemStreamMgr.openFile <filename>fname favor_type:<enum> code_page:<integer>

favor_type enums: {#FAVOR_ACP|#FAVOR_UTF8}
favor_type default value: #FAVOR_ACP
code_page default value: 0

memStream インタフェースを返します。指定したファイルの内容は、処理される入力ストリームです。

ファイルを開けない場合は、undefined 値が返されます。

3ds Max 2013 以降で使用可能なオプションのキーワード引数 favor_type: および code_page: で、ストリームのエンコーディングをコントロールできます。

ACP は ANSI Code Page (ANSI コード ページ)の略です。

UTF8 は UCS Transformation Format - 8 bit (UCS 変換形式 - 8 ビット)の略で、UCS は Universal Character Set (ユニバーサル文字セット)の略です。

   

<Interface>MemStreamMgr.openString <filename>string 	 

memStream インタフェースを返します。文字列の内容は、処理される入力ストリームです。

   

<void>MemStreamMgr.close <Interface>memStream   

memStream の入力ストリームを閉じ、このストリームに関連付けられているメモリを解放します。

memStream - インタフェース

memStream インタフェースは入力ストリームを解析するためのメソッドを提供します。このインタフェースは memStreamMgr.openString() メソッドおよび memStreamMgr.openFile() メソッドから返されます。

   

メソッド

<filename><Interface:MemStream>.getFileName() 

memStream の作成元のファイル名が返されます。インタフェースが memStreamMgr.openString() から作成された場合は "" を返します。

   

<void><Interface:MemStream>.skipSpace() 

現在のストリーム カーソル位置以降の、先行する空白文字(スペース、タブ、改行)をスキップします。この呼び出しの後では、ストリーム カーソル位置は非空白文字またはストリームの終端になります。

   

<string><Interface:MemStream>.readChar() 

ストリームから 1 文字を読み込み、それを文字列として返します。

   

<string><Interface:MemStream>.peekChar() 

ストリームから 1 文字を読み込み、それを文字列として返します。ストリーム カーソル位置は増分されません。

   

<string><Interface:MemStream>.readLine() 

現在のストリーム カーソル位置から改行までのすべての文字を読み込み、それを文字列として返します。

   

<string><Interface:MemStream>.readToken() 

指定ストリームからトークンを読み込んで、文字列として返します。トークンとは、空白文字またはストリームの先頭や終端で囲まれる一連の文字のことです。最初の空白と、1 行の「//」形式のコメントは自動的にスキップされます。

返される文字列の最大長は 5120 文字です。これより長いトークンが読み込まれた場合、返される文字列にはそのトークンの最初の 5120 文字が含まれます。ストリーム カーソル位置は、次の文字になります。

   

<string><Interface:MemStream>.peekToken() 

ストリーム カーソル位置を増分しない点を除けば、<memStream>.readToken と同じです。

   

<void><Interface:MemStream>.unReadToken() 

ストリーム カーソル位置を前回の readToken 操作の直前の状態にリセットします。

   

<string><Interface:MemStream>.readBlock <string>open <string>close 

トークンのブロック(「open」トークンから「close」トークンまで)を読み込み、ネストされた「open」トークン/「close」トークンのペアは自動的にスキップして、内容を文字列として返します。この文字列には、開始「open」トークンと終了「close」トークンが含まれます。入力ストリーム内の次のトークンは、開始「open」トークンでなければなりません。そうでない場合は、「undefined」が返されます。

この呼び出しの後、ストリーム カーソル位置は次のトークンの先頭になるか、または「close」トークンの後に続くトークンがない場合にはストリームの終端になります。「open」トークンと「close」トークンでは、大文字と小文字は区別されません。

注:

開始文字列と終了文字列は、文字列ではなく、トークンを表します。

b2=memStreamMgr.openstring "{aaaaa}"
b2.readblock "{" "}"

undefined を返します。これは、「{」と「}」が改行で囲まれていないため、トークンとして検出されないためです(memStream の内容は 1 つのトークンだけ)。

入力ストリーム内の次のトークンが「open」トークンでない場合は、「undefined」値が返され、ストリーム カーソル位置は変わりません。

入力トークン内の次のトークンが「open」トークンではなく、「close」トークンが検出されない場合は、「open」トークンからストリームの終端(-1)までの文字列が返されます。

ブロックの最大長は 5120 文字です。ブロックが検出されず、この長さよりも長い場合は、「undefined」値が返されます。ただし、ストリーム カーソル位置はブロックの終端になります。

   

<void><Interface:MemStream>.skipBlock <string>open <string>close 

トークンのブロックを返さない点を除いては、readBlock と同じです(この方がわずかに高速)。

   

<integer><Interface:MemStream>.pos() 

現在のストリーム カーソル位置を返します。

   

<void><Interface:MemStream>.seek <integer>offset <enum>origin 

origin enums: {#seek_set|#seek_cur|#seek_end} 

文字のストリーム カーソル位置を、指定された基点から「offset」数だけ移動します。

#seek_set-- start of file
#seek_cur-- current file position
#seek_end-- end of file (works with negative offset values)

   

<integer>size() 

入力ストリームのサイズを返します。

   

<bool>eos() 

現在のストリーム カーソル位置が入力ストリームの終端以降の場合は true を返し、それ以外の場合は false を返します。

ms = memStreamMgr.openString "token! //comment!\n { { nested bracket pair } } "
ms.readToken()
ms.readBlock "{" "}"
ms.eos()
memStreamMgr.close ms

結果

<MixinInterface:memStream>
"token!"
"{ { nested bracket pair } }"
true
OK
注:

read メソッドまたは peek メソッドでは現在、入力ストリームの終端を越えた読み込みは保護されません。

seek メソッドでは現在、入力ストリームの終端を越えた位置の設定は保護されません。

readBlock メソッドと skipBlock メソッドは、「open」トークンと「close」トークン文字列を比較するときに、大文字と小文字を区別しません。