using Aurora; using Aurora.Api; using VisionAligner; using VisionCalibrator; using VisionDirector; using VisionLight; using VisionUI.Pattern; using VisionCommon; using VisionSequence.Aligner; using VisionSequence.Pattern; using VisionSequence.Setup; using VisionSequence.Inspector; using Aurora.Api.Manager; using VisionUI.Setup; using VisionUI.Camera; using VisionUI.Aligner; using VisionUI.Inspector; using VisionUI.RecipeMenu; using VisionUI.ProcTest; using Aurora.View; using WeldingCommon.Vision.Adapter; using WeldingCommon.Vision.Device; using VisionCommon.DB; using System; using VisionUI.CamCalibration; using System.Windows; using WeldingCommon.Vision.Common; #if USE_COGNEX using CogCamera; using CogPattern; #else using MilCamera; using MilPattern; #endif namespace WeldingCommon.Vision.Factory { /// /// 비전 레시피, 디바이스, 뷰를 등록한다. /// public static class VisionFactory { #region Register Setting /// /// 비전 셋팅을 등록한다. /// public static void RegisterSetting(IAuroraEnvironment auroraEnv, SettingRegister register) { VisionEnv.AuroraEnv = auroraEnv; register(VisionKeys.VisionSettingKey, new VisionSetting()); } #endregion #region Register Recipe /// /// 비전 레시피를 Aurora 모델이 아닌 레시피에 등록한다. (Default) /// public static void RegisterRecipe(RecipeRegister register) { VisionSettingManager.Initialize(); var visionSetting = VisionSettingManager.VisionSetting; if (visionSetting.RecipeModelType == eRecipeModelType.AuroraRecipe) { EquipmentInfoManager.Initialize(); if (VisionSettingManager.VisionSetting.UseRecipeAutoUpdate) { RecipeUpdater.Run(eRecipeModelType.AuroraRecipe); } register(VisionKeys.VisionRecipeKey, VisionRecipeManager.CreateVisionRecipeDef(), (id, item) => new UCVisionRecipeMenuView { DataContext = new UCVisionRecipeMenuRecipe(VisionEnv.AuroraEnv) }); } } #endregion #region Register Model (Optional) /// /// 비전 레시피를 Aurora 레시피가 아닌 모델에 등록한다. (선택사항) /// public static void RegisterModel(ModelRegister register) { VisionSettingManager.Initialize(); var visionSetting = VisionSettingManager.VisionSetting; if (visionSetting.RecipeModelType == eRecipeModelType.AuroraModel) { EquipmentInfoManager.Initialize(); if (VisionSettingManager.VisionSetting.UseRecipeAutoUpdate) { RecipeUpdater.Run(eRecipeModelType.AuroraModel); } register( VisionKeys.VisionRecipeKey, VisionRecipeManager.CreateVisionModelDef(), (id, item) => new UCVisionRecipeMenuView { DataContext = new UCVisionRecipeMenuModel(VisionEnv.AuroraEnv) }); } } #endregion #region Register Ingredient (Optional) /// /// 비전 레시피를 Aurora 레시피가 아닌 Ingredient에 등록한다. (선택사항) /// public static void RegisterIngredient(IngredientsRegister register) { VisionSettingManager.Initialize(); var visionSetting = VisionSettingManager.VisionSetting; if (visionSetting.RecipeModelType == eRecipeModelType.AuroraIngredient) { EquipmentInfoManager.Initialize(); register( VisionKeys.VisionRecipeKey, VisionRecipeManager.CreateVisionIngredientDef(), true, (id, item) => new UCVisionRecipeMenuView { DataContext = new UCVisionRecipeMenuIngredient(VisionEnv.AuroraEnv) }); } } #endregion #region Register Sequences /// /// 패턴 검출, 얼라인, 셋업 등 비전 관련 시퀀스들을 등록한다. /// public static void RegisterSequences(IAuroraEnvironment auroraEnv, SequenceRegister register) { // 비전 시퀀스를 등록하기 전에 Ingredient가 Activate 되어야 한다. ActivateVisionIngredient(auroraEnv); //RegisterEquipSeqAdapters(); //ReviewSeqManager.RegisterSeq(auroraEnv, register); AlignProcSeqManager.RegisterSeq(auroraEnv, register); ManualGrabFindSeqManager.RegisterSeq(auroraEnv, register); SetSetupRecipeEnabled(); if (VisionRecipeManager.CalibrationEnabled) { register(VisionKeys.CalSeqKey, new SetupSeq_Calibration().Builder(VisionKeys.CalSeqKey)); register(VisionKeys.CalSubSeqKey, new SetupSeq_CalSub().Builder(VisionKeys.CalSubSeqKey)); } if (VisionRecipeManager.AutoFocusEnabled) { register(VisionKeys.AutoFocusSeqKey, new SetupSeq_AutoFocus().Builder()); // 오토포커스 } if (VisionRecipeManager.CenterTuningEnabled) { register(VisionKeys.CenterTuningSeqKey, new SetupSeq_CenterTuning().Builder()); // 센터튜닝 } if (VisionRecipeManager.VisionRepeatEnabled) { register(VisionKeys.VisionRepeatSeqKey, new SetupSeq_VisionRepeat().Builder()); // 비전반복도 (제자리) register(VisionKeys.VisionRepeatDynamicSeqKey, new SetupSeq_DynamicRepeat().Builder()); // 비전반복도 (축이동) } RegisterInspSeqs(auroraEnv, register); } private static void ActivateVisionIngredient(IAuroraEnvironment auroraEnv) { if (VisionSettingManager.VisionSetting.RecipeModelType == eRecipeModelType.AuroraIngredient) { foreach (var ingredientName in auroraEnv.IngredientsManager.Ingredients()) { var ingredient = auroraEnv.IngredientsManager.Ingredient(ingredientName); // To-Do : 장비에서 필요한 Ingredient로 명시적으로 Activate 한다. ingredient.ActivateItem("VisionRecipe_Test"); } } } private static void SetSetupRecipeEnabled() { foreach (UnitInfo unitInfo in VisionRecipeManager.GetUnitInfos()) { foreach (SubSysInfo subSysInfo in VisionRecipeManager.GetSubSysInfos(unitInfo)) { var subSysRecipe = VisionRecipeManager.GetSubSysRecipe(subSysInfo); if (subSysRecipe.SubSysSetupRecipe.CalSetupRecipe != null && !VisionRecipeManager.CalibrationEnabled) { VisionRecipeManager.CalibrationEnabled = true; } if (subSysRecipe.SubSysSetupRecipe.CenterTuningRecipe != null && !VisionRecipeManager.CenterTuningEnabled) { VisionRecipeManager.CenterTuningEnabled = true; } if (subSysRecipe.InspRecipe.AttachInspRecipe != null && !VisionRecipeManager.AttachInspEnabled) { VisionRecipeManager.AttachInspEnabled = true; } foreach (FovInfo fovInfo in VisionRecipeManager.GetFovInfos(subSysInfo)) { var fovRecipe = VisionRecipeManager.GetFovRecipe(fovInfo); if (fovRecipe.FovSetupRecipe.AutoFocusRecipe != null && !VisionRecipeManager.AutoFocusEnabled) { VisionRecipeManager.AutoFocusEnabled = true; } if (fovRecipe.FovSetupRecipe.VisionRepeatRecipe != null && !VisionRecipeManager.VisionRepeatEnabled) { VisionRecipeManager.VisionRepeatEnabled = true; } } } } } /// /// 지원 검사기능 : 패턴거리 검사 / 패턴유무 검사 / QR코드 검사 / 부착 검사 /// 미지원 검사기능 : 도포 검사 / 이물 및 찍힘 검사 / 기타 양불 판별 검사 /// 미지원 검사 기능은 별도 검사 모듈을 활용하여 장비에서 직접 구현해야 한다. /// private static void RegisterInspSeqs(IAuroraEnvironment auroraEnv, SequenceRegister register) { if (VisionRecipeManager.AttachInspEnabled) { register(VisionKeys.AttachInspSeqKey, new AttachInspSeq_C2_F4_MV().Builder(VisionKeys.AttachInspSeqKey)); } bool codeEnabled = false; bool patternExistEnabled = false; foreach (eUnitId unitId in VisionRecipeManager.GetUnitIds()) { foreach (SubSysInfo subSysInfo in VisionRecipeManager.GetSubSysInfos(unitId)) { SubSysRecipe subSysRecipe = VisionRecipeManager.GetSubSysRecipe(subSysInfo); if (subSysRecipe.AlignRecipes.Count > 0) { foreach (AlignRecipe alignRecipe in subSysRecipe.AlignRecipes) { if (alignRecipe.InspParams.CodeEnabled) { codeEnabled = true; } if (alignRecipe.InspParams.PatternExistEnabled) { patternExistEnabled = true; } } } } } if (codeEnabled) { register(VisionKeys.BcrInspSeqKey, new InspSeq_BCR().Builder(VisionKeys.BcrInspSeqKey)); } if (patternExistEnabled) { register(VisionKeys.PatternExsitInspSeqKey, new InspSeq_PatternExist().Builder(VisionKeys.PatternExsitInspSeqKey)); } // *참고 : 패턴거리 검사 시퀀스는 얼라인 시퀀스에 포함되어 있음. } #endregion #region Register Devices /// /// 카메라, 조명 등 비전 관련 디바이스들을 등록한다. /// public static void RegisterDevices(IDeviceRegistry registry) { RegisterEquipAdapters(); // Device 등록 전에 먼저 실행해야 한다. LightFactory.Register(registry); CameraFactory.Register(registry); CalibratorFactory.Register(); CoordConverterFactory.Register(); AlignerFactory.Register(); MilPatternAgentFactory.Register(); MotionDirectorFactory.Register(); ForceOkHandlerFactory.Register(); VisionImageTesterFactory.Register(); VisionDBFactory.Register(registry); } #endregion #region Register Equip Adapters /// /// 장비 시퀀스 어댑터를 등록한다. /// private static void RegisterEquipSeqAdapters() { EquipAdapter.Instance.MachineSeqManager = new EquipSeqManager(); } /// /// 비전과 장비를 연결해주는 어댑터 인터페이스를 등록한다. /// private static void RegisterEquipAdapters() { EquipAdapter.Instance.EquipMode = new EquipMode(); EquipAdapter.Instance.EquipTrigger = new EquipTrigger(); EquipAdapter.Instance.VisionSetup = new VisionSetup(); EquipAdapter.Instance.VisionAlarm = new VisionAlarm(); EquipAdapter.Instance.TeachingMotionManager = new TeachingMotionManager(); EquipAdapter.Instance.AlignMotionManager = new AlignMotionManager(); EquipAdapter.Instance.PositionManager = new EquipPositionManager(); EquipAdapter.Instance.MachinePatternManager = new PatternManager(); } #endregion #region Register Views /// /// 메인 및 서브 메뉴에 포함된 비전 관련 뷰들을 등록한다. /// public static void RegisterViews(IViewManager manager) { #region SetTheme if (ApplicationExt.Theme_Color.Contains("Light")) { Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { // Light Theme //Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/Theme/VisionLight.xaml") Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/Theme/VisionLightSG.xaml") }); } else { Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { // Dark Theme Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/Theme/VisionDark.xaml") }); } // Vision Theme 적용 Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("pack://application:,,,/VisionCommonUI;component/Styles/VisionResources.xaml") }); #endregion VisionEventManager.Instance.Init(); var vision = new MainMenu(ViewIds.Vision, MenuIcon.GetMenuIcon(eMenuIcon.VIDEO), PermissionLevel.NONE); vision.AddSubMenu(ViewIds.Pattern, new SubMenuPatternRegistrationView()); // Calibration if (VisionRecipeManager.CalibrationEnabled) { vision.AddSubMenu(ViewIds.Calibration, new SubMenuCalView()); } // CamCalibration vision.AddSubMenu(ViewIds.CamCalibration, new SubMenuCamCalibrationRegistrationView()); // Align vision.AddSubMenu(ViewIds.Align, new SubMenuAlignView()); // Inspector AddInspSubMenus(vision); // AutoFocus if (VisionRecipeManager.AutoFocusEnabled) { vision.AddSubMenu(ViewIds.AutoFocus, new SubMenuAutoFocusView()); } // CenterTuning if (VisionRecipeManager.CenterTuningEnabled) { vision.AddSubMenu(ViewIds.CenterTuning, new SubMenuCenterTuningView()); } // VisionRepeat if (VisionRecipeManager.VisionRepeatEnabled) { vision.AddSubMenu(ViewIds.VisionRepeat, new SubMenuVisionRepeatView()); } // AttachInsp if (VisionRecipeManager.AttachInspEnabled) { vision.AddSubMenu(ViewIds.AttachInsp, new SubMenuAttachInspView()); } // ProcTest if (VisionSettingManager.VisionSetting.UseProcTest) { vision.AddSubMenu(ViewIds.ProcTest, new SubMenuProcTestView()); } // MainCamWindow if (VisionSettingManager.VisionSetting.UseMainCameraWindow) { vision.AddSubMenu(ViewIds.MainCamWindow, new SubMenuMainCamWindow()); // 서브 메뉴 클릭시, 닫혔던 메인 카메라 윈도우를 다시 띄움 CameraUcManager.Instance.ShowMainCameraViewWindow(); } manager.RegisterMainMenu(vision); } /// /// 지원 검사기능 : 패턴거리 검사 / 패턴유무 검사 / QR코드 검사 / 부착 검사 /// 미지원 검사기능 : 도포 검사 / 이물 및 찍힘 검사 / 기타 양불 판별 검사 등 /// 미지원 검사 기능은 별도 검사 모듈을 활용하여 장비에서 직접 구현해야 한다. /// private static void AddInspSubMenus(MainMenu vision) { bool codeEnabled = false; foreach (eUnitId unitId in VisionRecipeManager.GetUnitIds()) { foreach (SubSysInfo subSysInfo in VisionRecipeManager.GetSubSysInfos(unitId)) { SubSysRecipe subSysRecipe = VisionRecipeManager.GetSubSysRecipe(subSysInfo); if (subSysRecipe.AlignRecipes.Count > 0) { foreach (AlignRecipe alignRecipe in subSysRecipe.AlignRecipes) { if (alignRecipe.InspParams.CodeEnabled) { codeEnabled = true; } } } } } if (codeEnabled) { vision.AddSubMenu(ViewIds.BCR, new VisionUI.Pattern.SubMenuBcrLogView()); } // *참고 : 패턴유무 검사 로그뷰는 따로 없음. // *참고 : 패턴거리 검사 로그뷰는 얼라인 서브메뉴 내에 있음. } /// /// 비전 뷰 ID /// public class ViewIds { /// /// Vision 뷰 ID /// public const string Vision = "Vision"; /// /// Pattern 뷰 ID /// public const string Pattern = "Pattern"; /// /// CamPattern 뷰 ID /// public const string CamPattern = "CamPattern"; /// /// Calibration 뷰 ID /// public const string Calibration = "Calibration"; /// /// CamCalibration 뷰 ID /// public const string CamCalibration = "CamCalibration"; /// /// Align 뷰 ID /// public const string Align = "Align"; /// /// AutoFocus 뷰 ID /// public const string AutoFocus = "AutoFocus"; /// /// Center Tuning 뷰 ID /// public const string CenterTuning = "CenterTuning"; /// /// Vision Repeat 뷰 ID /// public const string VisionRepeat = "VisionRepeat"; /// /// Attach Inspection 뷰 ID /// public const string AttachInsp = "AttachInsp"; /// /// Process Test 뷰 ID /// public const string ProcTest = "ProcTest"; /// /// BCR 뷰 ID /// public const string BCR = "BCR"; /// /// Main Camera Window 뷰 ID /// public const string MainCamWindow = "MainCamWindow"; /// /// Recipe Setting 뷰 ID /// public const string RecipeSetting = "RecipeSetting"; } #endregion #region Register Language /// /// 언어 리소스를 등록한다. /// /// Aurora의 LangResourceRegister public static void RegisterLanguageResource(LangResourceRegister register) { register(typeof(VisionCommonUI.Resources.StrTokens)); } #endregion } }