예제 #1
0
        //string study, string modality, out string seriesUID, bool bSaveEFilm
        private string CreateSeries(EFilmModel eFilmModel)
        {
            var studyInstanceUid = eFilmModel.StudyInstanceUid;

            Series series = DBWrapperHelper.DBWrapper.CreateSeries();

            var uidManager = McsfDatabaseDicomUIDManagerFactory.Instance().CreateUIDManager();

            series.SeriesInstanceUID  = uidManager.CreateSeriesUID("");//eFilmModel.EFilmSeriesUid;
            series.StudyInstanceUIDFk = studyInstanceUid;
            series.Modality           = eFilmModel.EFilmModality;
            // new seriesNumber equals the max seriesNumber of exist series add one
            series.SeriesNumber = Convert.ToInt32(GetSerieNumber(studyInstanceUid)) + 1;
            series.ReconResult  = 2; //代表重建已完成
            if (studyInstanceUid == "****")
            {
                return(string.Empty);                            //FilmingHelper.StarsString) return;
            }
            //check whether disk space is enough
            ICommunicationProxy pCommProxy = Containee.Main.GetCommunicationProxy();
            var target = new SystemResManagerProxy(pCommProxy);

            if (!target.HaveEnoughSpace())
            {
                Logger.LogError("No enough disk space, so Electronic Image Series will not be created");
                Containee.Main.ShowStatusError("UID_Filming_No_Enough_Disk_Space_To_Create_Electronic_Image_Series");
                return(string.Empty);
            }

            series.Save();
            return(series.SeriesInstanceUID);
        }
예제 #2
0
        private void GeneralFilms(EFilmModel eFilmModel, bool ifPageNo)
        {
            try
            {
                Logger.LogFuncUp();

                var dataHeader = GenerateDataHeader(eFilmModel, eFilmModel.FilmSize, ifPageNo);

                eFilmModel.DataHeaderForPrint = dataHeader;
                eFilmModel.DataHeaderForSave  = dataHeader;


                var printSettings = eFilmModel.PrintSettings;
                if (eFilmModel.IfSaveEFilm && !bool.Parse(printSettings.IfSaveHighPrecisionEFilm))
                {
                    eFilmModel.DataHeaderForSave = GenerateDataHeader(eFilmModel, eFilmModel.LowPrecisionEFilmSize, ifPageNo);
                }

                Logger.LogFuncDown();
            }
            catch (Exception ex)
            {
                Logger.LogFuncException(ex.Message + ex.StackTrace);
            }
        }
예제 #3
0
        private void SaveEFilmInCommonSave(EFilmModel eFilmModel, string jobID, double progress)
        {
            //系列化DataHeader
            byte[] serializedInfo;
            if (eFilmModel.DataHeaderForSave != null)
            {
                eFilmModel.DataHeaderForSave.Serialize(out serializedInfo);
            }
            else
            {
                serializedInfo = new byte[0];
            }

            //设置commonsave参数,todo 主干PS接口有变更
            SaveFilmingCommandContext.Builder builder = SaveFilmingCommandContext.CreateBuilder();

            builder.SetCellIndex(0);
            builder.SetSaveImageType(SavingType.SecondaryCapture);
            builder.SetOperationType(SaveFilmingMode.Save);
            builder.SetStrategy(SaveFilmingStrategy.SaveImages);
            builder.SetKeepSameSeries(true);
            builder.SetSeriesUID(eFilmModel.EFilmSeriesUid);
            var rangeBuilder = new PrgressRange.Builder();

            rangeBuilder.JobID = jobID;
            rangeBuilder.SetMaxForCurrentSubJob(progress);
            builder.SetRange(rangeBuilder);
            ImageAuxiliary.Builder auxiliaryBuilder = ImageAuxiliary.CreateBuilder();
            //auxiliaryBuilder.ActivePS = string.Empty;
            //auxiliaryBuilder.BurnedPS = string.Empty;
            auxiliaryBuilder.PS              = string.Empty;
            auxiliaryBuilder.CellIndex       = -1;//区别于 SaveSeries
            auxiliaryBuilder.SaveAsDisplay   = true;
            auxiliaryBuilder.DataHeaderBytes = Google.ProtocolBuffers.ByteString.CopyFrom(serializedInfo);
            builder.AddImageAuxiliaries(auxiliaryBuilder);
            byte[] btInfo = builder.Build().ToByteArray();



            //SAVE_EFILM_COMMAND
            CommandContext cs = new CommandContext();

            cs.iCommandId       = 16000; //7088
            cs.sReceiver        = CommunicationNodeName.CreateCommunicationProxyName("FilmingService");
            cs.sSerializeObject = btInfo;
            //var result = Containee.Main.GetCommunicationProxy().SyncSendCommand(cs);
            int errorCode = Containee.Main.GetCommunicationProxy().AsyncSendCommand(cs);

            if (0 != errorCode)
            {
                throw new Exception("send filming job command failure, error code: " + errorCode);
            }

            builder.Clear();
            // if (eFilmModel.DataHeaderForSave != null) eFilmModel.DataHeaderForSave.Dispose();
        }
