⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecgconverter.cs

📁 ecg tool kit for medical image retrieval system
💻 CS
📖 第 1 页 / 共 3 页
字号:
		/// Function to get the extra offset.
		/// </summary>
		/// <param name="i">position in list</param>
		/// <returns>extra offset</returns>
		public int getExtraOffset(int i)
		{
			if ((i < 0)
			||	(i >= _SupportedFormats.Count))
				return 0;

			return ((ECGPlugin)_SupportedFormats.GetByIndex(i)).ExtraOffset;
		}
		
		/// <summary>
		/// Function that will add plugin to supported list.
		/// </summary>
		/// <param name="plugin">the plugin</param>
		public void AddPlugin(ECGPlugin plugin)
		{
			if ((plugin != null)
			&&	(plugin.Name != null))
			{
				string temp = plugin.Name.ToUpper();

				int index = _SupportedFormats.IndexOfKey(temp);

				if (index >= 0)
					_SupportedFormats.SetByIndex(index, plugin);
				else
					_SupportedFormats.Add(temp, plugin);
			}	
		}

		/// <summary>
		/// Function that will add plugin to supported list.
		/// </summary>
		/// <param name="plugin">the plugin</param>
		public void AddPlugin(ECGManagementSystem.IECGManagementSystem manSys)
		{
			if ((manSys != null)
			&&	(manSys.Name != null))
			{
				string temp = manSys.Name.ToUpper();

				int index = _SupportedECGMS.IndexOfKey(temp);

				if (index >= 0)
					_SupportedECGMS.SetByIndex(index, manSys);
				else
					_SupportedECGMS.Add(temp, manSys);
			}	
		}

        /// <summary>
        /// Function to add all plugins in a directory.
        /// </summary>
        /// <param name="dir">directory to detect plugins from</param>
        /// <returns>returns 0 if successful</returns>
        public static int AddPlugins(string dir)
        {
            return AddPlugins(Instance, dir);
        }

        /// <summary>
        /// Function to add all plugins in a directory.
        /// </summary>
        /// <param name="converter">instance of the converter singleton</param>
        /// <param name="dir">directory to detect plugins from</param>
        /// <returns></returns>
        public static int AddPlugins(ECGConverter converter, string dir)
        {
            if (converter == null)
                return 1;

            try
            {
                if ((dir == null)
			    ||	(dir.Length == 0))
				    return 2;

    			string[] asPlugin = Directory.GetFiles(dir, "*.dll");

                String currentDll = System.IO.Path.GetFileName(Assembly.GetExecutingAssembly().Location);

    			foreach (string sPlugin in asPlugin)
	    		{
					if (String.Compare(System.IO.Path.GetFileName(sPlugin), currentDll, true) != 0)
					{
						AddPlugin(converter, sPlugin);
					}
			    }
            }
            catch (Exception)
            {
                return 3;
            }

            return 0;
        }

		/// <summary>
		/// Function that will add plugins from a certain dll to the supported list.
		/// </summary>
		/// <param name="dllfile">path to dll</param>
		/// <returns>returns 0 if successful</returns>
		public static int AddPlugin(string dllfile)
		{
			return AddPlugin(Instance, dllfile);
		}

		/// <summary>
		/// Function that will add plugins from a certain dll to the supported list.
		/// </summary>
		/// <param name="converter">the object to add the plugin to</param>
		/// <param name="dllfile">path to dll</param>
		/// <returns>returns 0 if successful</returns>
		private static int AddPlugin(ECGConverter converter, string dllfile)
		{
			if (converter == null)
				return 1;

			try
			{
				Assembly assembly = Assembly.LoadFrom(dllfile);
				Type type = assembly.GetType("ECGConversion.ECGLoad");
				MethodInfo methodInfo = type.GetMethod("LoadPlugin");

				if (methodInfo != null)
				{
					foreach (ECGPlugin plugin in (Array) methodInfo.Invoke(null, null))
						if (plugin != null)
							converter.AddPlugin(plugin);
				}

				methodInfo = type.GetMethod("LoadECGMS");

				if (methodInfo != null)
				{
					foreach (ECGManagementSystem.IECGManagementSystem ecgms in (Array) methodInfo.Invoke(null, null))
						if (ecgms != null)
							converter.AddPlugin(ecgms);
				}
			}
			catch (Exception)
			{
				return 2;
			}

			return 0;
		}

		/// <summary>
		/// Function to write an ECG to Txt file that can be read with Excel.
		/// </summary>
		/// <param name="src">an ECG file to convert</param>
		/// <param name="output">stream to write Txt in.</param>
		/// <param name="hSeperator">Horizontal seperator to use</param>
		/// <returns>0 on success</returns>
		public static int ToExcelTxt(IECGFormat src, TextWriter output, char hSeperator)
		{
			if ((src != null)
			&&	(output != null))
			{
				ISignal sigread = src.Signals;
				if (sigread != null)
				{
					Signals data;
					sigread.getSignals(out data);

					if ((data != null)
					&&	(data.NrLeads != 0))
					{
						// Determine minimum start and maximum end.
						int minstart = int.MaxValue;
						int maxend = int.MinValue;

						data.CalculateStartAndEnd(out minstart, out maxend);

						output.Write("samplenr");
						for (int lead=0;lead < data.NrLeads;lead++)
						{
							if (data[lead] != null)
							{
								output.Write("{0}{1}", hSeperator, data[lead].Type);
							}
							else
							{
								output.Write("{0}?", hSeperator);
							}
						}
						output.WriteLine();

						for (int sample=minstart;sample < maxend;sample++)
						{
							output.Write("{0}", sample);
							for (int lead=0;lead < data.NrLeads;lead++)
							{
								if ((data[lead] != null)
								&&	(data[lead].Rhythm != null)
								&&	(data[lead].Rhythm.Length >= (data[lead].RhythmEnd - data[lead].RhythmEnd))
								&&	(sample >= data[lead].RhythmStart)
								&&	(sample < data[lead].RhythmEnd))
								{
									output.Write("{0}{1}", hSeperator, (data[lead].Rhythm[sample - data[lead].RhythmStart] * data.RhythmAVM).ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat));
								}
								else
								{
									output.Write("{0}0", hSeperator);
								}
							}
							output.WriteLine();
						}

						return 0;
					}
					return 4;
				}
				return 2;
			}
			return 1;
		}
		/// <summary>
		/// Function to write an ECG to Txt file that can be read with MatLab.
		/// </summary>   
		/// <param name="src">an ECG file to convert</param>
		/// <param name="output">stream to write Txt in.</param>
		/// <returns>0 on success</returns>
		public static int ToMatlabTxt(IECGFormat src, TextWriter output)
		{
			if ((src != null)
			&&	(output != null))
			{
				ISignal sigread = src.Signals;
				if (sigread != null)
				{
					Signals data;
					sigread.getSignals(out data);

					if ((data != null)
					&&	(data.NrLeads != 0)
					&&	(data.RhythmSamplesPerSecond != 0))
					{
						LeadType[] neededLeads = {LeadType.I, LeadType.II, LeadType.III, LeadType.aVR, LeadType.aVL, LeadType.aVF, LeadType.V1, LeadType.V2, LeadType.V3, LeadType.V4, LeadType.V5, LeadType.V6};
						output.Write("ECGStandardLeads = [");
						for (int find=0;find < neededLeads.Length;find++)
						{
							int p = 0;
							for (;p < data.NrLeads;p++)
							{
								if ((data[p] != null)
								&&	(data[p].Type == neededLeads[find])
								&&	(data[p].Rhythm != null))
								{
									break;
								}
							}
							if (p == data.NrLeads)
							{
								p = -1;
							}
							output.Write("{0} ", p+1);
						}
						output.WriteLine("];");
						output.WriteLine();

						if (data.MedianSamplesPerSecond != 0)
						{
							if (data.QRSZone != null)
							{
								output.Write("ECGSubtraction = [");
								int nr = 0;
								for (int loper=0;loper < data.QRSZone.Length;loper++)
								{
									if ((data.QRSZone[loper] != null)
									&&	(data.QRSZone[loper].Type == 0))
									{
										nr++;
										output.Write("{0} {1} {2} {3};",
										    data.QRSZone[loper].Start + 1,
										    data.MedianFiducialPoint + (data.QRSZone[loper].Start - data.QRSZone[loper].Fiducial) + 1,
										    data.QRSZone[loper].End,
										    data.MedianFiducialPoint + (data.QRSZone[loper].End - data.QRSZone[loper].Fiducial));
									}
								}
								output.WriteLine("];");
								output.WriteLine();
								output.WriteLine("ECGSubtractionNr = {0};", nr);
								output.WriteLine();
							}

							output.WriteLine("ECGMedianLength = {0};", (data.MedianLength * data.MedianSamplesPerSecond) / 1000);
							output.WriteLine();
						
					    	output.Write("ECGMedian = [");
							for (int sample=0;sample < (data.MedianLength * data.MedianSamplesPerSecond) / 1000;sample++)
							{
								for (int lead=0;lead < data.NrLeads;lead++)
								{
									if ((data[lead] != null)
									&&	(data[lead].Median != null)
									&&	(sample < data[lead].Median.Length))
									{
										output.Write(" {0}", data[lead].Median[sample] * data.MedianAVM);
									}
									else
									{
										output.Write(" 0");
									}
								}
								output.Write(";");
							}
							output.WriteLine("];");
							output.WriteLine();
							
							if (data.MedianSamplesPerSecond != data.RhythmSamplesPerSecond)
							{
								for (int lead=0;lead < data.NrLeads;lead++)
								{
									ECGTool.ResampleLead(data[lead].Rhythm, data.RhythmSamplesPerSecond, data.MedianSamplesPerSecond, out data[lead].Rhythm);
									data[lead].RhythmStart = (data[lead].RhythmStart * data.MedianSamplesPerSecond) / data.RhythmSamplesPerSecond;
									data[lead].RhythmEnd = (data[lead].RhythmEnd * data.MedianSamplesPerSecond) / data.RhythmSamplesPerSecond;
								}
							}
						}

						// Determine minimum start and maximum end.
						int minstart = int.MaxValue;
						int maxend = int.MinValue;
						for (int lead=0;lead < data.NrLeads;lead++)
						{
							if (data[lead] != null)
							{
								minstart = Math.Min(minstart, data[lead].RhythmStart);
								maxend = Math.Max(maxend, data[lead].RhythmEnd);
							}
						}

						output.WriteLine("ECGNrLeads = {0};", data.NrLeads);
						output.WriteLine();
						output.WriteLine("ECGNrSamples = {0};", maxend - minstart);
						output.WriteLine();

						output.Write("ECGRhythm = [");
						for (int sample=minstart;sample < maxend;sample++)
						{
							for (int lead=0;lead < data.NrLeads;lead++)
							{
								if ((data[lead] != null)
								&&	(data[lead].Rhythm != null)
								&&	(data[lead].Rhythm.Length >= (data[lead].RhythmEnd - data[lead].RhythmEnd))
								&&	(sample >= data[lead].RhythmStart)
								&&	(sample < data[lead].RhythmEnd))
								{
									output.Write(" {0}", data[lead].Rhythm[sample - data[lead].RhythmStart] * data.RhythmAVM);
								}
								else
								{
									output.Write(" 0");
								}
							}
							output.Write(";");
						}
						output.WriteLine("];");

						return 0;
					}
					return 4;
				}
				return 2;
			}
			return 1;
		}
		/// <summary>
		/// Enumeration to determine the part of converting that must be done.
		/// </summary>
		public enum ConvertWork
		{
			DoDemographics			= 0x01,
			DoSignal				= 0x02,
			DoDiagnostic			= 0x04,
			DoGlobalMeasurements	= 0x08,
			DoLeadMeasurements		= 0x10,
			DoAll					= 0x1f
		}
		/// <summary>
		/// Function to copy one ECG file to an other. (uses a couple of interfaces)
		/// </summary>
		/// <param name="src">source ECG file</param>
		/// <param name="dst">destination ECG file</param>
		/// <returns>0 on success</returns>
		public static int Convert(IECGFormat src, IECGFormat dst)
		{
			return Convert(src, dst, ConvertWork.DoAll);
		}
		/// <summary>
		/// Function to copy one ECG file to an other. (uses a couple of interfaces)
		/// </summary>
		/// <param name="src">source ECG file</param>
		/// <param name="dst">destination ECG file</param>
		/// <returns>0 on success</returns>
		public static int Convert(IECGFormat src, IECGFormat dst, ConvertWork cw)
		{
			_DemographicsError = 0;
			_DiagnosticError = 0;
			_GlobalMeasurementsError = 0;
			_SignalError = 0;
			_LeadMeasurementsError = 0;

			if (src == null)
			{
				return 1;
			}
			if (dst == null)
			{
				return 2;
			}

			if ((cw & ConvertWork.DoDemographics) != 0)
			{
				IDemographic demsrc = src.Demographics;
				IDemographic demdst = dst.Demographics;
				if ((demsrc != null)
				&&  (demdst != null))
				{
					demdst.Init();
					_DemographicsError = DemographicCopy(demsrc, demdst);
				}
			}

			if ((cw & ConvertWork.DoSignal) != 0)
			{
				ISignal sigsrc = src.Signals;
				ISignal sigdst = dst.Signals;
				if ((sigsrc != null)
				&&	(sigdst != null))
				{
					_SignalError = SignalCopy(sigsrc, sigdst);
				}
			}

			if ((cw & ConvertWork.DoDiagnostic) != 0)
			{
				IDiagnostic diasrc = src.Diagnostics;
				IDiagnostic diadst = dst.Diagnostics;
				if ((diasrc != null)
				&&  (diadst != null))
				{
					_DiagnosticError = DiagnosticCopy(diasrc, diadst);
				}
			}

			if ((cw & ConvertWork.DoGlobalMeasurements) != 0)
			{
				IGlobalMeasurement messrc = src.GlobalMeasurements;
				IGlobalMeasurement mesdst = dst.GlobalMeasurements;
				if ((messrc != null)
				&&  (mesdst != null))
				{
					_GlobalMeasurementsError = GlobalMeasurementCopy(messrc, mesdst);
				}
			}

			if ((cw & ConvertWork.DoLeadMeasurements) != 0)
			{
				ILeadMeasurement leadsrc = src.LeadMeasurements;
				ILeadMeasurement leaddst = dst.LeadMeasurements;
				if ((leadsrc != null)
				&&	(leaddst != null))
				{
					_LeadMeasurementsError = LeadMeasurementCopy(leadsrc, leaddst);
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -