using System;
using System.Text;
using System.Windows.Forms;
/// <summary>
/// Form上にテキストボックスを2つ配置
/// (コントロール名:txtHinban, txtEpcCode)
/// Form上にボタンを配置して下記イベントを実装
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
// プリンタに渡すコマンドを生成します。
StringBuilder sb = new StringBuilder();
//********************************
// RFID タグへの書き込み情報
//********************************
// イメージバッファを消去します
sb.AppendLine("CLS");
// RFIDへの書き込み情報セット
// 今回はHex文字列を書き込みます
sb.AppendLine(@"RFID WRITE,0,H,0,@Length,EPC,""@EPCCode""");
// ラベル1枚にRFID書き込み
sb.AppendLine("PRINT 1");
//
// ここで一旦ラベルが排出されてしまう。このまま印字を続けると次のラベルに印字されるので・・・
//
// 今回使用するタグラベルのサイズと同じ89mm戻る。300dpiの時:1mm=12ドットの為、89mm=1068ドット
sb.AppendLine("BACKFEED 1068");
//********************************
// ここからラベル印刷情報
//********************************
// 印刷方向。1は出力後に人間が視認しやすい方向
sb.AppendLine("DIRECTION 1");
sb.AppendLine("CLS");
// 枠線出力
BorderBox box = new BorderBox();
box.TopMM = 4; // mmで指定
box.LeftMM = 6;
box.WidthMM = 75;
box.HeightMM = 75;
box.Tick = 4; // ドットで指定
box.radius = 20;
sb.AppendLine(box.ToCommandString());
// 品番文字列出力
sb.AppendLine(@"TEXT 100,100, ""5"",0,1,1,""@Hinban""");
// QRコード出力
//QRCODE x,y,ECC Level,cell width,mode,rotation,[justification,]model,]mask,]area] "content"
string qr = @"QRCODE 100,200,H,10,A,0,M2, ""@EPCCode""";
sb.AppendLine(qr);
// テストのためにRFIDに書き込んだ文字列を出力
sb.AppendLine(@"TEXT 100,480, ""3"",0,1,1,""@EPCCode""");
// ロゴ画像
string logo = @"PUTBMP 100,700,""LOGO.BMP"",8";
sb.AppendLine(logo);
// ラベルに印字。1セット1部=ようするに1枚印刷
sb.AppendLine("PRINT 1");
// 品番
string hinban = txtHinban.Text;
// RFIDタグに書き込むデータ。24桁のHEX文字列
string epc_data = txtEpcCode.Text;
// その長さ
string length = epc_data.Length.ToString();
// 変数セット
string command = sb.ToString()
.Replace("@Hinban", hinban)
.Replace("@EPCCode", epc_data)
.Replace("@Length", length);
//********************************
// プリンタにデータを送信
//********************************
// スプール開始
// インストールしたプリンタ名に合わせて下さい
BROLIB_DLL.openport("Brother TD-4750TNWBR");
// コマンド送信
BROLIB_DLL.sendcommand(command);
// スプール終了
BROLIB_DLL.closeport();
// ここからプリンタがコマンドに沿って動作を始めます
}
/// <summary>
/// 枠線描画用内部クラス
/// 300 dpi(dot per inch=2.54cm)
/// 1mm = 12ドットで計算します。
/// </summary>
private class BorderBox
{
public BorderBox()
{
// 初期値
Tick = 4;
radius = 0;
}
/// <summary>
/// 開始上位置(ミリメートル)を指定します。
/// </summary>
public int TopMM { get; set; }
/// <summary>
/// 開始左位置(ミリメートル)を指定します。
/// </summary>
public int LeftMM { get; set; }
/// <summary>
/// 幅(ミリメートル)を指定します
/// </summary>
public int WidthMM { get; set; }
/// <summary>
/// 高さ(ミリメートル)を指定します
/// </summary>
public int HeightMM { get; set; }
/// <summary>
/// 線の太さ(ドット)で指定します
/// <para>1mm = 12ドット</para>
/// </summary>
public int Tick { get; set; }
/// <summary>
/// 角の丸め度。0で直角、数値が大きければ丸め度が大きい
/// </summary>
public int radius { get; set; }
/// <summary>
/// BOXコマンド文字列を返します
/// </summary>
public string ToCommandString()
{
int x = this.LeftMM * 12;
int y = this.TopMM * 12;
int x_end = (this.LeftMM + this.WidthMM) * 12;
int y_end = (this.TopMM + this.HeightMM) * 12;
return ($"BOX {x}, {y},{x_end},{y_end},{this.Tick},{this.radius}");
}
}