.recx ファイルとは

.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(木取り図) 
 │   └─LineData(1次元) or BoardNode(2次元)
 ├─ProcessNumberPriorityPanelSawList(1次元工程数優先) or RemnantsLengthPriorityPanelSawList (1次元残材長さ優先)
 │ └─PanelSaw(木取り図)
 │   └─LineData
 ├─PartsBoardList(部材リスト)
 ├─PartsColorList(部材の色設定リスト)
 ├─SourceBoardList(原板リスト)
 ├─StockBoardList(優先使用材リスト)
 ├─SourceBoardData(原板の集計済みデータ)
 ├─PartsBoardData(部材の集計済みデータ)
 └─PrintSetUp(印刷のページ設定)

 

 

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

部材・原板を面積順にソートし、大きい方から0から始まる番号が付きます。面積が同じ場合は横が長い方、それも同じ場合は回転可能な方を先に番号をつけます。

 

2次元木取り図のデータ構造について

板を1回切断すると2枚になります。その内の1枚を切るとそれが2枚になります。つまり、データ構造は2分岐の木構造です。
xmlですのでちょうど"板の定義"をすればそのまま表現することができます。木構造の末端にあたる部材と未使用スペースを四角形に描画すればアプリ上の表示の通りになります。
矛盾した値を読ませることはCutting Plannerが正常動作しない可能性があります。出力された値を使うだけにしてください。

 

木取り図・集計済みデータの板サイズ・座標について

内部でのアルゴリズムの仕様上、値は整数でなければなりません。そのため、最小単位を1とした数値に変換されて記録します。[オプション]-[配置計算]-[精度]を1単位とした整数値となります。例えば、長さの形式が小数点で精度(最小単位)0.1の場合12.3は10倍した123となります。分数インチの最小単位1/8インチの場合、12インチはそれを8倍した96となります。

2次元コード例

1次元との違いはコメント欄で

 

<?xml version="1.0" encoding="UTF-8"?>
<RectPacker FileTypeVersion="2.3" ExeFileVersion="11.6">
  <Option Material="Sheet1" Thickness="" SameSizePartsMerge="true" TabColor="" Problem="2D" LengthFormat="ftDecimal" Precision="1" Decimals="0" Rotate="0" SmallSourcePriorityPoint="5" SearchLevel="4" HighRatio="1" PartsColorListType="1" KerfSize="3" MaxCutLength="" MinimumSearchTime="2" ConvergenceJudgmentTime="15" TopTrimSize="0" BottomTrimSize="0" LeftTrimSize="0" RightTrimSize="0" RotationalProcessesPriority="1"/>
<!--

オプション
Material="Sheet1"

シート名(素材)

 

Thickness=""

シート名(厚さ)

 

SameSizePartsMerge="true"

同一サイズの部材と統合する

 

TabColor="" 

タブ色

 

Problem="2D" 

最適化問題(1次元・2次元)

 

LengthFormat="ftDecimal"

ftDecimal 小数点
ftFeetDecimalInches フィートと小数点インチ
ftFactionalInches 分数インチ
ftFeetFractionalInches フィートと分数インチ

 

Precision="1" 

精度・最小単位
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="0"
小数点の桁数(旧バージョンの互換のため、 Precisionを優先)

 

Rotate="0" 

すべての部材が回転可能=0 すべての部材が回転不可能=1 個別設定=2

 

SmallSourcePriorityPoint="5" 

小さい方の原板を優先する優先度

 

SearchLevel="4" 

配置探索レベル

 

HighRatio="1" 
旧バージョン互換 SearchLevel=1 で0 , SearchLevel>1 で1

 

PartsColorListType="1" 

部材の色分け

 

なし=0
似た形状=1
大きいサイズ順=2
小さいサイズ順=3

 

KerfSize="3" 

アサリ寸法

 

MaxCutLength="" 

最大切断可能長(2D)

 

MinimumSearchTime="2" 

最低探索時間(2D)

 

ConvergenceJudgmentTime="15" 

収束判定(1D)

 

TopTrimSize="0" 
BottomTrimSize="0" 
LeftTrimSize="0" 
RightTrimSize="0"

トリムサイズ

 

RotationalProcessesPriority="1"

回転工程数優先度(2D)

 

PlacementPriority1D="lrProcesses"

1次元のみ
"lrProcesses" 工程数優先
"lrRemnants" 残材長さ優先

-->
  <SourceBoardList>
    <Board Comment="" Width="1000" Height="700" Count="" Cost=""/>
    <Board Comment="" Width="" Height="" Count="" Cost=""/>
  </SourceBoardList>
<!--

原板リスト

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

-->
  <StockBoardList>
    <Board Comment="" Width="" Height="" Count="" Cost=""/>
 </StockBoardList>
<!--

優先使用材リスト

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

-->
  <PartsBoardList>
    <Board Comment="#Parts1" Width="400" Height="300" Count="1"/>
    <Board Comment="#Parts2" Width="500" Height="200" Count="2"/>
    <Board Comment="" Width="" Height="" Count=""/>
  </PartsBoardList>
<!--

 

部材リスト

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

-->
  <SourceBoardData>
    <Board Index="0" Count="-1" Cost="0" UsedNumber="1" Priority="0" Comment="" Width="1000" Height="700"/>
  </SourceBoardData>
  <PartsBoardData>
    <Board Index="0" Width="400" Count="1" Cost="0" Comment="#Parts1" Height="300" CanRotate="true" CanNotBeArrangedNumber="0"/>
    <Board Index="1" Width="500" Count="2" Cost="0" Comment="#Parts2" Height="200" CanRotate="true" CanNotBeArrangedNumber="0"/>