예제 #4
0
        private DicomAttributeCollection GenerateDataHeader(EFilmModel eFilmModel, Size size, bool ifPageNo)
        {
            try
            {
                Logger.LogFuncUp();

                bool ifGrayScalePrint = eFilmModel.IfSaveImageAsGrayScale;

                var bitmap = this.RenderToBitmap(size,
                                                 eFilmModel.PageTitlePosition,
                                                 this,
                                                 _filmingViewerControl,
                                                 filmPageBarGrid, filmPageBarGridSimple,
                                                 ifGrayScalePrint, ifPageNo);

                byte[] pixelData = Widget.ProcessImage(bitmap);
                //if (ifGrayScalePrint)
                //{
                //    //pixelData = ApplyLUT(pixelData);
                //    pixelData = PerformGammaCorrected(pixelData);
                //}
                eFilmModel.Rows    = (ushort)bitmap.PixelHeight;
                eFilmModel.Columns = (ushort)bitmap.PixelWidth;

                var dicomElements = new DicomElementWidget();
                var dataHeader    = dicomElements.AssembleSendData(pixelData, eFilmModel);

                Logger.LogFuncDown();

                return(dataHeader);
            }
            catch (Exception ex)
            {
                Logger.LogFuncException(ex.Message + ex.StackTrace);
                return(null);
            }
        }
