.recx ファイル仕様


.recx ファイルとは

.recx は .xml形式 をzip圧縮して拡張子を .recx にしたものです。保存時に無圧縮の.xmlを選択することもできます。zipファイルであることは日常意識する必要はなく、圧縮・展開ソフトを別に導入する必要もありません。
 一般的にバイナリ形式では作った本人・ソフト屋しかその仕様を理解していません。そのため昔のワープロ専用機の文章ファイルのように時代の変化によりデータ の再利用が困難になる可能性があります。本ソフトウェアはマイナーな独自規格であり、大量にこの形式でデータを残すことは、どうしても不安が残ると思います。
 そこでxml形式に変更しました。
xmlは将来の仕様変更・拡張に柔軟に対応できる。
仕様を公開することで、出力された木取り図を他のアプリケーションで使うソフトウェアを第三者が開発できる。などのメリットがあります。
(.recxに余計なファイルを入れた場合は正常に動作しないかもしれません)

Zipファイルの中身のファイル名は同じものが付けられます。UTF-8形式でファイル名を保持していますのでShift-Jisで扱っている Windows7までのZip解凍ではファイル名が文字化けする場合があります。
この場合はUTF-8に対応した「MacやUbuntuで作成したZipファイルを文字化けせずに解凍できるソフト」を使用してください。

例として次のデータのxmlを示します。


  • データ構造としては次の構成となっています。
    不要な部分のリストはなくても構いません。例えばデータ入力だけなら<PartsBoardList> と<SourceBoardList>だけでも有効です。
    The data structure is a street of the next chart.
    Data entry is effective only in <PartsBoardList> and <SourceBoardList>.

 ─RectPacker
    ├─Memo(メモ)
    │  └─Line(行単位のテキスト)
    ├─Option(オプション)
    ├─PanelSawList(木取り図リスト)
    │  └─PanelSaw(木取り図)
    │      └─BoardNode(板)
    ├─PartsBoardList(部材リスト)
    ├─PartsColorList(部材の色設定リスト)
    ├─SourceBoardList(原版リスト)
    ├─StockBoardList(優先使用材リスト)
    ├─SourceBoardData(原版の集計済みデータ)
    └─PartsBoardData(部材の集計済みデータ)

  • 部材番号・原版番号について
    部材原版を面積順にソートし、大きい方から0から始まる番号をつけます。面積が同じ場合は横が長い方、それも同じ場合は回転可能な方を先に番号をつけま す。
    全て同一の場合は統合して同一の部材とみなします。
     
  • 木取り図のデータ構造について
    板を1回切断すると2枚になります。その内の1枚を切るとそれが2枚になります。つまり、データ構造は2分岐の木構造となります。
    xmlですのでちょうど板を定義すればそのまま表現することができます。部材と未使用スペースだけを描画すれば表示の通りになります。
    矛盾した値を読ませることはRectPackerが正常動作しない可能性があります。出力された値を使うだけにしてください。
     
  • 木取り図の板サイズ・座標について
    値は整数でなければなりません。[オプション]-[小数点の桁数]が1の時は1/10、2の時は1/100にした値が実際の値です。

実際のコード(2次元の場合)を示します。解説をコメントとして挿入してあります。


<?xml version="1.0" encoding="UTF-8"?>
<RectPacker FileTypeVersion="1.2">

  <!--
 ------------------------------------------------------------------

オプション

  MaxCutLength=切断機の最大切断長
  Rotate=すべての部材が回転可能=0 すべての部材が回転不可能=1 個別設定=2
  SmallSourcePriorityPoint=小さい方の原版を優先する優先度
  Decimals=小数点の桁数
  SearchLevel=配置探索レベル
 MinimumSearchTime=最低探索時間(秒単位)
  PartsColorListType 部材の色分け なし=0 似た形状=1 大きいサイズ順=2 小さいサイズ順=3

  Problem
=最適化問題 1D or 2D


-->
<Option Rotate="0" PartsAlignment="0" SmallSourcePriorityPoint="2" Decimals="0" SearchLevel="3" HighRatio="1" PartsColorListType="1" KerfSize="3" MaxCutLength="" Problem="2D"//>

