static bool GetImageList(RBObjectQuery query, out List <RBImage> imageList) { imageList = new List <RBImage>(); int cnt; int ret; var errmsg = new StringBuilder(IRCOM_MAX_MESSAGE_LENGTH); var ptr = RsGetImageList(AppUtil.rsAddr, AppUtil.rsPort, ref query, out cnt, out ret, errmsg); if (ptr == null || ret != 0) { LogUtil.Error2("RsGetImageList[{0}] {1}", ret, errmsg); return(false); } try { for (int i = 0; i < cnt; i++) { var image = (RBImage)Marshal.PtrToStructure(ptr + Marshal.SizeOf(typeof(RBImage)) * i, typeof(RBImage)); if (image.ObjectType != RB_OBJECT_IMAGE) { continue; } if (image.DBStatus == RB_STATUS_DBLOCK) { LogUtil.Warn1("RB_STATUS_DBLOCK: {0}", image.InstUID); continue; } imageList.Add(image); } return(true); } finally { RsFree(ptr); } }
//画像一覧の取得 public static void GetImageList(SeriesKey key, out List <ImageTag> tags) { tags = new List <ImageTag>(); if (!key.IsImage) { var imageQuery = new RBObjectQuery(); imageQuery.is_filter_on = 1; imageQuery.location = Int32.Parse(key.StorageID); imageQuery.StudyUID = key.StudyInstanceUID; imageQuery.SeriesUID = key.SeriesInstanceUID; List <RBImage> imageList; if (!GetImageList(imageQuery, out imageList)) { return; } //ソート imageList.Sort((x, y) => { int c = x.ImageNo.CompareTo(y.ImageNo); if (c == 0) { return(x.InstUID.CompareTo(y.InstUID)); } else { return(c); } }); foreach (var image in imageList) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = image.InstUID, StorageID = key.StorageID }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); //new RsImageKey(key, image.InstUID); tag.InstanceNumber = image.ImageNo; tag.SliceThickness = image.SliceThickness.ToString(); tag.ImagePositionPatient = image.ImagePosition.ToString('\\'); tag.ImageOrientationPatient = image.ImageOrientation.ToString('\\'); tag.SliceLocation = image.SliceLocation.ToString(); tag.Rows = image.Rows; tag.Columns = image.Columns; tag.PixelSpacing = image.PixelSpacing.ToString('\\'); tag.WindowCenter = image.Level.ToString('\\'); tag.WindowWidth = image.Width.ToString('\\'); tags.Add(tag); } } else { //※イメージで検索できない var imageQuery = new RBObjectQuery(); imageQuery.is_filter_on = 1; imageQuery.location = Int32.Parse(key.StorageID); imageQuery.StudyUID = key.StudyInstanceUID; imageQuery.SeriesUID = key.SeriesInstanceUID; List <RBImage> imageList; if (!GetImageList(imageQuery, out imageList)) { return; } foreach (var image in imageList) { if (image.InstUID == key.SOPInstanceUID) { var nof = image.NoOfFrames; if (nof == 0) { nof = 1; } for (int i = 0; i < nof; i++) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = image.InstUID, FrameNumber = i, StorageID = key.StorageID }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); //new RsImageKey(key, i); tag.InstanceNumber = i; tag.SliceThickness = image.SliceThickness.ToString(); tag.ImagePositionPatient = image.ImagePosition.ToString('\\'); tag.ImageOrientationPatient = image.ImageOrientation.ToString('\\'); tag.SliceLocation = image.SliceLocation.ToString(); tag.Rows = image.Rows; tag.Columns = image.Columns; tag.PixelSpacing = image.PixelSpacing.ToString('\\'); tag.WindowCenter = image.Level.ToString('\\'); tag.WindowWidth = image.Width.ToString('\\'); tag.NumberOfFrames = nof; tags.Add(tag); } break; } } } }
//シリーズ一覧の取得 public static void GetSeriesList(StudyKey key, out List <SeriesTag> tags) { tags = new List <SeriesTag>(); var seriesQuery = new RBSeriesQuery(); seriesQuery.is_filter_on = 1; seriesQuery.location = Int32.Parse(key.StorageID); seriesQuery.StudyUID = key.StudyInstanceUID; List <RBSeries> seriesList; if (!GetSeriesList(seriesQuery, out seriesList)) { return; } //ソート seriesList.Sort((x, y) => { int c = x.SeriesNo.CompareTo(y.SeriesNo); if (c == 0) { return(x.SeriesUID.CompareTo(y.SeriesUID)); } else { return(c); } }); foreach (var series in seriesList) { var imageQuery = new RBObjectQuery(); imageQuery.is_filter_on = 1; imageQuery.location = Int32.Parse(key.StorageID); imageQuery.StudyUID = key.StudyInstanceUID; imageQuery.SeriesUID = series.SeriesUID; List <RBImage> imageList; if (!GetImageList(imageQuery, out imageList)) { continue; } //ソート imageList.Sort((x, y) => { int c = x.ImageNo.CompareTo(y.ImageNo); if (c == 0) { return(x.InstUID.CompareTo(y.InstUID)); } else { return(c); } }); int nof = 0; foreach (var image in imageList) { nof += image.NoOfFrames; } if (nof == 0) { var sekey = new SeriesKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = series.SeriesUID, SOPInstanceUID = null, StorageID = key.StorageID, IsImage = false }; var tag = new SeriesTag(); tag.SeriesKey = ConvertUtil.Serialize(sekey); //new RsSeriesKey(key, series.SeriesUID, series.Modality, series.SeriesDesc, series.SeriesNo); tag.SeriesNumber = series.SeriesNo; tag.Modality = series.Modality; tag.SeriesDescription = series.SeriesDesc; tag.NumberOfImages = series.no_im; tag.NumberOfFrames = nof; tags.Add(tag); } else { //イメージ foreach (var image in imageList) { var sekey = new SeriesKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = series.SeriesUID, SOPInstanceUID = image.InstUID, StorageID = key.StorageID, IsImage = true }; var tag = new SeriesTag(); tag.SeriesKey = ConvertUtil.Serialize(sekey); //new RsSeriesKey(key, series.SeriesUID, image.InstUID, image.NoOfFrames); tag.SeriesNumber = series.SeriesNo; tag.Modality = series.Modality; tag.SeriesDescription = series.SeriesDesc; tag.NumberOfImages = 1; tag.NumberOfFrames = image.NoOfFrames; tags.Add(tag); } } } }
static extern IntPtr RsGetImageList(byte[] addr, ushort port_no, ref RBObjectQuery query_data, out int no_of_obj, out int ret_code, StringBuilder message);