VYP ye Yeni Bir Standart Kontrol

Mavis VYP Kameralı Kontrol Yazılımı standart kontrollerine yeni bir tane daha eklendi : Parça Yönelimi.

Mavis VYP de, kameralı kontroller 3 gruba ayrılır.

  • Standart Kontroller
  • Projeye Özgü Kontroller
  • Gelişmiş Kontroller

Bir projenin sadece standart kontroller kullanılarak gerçeklenmesi en ideal durumdur. Projeye özgü kontroller bazı durumlarda kaçınılmaz olabilir. VYP, standart kontrol setini zenginleştirerek Projeye özgü kontrolleri olabildiğince minimuma indirgemiştir.

Standart kontrol kullanmanın avantajları

  • Kod yazımına gerek kalmaz
  • Defalarca test edilmiş olduğundan hatalara açık değildir
  • İyi Dökümante edilmiş ve eğitimlerde anlatılmış olduğundan kullanıcılar kolay uyum sağlar
  • Modüler / parametrik  olduğundan zahmetsizce uyarlanabilir
  • Güncelleştirmeler veya arayüz iyileştirmelerinden var olan tüm kurulumlar ek işlem yapılmaksızın yükseltilmiş olur

Parça Yönelimi :

Bu kontrol, sıkça karşılaştığımız “ters yönde takılmış” parçaları yakalamaya yarar. Kullanıcı arayüzü oldukça basittir.

Zorunlu kullanıcı seçimleri

  • bağlantı noktası (_juncPoint)
  • parçanın doğrultusu (_partDirection) Yatay / Dikey
  • parçanın beklenilen yönelimi (_expectingOrientation) Sol / Sağ / Üst / Alt

Opsiyonel kullanıcı seçimleri

  • Yaklaşma dörtgeninin kenar uzunluğu (_juncHeight) Varsayılan Değer : 10

Böylece sadece 3 seçimle birlikte kullanıcı parçanın olması gereken yönü sisteme kolayca bildirmiş olur.

(VYP Parça Yönelimi İçeren Kontrolleri Çalıştırıyor)

VYP Ekranında %800 zoom edildiğinde, parçanın yönelimi görülüyor.

Yönelim kullanıcının beklediği doğrultuda ise yeşil ok, aksi halde kırmızı ok (ters istikamete) ekranda belirecektir.