<!--

  ------------------------------------------------------------------

原版リスト

 (空白行を削除してある以外はアプリに入力したそのままで記録 
 無効な値は実行時に無視 
 1次元の場合はHeightがなくなります)
  Comment=コメント  
  Width=横サイズ  
  Height=縦サイズ  
  Count=枚数 
  Cost=単価 -->
  <SourceBoardList>
    <Board Comment="" Width="1800" Height="900" Count="" Cost=""/>
  </SourceBoardList>

  <!--
  ------------------------------------------------------------------

優先使用材リスト

 (空白行を削除してある以外はアプリに入力したそのままで記録 
 無効な値は実行時に無視 
 1次元の場合はHeightがなくなります)
  Comment=コメント  
  Width=横サイズ  
  Height=縦サイズ  
  Count=枚数 
  Cost=単価 -->
  <StockBoardList>
    <Board Comment="" Width="1800" Height="900" Count="" Cost=""/>
  </StockBoardList>

  <!--
 ------------------------------------------------------------------

部材リスト

 (空白行を削除してある以外はアプリに入力したそのままで記録 無効な値は実行時に無視)
  Comment=コメント  
  Width=横サイズ  
  Height=縦サイズ  
  Count=枚数  
 CanRotate=個別設定時の回転可=1・回転不可=0 個別設定以外の時は無視される-->
  <PartsBoardList>
    <Board Comment="" Width="400" Height="300" Count="1" CanRotate="1"/>
    <Board Comment="" Width="500" Height="200" Count="2" CanRotate=""/>
  </PartsBoardList>

  <!-- 
 ------------------------------------------------------------------

原版の集計済みデータ

(重複や無効な値を削除し、面積順・番号順にソート) 
  Index=原版番号
  Comment=コメント  
  Width=横サイズ  
  Height=縦サイズ  
  Count=枚数 -1は無制限
  Cost=単価
  UsedNumber=使用枚数
  Priority=優先使用材は1
-->
  <SourceBoardData>
    <Board Index="0" Width="1800" Height="900" Count="-1" Cost="0" UsedNumber="1" Comment="" Priority="0" />
  </SourceBoardData>

  <!-- 
 ------------------------------------------------------------------

部材の集計済みデータ

(重複や無効な値を削除し、面積順・番号順にソート) 
  Index=部材番号
 Comment=コメント  
  Width=横サイズ  
  Height=縦サイズ  
  Count=枚数  
 CanRotate=回転の可否、個別設定以外の時は無視される
 Cost=一枚あたりの単価
  CanNotBeArrangedNumber=配置できなかった数
 -->
  <PartsBoardData>
    <Board Index="0" Width="400" Height="300" Count="1" CanRotate="true" Cost="0" CanNotBeArrangedNumber="0" Comment=""/>
    <Board Index="1" Width="500" Height="200" Count="2" CanRotate="true" Cost="0" CanNotBeArrangedNumber="0" Comment=""/>
  </PartsBoardData>

  <!--
 ------------------------------------------------------------------

