.recx ファイル仕様

.recx ファイルとは

.xmlファイル一つでワークシート1枚分を保存することができます。.recx は ワークシート数ごとの.xml形式 をzip圧縮して拡張子を .recx にしたものです。.xmlでの入出力も可能です。zipファイルであることは日常意識する必要はなく、圧縮・展開ソフトを別に導入する必要もありません。

一般的にバイナリ形式では作った本人・ソフト屋しかその仕様を理解していません。そのため昔のワープロ専用機の文章ファイルのように時代の変化によりデータ の再利用が困難になる可能性があります。本ソフトウェアはマイナーな独自規格であり、大量にこの形式でデータを残すことは、どうしても不安が残ると思います。

そこでxml形式に変更しました。xmlは将来の仕様変更・拡張に柔軟に対応できる。仕様を公開することで、出力された木取り図を他のアプリケーションで使うソフトウェアを第三者が開発できる。などのメリットがあります。

(.recxに余計なファイルを入れた場合は正常に動作しないかもしれません)

複数の.xml をzipにまとめることで複数シートに対応します。タブ順はzip内部のファイルリストの順番となります。これによってコマンドライン上でもzipファイ ル作成ツールを用いることで複数シートの.recxファイルを作成することができます。zipファイル作成ツールはUTF-8 対応でなければ日本語文字が化けます。

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

データ構造としては次の構成となっています。

不要な部分のリストはなくても構いません。例えばデータ入力だけなら<PartsBoardList> と<SourceBoardList>だけでも有効です。

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

部材番号・原版番号について

  • 部材原版を面積順にソートし、大きい方から0から始まる番号をつけます。面積が同じ場合は横が長い方、それも同じ場合は回転可能な方を先に番号をつけま す。
  • 全て同一の場合は統合して同一の部材とみなします。
  • 木取り図のデータ構造について
  • 板を1回切断すると2枚になります。その内の1枚を切るとそれが2枚になります。つまり、データ構造は2分岐の木構造となります。
  • xmlですのでちょうど板を定義すればそのまま表現することができます。部材と未使用スペースだけを描画すれば表示の通りになります。
  • 矛盾した値を読ませることはCutting Plannerが正常動作しない可能性があります。出力された値を使うだけにしてください。
  • 木取り図・集計済みデータの板サイズ・座標について
  • 仕様上、値は整数でなければなりません。そのため、最小単位を1とした数値に変換されて記録し、内部で計算されます。[オプション]-[配置計算]-[精度]を1単位とした整数値となります。例えば、長さの形式が小数点で精度(最小単位)0.1の場合12.3が123となります。分数インチの最小単位1/8"の場合、1フィートは12インチを8倍した96となります。


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

<?xml version="1.0" encoding="UTF-8"?>
<RectPacker FileTypeVersion="1.3">
  <!--
------------------------------------------------------------------
オプション
  MaxCutLength=
切断機の最大切断長
  Rotate=
すべての部材が回転可能=0 すべての部材が回転不可能=1 個別設定=2
  SmallSourcePriorityPoint=
小さい方の原版を優先する優先度
  LengthFormat=
値の型
ftDecimal 小数点
ftFeetDecimalInches フィートと小数点インチ
ftFactionalInches 分数インチ
ftFeetFractionalInches フィートと分数インチ
  Precision=
精度・最小単位 
LengthFormat = "ftDecimal"の場合
1, 0.1, 0.01
LengthFormat = "ftFeetDecimalInches"の場合
0.1, 0.01, 0.001
"ftFactionalInches" or "ftFeetFractionalInches"の場合
1/8", 1/16", 1/32", 1/64", 1/128"
  Decimals=
小数点の桁数(旧バージョンの互換のため、 Precisionを優先)
  SearchLevel=
配置探索レベル
  MinimumSearchTime=
最低探索時間(秒単位)
  PartsColorListType =
部材の色分け 
なし=0 
似た形状=1 
大きいサイズ順=2 
小さいサイズ順=3
 
  Problem=
最適化問題 1D or 2D
TabColor=タブ色
Thickness=厚さ
Material=素材名
-->
<Option Rotate="0" PartsAlignment="0" SmallSourcePriorityPoint="2" Decimals="0" SearchLevel="3" HighRatio="1" PartsColorListType="1" KerfSize="3" MaxCutLength="" Problem="2D" TabColor="" Thickness="" Material="Sheet1"/>
<!--
  ------------------------------------------------------------------
原版リスト
(空白行を削除してある以外はアプリに入力したそのままで記録 
無効な値は実行時に無視 
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>