/// <summary> /// 마커는 내부 쓰레드에 의해 가공 데이타를 처리하게 되는데, 이때 가공 데이타(IDocument)에 /// 크로스 쓰레드 상태가 될수 있으므로, 준비(Prepare)시에는 가공 데이타를 모두 복제(Clone) 하여 가공시 /// 데이타에 대한 쓰레드 안전 접근을 처리하게 된다. 또한 가공중 뷰에 의해 원본 데이타가 조작, 수정되더라도 /// 준비(Ready) 즉 신규 데이타를 다운로드하지 않으면 아무런 영향이 없게 된다. /// </summary> /// <param name="dmarkerArgoc">가공 인자</param> /// <returns></returns> public bool Ready(IMarkerArg markerArg) { if (null == markerArg) { return(false); } if (null == markerArg.Document || null == markerArg.Rtc || null == markerArg.Laser) { return(false); } this.MarkerArg = markerArg; this.clonedDoc = (IDocument)this.MarkerArg.Document.Clone(); Debug.Assert(clonedDoc != null); var rtc = this.MarkerArg.Rtc; //character set 모두 삭제 RtcCharacterSetHelper.Clear(rtc); // 재등록 bool success = true; for (int i = 0; i < this.clonedDoc.Layers.Count; i++) { var layer = this.clonedDoc.Layers[i]; if (layer.IsMarkerable) { foreach (var entity in layer) { var siriusText = entity as SiriusText; if (null != siriusText) { success &= siriusText.RegisterCharacterSetIntoRtc(rtc); } var text = entity as Text; if (null != text) { success &= text.RegisterCharacterSetIntoRtc(rtc); } } } } if (!success) { Logger.Log(Logger.Type.Error, $"marker [{this.Index}]: fail to register character into rtc"); } this.MarkerArg.Progress = 0; this.OnProgress?.Invoke(this, this.MarkerArg); return(true); }
static void Main3(string[] args) { SpiralLab.Core.Initialize(); #region initialize RTC //var rtc = new RtcVirtual(0); //create Rtc for dummy var rtc = new Rtc5(0); //create Rtc5 controller //var rtc = new Rtc6(0); //create Rtc6 controller //var rtc = new Rtc6Ethernet(0, "192.168.0.100", "255.255.255.0"); //실험적인 상태 (Scanlab Rtc6 Ethernet 제어기) float fov = 60.0f; // scanner field of view : 60mm float kfactor = (float)Math.Pow(2, 20) / fov; // k factor (bits/mm) = 2^20 / fov var correctionFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "correction", "cor_1to1.ct5"); rtc.Initialize(kfactor, LaserMode.Yag1, correctionFile); // 스캐너 보정 파일 지정 : correction file rtc.CtlFrequency(50 * 1000, 2); // laser frequency : 50KHz, pulse width : 2usec rtc.CtlSpeed(100, 100); // default jump and mark speed : 100mm/s rtc.CtlDelay(10, 100, 200, 200, 0); // scanner and laser delays #endregion #region initialize Laser (virtual) var laser = new LaserVirtual(0, "virtual", 20); // virtual laser source with max 20W power (최대 출력 20W 의 가상 레이저 소스 생성) //var laser = new IPGYLP(0, "IPG YLP", 1, 20); //var laser = new JPTTypeE(0, "JPT Type E", 1, 20); //var laser = new SPIG4(0, "SPI G3/4", 1, 20); //var laser = new PhotonicsIndustryDX(0, "PI", 1, 20); //var laser = new AdvancedOptoWaveFotia(0, "Fotia", 1, 20); //var laser = new CoherentAviaLX(0, "Avia LX", 1, 20); laser.Rtc = rtc; laser.Initialize(); laser.CtlPower(2); #endregion var rtcCharSet = rtc as IRtcCharacterSet; ConsoleKeyInfo key; do { Console.WriteLine("Testcase for spirallab.sirius. powered by [email protected] (http://spirallab.co.kr)"); Console.WriteLine(""); Console.WriteLine("'D' : mark to date"); Console.WriteLine("'I' : mark to time"); Console.WriteLine("'S' : mark to serial number"); Console.WriteLine("'R' : reset serial number"); Console.WriteLine("'Q' : quit"); Console.WriteLine(""); Console.Write("select your target : "); key = Console.ReadKey(false); if (key.Key == ConsoleKey.Q) { break; } Console.WriteLine(""); var timer = Stopwatch.StartNew(); switch (key.Key) { case ConsoleKey.D: RtcCharacterSetHelper.Clear(rtc); MarkToDate(laser, rtc); break; case ConsoleKey.I: RtcCharacterSetHelper.Clear(rtc); MarkToTime(laser, rtc); break; case ConsoleKey.S: RtcCharacterSetHelper.Clear(rtc); MarkToSerial(laser, rtc); break; case ConsoleKey.R: RtcCharacterSetHelper.Clear(rtc); rtcCharSet.CtlSerialReset(1000, 1); break; } Console.WriteLine($"Processing time = {timer.ElapsedMilliseconds / 1000.0:F3}s"); } while (true); rtc.Dispose(); }