//dcmconv - Convert DICOM file encoding private static bool dcmconv(string options, string dcmfile_in, string dcmfile_out) { string exeFile = Path.Combine(AppUtil.DcmtkExePath, "dcmconv.exe"); if (!File.Exists(exeFile)) { LogUtil.Error("dcmconv.exe Not Found"); return(false); } if (!File.Exists(dcmfile_in)) { LogUtil.Error1("dcmconv.exe dcmfile_in Not Found [{0}]", dcmfile_in); return(false); } if (File.Exists(dcmfile_out)) { try { File.Delete(dcmfile_out); } catch { } } string arg = options + " \"" + dcmfile_in + "\" \"" + dcmfile_out + "\""; using (Process p = new Process()) { p.StartInfo.FileName = exeFile; //起動するファイル名 p.StartInfo.Arguments = arg; //起動時の引数 p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true; p.Start(); if (p.WaitForExit(AppUtil.ExeTimeout)) { if (!File.Exists(dcmfile_out)) { LogUtil.Error1("dcmconv.exe 失敗[{0}]", dcmfile_in); return(false); } } else { LogUtil.Warn1("dcmconv.exe タイムアウト[{0}]", dcmfile_in); try { p.Kill(); p.WaitForExit(); } catch { } return(false); } } return(true); }
static bool GetDBList(out Dictionary <int, string> server) { server = new Dictionary <int, string>(); int ret = RsWSAStartup(); if (ret != 0) { LogUtil.Error1("RsWSAStartup={0}", ret); ret = RsWSACleanup(); if (ret != 0) { LogUtil.Error1("Retry: RsWSACleanup={0}", ret); } ret = RsWSAStartup(); if (ret != 0) { LogUtil.Error1("Retry: RsWSAStartup={0}", ret); } } int cnt; var errmsg = new StringBuilder(IRCOM_MAX_MESSAGE_LENGTH); var ptr = RsGetDBList(AppUtil.rsAddr, AppUtil.rsPort, out cnt, out ret, errmsg); if (ptr == null || ret != 0) { LogUtil.Error2("RsGetDBList={0} {1}", ret, errmsg); return(false); } try { for (int i = 0; i < cnt; i++) { var path = Marshal.PtrToStringAnsi(ptr + 64 * i); server.Add(i - 1, path); } return(true); } finally { RsFree(ptr); } }
public static YCom Open(int no, string serverAETitle) { string key = no + "_" + serverAETitle; if (lockObjs.ContainsKey(key)) { return(lockObjs[key]); } lock (sync) { if (lockObjs.ContainsKey(key)) { return(lockObjs[key]); } var sv = YCOM.GetStoreServer(serverAETitle); if (sv == null || sv.IPAddr == "" || sv.PortNumber == "") { LogUtil.Error1("YCOM AEエラー[{0}]", serverAETitle); return(null); } int port = 0; Int32.TryParse(sv.PortNumber, out port); var ycom = new YCom(sv.IPAddr, port, AppUtil.YComClientInfo, AppUtil.YComHospitalID, AppUtil.YComUserID); YComErrorStatus status = ycom.Open(); if (status != YComErrorStatus.Success) { LogUtil.Error("YComErrorStatus=" + status); } lockObjs.Add(key, ycom); return(ycom); } }
//DICOMファイルの圧縮 public static bool DicomToComp(string file, string dicomFile, Dictionary <string, string> tags) { try { //モダリティ string Modality = tags[DcmTag.Modality.Name]; //圧縮タイプ string CompType; if (!AppUtil.ModalityCompType.TryGetValue(Modality, out CompType)) { CompType = AppUtil.CompType; } //圧縮オプション string CompOption; if (!AppUtil.ModalityCompOption.TryGetValue(Modality, out CompOption)) { CompOption = AppUtil.CompOption; } //ディレクトリ作成 string dicomDir = Path.GetDirectoryName(dicomFile); if (!Directory.Exists(dicomDir)) { Directory.CreateDirectory(dicomDir); } //ファイル削除 if (File.Exists(dicomFile)) { lock (fileLock) { File.Delete(dicomFile); } } //圧縮 if (CompType == "0") { //なし return(FileUtil.Copy(file, dicomFile)); } else if (CompType == "2") { //MEG var scale = double.Parse(CompOption); DicomToMeg(file, dicomFile, scale); return(true); } else { //転送構文UID string TransferSyntaxUID = tags[DcmTag.TransferSyntaxUID.Name]; if (TransferSyntaxUID != "1.2.840.10008.1.2" && TransferSyntaxUID != "1.2.840.10008.1.2.1") { LogUtil.Debug1("TransferSyntaxUID[{0}]", TransferSyntaxUID); } //画素表現 string PixelRepresentation = tags[DcmTag.PixelRepresentation.Name]; var dcmCtrl = new DicomFile(file); //圧縮対象 if (TransferSyntaxUID == "1.2.840.10008.1.2" || TransferSyntaxUID == "1.2.840.10008.1.2.1" || TransferSyntaxUID == "1.2.840.10008.1.2.2") { //JPEG-Lossy(8bit)圧縮 if (CompType == "50" && dcmCtrl.EncodeToJpeg("+eb +un", dicomFile)) { dcmCtrl = new DicomFile(dicomFile); } //JPEG-Lossy(12bit)圧縮 else if (CompType == "51" && dcmCtrl.EncodeToJpeg("+ee +un", dicomFile)) { dcmCtrl = new DicomFile(dicomFile); } //JPEG-Lossless圧縮 else if (CompType == "70" && dcmCtrl.EncodeToJpeg("+e1", dicomFile)) { dcmCtrl = new DicomFile(dicomFile); } //JPEG2000圧縮 else if (CompType == "90" || CompType == "91") { string tmpFile = ""; try { //Explicit変換 if (TransferSyntaxUID != "1.2.840.10008.1.2.1") { tmpFile = dcmCtrl.FileName + ".tmp"; if (dcmconv("+te", dcmCtrl.FileName, tmpFile)) { dcmCtrl = new DicomFile(tmpFile); } } //JPEG2000変換 if (!File.Exists(AppUtil.CompExe)) { throw new FileNotFoundException(AppUtil.CompExe + " NOT FOUND"); } //EXE引数 string compArg; //JPEG2000-Lossless圧縮 if (CompType == "90") { compArg = "\"" + dcmCtrl.FileName + "\" \"" + dicomFile + "\""; } //JPEG2000-Lossy圧縮 else { string ratio; if (!AppUtil.ModalityCompOption.TryGetValue(Modality, out ratio)) { ratio = AppUtil.CompOption; } string[] ratios = ratio.Split(':'); if (ratios.Length == 1 || (ratios.Length == 2 && ratios[0] == ratios[1])) { ratio = ratios[0]; } else { //画素表現により決定 if (PixelRepresentation == "1") { ratio = ratios[1]; } else { ratio = ratios[0]; } } compArg = "\"" + dcmCtrl.FileName + "\" \"" + dicomFile + "\" " + ratio; } bool moveFlag = true; using (Process p = new Process()) { p.StartInfo.FileName = AppUtil.CompExe; p.StartInfo.Arguments = compArg; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true; if (p.Start()) { if (p.WaitForExit(AppUtil.ExeTimeout)) { if (File.Exists(dicomFile)) { dcmCtrl = new DicomFile(dicomFile); moveFlag = false; } else { LogUtil.Warn("CompExe:ExitCode={0}" + p.ExitCode); } } else { LogUtil.Warn("CompExe:Timeout"); try { p.Kill(); p.WaitForExit(); } catch { } } } else { LogUtil.Warn("CompExe:Process.Start()=false"); } } if (moveFlag) { for (int i = 0; i < AppUtil.RetryCount; i++) { try { if (File.Exists(dicomFile)) { lock (fileLock2) { File.Delete(dicomFile); } } return(FileUtil.Copy(file, dicomFile)); } catch (Exception ex) { LogUtil.Warn(ex); } //リトライ if (i < AppUtil.RetryCount - 1) { System.Threading.Thread.Sleep(AppUtil.SleepTime); LogUtil.Info1("RETRY:{0}", i + 1); } else { LogUtil.Error1("DicomFile.Move():失敗 [{0}]", dicomFile); } } } } finally { if (tmpFile != "") { FileUtil.Delete(tmpFile, true); } } } else { //無変換 return(FileUtil.Copy(file, dicomFile)); } } else { //無変換 return(FileUtil.Copy(file, dicomFile)); } } return(true); } catch (Exception ex) { LogUtil.Error(ex.ToString()); return(false); } }
//スタディの削除 public static bool DelStudy(StudyKey key, out List <string> items) { items = new List <string>(); using (var db = new TryDbConnection(settings)) { using (var cmd = db.CreateCommand()) { cmd.CommandText = "SELECT DISTINCT StorageID FROM T_Image WHERE StudyInstanceUID=@0"; cmd.Add(key.StudyInstanceUID); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) { items.Add((string)dr["StorageID"]); } } } } for (int i = 0; i < AppUtil.RetryCount; i++) { using (var db = new TryDbConnection(settings)) { db.BeginTransaction(); try { using (var cmd = db.CreateCommand()) { cmd.CommandText = "DELETE FROM T_Study WHERE StudyInstanceUID=@0"; cmd.Add(key.StudyInstanceUID); cmd.ExecuteNonQuery(); } db.Commit(); return(true); } catch (Exception ex) { db.Rollback(); LogUtil.Warn(ex); } } //リトライ if (i < AppUtil.RetryCount - 1) { System.Threading.Thread.Sleep(AppUtil.SleepTime); LogUtil.Info1("RETRY:{0}", i + 1); } else { LogUtil.Error1("STUDY削除:失敗 [{0}]", key.StudyInstanceUID); return(false); } } return(true); }
private static void GetImage(string UserName, string StorageID, string StudyUID, string SeriesUID, string SopUID) { LogUtil.Debug3("CMOVE [{0}][{1}][{2}]", StudyUID, SeriesUID, SopUID); var sto = DbCacheUtil.GetStorage(StorageID); using (var pc = new PacsComm()) { //画像取得 DicomFilesResult ret = pc.CMoveImage(StudyUID, SeriesUID, SopUID); if (!ret.IsSuccess) { LogUtil.Error("CMoveImage"); return; } if (ret.Files.Length == 0) { LogUtil.Error("CMoveImage [File=0]"); return; } LogUtil.Debug1("CMoveImage [File={0}]", ret.Files.Length.ToString()); var seriesList = new Dictionary <string, List <Dictionary <string, string> > >(); int cnt = 0; foreach (DicomFile dcmfile in ret.Files) { var file = dcmfile.FileName.Trim(); if (!File.Exists(file)) { continue; } var tags = new Dictionary <string, string>(); tags.Add("StorageID", sto.StorageID); tags.Add("UserName", UserName); tags.Add("AETitle", ""); tags.Add("File", file); var fi = new FileInfo(file); tags.Add("FileSize", fi.Length.ToString()); //タグ取得 using (var dcm = new DicomData(file)) { var tmpTags = new List <uint>(DcmTag.ToTagArray(AppUtil.IMAGE_TAG)); var dic = DicomTagDictionary.Open(dcm, tmpTags.ToArray()); foreach (DcmTag dcmTag in AppUtil.IMAGE_TAG) { tags.Add(dcmTag.Name, dic.GetString(dcmTag.Tag)); } if (dcm.Images.Load()) { if (dcm.Images.Bits == 8 || dcm.Images.Bits == 24) { tags.SetString("WindowCenter", "127"); tags.SetString("WindowWidth", "255"); } else { ImageControl ctrl = null; if (dcm.Images.WindowCenters.Length > 0) { tags.SetString("WindowCenter", dcm.Images.WindowCenters[0].ToString()); } else { if (ctrl == null) { ctrl = dcm.Images.CreateImageControl(0); } //MinMax if (ctrl != null) { tags.SetString("WindowCenter", ctrl.WindowCenter.ToString()); } } if (dcm.Images.WindowWidths.Length > 0) { tags.SetString("WindowWidth", dcm.Images.WindowWidths[0].ToString()); } else { if (ctrl == null) { ctrl = dcm.Images.CreateImageControl(0); } //MinMax if (ctrl != null) { tags.SetString("WindowWidth", ctrl.WindowWidth.ToString()); } } } } } var studyUid = tags[DcmTag.StudyInstanceUID.Name]; var seriesUid = tags[DcmTag.SeriesInstanceUID.Name]; var sopUid = tags[DcmTag.SOPInstanceUID.Name]; var mod = tags[DcmTag.Modality.Name]; //DICOMチェック if (studyUid == "" || seriesUid == "" || sopUid == "" || mod == "") { LogUtil.Error1("NOT DICOM [{0}]", Path.GetFileName(file)); continue; } //無視するモダリティ if (Array.IndexOf(AppUtil.SkipModality, mod) >= 0) { LogUtil.Debug2("SKIP:{0} [{1}]", mod, Path.GetFileName(file)); continue; } if (!seriesList.ContainsKey(seriesUid)) { seriesList.Add(seriesUid, new List <Dictionary <string, string> >()); } seriesList[seriesUid].Add(tags); cnt++; } //SERIES毎のSOPソート foreach (var series in seriesList.Values) { series.Sort((x, y) => { long n1, n2; if (!long.TryParse(x[DcmTag.SeriesNumber.Name], out n1)) { n1 = long.MaxValue; } if (!long.TryParse(y[DcmTag.SeriesNumber.Name], out n2)) { n2 = long.MaxValue; } return((int)(n1 - n2)); }); } int idx = 0; foreach (var series in seriesList.Values) { if (series.Count == 0) { continue; } LogUtil.Info5("AETitle[{0}] StudyDate[{1}] StudyTime[{2}] Modality[{3}] PatientID[{4}]", series[0]["AETitle"], series[0][DcmTag.StudyDate.Name], series[0][DcmTag.StudyTime.Name], series[0][DcmTag.Modality.Name], series[0][DcmTag.PatientID.Name]); var importList = new List <Dictionary <string, string> >(); foreach (var sop in series) { var studyUid = sop[DcmTag.StudyInstanceUID.Name]; var seriesUid = sop[DcmTag.SeriesInstanceUID.Name]; var sopUid = sop[DcmTag.SOPInstanceUID.Name]; var file = sop["File"]; idx++; LogUtil.Debug3("{0}/{1} [{2}]", idx, cnt, Path.GetFileName(file)); //画像圧縮 using (var imp = new Impersonate(sto.LogonUsername, sto.LogonPassword)) { var dicomFile = Path.Combine(sto.DicomPath, studyUid, seriesUid, sopUid + AppUtil.DicomExt); if (DicomUtil.DicomToComp(file, dicomFile, sop)) { sop.Add("DicomFile", dicomFile); LogUtil.Debug("圧縮 end"); var fi = new FileInfo(dicomFile); sop.Add("CompFileSize", fi.Length.ToString()); } else { LogUtil.Error1("圧縮エラー [{0}]", file); return; } } importList.Add(sop); } //DB登録 if (importList.Count > 0) { if (DbUtil.DicomToDB(importList)) { LogUtil.Debug("DB登録 end"); } else { LogUtil.Error("DB登録エラー"); } } else { LogUtil.Debug("DB登録 なし"); } } //DB更新 DbUtil.UpdateStudy(StudyUID); } }
//スタディの取得 (URLコール用) public static bool GetStudyKey(FindParam prm, out string patientid, out List <string> studykey) { patientid = ""; studykey = new List <string>(); using (var db = new TryDbConnection(LCL.settings)) { var studyQuery = new RBStudyQuery(); studyQuery.is_with_both_exist = AppUtil.rsNas; studyQuery.max_no_of_replay = AppUtil.rsMax; if (string.IsNullOrEmpty(prm.PatientID) == false) { studyQuery.is_filter_on = 1; studyQuery.is_pat_id_on = 1; studyQuery.comp_mode_of_pat_id = AppUtil.cmPatientID; studyQuery.PatientID = prm.PatientID; } if (string.IsNullOrEmpty(prm.PatientName) == false) { studyQuery.is_filter_on = 1; studyQuery.is_pat_name_on = 1; studyQuery.comp_mode_of_pat_name = AppUtil.cmPatientName; studyQuery.PatientName = prm.PatientName; } if (string.IsNullOrEmpty(prm.AccessionNumber) == false) { studyQuery.is_filter_on = 1; studyQuery.is_acc_no_on = 1; studyQuery.comp_mode_of_acc_no = AppUtil.cmAccessionNumber; studyQuery.AccNo = prm.AccessionNumber; } if (string.IsNullOrEmpty(prm.Modality) == false) { studyQuery.is_filter_on = 1; studyQuery.is_modality_on = 1; studyQuery.comp_mode_of_modality = AppUtil.cmModality; studyQuery.Modality = prm.Modality.Replace(',', '|'); } if (string.IsNullOrEmpty(prm.StudyDateFrom) == false && string.IsNullOrEmpty(prm.StudyDateTo) == false) { studyQuery.is_filter_on = 1; studyQuery.is_st_date_on = 1; studyQuery.StudyDate = string.Format("{0}-{1}", prm.StudyDateFrom, prm.StudyDateTo); } else if (string.IsNullOrEmpty(prm.StudyDateFrom) == false) { studyQuery.is_filter_on = 1; studyQuery.is_st_date_on = 1; studyQuery.StudyDate = string.Format("{0}-{1}", prm.StudyDateFrom, DateTime.Now.ToString("yyyyMMdd")); } else if (string.IsNullOrEmpty(prm.StudyDateTo) == false) { studyQuery.is_filter_on = 1; studyQuery.is_st_date_on = 1; studyQuery.StudyDate = string.Format("{0}-{1}", "19700101", prm.StudyDateTo); } List <RBStudy> studyList; if (!GetStudyList(studyQuery, out studyList)) { return(false); } //ソート studyList.Sort((x, y) => { int c = (y.StudyDate + y.StudyTime).CompareTo(x.StudyDate + x.StudyTime); if (c == 0) { return(x.StudyUID.CompareTo(y.StudyUID)); } else { return(c); } }); foreach (var study in studyList) { int nasno = -1; if (!int.TryParse(study.NASHostName, out nasno)) { LogUtil.Error1("NASHostName={0}", study.NASHostName); continue; } var key = new StudyKey() { StudyInstanceUID = study.StudyUID, StorageID = nasno.ToString() }; studykey.Add(ConvertUtil.Serialize(key)); if (studykey.Count == 1) { patientid = study.PatID; } else { if (patientid != study.PatID) { patientid = null; studykey = null; return(false); } } } } return(true); }
//スタディ一覧の取得 (過去検査) public static void GetStudyList_Kako(string patientid, StudyKey key, out List <StudyTag> tags) { tags = new List <StudyTag>(); using (var db = new TryDbConnection(LCL.settings)) { var studyQuery = new RBStudyQuery(); studyQuery.is_with_both_exist = AppUtil.rsNas; studyQuery.max_no_of_replay = AppUtil.rsMax; if (string.IsNullOrEmpty(patientid)) { studyQuery.is_filter_on = 1; studyQuery.is_study_id_on = 1; studyQuery.comp_mode_of_study_id = 1; studyQuery.StudyUID = key.StudyInstanceUID; } else { studyQuery.is_filter_on = 1; studyQuery.is_pat_id_on = 1; studyQuery.comp_mode_of_pat_id = 1; studyQuery.PatientID = patientid; } List <RBStudy> studyList; if (!GetStudyList(studyQuery, out studyList)) { return; } var PatName = new Dictionary <string, string>(); foreach (var study in studyList) { int nasno = -1; if (!int.TryParse(study.NASHostName, out nasno)) { LogUtil.Error1("NASHostName={0}", study.NASHostName); continue; } var stkey = new StudyKey() { StudyInstanceUID = study.StudyUID, StorageID = nasno.ToString() }; var tag = new StudyTag(); tag.StudyKey = ConvertUtil.Serialize(stkey); tag.StudyDate = study.StudyDate; tag.StudyTime = study.StudyTime; tag.AccessionNumber = study.AccNo; tag.Modality = study.Modality; tag.StudyDescription = study.StudyDesc; tag.PatientName = study.PatNameSJ != "" ? study.PatNameSJ : study.PatName; tag.PatientID = study.PatID; tag.PatientBirthDate = study.BirthDate; tag.PatientSex = study.Sex; tag.BodyPartExamined = study.BodyPart; tag.NumberOfImages = (int)study.NoOfImg; //患者名 if (PatName.ContainsKey(tag.PatientID)) { if (PatName[tag.PatientID] != null) { tag.PatientName = PatName[tag.PatientID]; } } else { using (var cmd = db.CreateCommand()) { cmd.CommandText = "SELECT PatientName FROM T_Patient WHERE PatientID=@0"; cmd.Add(tag.PatientID); using (var dr = cmd.ExecuteReader()) { if (dr.Read()) { tag.PatientName = (string)dr["PatientName"]; PatName.Add(tag.PatientID, (string)dr["PatientName"]); } else { PatName.Add(tag.PatientID, null); } } } } if (AppUtil.HideData == "1") { tag.PatientName = ""; } //メモ有無 using (var cmd = db.CreateCommand()) { cmd.CommandText = "SELECT COUNT(*) cnt FROM T_StudyMemo WHERE StudyInstanceUID=@0"; cmd.Add(stkey.StudyInstanceUID); using (var dr = cmd.ExecuteReader()) { if (dr.Read()) { tag.StudyMemoUmu = Convert.ToInt32(dr["cnt"]); } } } //ソート用 tag.StudyInstanceUID = study.StudyUID; tags.Add(tag); } } //ソート tags.Sort(new StudyTagComparer()); }
public static void GetGsps(GSPSKey key, out Dictionary <string, GSPSDataItem> items) { items = null; var tmpItems = new Dictionary <string, GSPSDataItem>(); var tmpSeries = new Dictionary <string, string>(); var delItems = new List <string>(); //マルチフレーム時の調整 //GSPSのImageKey取得 List <ImageKey> gspsImkeys; DbUtil.GetGsps(key, out gspsImkeys); foreach (var gspsImKey in gspsImkeys) { var file = FileUtil.GetDicomFile(gspsImKey); try { using (var dcm = new DicomData(file, DicomTransferSyntax.LittleEndianImplicit)) { var pr = new PRAnalyzer(dcm); var tmpSop = new List <PRReferenceSOP>(); //ReferencedSeriesSequence foreach (var seq in pr.References) { tmpSop.AddRange(seq.SopRefs); //ReferencedImageSequence foreach (var sop in seq.SopRefs) { if (!tmpSeries.ContainsKey(sop.SOPInstanceUID)) { tmpSeries.Add(sop.SOPInstanceUID, seq.SeriesInstanceUID); } var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = seq.SeriesInstanceUID, SOPInstanceUID = sop.SOPInstanceUID, FrameNumber = sop.FrameNumber, StorageID = gspsImKey.StorageID }; var imkey2 = ConvertUtil.Serialize(imkey); tmpItems.Add(imkey2, new GSPSDataItem()); tmpItems[imkey2].Flip = pr.Flip.ToString().ToLower(); tmpItems[imkey2].Rotate = pr.Rotate.ToString(); } } //SoftcopyVOILUTSequence foreach (var seq in pr.VoiLuts) { if (seq.SopRefs.Length == 0) { seq.SopRefs = tmpSop.ToArray(); } //ReferencedImageSequence foreach (var sop in seq.SopRefs) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = tmpSeries[sop.SOPInstanceUID], SOPInstanceUID = sop.SOPInstanceUID, FrameNumber = sop.FrameNumber, StorageID = gspsImKey.StorageID }; var imkey2 = ConvertUtil.Serialize(imkey); if (!tmpItems.ContainsKey(imkey2)) { tmpItems.Add(imkey2, new GSPSDataItem()); } tmpItems[imkey2].VoiLut = seq.ToString(); } } //GraphicAnnotationSequence foreach (var seq in pr.Infos) { //ReferencedImageSequence foreach (var sop in seq.Reference.SopRefs) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = tmpSeries[sop.SOPInstanceUID], SOPInstanceUID = sop.SOPInstanceUID, FrameNumber = sop.FrameNumber, StorageID = gspsImKey.StorageID }; var imkey2 = ConvertUtil.Serialize(imkey); if (!tmpItems.ContainsKey(imkey2)) { tmpItems.Add(imkey2, new GSPSDataItem()); } tmpItems[imkey2].Info = seq.ToString(); } } //DisplayedAreaSelectionSequence foreach (var seq in pr.DisplayAreas) { if (seq.SopRefs.Length == 0) { seq.SopRefs = tmpSop.ToArray(); } //ReferencedImageSequence foreach (var sop in seq.SopRefs) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = tmpSeries[sop.SOPInstanceUID], SOPInstanceUID = sop.SOPInstanceUID, FrameNumber = sop.FrameNumber, StorageID = gspsImKey.StorageID }; var imkey2 = ConvertUtil.Serialize(imkey); if (!tmpItems.ContainsKey(imkey2)) { tmpItems.Add(imkey2, new GSPSDataItem()); } tmpItems[imkey2].DisplayArea = seq.ToString(); //マルチフレーム時の調整 if (sop.FrameNumber > 0) { var imkey3 = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = tmpSeries[sop.SOPInstanceUID], SOPInstanceUID = sop.SOPInstanceUID, FrameNumber = 0, StorageID = gspsImKey.StorageID }; var imkey4 = ConvertUtil.Serialize(imkey3); if (tmpItems.ContainsKey(imkey4)) { if (tmpItems[imkey2].Flip == "") { tmpItems[imkey2].Flip = tmpItems[imkey4].Flip; } if (tmpItems[imkey2].Rotate == "") { tmpItems[imkey2].Rotate = tmpItems[imkey4].Rotate; } if (!delItems.Contains(imkey4)) { delItems.Add(imkey4); } } } } } } } catch { LogUtil.Error1("PR Error [{0}]", file); throw; } } //マルチフレーム時の調整 if (delItems.Count > 0) { foreach (var delItem in delItems) { tmpItems.Remove(delItem); } } items = tmpItems; }