Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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();
        }