/// <summary> /// one-way call to resample an image volume /// </summary> /// <param name="seriesInstanceUID"></param> public void ResampleImageVolume(ImageVolumeResampleRequest request) { _responseContext = OperationContext.Current.IncomingMessageHeaders.GetHeader<ResponseContext>( "ResponseContext", "ServiceModelEx"); _responseAddress = new EndpointAddress(_responseContext.ResponseAddress); ResampleEngineClient re = new ResampleEngineClient(); ImageVolumeResampleResponse response = re.ResampleImageVolume(request); System.Diagnostics.Trace.Assert(response.ResampledImageVolumeGuid.CompareTo(Guid.Empty) != 0); MessageHeader<ResponseContext> responseHeader = new MessageHeader<ResponseContext>(_responseContext); NetMsmqBinding binding = new NetMsmqBinding("NoMsmqSecurity"); ResampleResponseProxy proxy = new ResampleResponseProxy(binding, _responseAddress); using (OperationContextScope scope = new OperationContextScope(proxy.InnerChannel)) { OperationContext.Current.OutgoingMessageHeaders.Add( responseHeader.GetUntypedHeader("ResponseContext", "ServiceModelEx")); proxy.OnResampleDone(response); } proxy.Close(); }
/// <summary> /// TODO: return response, not contract /// </summary> /// <param name="seriesInstanceUID"></param> /// <returns></returns> public ImageVolumeResampleResponse ResampleImageVolume(ImageVolumeResampleRequest request) { LocalImageResourceManagerClient cmsc1 = new LocalImageResourceManagerClient(); var imageIds = cmsc1.GetImageIdsBySeries(request.SeriesInstanceUID); if (imageIds.Count() == 0) return null; var imagesInSeries = (from guid in imageIds select cmsc1.GetImage(guid) ).OrderBy(idc => -idc.ImagePosition.Z); var ivdc = new UniformImageVolumeDataContract(); ivdc.Identity.SeriesInstanceUID = request.SeriesInstanceUID; ivdc.Identity.Label = imagesInSeries.First().Label; ivdc.Identity.PatientId = imagesInSeries.First().PatientId; ivdc.FrameOfReferenceUID = imagesInSeries.First().FrameOfReferenceUID; ivdc.Width = imagesInSeries.First().Width; ivdc.Height = imagesInSeries.First().Height; ivdc.Depth = imagesInSeries.Count(); var imageOrientation = imagesInSeries.First().ImageOrientation; ivdc.VolumeOrientation = new VolumeOrientation() { Row = imageOrientation.Row, Column = imageOrientation.Column, }; var voxelSpacing = new VoxelSize() { X = imagesInSeries.First().PixelSpacing.X, Y = imagesInSeries.First().PixelSpacing.Y, Z = Math.Abs(imagesInSeries.First().ImagePosition.Z - imagesInSeries.Last().ImagePosition.Z) / imagesInSeries.Count() }; ivdc.VoxelSpacing = voxelSpacing; // take cross product // ivdc.DirectionZ = ivdc = cmsc1.AddImageVolume(ivdc); var outVoxelHandle = ivdc.PixelBuffer.GetHandle(); ushort[] frame = new ushort[imagesInSeries.First().PixelBuffer.ElementCount]; ulong currentVoxelOffset = 0; foreach (var idc in imagesInSeries) { // get access to the buffer var inPixelHandle = idc.PixelBuffer.GetHandle(); inPixelHandle.ReadArray<ushort>(0, frame, 0, frame.Length); outVoxelHandle.WriteArray<ushort>(currentVoxelOffset, frame, 0, frame.Length); idc.PixelBuffer.ReleaseHandle(); idc.PixelBuffer.CloseMapping(); currentVoxelOffset += (ulong)(idc.PixelBuffer.ElementCount * sizeof(ushort)); } ivdc.PixelBuffer.ReleaseHandle(); ivdc.PixelBuffer.CloseMapping(); cmsc1.Close(); System.Diagnostics.Trace.Assert(ivdc != null); System.Diagnostics.Trace.Assert(ivdc.Identity != null); System.Diagnostics.Trace.Assert(ivdc.Identity.Guid.CompareTo(Guid.Empty) != 0); return new ImageVolumeResampleResponse() { SeriesInstanceUID = request.SeriesInstanceUID, ResampledImageVolumeGuid = ivdc.Identity.Guid }; }
/// <summary> /// performs resampling on a series /// </summary> /// <param name="seriesInstanceUID">the series UID to be used</param> static void ResampleVolumeForSeries(string seriesInstanceUID) { var resampleManager = new ResampleManagerClient(); using (OperationContextScope contextScope = new OperationContextScope(resampleManager.InnerChannel)) { var methodId = Guid.NewGuid(); ResampleDoneResponse.SetupResponseHeader(methodId); // create the request object ImageVolumeResampleRequest request = new ImageVolumeResampleRequest(); request.SeriesInstanceUID = seriesInstanceUID; // and queue the request resampleManager.ResampleImageVolume(request); } resampleManager.Close(); }