メモ

 (行単位にして記録します-->
  <Memo>
    <Line>xmlサンプル行1</Line>
    <Line>xmlサンプル行2</Line>
  </Memo>

  <!--
 ------------------------------------------------------------------

部材色設定リスト

  Back=背景色  BrushColor=模様色  FontColor=文字色  PenColor=枠色  Style=模様
  (値については「delphi VCL 色」・「Vcl.Graphics.TBrushStyle」で検索)-->
  <PartsColorList>
    <PartsColor Back="clWindow" BrushColor="clAppWorkSpace" FontColor="clGrayText" PenColor="clGrayText" Style="bsDiagCross"/>
    <PartsColor Back="clWindow" BrushColor="clWindow" FontColor="clWindowText" PenColor="clWindowText" Style="bsClear"/>
    <PartsColor Back="clGradientInactiveCaption" BrushColor="clWindow" FontColor="clWindowText" PenColor="clWindowText" Style="bsClear"/>
    <PartsColor Back="$008080FF" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$0080FFFF" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$0080FF80" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$00FFFF80" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$00FF8000" BrushColor="clWindow" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$00C080FF" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$00404080" BrushColor="clWindow" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$004080FF" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="clTeal" BrushColor="clWindow" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$00804000" BrushColor="clWindow" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
    <PartsColor Back="$00FF8080" BrushColor="clWindow" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
  </PartsColorList>

  <!--
 ------------------------------------------------------------------

木取り図リスト

ExecutionTime=ミリ秒単位の実行時間-->
  <PanelSawList ExecutionTime="15">

  <!--
 ------------------------------------------------------------------
  <PanelSaw>タグ 木取り図1枚分のデータ 
    Count=同一図の枚数 
    SourceIndex=原版番号

    PartitionID=PanelSawが分割されたものである場合、分割元に1から番号が付けられる。0は分割されていない。
    PartitionIndex=
同一PartitionID内で0からつけられる番号
    PartitionCount=
同一PartitionID内で分割された枚数を示す。
 -->
    <PanelSaw Count="1" SourceIndex="0" PartitionID="0" PartitionIndex="0" PartitionCount="0">

  
  <!--
   <BoardNode>タグ 板の定義
      板を一回切断すると2枚になります。その内の1枚を切断するとそれままた2枚になります。
   つまり、データ構造は2分岐の木構造となります。階層の一番下が部材か端材のデータとなり、
   そのまま描画すれば表示のとおりになります。

      Category=板の種類
      この板は横に切断される   = cgHCut (子ノードが存在する)
      この板は縦に切断される   = cgVCut (子ノードが存在する) 
      回転された部材である     = cgPartsLength
      回転していない部材である = cgPartsSide
      未使用の板(端材)である   = cgSpace
      SizeX=横サイズ  SizeY=縦サイズ 
      OriginY=木取り図の左上を(0,0)とした時のY座標 OriginX=木取り図の左上を(0,0)とした時のX座標
      PartsIndex=部材番号-->
      <BoardNode Category="cgVcut" SizeX="1800" SizeY="900" OriginY="0" OriginX="0">
        <BoardNode Category="cgHCut" SizeX="403" SizeY="900" OriginY="0" OriginX="0">
          <BoardNode Category="cgVcut" SizeX="403" SizeY="500" OriginY="0" OriginX="0">
            <BoardNode Category="cgPartsLength" SizeX="200" SizeY="500" OriginY="0" OriginX="0" PartsIndex="1"/>
            <BoardNode Category="cgVcut" SizeX="200" SizeY="500" OriginY="0" OriginX="203">
              <BoardNode Category="cgPartsLength" SizeX="200" SizeY="500" OriginY="0" OriginX="203" PartsIndex="1"/>
            </BoardNode>
          </BoardNode>
          <BoardNode Category="cgHCut" SizeX="403" SizeY="397" OriginY="503" OriginX="0">
            <BoardNode  Category="cgVcut" SizeX="403" SizeY="300" OriginY="503" OriginX="0">
              <BoardNode Category="cgPartsSide" SizeX="400" SizeY="300" OriginY="503" OriginX="0" PartsIndex="0"/>
            </BoardNode>
            <BoardNode Category="cgSpace" SizeX="403" SizeY="94" OriginY="806" OriginX="0"/>
          </BoardNode>
        </BoardNode>
        <BoardNode Category="cgSpace" SizeX="1394" SizeY="900" OriginY="0" OriginX="406"/>
      </BoardNode>
    </PanelSaw>
  </PanelSawList>
</RectPacker>


1次元の場合


上記2次元の説明内容で不要な部分は省略されます。
<PanelSaw>の部分は以下のとおりになります。
<PanelSaw Count="1" SourceIndex="0">
<LineData Count="1">0</LineData> <!-- 例の0は部材番号 Count=1はその部材の枚数-->
<LineData Count="1">1</LineData>
<LineData Count="1">2</LineData>
</PanelSaw>