예제 #5
0
        //public DicomAttributeCollection AssembleSendData(byte[] imageData, double imageWidth, double imageHeight,
        //                                                 int filmPageIndex, bool ifSaveImageAsGreyScale = true)
        public DicomAttributeCollection AssembleSendData(byte[] imageData, EFilmModel dicomTags)
        {
            try
            {
                Logger.LogFuncUp();

                var dataHeader = new DicomAttributeCollection();

                #region DICOM File Meta Information
                //DICOM File Meta Information
                //string strLen = GetPatientInfo("PatientsBirthTime", string.Empty, string.Empty);
                //UInt32 nLen = Convert.ToUInt32(strLen);
                //DicomElementWidget.InsertUInt32DicomElement(dataHeader, Tag.FileMetaInformationGroupLength, nLen);
                //byte[] btVersion = new byte[1];
                //btVersion[0] = 55;
                //InsertBytesDicomElement(dataHeader, Tag.FileMetaInformationVersion, btVersion);
                //InsertUInt16DicomElement(dataHeader, Tag.MediaStorageSOPClassUID, 0);
                //InsertUInt16DicomElement(dataHeader, Tag.MediaStorageSOPInstanceUID, 0);
                //InsertUInt16DicomElement(dataHeader, Tag.TransferSyntaxUID, 0);//"1.2.840.10008.1.2.1"
                //InsertUInt16DicomElement(dataHeader, Tag.ImplementationClassUID, 0);
                //InsertStringDicomElement(dataHeader, Tag.ImplementationVersionName, string.Empty);
                InsertStringDicomElement(dataHeader, Tag.SpecificCharacterSet, "ISO.IR 192");         //中文字符集
                #endregion



                //Patient Module
                #region Patient Module
                InsertStringDicomElement(dataHeader, Tag.PatientsName, dicomTags.PatientName);              //患者姓名
                InsertStringDicomElement(dataHeader, Tag.PatientID, dicomTags.PatientId);                   //患者ID
                InsertStringDicomElement(dataHeader, Tag.PatientsBirthDate, dicomTags.PatientBirthDate);    //患者出生日期
                InsertStringDicomElement(dataHeader, Tag.PatientsSex, dicomTags.PatientSex);                //患者性别
                InsertStringDicomElement(dataHeader, Tag.PatientsBirthTime, dicomTags.PatientsBirthTime);   //患者出生时间
                InsertStringDicomElement(dataHeader, Tag.PatientComments, dicomTags.PatientComments);       //患者注释
                InsertStringDicomElement(dataHeader, Tag.PatientsAge, dicomTags.PatientsAge);               //患者年龄
                InsertStringDicomElement(dataHeader, Tag.PatientsSize, dicomTags.PatientsSize);             //患者身高
                InsertStringDicomElement(dataHeader, Tag.PatientsWeight, dicomTags.PatientsWeight);         //患者体重
                InsertStringDicomElement(dataHeader, Tag.Occupation, dicomTags.Occupation);                 //患者职业

                #endregion


                //General Study Module

                #region General Study Module
                InsertStringDicomElement(dataHeader, Tag.StudyInstanceUid, dicomTags.StudyInstanceUid);               //检查UID
                InsertStringDicomElement(dataHeader, Tag.StudyDate, dicomTags.StudyDate);                             //检查日期
                InsertStringDicomElement(dataHeader, Tag.StudyTime, dicomTags.StudyTime);                             //检查时间
                InsertStringDicomElement(dataHeader, Tag.ReferringPhysiciansName, dicomTags.ReferringPhysiciansName); //咨询医师姓名
                InsertStringDicomElement(dataHeader, Tag.AccessionNumber, dicomTags.AccessionNumber);                 //检查编号
                //InsertStringDicomElement(dataHeader, Tag.StudyDescription, dicomTags.StudyDescription);
                var now = DateTime.Now;
                InsertStringDicomElement(dataHeader, Tag.AcquisitionDate, now.Date.ToShortDateString());    //获取日期
                InsertStringDicomElement(dataHeader, Tag.AcquisitionTime, now.TimeOfDay.ToString());        //获取时间
                #endregion

                //General Series Module
                #region General Series Module
                InsertStringDicomElement(dataHeader, Tag.SeriesInstanceUid, dicomTags.EFilmSeriesUid);              //系列UID
                InsertStringDicomElement(dataHeader, Tag.SeriesNumber, GetSerieNumber(dicomTags.StudyInstanceUid)); //系列号 ??是否每张都去找数据库算一次??
                InsertStringDicomElement(dataHeader, Tag.SeriesDate, now.Date.ToShortDateString());                 //系列日期
                InsertStringDicomElement(dataHeader, Tag.SeriesTime, now.TimeOfDay.ToString());                     //系列时间

                string descreption = "Electronic film_" + string.Format("{0:yyyyMMddHHmmss}", DateTime.Now);        //系列描述
                InsertStringDicomElement(dataHeader, Tag.SeriesDescription, descreption);
                #endregion

                #region 患者病理相关
                //InsertStringDicomElement(dataHeader, Tag.ProtocolName, dicomTags.ProtocolName);           //协议名称
                InsertStringDicomElement(dataHeader, Tag.BodyPartExamined, dicomTags.BodyPartExamined);     //检查部位
                InsertStringDicomElement(dataHeader, Tag.PatientPosition, dicomTags.PatientPosition);       //病人进入设备体位
                #endregion

                //General Equipment Module
                #region General Equipment Module
                InsertStringDicomElement(dataHeader, Tag.Modality, dicomTags.EFilmModality);          //胶片设备类型
                InsertStringDicomElement(dataHeader, Tag.InstitutionName, dicomTags.InstitutionName); //医院信息
                InsertStringDicomElement(dataHeader, Tag.Manufacturer, dicomTags.Manufacturer);       //原图厂商信息
                #endregion


                #region SC Equipment Module
                //SC Equipment Module
                InsertStringDicomElement(dataHeader, Tag.ConversionType, "WSD");                                //转化类型,WSD:Workstation
                InsertStringDicomElement(dataHeader, Tag.SecondaryCaptureDeviceID,                              //二次获取设备ID
                                         dicomTags.SecondaryCaptureDeviceID);
                InsertStringDicomElement(dataHeader, Tag.SecondaryCaptureDeviceManufacturer,                    //二次获取设备厂商
                                         FilmingUtility.SecondaryCaptureDeviceManufacturer);
                InsertStringDicomElement(dataHeader, Tag.SecondaryCaptureDeviceManufacturersModelName,          //二次获取设备型号
                                         dicomTags.SecondaryCaptureDeviceManufacturersModelName);
                InsertStringDicomElement(dataHeader, Tag.SecondaryCaptureDeviceSoftwareVersions,                //二次获取设备软件版本
                                         dicomTags.SecondaryCaptureDeviceSoftwareVersions);
                var dateOfSecondaryCapture = string.Format("{0:D4}{1:D2}{2:D2}", now.Year, now.Month, now.Day); //二次获取日期
                InsertStringDicomElement(dataHeader, Tag.DateOfSecondaryCapture, dateOfSecondaryCapture);

                var timeOfSecondaryCapture = string.Format("{0:D2}{1:D2}{2:D2}", now.Hour, now.Minute, now.Second); //二次获取时间
                InsertStringDicomElement(dataHeader, Tag.TimeOfSecondaryCapture, timeOfSecondaryCapture);
                #endregion

                //General Image Module
                #region 图片相关

                InsertStringDicomElement(dataHeader, Tag.InstanceNumber, dicomTags.FilmPageIndex); //图片序号
                const string imageType  = FilmingUtility.EFilmImageType;                           //图片类型
                var          imageTypes = imageType.Split('\\');
                InsertStringArrayDicomElement(dataHeader, Tag.ImageType, imageTypes);

                InsertStringDicomElement(dataHeader, Tag.AcquisitionNumber, dicomTags.AcquisitionNumber);     //图片获取号

                InsertStringDicomElement(dataHeader, Tag.ImagesInAcquisition, dicomTags.ImagesInAcquisition); //图片获取总数
                InsertStringDicomElement(dataHeader, Tag.ImageComments, "");                                  //图片注释
                InsertStringDicomElement(dataHeader, Tag.BurnedInAnnotation, dicomTags.BurnedInAnnotation);   //图片烧图注释??

                #endregion


                //Image Pixel Module
                #region 图像像素相关
                if (dicomTags.IfSaveImageAsGrayScale)
                {
                    InsertUInt16DicomElement(dataHeader, Tag.SamplesPerPixel, 1);                       //取样点数
                    InsertStringDicomElement(dataHeader, Tag.PhotometricInterpretation, "MONOCHROME2"); //灰度类型
                }
                else
                {
                    InsertUInt16DicomElement(dataHeader, Tag.SamplesPerPixel, 3);                         //取样点数彩图
                    InsertStringDicomElement(dataHeader, Tag.PhotometricInterpretation, "RGB");           //彩图
                    InsertStringDicomElement(dataHeader, Tag.PlanarConfiguration, "0");                   //彩图依赖
                }
                InsertUInt16DicomElement(dataHeader, Tag.BitsAllocated, dicomTags.BitsAllocated);         //允许存储位数
                InsertUInt16DicomElement(dataHeader, Tag.BitsStored, dicomTags.BitsStored);               //实际存储位数
                InsertUInt16DicomElement(dataHeader, Tag.HighBit, (ushort)(dicomTags.BitsAllocated - 1)); //高位
                InsertUInt16DicomElement(dataHeader, Tag.PixelRepresentation, 0);                         //是否有符号位
                InsertUInt16DicomElement(dataHeader, Tag.Columns, dicomTags.Columns);                     //图片宽
                InsertUInt16DicomElement(dataHeader, Tag.Rows, dicomTags.Rows);                           //图片高

                #endregion

                //SOP Common Module
                #region 图片标识
                var uidManager = McsfDatabaseDicomUIDManagerFactory.Instance().CreateUIDManager();
                var str        = uidManager.CreateImageUID("");
                InsertStringDicomElement(dataHeader, Tag.SOPInstanceUID, str);
                InsertStringDicomElement(dataHeader, Tag.SOPClassUID, "1.2.840.10008.5.1.4.1.1.7");
                InsertStringDicomElement(dataHeader, Tag.SpecificCharacterSet, "127");
                InsertStringDicomElement(dataHeader, Tag.InstanceCreatorUID, "256");
                InsertStringDicomElement(dataHeader, Tag.InstanceNumber, "256");

                #endregion


                #region LUT
                //LUT
                InsertStringDicomElement(dataHeader, Tag.RescaleIntercept, "0");      //截距
                InsertStringDicomElement(dataHeader, Tag.RescaleSlope, "1");          //斜率
                InsertStringDicomElement(dataHeader, Tag.WindowCenter, "127");        //窗位
                InsertStringDicomElement(dataHeader, Tag.WindowWidth, "256");         //窗宽
                #endregion

                #region 插入PixelData
                var element = DicomAttribute.CreateAttribute(Tag.PixelData, VR.OB);
                if (!element.SetBytes(0, imageData))
                {
                    Logger.LogWarning("Failed to Insert NULL  image Data to Data header");
                }
                dataHeader.AddDicomAttribute(element);
                #endregion


                Logger.LogFuncDown();
                return(dataHeader);
            }
            catch (Exception ex)
            {
                Logger.LogFuncException(ex.Message + ex.StackTrace);
                throw;
            }
        }
