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; }