//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); }
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); } }
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(); }
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); } }
//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; } }
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); } }