.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(1次元 or 2次元 木取り図リスト)
│ └─PanelSaw(木取り図)
│ ├──CuttingCoordinateList(2次元:部材・残材の座標リスト)
│ └─LineData(1次元) or BoardNode(2次元:木取り図)
├─ProcessNumberPriorityPanelSawList(1次元工程数優先) or RemnantsLengthPriorityPanelSawList (1次元残材長さ優先)
│ └─PanelSaw(木取り図)
│ └─LineData
├─PartsBoardList(部材リスト)
├─PartsColorList(部材の色設定リスト)
├─SourceBoardList(原板リスト)
├─StockBoardList(優先使用材リスト)
├─SourceBoardData(原板の集計済みデータ)
├─PartsBoardData(部材の集計済みデータ)
└─PrintSetUp(印刷のページ設定)
部材・原板を面積順にソートし、大きい方から0から始まる番号が付きます。面積が同じ場合は横が長い方、それも同じ場合は回転可能な方を先に番号をつけます。ただし、アプリ画面上の表示はこれに+1したものになります。これは番号がゼロから始まることに対して違和感を覚えるユーザーのために変更したものです。内部的に変更することは過去のファイルとの互換性など問題があるため、このxmlファイル上はゼロから番号がつきます。
BoardNodeタグについては人からの見た目が複雑すぎて理解困難なため座標だけを抽出した<CuttingCoordinateList>タグを追加しました。通常はこちらをご利用ください。
矛盾した値を読ませることはCutting Plannerが正常動作しない可能性があります。出力された値を使うだけにしてください。
<?xml version="1.0" encoding="UTF-8"?>
<RectPacker FileTypeVersion="3.7" ExeFileVersion="15.40" WindowsVersion="10.0.26200" UserID="XXXXXXXXX">
<FormatSettings DecimalSeparator="." ThousandSeparator=","/>
FormatSettings DecimalSeparator="." ThousandSeparator=","
このファイルを保存したPCの地域の設定である小数点記号と桁区切り記号。設定が異なるPCで開いた場合は変換される。
<Option SheetName1="Sheet1_#2" SheetName2="" Material="Sheet1_#2" Thickness="" SameSizePartsMerge="False" TabColor="clBtnFace" Problem="2D" LengthFormat="ftDecimals" Precision="1" Decimals="0" Rotate="0" SmallSourcePriorityPoint="1" PartsColorListType="1" KerfSize="3" ConvergenceJudgmentTime="10" TopTrimSize="" BottomTrimSize="" LeftTrimSize="" RightTrimSize="" Objective="MaximizeYield" FigureSortOrder="sotSourceSize" DescriptionCount="1" DescriptionTitle="" MethodOfLeavingRemnants="lrArea" MaxCutLength="" ComparisonOrder="rtYield,rtDrawingsQty,rtContiPartsArrange,rtPartsStraddlingPoint,rtRotationalRrocesses,rtMaxRemainingSize"/>
<SourceBoardList>
<Board Comment=" " Width="950" Height="450" Count=" " Cost="1000"/>
<Board Comment=" " Width=" " Height=" " Count=" " Cost=" "/>
空白行を削除してある以外はアプリに入力したそのままで記録、無効な値は実行時に無視、1次元の場合はHeightがなくなります。
Comment=コメント
Width=横サイズ
Height=縦サイズ
Count=枚数
Cost=単価
</SourceBoardList>
<StockBoardList>
<Board Comment=" " Width=" " Height=" " Count=" " Cost=" "/>
</StockBoardList>
空白行を削除してある以外はアプリに入力したそのままで記録、無効な値は実行時に無視、1次元の場合はHeightがなくなります
Comment=コメント
Width=横サイズ
Height=縦サイズ
Count=枚数
Cost=単価
<PartsBoardList>
<Board Comment="#Parts1" Width="400" Count="1" Height="300"/>
<Board Comment="#Parts2" Width="500" Count="2" Height="200"/>
<Board Comment=" " Width=" " Count=" " Height=" "/>
<Board Comment=" " Width=" " Count=" " Height=" "/>
空白行を削除してある以外はアプリに入力したそのままで記録 無効な値は実行時に無視
Comment=コメント
Width=横サイズ
Height=縦サイズ
Count=枚数
CanRotate=個別設定時の回転可=1・回転不可=0 個別設定以外の時は無視される
</PartsBoardList>
<SourceBoardData>
<Board Index="0" Count="-1" Cost="1000" UsedNumber="1" Priority="0" Comment="" Width="950" Height="450"/>
</SourceBoardData>
重複や無効な値を削除し、面積順・番号順にソート
Index=原板番号
Comment=コメント
Width=横サイズ
Height=縦サイズ
Count=枚数 -1は無制限
Cost=単価
UsedNumber=使用枚数
Priority=優先使用材は1
<PartsBoardData>
<Board Index="0" Width="400" Count="1" Cost="280.701754385965" Comment="#Parts1" Height="300" CanRotate="true" CanNotBeArrangedNumber="0"/>
<Board Index="1" Width="500" Count="2" Cost="233.918128654971" Comment="#Parts2" Height="200" CanRotate="true" CanNotBeArrangedNumber="0"/>
</PartsBoardData>
重複や無効な値を削除し、面積順・番号順にソート
Index=部材番号
Comment=コメント
Width=横サイズ
Height=縦サイズ
Count=枚数
CanRotate=回転の可否、個別設定以外の時は無視される
Cost=一枚あたりの単価
CanNotBeArrangedNumber=配置できなかった数
<Memo>
<Line>サンプル行1</Line>
<Line>サンプル行2</Line>
</Memo>
行単位にして記録します
<PartsColorList>
<PartsColor Back="clWhite" BrushColor="clSilver" FontColor="clGray" PenColor="clGray" Style="bsBDiagonal"/>
<PartsColor Back="clWhite" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00EAD1B9" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$008080FF" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$0080FFFF" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$0080FF80" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00FFFF80" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00FF8000" BrushColor="clWhite" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00C080FF" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00404080" BrushColor="clWhite" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$004080FF" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="clTeal" BrushColor="clWhite" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00804000" BrushColor="clWhite" FontColor="clWhite" PenColor="clBlack" Style="bsClear"/>
<PartsColor Back="$00FF8080" BrushColor="clWhite" FontColor="clBlack" PenColor="clBlack" Style="bsClear"/>
</PartsColorList>
Back=背景色 BrushColor=模様色 FontColor=文字色 PenColor=枠色 Style=模様
(値については「delphi VCL 色」・「Vcl.Graphics.TBrushStyle」で検索)
<PanelSawList ExecutionTime="203">
ExecutionTime=ミリ秒単位の実行時間
RotationsNumber="2"= 回転工程数の合計(2D)
オプション PlacementPriority1Dで設定した配置データが
に入ります。
工程数優先(lrProcesses) と残材長さ優先(lrRemnants)が別々の計算結果となった場合はもう一方は
の代わりに次のタグで併記されます。
工程数優先 残材長さ優先
<PanelSaw Count="1" SourceIndex="0" PartitionID="0" PartitionIndex="0" PartitionCount="0" LayoutNumber="0">
Count=同一図の枚数
SourceIndex=原板番号
Count=同一図の枚数
SourceIndex=原板番号
PartitionID=PanelSawが分割されたものである場合、分割元に1から番号が付けられる。0は分割されていない。
PartitionIndex=同9一PartitionID内で0からつけられる番号
PartitionCount=同一PartitionID内で分割された枚数を示す。
LayoutNumber="0"=図面番号として
ユニークにつけられる。
RotationsNumber="2" =この
回転工程数
<CuttingCoordinateList>
<cgPartsSide PartsIndex="1" Left="0" Top="0" Right="500" Bottom="200"/>
<cgPartsSide PartsIndex="1" Left="0" Top="203" Right="500" Bottom="403"/>
<cgSpace Left="0" Top="406" Right="500" Bottom="450"/>
<cgPartsSide PartsIndex="0" Left="503" Top="0" Right="903" Bottom="300"/>
<cgSpace Left="906" Top="0" Right="950" Bottom="300"/>
<cgSpace Left="503" Top="303" Right="950" Bottom="450"/>
</CuttingCoordinateList>
下記のBoardNodeタグが人の見た目では難解なため、カットレイアウト図の部材と残材の左上と右下の座標部分をリスト
cgPartsSide: 部材
cgPartsLength: 90度向きを回転した部材
cgSpace: 残材
<BoardNode Category="cgVcut" SizeX="950" SizeY="450" OriginY="0" OriginX="0">
<BoardNode Category="cgHCut" SizeX="500" SizeY="450" OriginY="0" OriginX="0">
<BoardNode Category="cgPartsSide" SizeX="500" SizeY="403" OriginY="0" OriginX="0" ColCount="1" RowCount="2" PartsIndex="1"/>
<BoardNode Category="cgSpace" SizeX="500" SizeY="44" OriginY="406" OriginX="0"/>
</BoardNode>
<BoardNode Category="cgHCut" SizeX="447" SizeY="450" OriginY="0" OriginX="503">
<BoardNode Category="cgVcut" SizeX="447" SizeY="300" OriginY="0" OriginX="503">
<BoardNode Category="cgPartsSide" SizeX="400" SizeY="300" OriginY="0" OriginX="503" ColCount="1" RowCount="1" PartsIndex="0"/>
<BoardNode Category="cgSpace" SizeX="44" SizeY="300" OriginY="0" OriginX="906"/>
</BoardNode>
<BoardNode Category="cgSpace" SizeX="447" SizeY="147" OriginY="303" OriginX="503"/>
</BoardNode>
</BoardNode>
例:
<PanelSaw Count="1" SourceIndex="0">
<LineData Count="1">0</LineData>
<LineData Count="1">1</LineData>
<LineData Count="1">2</LineData>
</PanelSaw>
012例の内容の0, 1, 2は部材番号 Count="1"はその部材の内での本数となります。
このBoardNodeタグでは人からの見た目が難解なため、CuttingCoordinateListの参照をおすすめします。
板を一回切断すると2枚になります。その内の1枚を切断するとそれがまた2枚となります。
つまり、データ構造は2分岐の木構造となります。階層の一番下が部材か端材のデータとなり、
そのまま描画すればアプリ表示の通りになります。
複雑でややこしく思えますがほとんどの場合、末端部分の部材か端材のデータだけ考えれば十分です。PartsIndexは
PartsBoardDataタグを見ればサイズやコメントなどの情報を参照することができます。
Category="cgVcut" この板は縦に切断される
Category="cgHcut" この板は横に切断される
Category="cgPartsSide" 向きを変えずに配置される部材
Category="cgPartsLength" 向きを変えて配置される部材
Category="cgSpace" 残材
OriginY="0" OriginX="0" PanelSaw左上隅を(0,0) としたこの板の座標
SizeX="950" SizeY="450" 整数に正規化したこの板のサイズ、ColCount, RowCount が複数になる場合は全体の板サイズ
ColCount="1" RowCount="1" 同じ部材が複数並ぶ場合の列数と行数
PartsIndex=部材番号
RotationsNumber=回転工程数を数えるための中間データ
内部でのアルゴリズムの都合上、値は整数でなければなりません。そのため、最小単位を1とした数値に変換されて記録します。[シートのプロパティ]-[精度]を1単位とした整数値となります。例えば、長さの形式が小数点で精度(最小単位)0.1の場合12.3は10倍した123となります。分数インチの最小単位1/8インチの場合、12インチはそれを8倍した96となります。
座標はトリミング部分を除いた値となります。
</PanelSaw>
</PanelSawList>
<PrintSetUp PrintingTarget="True" Unit="mm" FixedRatio="true" PrintPartsList="true" PrintMemo="false" ViewCost="true" ViewUnitCost="true" PrintSizeRemnantes="false" Figure-to-FigureSpacing="2" ListPartsInFigure1D="2" ListPartsInFigure2D="2">
<Columns Number="2" Between="13"/>
<Margin Top="20" Bottom="20" Left="10" Right="10"/>
<Header Left="" Center="" Right=""/>
<Footer Left="" Center="&p/&P" Right=""/>
</PrintSetUp>
</RectPacker>