public BoundingBox GetBoundingBox(Point2 gameVoxel) { var botLeft = Vector2.Modulate(gameVoxel, VoxelSize).ToXZ(0); botLeft.Y += GetVoxel(gameVoxel).Data.Height; return(new BoundingBox(botLeft, botLeft + VoxelSize.ToXZ(0.1f))); }
/// <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 }); }