Beispiel #1
0
        //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);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        //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);
            }
        }
Beispiel #5
0
        //スタディの削除
        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);
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
        //スタディの取得 (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);
        }
Beispiel #8
0
        //スタディ一覧の取得 (過去検査)
        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());
        }
Beispiel #9
0
        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;
        }