Yeni kontrolün C# kodlaması :

 

		private bool CheckDirection(JobDefs job)
		{

			if (masterFailed)
			{
				DrawCurrentRoi(job, false);
				return false;
			}

			HObject ho_ImageReduced;
			HObject ho_Region, ho_SelectedRegions, ho_Open, ho_Rect;
			HTuple hv_R1, hv_C1, hv_R2, hv_C2;

			bool retval = false;

			// Initialize local and output iconic variables 
			HOperatorSet.GenEmptyObj(out ho_ImageReduced);
			HOperatorSet.GenEmptyObj(out ho_Region);
			HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
			HOperatorSet.GenEmptyObj(out ho_Open);
			HOperatorSet.GenEmptyObj(out ho_Rect);

			ho_ImageReduced.Dispose();
			if (imagesource.ReduceJobDomain(job, out ho_ImageReduced))
			{
				ho_Region.Dispose();
				imagesource.ApplyThreshold(job, ho_ImageReduced, out ho_Region);

				if (job.ValDouble("area") > 0)
				{

					ho_SelectedRegions.Dispose();
					imagesource.ApplySelection(job, ho_Region, out ho_SelectedRegions);

					int openR = job.VarInt32("OpeningRadius", 1);
					ho_Open.Dispose();
					HOperatorSet.OpeningCircle(ho_SelectedRegions, out ho_Open, openR);

					imagesource.DisplayObj(ho_Open, "blue");

					// Yaklaşma Bölgesini oluşturalım
					HOperatorSet.SmallestRectangle1(ho_Open, out hv_R1, out hv_C1, out hv_R2, out hv_C2);
					int tutamac = job.VarInt32("_juncPoint", 3); //L R U D
					int rHeight = job.VarInt32("_juncHeight", 10); // Yaklaşma Dörtgeninin Yüksekliği
					int yonelim = job.VarInt32("_partDirection", 0); // Horizontal, Vertical
					int beklenenYon = job.VarInt32("_expectingOrientation", 0); // L R U D

					if (tutamac == 0) // Soldan tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R1, hv_C1-rHeight, hv_R2, hv_C1);
					else if (tutamac == 1) // Sağdan tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R1, hv_C2, hv_R2, hv_C2 + rHeight);
					else if (tutamac == 2) // Üstten tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R1 - rHeight, hv_C1, hv_R1, hv_C2);
					else if (tutamac == 3) // Alttan tutturulmuş				
						HOperatorSet.GenRectangle1(out ho_Rect, hv_R2, hv_C1, hv_R2 + rHeight, hv_C2);

					imagesource.SetColor("yellow");

					ho_ImageReduced.Dispose();
					HOperatorSet.ReduceDomain(imagesource.Image, ho_Rect, out ho_ImageReduced);

					ho_Region.Dispose();
					if (imagesource.ApplyThreshold(job, ho_ImageReduced, out ho_Region))
					{
						double yRow = job.ValDouble("row"); // yaklaşma Row
						double yCol = job.ValDouble("column"); // yaklaşma col

						HOperatorSet.DispCross(imagesource.DisplayHandle, yRow, yCol, 12, 0);

						if (yonelim == 0) // Yatay bir parça ise
						{
							double pC1 = TupleToDbl(hv_C1);
							double pC2 = TupleToDbl(hv_C2);

							double lFark = Math.Abs(pC1 - yCol); // merkez ile sol noktanın farkı
							double rFark = Math.Abs(pC2 - yCol); // merkez ile sağ noktanın farkı

							//imagesource.SetColor("blue");
							if (beklenenYon == 0) // Soldan bekleniyor
							{
								retval = lFark > rFark; // Solda bekleniyordu, geldi.
								imagesource.SetColor(retval ? "green" : "red");
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C1, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C2, 1);

							}
							else if (beklenenYon == 1) // Sağdan bekleniyor
							{
								retval = rFark > lFark;
								imagesource.SetColor(retval ? "green" : "red");								
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C2, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, yRow, hv_C1, 1);
							}
						} 
						else  // Dikey Parça
						{
							double pR1 = TupleToDbl(hv_R1);
							double pR2 = TupleToDbl(hv_R2);

							double uFark = Math.Abs(pR1 - yRow); // merkez ile üst noktanın farkı
							double dFark = Math.Abs(pR2 - yRow); // merkez ile alt noktanın farkı

							if (beklenenYon == 2) // Üstte bekleniyor
							{
								retval = uFark > dFark;
								imagesource.SetColor(retval ? "green" : "red");
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R1, yCol, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R2, yCol, 1);
							}
							else if (beklenenYon == 3) // Altta bekleniyor
							{
								retval = dFark > uFark;
								imagesource.SetColor(retval ? "green" : "red");
								if (retval)
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R2, yCol, 1);
								else
									HOperatorSet.DispArrow(imagesource.DisplayHandle, yRow, yCol, hv_R1, yCol, 1);
							}

						}
						PutLog(job, retval, "Parça Beklenen Yönde " + (retval ? "Geldi" : "Gelmedi"));
					}

				}
				else RedLog(job, "Seçili Bölg Bulunmamadı!");
			}
			else RedLog(job, "ROI indirgenemedi!");

			ho_ImageReduced.Dispose();
			ho_Region.Dispose();
			ho_SelectedRegions.Dispose();

			int compela = job.VarInt32("Complement", 0);
			if (compela == 1) retval = !retval;

			if (!retval)
			{
				DrawCurrentRoi(job, retval);
				int masterJob = job.VarInt32("MasterJob", 0);
				if (masterJob == 1)
					masterFailed = true;
			}

			return retval;
		}