예제 #6
0
        private void PrintByGeneralPrinter(EFilmModel eFilmModel, bool ifPageNo)
        {
            try
            {
                Logger.LogFuncUp();
                var setting        = eFilmModel.PrintSettings;
                var dpi            = int.Parse(setting.CurrPrinterDPI);
                var isExistPrinter = true; //检测是否存在打印机

                // 设置页边距
                //const double margin = 30;
                double      widthMargin  = 30 * dpi / 96;
                double      heightMargin = 45 * dpi / 96;
                PrintDialog printDlg     = new PrintDialog();

                // 打印方向
                printDlg.PrintTicket.PageOrientation = setting.CurrOrientation == "0"
                                                           ? PageOrientation.Portrait
                                                           : PageOrientation.Landscape;

                //打印份数
                printDlg.PrintTicket.CopyCount = int.Parse(setting.CurrCopyCount);

                //选择纸张尺寸 //todo: FilmSize convertor
                var pageMediaSizeName = (PageMediaSizeName)Enum.Parse(typeof(PageMediaSizeName), setting.CurrFilmSize);
                printDlg.PrintTicket.PageMediaSize = new PageMediaSize(pageMediaSizeName);

                //选择一个打印机;
                if (eFilmModel.IfPrint)
                {
                    PrintQueue selectedPrinter;
                    try
                    {
                        selectedPrinter =
                            Printers.Instance.GeneralPrinters.FirstOrDefault(p => p.Name == setting.CurrPrinterAE);
                    }
                    catch (Exception)
                    {
                        var printers = new LocalPrintServer().GetPrintQueues();
                        selectedPrinter = printers.FirstOrDefault(p => p.Name == setting.CurrPrinterAE);
                    }
                    if (selectedPrinter == null)
                    {
                        Logger.LogError("没有找到" + setting.CurrPrinterAE);
                        isExistPrinter = false;
                        // return;
                    }
                    else
                    {
                        //设置打印;
                        printDlg.PrintQueue = selectedPrinter;
                    }
                }

                Size filmSize    = eFilmModel.FilmSize;
                bool ifGrayPrint = eFilmModel.IfSaveImageAsGrayScale;
                var  bitmap      = this.RenderToBitmap(filmSize,
                                                       eFilmModel.PageTitlePosition,
                                                       this,
                                                       _filmingViewerControl,
                                                       filmPageBarGrid, filmPageBarGridSimple, ifGrayPrint);

                if (isExistPrinter && eFilmModel.IfPrint)
                {
                    DrawingVisual visual = new DrawingVisual();
                    using (DrawingContext context = visual.RenderOpen())
                    {
                        // VisualBrush brush = new VisualBrush(this);

                        if (printDlg.PrintTicket.PageOrientation == PageOrientation.Portrait)
                        {
                            //context.DrawRectangle(brush, null, new Rect(new Point(30, 120),
                            //                                            new Size(this.ActualWidth, this.ActualHeight)));
                            context.DrawImage(bitmap,
                                              new Rect(new Point(widthMargin, heightMargin),
                                                       new Size(bitmap.PixelWidth, bitmap.PixelHeight)));
                        }
                        else if (printDlg.PrintTicket.PageOrientation == PageOrientation.Landscape)
                        {
                            //context.DrawRectangle(brush, null, new Rect(new Point(120, 30),
                            //                                            new Size(this.ActualWidth, this.ActualHeight)));
                            context.DrawImage(bitmap,
                                              new Rect(new Point(heightMargin, widthMargin),
                                                       new Size(bitmap.PixelWidth, bitmap.PixelHeight)));
                        }
                    }
                    double scale = Math.Min(printDlg.PrintableAreaWidth / (bitmap.PixelWidth + (widthMargin * 2)),
                                            printDlg.PrintableAreaHeight / (bitmap.PixelHeight + (widthMargin * 2)));
                    visual.Transform = new ScaleTransform(scale, scale);
                    printDlg.PrintVisual(visual, string.Empty);
                }


                if (!eFilmModel.IfSaveEFilm)
                {
                    return;
                }
                if (bool.Parse(eFilmModel.PrintSettings.IfSaveHighPrecisionEFilm))
                {
                    byte[] pixelData = Widget.ProcessImage(bitmap);

                    eFilmModel.Rows    = (ushort)bitmap.PixelHeight;
                    eFilmModel.Columns = (ushort)bitmap.PixelWidth;

                    var dicomElements = new DicomElementWidget();
                    eFilmModel.DataHeaderForSave = dicomElements.AssembleSendData(pixelData, eFilmModel);
                }
                else
                {
                    eFilmModel.DataHeaderForSave = GenerateDataHeader(eFilmModel, eFilmModel.LowPrecisionEFilmSize, ifPageNo);
                }


                Logger.LogFuncDown();
            }
            catch (Exception ex)
            {
                Logger.LogFuncException(ex.Message + ex.StackTrace);
            }
        }