<!--

 

原板の集計済みデータ

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

-->
  </PartsBoardData>
<!--

 

部材の集計済みデータ

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

-->
  <Memo>
    <Line>#SumpleLine1</Line>
    <Line>#SumpleLine2</Line>
  </Memo>
<!--

 

メモ

(行単位にして記録します

-->
  <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="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="0" RotationsNumber="2">
<!--

 

<PanelSawList>木取り図リスト

ExecutionTime=ミリ秒単位の実行時間
RotationsNumber="2"= 回転工程数の合計(2D)

1次元の場合

オプション PlacementPriority1Dで設定した配置データが<PanelSawList>に入ります。
工程数優先(lrProcesses) と残材長さ優先(lrRemnants)が別々の計算結果となった場合はもう一方は<PanelSawList>の代わりに次のタグで併記されます。
<ProcessNumberPriorityPanelSawList> 工程数優先
<RemnantsLengthPriorityPanelSawList> 残材長さ優先

-->
    <PanelSaw Count="1" SourceIndex="0" PartitionID="0" PartitionIndex="0" PartitionCount="0" LayoutNumber="0" RotationsNumber="2">
<!--

 

<PanelSaw>タグ ー 木取り図1枚分のデータ
1次元

Count=同一図の枚数
SourceIndex=原板番号

 

2次元

Count=同一図の枚数
SourceIndex=原板番号
PartitionID=PanelSawが分割されたものである場合、分割元に1から番号が付けられる。0は分割されていない。
PartitionIndex=同一PartitionID内で0からつけられる番号
PartitionCount=同一PartitionID内で分割された枚数を示す。
LayoutNumber="0"=図面番号として<PanelSawList>内でユニークにつけられる。
RotationsNumber="2" =この<PanelSaw>の回転工程数

-->
      <BoardNode Category="cgHCut" SizeX="1000" SizeY="700" OriginY="0" OriginX="0" RotationsNumber="1">
        <BoardNode Category="cgVcut" SizeX="1000" SizeY="403" OriginY="0" OriginX="0" RotationsNumber="2">
          <BoardNode Category="cgHCut" SizeX="500" SizeY="403" OriginY="0" OriginX="0" RotationsNumber="0">
            <BoardNode Category="cgPartsSide" SizeX="500" SizeY="200" OriginY="0" OriginX="0" PartsIndex="1"/>
            <BoardNode Category="cgPartsSide" SizeX="500" SizeY="200" OriginY="203" OriginX="0" PartsIndex="1"/>
          </BoardNode>
          <BoardNode Category="cgVcut" SizeX="497" SizeY="403" OriginY="0" OriginX="503" RotationsNumber="0">
            <BoardNode Category="cgHCut" SizeX="300" SizeY="403" OriginY="0" OriginX="503" RotationsNumber="0">
              <BoardNode Category="cgPartsLength" SizeX="300" SizeY="400" OriginY="0" OriginX="503" PartsIndex="0"/>
            </BoardNode>
            <BoardNode Category="cgSpace" SizeX="194" SizeY="403" OriginY="0" OriginX="806"/>
          </BoardNode>
        </BoardNode>
        <BoardNode Category="cgSpace" SizeX="1000" SizeY="294" OriginY="406" OriginX="0"/>
      </BoardNode>
<!--

1次元<LineData>タグ

例:
<PanelSaw Count="1" SourceIndex="0">
<LineData Count="1">0</LineData>
<LineData Count="1">1</LineData>
<LineData Count="1">2</LineData>
</PanelSaw>
例の内容の0, 1, 2は部材番号 Count="1"はその部材の<PanelSaw>内での本数となります。

 

2次元<BoardNode>タグ ー 板の定義

板を一回切断すると2枚になります。その内の1枚を切断するとそれがまた2枚となります。
つまり、データ構造は2分岐の木構造となります。階層の一番下が部材か端材のデータとなり、
そのまま描画すればアプリ表示の通りになります。
複雑でややこしく思えますがほとんどの場合、末端部分の部材か端材のデータだけ考えれば十分です。 PartsIndexは<PartsBoardData>タグを見ればサイズやコメントなどの情報を参照することができます。
Category=板の種類
この板は横に切断される = cgHCut (子ノードが存在する)
この板は縦に切断される = cgVCut (子ノードが存在する)
回転された部材である= cgPartsLength
回転していない部材である = cgPartsSide
未使用の板(端材)である = cgSpace
SizeX=横サイズ SizeY=縦サイズ
OriginY=, OriginX= 木取り図の左上を(0,0)とした時の左上のY座標, X座標
PartsIndex=部材番号
RotationsNumber=回転工程数を数えるための中間データ

-->
    </PanelSaw>
  </PanelSawList>
  <PrintSetUp Unit="mm" FixedRatio="true" PrintPartsList="true" PrintMemo="false" ViewCost="true" UnitCost="true" OneDNotation="2">
    <Columns Number="2" Between="13"/>
    <Margin Top="20" Bottom="20" Left="10" Right="10"/>
    <Header Left="" Center="" Right=""/>
    <Footer Left="" Center="&amp;p/&amp;P" Right=""/>
  </PrintSetUp>
<!--

印刷時のページ設定

-->
</RectPacker>