.recx は Cutting Planner独自のファイル形式で、ワークシート単位の .xml形式 をzip圧縮して拡張子を .recx にしたものです。.xmlファイル一つがワークシート1枚分となります。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(部材の集計済みデータ)
└─PrintSetUp(印刷のページ設定)
部材・原板を面積順にソートし、大きい方から0から始まる番号が付きます。面積が同じ場合は横が長い方、それも同じ場合は回転可能な方を先に番号をつけま す。
全て同一の場合は統合して同一の部材とみなします。
板を1回切断すると2枚になります。その内の1枚を切るとそれが2枚になります。つまり、データ構造は2分岐の木構造です。
xmlですのでちょうど"板の定義"をすればそのまま表現することができます。木構造末端になる部材と未使用スペースだけを描画すればアプリ表示の通りになります。
矛盾した値を読ませることはCutting Plannerが正常動作しない可能性があります。出力された値を使うだけにしてください。
仕様上、値は整数でなければなりません。そのため、最小単位を1とした数値に変換されて記録します。[オプション]-[配置計算]-[精度]を1単位とした整数値となります。例えば、長さの形式が小数点で精度(最小単位)0.1の場合12.3は123となります。分数インチの最小単位1/8"の場合、1フィートは12インチを8倍した96となります。
<?xml version="1.0" encoding="UTF-8"?>
<RectPacker FileTypeVersion="1.7">
<!--
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=素材名
SameSizePartsMerge="true" 同じサイズを同一扱いする
-->
<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">
<!--
Count=同一図の枚数
SourceIndex=原板番号
PartitionID=PanelSawが分割されたものである場合、分割元に1から番号が付けられる。0は分割されていない。
PartitionIndex=同一PartitionID内で0からつけられる番号
PartitionCount=同一PartitionID内で分割された枚数を示す。
-->
<PanelSaw Count="1" SourceIndex="0" PartitionID="0" PartitionIndex="0" PartitionCount="0">
<!--
板を一回切断すると2枚になります。その内の1枚を切断するとそれがまた2枚となります。
つまり、データ構造は2分岐の木構造となります。階層の一番下が部材か端材のデータとなり、
そのまま描画すればアプリ表示の通りになります。
複雑でややこしく思えますがほとんどの場合、末端部分の部材か端材のデータだけ考えれば十分です。PartsIndexは<PartsBoardData>タグを見ればサイズやコメントなどの情報を参照することができます。
Category=板の種類
この板は横に切断される = cgHCut (子ノードが存在する)
この板は縦に切断される = cgVCut (子ノードが存在する)
回転された部材である= cgPartsLength
回転していない部材である = cgPartsSide
未使用の板(端材)である = cgSpace
SizeX=横サイズ SizeY=縦サイズ
OriginY=, OriginX= 木取り図の左上を(0,0)とした時の左上のY座標, 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>
<!-- -->
<PrintSetUp Unit="mm" FixedRatio="false" PrintPartsList="true" PrintMemo="false" ViewCost="true" TextOnly1D="false">
<Columns Number="2" Between="13"/>
<Margin Top="10" Bottom="10" Left="10" Right="10"/>
<Header Left="" Center="" Right=""/>
<Footer Left="" Center="&p/&P" Right=""/>
</PrintSetUp>
</RectPacker>
上記2次元の説明内容で1次元にとって不要な部分が省略されます。
そして図の例の場合、<PanelSaw>の部分は以下のとおりになります。
<PanelSaw Count="1" SourceIndex="0">
< !--
-->
<LineData Count="1">0</LineData>
<LineData Count="1">1</LineData>
<LineData Count="1">2</LineData>
</PanelSaw>