using System; using System.Drawing; using System.IO; using System.Linq; namespace UpdateDataTool { class VidUpgrader { public static void Convert(string source, string dest) { if (File.Exists(source)) { using (var sourceStream = new MemoryStream(File.ReadAllBytes(source))) { using (var vid1 = new Vinno.vCloud.Common.Vid.VinnoImageData(sourceStream)) { using (var vid2 = new Vinno.vCloud.Common.Vid2.VinnoImageData(dest, Vinno.vCloud.Common.Vid2.OperationMode.Create)) { var probe1 = vid1.Probe; var probeType = GetNewProbeType(probe1.Type); var application = GetNewApplication(probe1.Application); var probe2 = new Vinno.vCloud.Common.Vid2.VinnoProbe(probe1.Name, probeType, application, probe1.FrameRate); vid2.AddProbe(probe2); for (var i = 0; i < vid1.ImageCount; i++) { var vinnoImage1 = Vinno.vCloud.Common.Vid.VinnoImage.FromBytes(vid1.GetImage(i)); var image = GetImageFromBytes(vinnoImage1.ImageData); var vinnoImage2 = new Vinno.vCloud.Common.Vid2.VinnoImage(i, image.Width, image.Height, vinnoImage1.ImageData); if (vinnoImage1 is Vinno.vCloud.Common.Vid.Vinno2DImage vinno2DImage1) { if (vinno2DImage1.AllowMeasure) { var vinno2DVisual = new Vinno.vCloud.Common.Vid2.Visuals.Vinno2DVisual(); foreach (var lc in vinno2DImage1.LogicalCoordinates) { var newAreaType = GetNewVinnoVisualAreaType(lc.Key); vinno2DVisual.LogicalCoordinates.Add(newAreaType, new Vinno.vCloud.Common.Vid2.Visuals.VinnoLogicalCoordinate(lc.Value.IsFlipHorizontal, lc.Value.IsFlipVertical, GetNewRect(lc.Value.Region), GetNewUnit(lc.Value.XUnit), GetNewUnit(lc.Value.YUnit) )); } foreach (var pc in vinno2DImage1.PhysicalCoordinates) { var newAreaType = GetNewVinnoVisualAreaType(pc.Key); vinno2DVisual.PhysicalCoordinates.Add( newAreaType, GetNewPhysicalCoordinate(pc.Value)); } var oldVisual = probe1.Visuals.FirstOrDefault(); if (oldVisual != null) { foreach (var oldVisualMode in oldVisual.Modes) { vinno2DVisual.Modes.Add( new Vinno.vCloud.Common.Vid2.Visuals.VinnoMode(oldVisualMode.Name, oldVisualMode.DisplayName, GetNewModeType(oldVisualMode.Type))); } vinno2DVisual.ActiveModeType = GetNewModeType(oldVisual.ActiveModeType); } vinnoImage2.Visuals.Add(vinno2DVisual); } } if (vinnoImage1 is Vinno.vCloud.Common.Vid.Vinno3DPlaneImage vinno3DImage1) { if (vinno3DImage1.AllowMeasure) { var vinno3DVisual = new Vinno.vCloud.Common.Vid2.Visuals.Vinno3DVisual(); foreach (var t3a in vinno3DImage1.Tissue3DAreas) { var new3DArea = new Vinno.vCloud.Common.Vid2.Visuals.VinnoTissue3DArea( GetNewRect(t3a.Bounds), t3a.CmPerPixel, GetNewPoint(t3a.GlobalOffset), GetNewIndicator(t3a.Indicator) ); vinno3DVisual.Tissue3DAreas.Add(new3DArea); } var oldVisual = probe1.Visuals.FirstOrDefault(); if (oldVisual != null) { foreach (var oldVisualMode in oldVisual.Modes) { vinno3DVisual.Modes.Add( new Vinno.vCloud.Common.Vid2.Visuals.VinnoMode(oldVisualMode.Name, oldVisualMode.DisplayName, GetNewModeType(oldVisualMode.Type))); } vinno3DVisual.ActiveModeType = GetNewModeType(oldVisual.ActiveModeType); } vinnoImage2.Visuals.Add(vinno3DVisual); } } vid2.AddImage(vinnoImage2); } } } } } } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType GetNewVinnoVisualAreaType( Vinno.vCloud.Common.Vid.VinnoVisualAreaType vinnoVisualAreaType) { switch (vinnoVisualAreaType) { case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Colorbar: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Colorbar; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Doppler: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Doppler; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Flow: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Flow; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.TimeMotion: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.TimeMotion; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Tissue: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Tissue; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Tissue3D: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Tissue3D; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.TissueTimeMotion: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.TissueTimeMotion; case Vinno.vCloud.Common.Vid.VinnoVisualAreaType.Trace: return Vinno.vCloud.Common.Vid2.Visuals.VinnoVisualAreaType.Trace; default: throw new ArgumentOutOfRangeException(nameof(vinnoVisualAreaType), vinnoVisualAreaType, "Convert VinnoVisualAreaType failed."); } } private static Vinno.vCloud.Common.Vid2.VinnoProbeType GetNewProbeType( Vinno.vCloud.Common.Vid.VinnoProbeType oldProbeType) { switch (oldProbeType) { case Vinno.vCloud.Common.Vid.VinnoProbeType.Undefined: return Vinno.vCloud.Common.Vid2.VinnoProbeType.Undefined; case Vinno.vCloud.Common.Vid.VinnoProbeType.Linear: return Vinno.vCloud.Common.Vid2.VinnoProbeType.Linear; case Vinno.vCloud.Common.Vid.VinnoProbeType.Convex: return Vinno.vCloud.Common.Vid2.VinnoProbeType.Convex; case Vinno.vCloud.Common.Vid.VinnoProbeType.Sector: return Vinno.vCloud.Common.Vid2.VinnoProbeType.Sector; default: throw new ArgumentOutOfRangeException(nameof(oldProbeType), oldProbeType, null); } } private static Vinno.vCloud.Common.Vid2.VinnoApplication GetNewApplication( Vinno.vCloud.Common.Vid.VinnoApplication oldApplication) { var newApplication = new Vinno.vCloud.Common.Vid2.VinnoApplication(oldApplication.ApplicationId, oldApplication.ApplicationOriginalId, oldApplication.ApplicationName, oldApplication.ApplicationCategoryName, oldApplication.IsUserDefined); return newApplication; } private static Image GetImageFromBytes(byte[] bytes) { using (var ms = new MemoryStream(bytes)) { return Image.FromStream(ms); } } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoRect GetNewRect(Vinno.vCloud.Common.Vid.VinnoRect oldRect) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoRect(oldRect.Left, oldRect.Top, oldRect.Width, oldRect.Height); } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoPoint GetNewPoint(Vinno.vCloud.Common.Vid.VinnoPoint oldPoint) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoPoint(oldPoint.X, oldPoint.Y); } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType GetNewModeType(Vinno.vCloud.Common.Vid.VinnoModeType oldModeType) { switch (oldModeType) { case Vinno.vCloud.Common.Vid.VinnoModeType.Undefined: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Undefined; case Vinno.vCloud.Common.Vid.VinnoModeType.Tissue: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Tissue; case Vinno.vCloud.Common.Vid.VinnoModeType.Flow: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Flow; case Vinno.vCloud.Common.Vid.VinnoModeType.Doppler: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Doppler; case Vinno.vCloud.Common.Vid.VinnoModeType.TissueTM: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.TissueTM; case Vinno.vCloud.Common.Vid.VinnoModeType.Tissue3D: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.Tissue3D; case Vinno.vCloud.Common.Vid.VinnoModeType.FlowM: return Vinno.vCloud.Common.Vid2.Visuals.VinnoModeType.FlowM; default: throw new ArgumentOutOfRangeException(nameof(oldModeType), oldModeType, null); } } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator GetNewIndicator( Vinno.vCloud.Common.Vid.AreaIndicator oldArea) { switch (oldArea) { case Vinno.vCloud.Common.Vid.AreaIndicator.Global: return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.Global; case Vinno.vCloud.Common.Vid.AreaIndicator.A: return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.A; case Vinno.vCloud.Common.Vid.AreaIndicator.B: return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.B; case Vinno.vCloud.Common.Vid.AreaIndicator.C: return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.C; case Vinno.vCloud.Common.Vid.AreaIndicator.ThreeD: return Vinno.vCloud.Common.Vid2.Visuals.VinnoAreaIndicator.ThreeD; default: throw new ArgumentOutOfRangeException(nameof(oldArea), oldArea, null); } } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit GetNewUnit(Vinno.vCloud.Common.Vid.VinnoUnit oldUnit) { switch (oldUnit) { case Vinno.vCloud.Common.Vid.VinnoUnit.None: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.None; case Vinno.vCloud.Common.Vid.VinnoUnit.percent: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.percent; case Vinno.vCloud.Common.Vid.VinnoUnit.cm: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm; case Vinno.vCloud.Common.Vid.VinnoUnit.mm: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mm; case Vinno.vCloud.Common.Vid.VinnoUnit.inch: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.inch; case Vinno.vCloud.Common.Vid.VinnoUnit.ft: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ft; case Vinno.vCloud.Common.Vid.VinnoUnit.s: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.s; case Vinno.vCloud.Common.Vid.VinnoUnit.minute: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.minute; case Vinno.vCloud.Common.Vid.VinnoUnit.hour: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.hour; case Vinno.vCloud.Common.Vid.VinnoUnit.day: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.day; case Vinno.vCloud.Common.Vid.VinnoUnit.week: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.week; case Vinno.vCloud.Common.Vid.VinnoUnit.week_day: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.week_day; case Vinno.vCloud.Common.Vid.VinnoUnit.Tick: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Tick; case Vinno.vCloud.Common.Vid.VinnoUnit.msec: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.msec; case Vinno.vCloud.Common.Vid.VinnoUnit.degree: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.degree; case Vinno.vCloud.Common.Vid.VinnoUnit.radian: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.radian; case Vinno.vCloud.Common.Vid.VinnoUnit.g: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.g; case Vinno.vCloud.Common.Vid.VinnoUnit.mg: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mg; case Vinno.vCloud.Common.Vid.VinnoUnit.ng: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ng; case Vinno.vCloud.Common.Vid.VinnoUnit.kg: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.kg; case Vinno.vCloud.Common.Vid.VinnoUnit.oz: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.oz; case Vinno.vCloud.Common.Vid.VinnoUnit.lb: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.lb; case Vinno.vCloud.Common.Vid.VinnoUnit.cm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm2; case Vinno.vCloud.Common.Vid.VinnoUnit.mm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mm2; case Vinno.vCloud.Common.Vid.VinnoUnit.m2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.m2; case Vinno.vCloud.Common.Vid.VinnoUnit.cm3: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3; case Vinno.vCloud.Common.Vid.VinnoUnit.mm3: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mm3; case Vinno.vCloud.Common.Vid.VinnoUnit.ml: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ml; case Vinno.vCloud.Common.Vid.VinnoUnit.L: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.L; case Vinno.vCloud.Common.Vid.VinnoUnit.cms: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cms; case Vinno.vCloud.Common.Vid.VinnoUnit.mms: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mms; case Vinno.vCloud.Common.Vid.VinnoUnit.ms: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ms; case Vinno.vCloud.Common.Vid.VinnoUnit.cms2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cms2; case Vinno.vCloud.Common.Vid.VinnoUnit.mms2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mms2; case Vinno.vCloud.Common.Vid.VinnoUnit.cm3s: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3s; case Vinno.vCloud.Common.Vid.VinnoUnit.mls: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mls; case Vinno.vCloud.Common.Vid.VinnoUnit.mlmin: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlmin; case Vinno.vCloud.Common.Vid.VinnoUnit.Lmin: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Lmin; case Vinno.vCloud.Common.Vid.VinnoUnit.gcm3: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.gcm3; case Vinno.vCloud.Common.Vid.VinnoUnit.gml: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.gml; case Vinno.vCloud.Common.Vid.VinnoUnit.ngml: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.ngml; case Vinno.vCloud.Common.Vid.VinnoUnit.mmHg: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mmHg; case Vinno.vCloud.Common.Vid.VinnoUnit.mV: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mV; case Vinno.vCloud.Common.Vid.VinnoUnit.Hz: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Hz; case Vinno.vCloud.Common.Vid.VinnoUnit.KHz: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.KHz; case Vinno.vCloud.Common.Vid.VinnoUnit.HR: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.HR; case Vinno.vCloud.Common.Vid.VinnoUnit.cm3m2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3m2; case Vinno.vCloud.Common.Vid.VinnoUnit.mlm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlm2; case Vinno.vCloud.Common.Vid.VinnoUnit.cm3sm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3sm2; case Vinno.vCloud.Common.Vid.VinnoUnit.mlsm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlsm2; case Vinno.vCloud.Common.Vid.VinnoUnit.cm3minm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.cm3minm2; case Vinno.vCloud.Common.Vid.VinnoUnit.mlminm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlminm2; case Vinno.vCloud.Common.Vid.VinnoUnit.Lminm2: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.Lminm2; case Vinno.vCloud.Common.Vid.VinnoUnit.circs: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.circs; case Vinno.vCloud.Common.Vid.VinnoUnit.mlbeat: return Vinno.vCloud.Common.Vid2.Visuals.VinnoUnit.mlbeat; default: throw new ArgumentOutOfRangeException(nameof(oldUnit), oldUnit, null); } } private static Vinno.vCloud.Common.Vid2.Visuals.VinnoPhysicalCoordinate GetNewPhysicalCoordinate( Vinno.vCloud.Common.Vid.VinnoPhysicalCoordinate oldPhysicalCoordinate) { if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoConvexTVTissuePhysicalCoordinate cttpc) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoConvexTVTissuePhysicalCoordinate(cttpc.DepthEnd, cttpc.DepthStart, cttpc.Width, cttpc.BeamPosition, cttpc.ZeroRadius, cttpc.OriginalZeroRadius, cttpc.OriginalRocx); } if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoLinearTVTissuePhysicalCoordinate lttpc) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoLinearTVTissuePhysicalCoordinate(lttpc.DepthEnd, lttpc.DepthStart, lttpc.Width, lttpc.BeamPosition, lttpc.ZeroRadius); } if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoLinearTissuePhysicalCoordinate ltpc) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoLinearTissuePhysicalCoordinate(ltpc.DepthEnd, ltpc.DepthStart, ltpc.Width, ltpc.BeamPosition, ltpc.Steer); } if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoConvexTissuePhysicalCoordinate ctpc) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoConvexTissuePhysicalCoordinate(ctpc.DepthEnd, ctpc.DepthStart, ctpc.Width, ctpc.BeamPosition, ctpc.ZeroRadius); } if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoDopplerPhysicalCoordinate dpc) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoDopplerPhysicalCoordinate(dpc.SweepSpeed, dpc.Max, dpc.Min, dpc.BaseLine); } if (oldPhysicalCoordinate is Vinno.vCloud.Common.Vid.VinnoTissueTimeMotionPhysicalCoordinate ttpc) { return new Vinno.vCloud.Common.Vid2.Visuals.VinnoTissueTimeMotionPhysicalCoordinate(ttpc.SweepSpeed, ttpc.Max, ttpc.Min, ttpc.DepthStart, ttpc.DepthEnd); } return null; } } }