1.首先resharper在代码重构以及规范方面的很全面,对于其中快捷键的掌握也是很重要的环节。
当项目初期由于时
间紧迫,难以在保证工期的同时保证质量时候,resharper是一个很不错的选择。
但是养成良好的代码习惯是很重要,这样才是真正事半功倍的方式。
2.code maid自动排版 https://www.cnblogs.com/clark159/p/4003542.html
3.stylecop 作为微软内部代码审核的工具,在格式方面是异常的严格,通过resharp对于代码重构之后,通过stylecop是修剪细节
,这个修剪的过程中,我也学会了一些常见的代码的格式。
4.c# outline对于语句块的折叠很分层很好用。
5.indent guides 增加代码行与行之间对其的垂直线。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using HalconDotNet;
using Tztek.C311.Alg.Mark;
namespace TestBgaMeasure
{
public partial class Form1 : Form
{
/// <summary>
/// 输入图像
/// </summary>
public HObject Image;
/// <summary>
/// 模板学习ROI
/// </summary>
public AlgRoi MaskLearnRoi;
/// <summary>
/// 模板学习参数
/// </summary>
public AlgPara LearnFromImagePara;
/// <summary>
/// 边缘检测参数
/// </summary>
public AlgPara BodyLoactionPara;
/// <summary>
/// 测量以及缺陷检测参数
/// </summary>
public AlgPara MeasureDectectBallPara;
/// <summary>
/// 所有参数
/// </summary>
public BgaMeasurePara Para;
public Form1()
{
InitializeComponent();
ucHalcon1.InitUcHalcon();
Para = new BgaMeasurePara()
{
EdgecalipersNumber1 = "30",
CalipersHeight1 = "160",
CalipersWidth1 = "15",
GaussFilterFactor1 = "1",
EdgeDetectThreshold1 = "20",
EdgePolarity1 = "negative",
EdgePointSelect1 = "last",
MinThreshold1 = "10",
MaxThreshold1 = "255",
BasePlateMinLength1 = "1900",
BasePlateMaxLength1 = "2500",
BallDiameterMin1 = "15",
BallDiameterMax1 = "25",
BallQualitySmallCircle1 = "0.2",
BallQualityMidCircle1 = "0.5",
BallQualityBiglCircle1 = "1"
};
propertyGrid1.SelectedObject = Para;
ApplyPara();
}
/// <summary>
/// 加载图像
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_LoadImage_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
HOperatorSet.GenEmptyObj(out Image);
HOperatorSet.ReadImage(out Image, openFileDialog1.FileName);
ucHalcon1.DispImage(Image);
}
}
/// <summary>
/// 参数应用
/// </summary>
private void ApplyPara()
{
LearnFromImagePara = new AlgPara() {
ParaDic = new Dictionary<string, string>()
{
{ "边缘卡尺个数", Para.EdgecalipersNumber1 },
{ "卡尺高度", Para.CalipersHeight1 },
{ "卡尺宽度", Para.CalipersWidth1 },
{ "高斯滤波因子", Para.GaussFilterFactor1 },
{ "边缘检测阈值", Para.EdgeDetectThreshold1 },
{ "边缘极性", Para.EdgePolarity1 },
{ "边缘强度点选择", Para.EdgePointSelect1 },
{ "阈值分割下限", Para.MinThreshold1 },
{ "阈值分割上限", Para.MaxThreshold1 },
{ "基板下限", Para.BasePlateMinLength1 },
{ "基板上限", Para.BasePlateMaxLength1 },
{ "球直径下限", Para.BallDiameterMin1 },
{ "球直径上限", Para.BallDiameterMax1 },
{ "球品质分析小球直径", Para.BallQualitySmallCircle1 },
{ "球品质分析中球直径", Para.BallQualityMidCircle1 },
{ "球品质分析正常球直径", Para.BallQualityBiglCircle1 }
}
};
BodyLoactionPara = new AlgPara() {
ParaDic = new Dictionary<string, string>()
{
{ "边缘卡尺个数", Para.EdgecalipersNumber1 },
{ "卡尺高度", Para.CalipersHeight1 },
{ "卡尺宽度", Para.CalipersWidth1 },
{ "高斯滤波因子", Para.GaussFilterFactor1 },
{ "边缘检测阈值", Para.EdgeDetectThreshold1 },
{ "边缘极性", Para.EdgePolarity1 },
{ "边缘强度点选择", Para.EdgePointSelect1 }
}
};
MeasureDectectBallPara = new AlgPara() {
ParaDic = new Dictionary<string, string>()
{
{ "灰度阈值下限", Para.MinThreshold1 },
{ "球的最小直径", Para.BallDiameterMin1 },
{ "球的最大直径", Para.BasePlateMaxLength1 },
{ "球品质分析正常球直径", Para.BallQualityMidCircle1 },
{ "球品质分析小球直径", Para.BallQualitySmallCircle1 },
{ "球品质分析大球直径", Para.BallQualityBiglCircle1 }
}
};
}
/// <summary>
/// 参数应用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ApplyPara_Click(object sender, EventArgs e)
{
ApplyPara();
}
/// <summary>
/// 绘制产品区域掩膜
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_DrawMask_Click(object sender, EventArgs e)
{
HTuple row1; HTuple row2; HTuple col1; HTuple col2;
ucHalcon1.Window.SetColor("green");
HOperatorSet.DrawRectangle1(ucHalcon1.Window, out col1, out col2, out row1, out row2);
HObject roi;
HOperatorSet.GenEmptyObj(out roi);
HOperatorSet.GenRectangle1(out roi, col1, col2, row1, row2);
roi.DispObj(ucHalcon1.Window);
HOperatorSet.WriteRegion(roi, "Roi.hobj");
MaskLearnRoi = new AlgRoi { roiList = new List<HObject> { roi } };
}
/// <summary>
/// 生成灰度模板以及掩膜
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_GenTempleAndMask_Click(object sender, EventArgs e)
{
var alg = new BgaFactory(LearnFromImagePara, MaskLearnRoi).CreateAlg("LearnFromImage");
alg.Process(Image.SelectObj(1), ucHalcon1.hWindowControl1.HalconWindow);
var resultValues = alg.GetResultValue();
List<string> modelColstr2;
List<string> modelRowstr2;
resultValues.ResultDic.TryGetValue("工件坐标系Row", out modelRowstr2);
resultValues.ResultDic.TryGetValue("工件坐标系Column", out modelColstr2);
var mat2D = new HTuple();
var r1 = HalconHepler.ConvertListStr2Htuple(modelRowstr2);
var c1 = HalconHepler.ConvertListStr2Htuple(modelColstr2);
HOperatorSet.WriteTuple(r1, "R.tuple");
HOperatorSet.WriteTuple(c1, "C.tuple");
HOperatorSet.GenEmptyObj(out ucHalcon1.MouseHwindow._objshow);
ucHalcon1.Window.SetColored(12);
foreach (var obj in alg.GetResultRegion())
{
obj.DispObj(ucHalcon1.Window);
HOperatorSet.ConcatObj(ucHalcon1.MouseHwindow._objshow, obj, out ucHalcon1.MouseHwindow._objshow);
}
}
/// <summary>
/// 进行二维测量
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_2dMeasure_Click(object sender, EventArgs e)
{
HObject roi;
HOperatorSet.GenEmptyObj(out roi);
HOperatorSet.ReadRegion(out roi, "Roi.hobj");
var algRoi2 = new AlgRoi { roiList = new List<HObject> { roi } };
var factroFactory = new BgaFactory(BodyLoactionPara, algRoi2);
var alg = factroFactory.CreateAlg("BodyLoaction");
HOperatorSet.SelectObj(Image, out Image, 1);
alg.Process(Image, ucHalcon1.hWindowControl1.HalconWindow);
var resultValues2 = alg.GetResultValue();
ucHalcon1.Window.SetColored(12);
foreach (var obj in alg.GetResultRegion())
{
obj.DispObj(ucHalcon1.Window);
}
#region 计算坐标系的偏斜
List<string> modelColstr2;
List<string> modelRowstr2;
resultValues2.ResultDic.TryGetValue("工件坐标系Row", out modelRowstr2);
resultValues2.ResultDic.TryGetValue("工件坐标系Column", out modelColstr2);
HTuple mat2d;
HTuple r2 = HalconHepler.ConvertListStr2Htuple(modelRowstr2);
HTuple c2 = HalconHepler.ConvertListStr2Htuple(modelColstr2);
HTuple r1;
HTuple c1;
HOperatorSet.ReadTuple("R.tuple", out r1);
HOperatorSet.ReadTuple("C.tuple", out c1);
HOperatorSet.VectorToHomMat2d(r1, c1, r2, c2, out mat2d);
HObject ballRegion;
HOperatorSet.GenEmptyObj(out ballRegion);
HOperatorSet.ReadRegion(out ballRegion, "BallRegion.hobj");
HObject roiAffine;
HOperatorSet.GenEmptyObj(out roiAffine);
HOperatorSet.AffineTransRegion(ballRegion, out roiAffine, mat2d, "nearest_neighbor");
roiAffine.DispObj(ucHalcon1.Window);
HOperatorSet.ConcatObj(roiAffine, ucHalcon1.MouseHwindow._objshow, out ucHalcon1.MouseHwindow._objshow);
#endregion
var algRoi4 = new AlgRoi { roiList = new List<HObject> { roiAffine } };
var Alg1 = new BgaFactory(MeasureDectectBallPara, algRoi4).CreateAlg("MeasureDectectBall");
HOperatorSet.SelectObj(Image, out Image, 1);
Alg1.Process(Image, ucHalcon1.hWindowControl1.HalconWindow);
var resultRegions4 = Alg1.GetResultRegion();
var resultValues4 = Alg1.GetResultValue();
listBox1.Items.Clear();
foreach (var value in resultValues4.ResultDic)
{
listBox1.Items.Add(value.Key);
var values = value.Value;
var temp = values.Aggregate("", (current, resultValue) => current + (resultValue + ", "));
listBox1.Items.Add(temp);
}
}
}
}