/*** * Create dicom.wl files for the MWL ORTHANC Plugin */ package dicomMWL; /*** * Auth: Ingeniero Ricardo Martínez * Enterprise: Desarrollo y Soluciones Informáticas Profesionales */ import com.pixelmed.dicom.*; import java.text.SimpleDateFormat; import java.util.Date; public class CreateMWLFile2 { public static void main(String[] args) { try { // Crear un nuevo AttributeList que contendrá todos los datos DICOM AttributeList attrList = new AttributeList(); // ============================================= // Grupo 0002 - Meta información del archivo DICOM // ============================================= // (0002,0001) FileMetaInformationVersion - Versión de la meta información (siempre 00\01) attrList.putNewAttribute(TagFromName.FileMetaInformationVersion).addValue("00\\01"); // (0002,0002) MediaStorageSOPClassUID - UID de la clase SOP (1.2.840.10008.5.1.4.1.1.2 para CT) attrList.putNewAttribute(TagFromName.MediaStorageSOPClassUID).addValue("1.2.840.10008.5.1.4.1.1.2"); // (0002,0003) MediaStorageSOPInstanceUID - UID único para esta instancia attrList.putNewAttribute(TagFromName.MediaStorageSOPInstanceUID).addValue(new UIDGenerator().getNewUID()); // (0002,0010) TransferSyntaxUID - Sintaxis de transferencia (1.2.840.10008.1.2.1 para Little Endian Explícito) attrList.putNewAttribute(TagFromName.TransferSyntaxUID).addValue("1.2.840.10008.1.2.1"); // (0002,0012) ImplementationClassUID - UID que identifica la implementación del software attrList.putNewAttribute(TagFromName.ImplementationClassUID).addValue("1.2.826.0.1.3680043.10.1"); // (0002,0013) ImplementationVersionName - Nombre/versión de la implementación attrList.putNewAttribute(TagFromName.ImplementationVersionName).addValue("MY_DICOM_APP_1.0"); // NOTA: (0002,0000) FileMetaInformationGroupLength se genera automáticamente al guardar el archivo // ============================================= // Grupo 0008 - Identificación del estudio // ============================================= // (0008,0005) SpecificCharacterSet - Juego de caracteres (ISO_IR 100 para Latin-1) attrList.putNewAttribute(TagFromName.SpecificCharacterSet).addValue("ISO_IR 100"); // (0008,0050) AccessionNumber - Número de acceso/identificador del estudio attrList.putNewAttribute(TagFromName.AccessionNumber).addValue("ACN202405001"); // ============================================= // Grupo 0010 - Información del paciente // ============================================= // (0010,0010) PatientName - Nombre del paciente en formato DICOM (Apellido^Nombre) attrList.putNewAttribute(TagFromName.PatientName).addValue("GONZALEZ^MARIA"); // (0010,0020) PatientID - Identificador único del paciente attrList.putNewAttribute(TagFromName.PatientID).addValue("PID123456789"); // (0010,0030) PatientBirthDate - Fecha de nacimiento (formato YYYYMMDD) attrList.putNewAttribute(TagFromName.PatientBirthDate).addValue("19800515"); // (0010,0040) PatientSex - Sexo del paciente (M, F u O) attrList.putNewAttribute(TagFromName.PatientSex).addValue("F"); // (0010,2000) MedicalAlerts - Alertas médicas importantes attrList.putNewAttribute(TagFromName.MedicalAlerts).addValue("DIABETES"); // (0010,2110) Allergies - Alergias del paciente attrList.putNewAttribute(TagFromName.Allergies).addValue("PENICILLIN"); // ============================================= // Grupo 0020 - Identificación del estudio // ============================================= // (0020,000d) StudyInstanceUID - UID único del estudio attrList.putNewAttribute(TagFromName.StudyInstanceUID).addValue(new UIDGenerator().getNewUID()); // ============================================= // Grupo 0032 - Información de solicitud // ============================================= // (0032,1032) RequestingPhysician - Médico que solicita el estudio attrList.putNewAttribute(TagFromName.RequestingPhysician).addValue("PEREZ^JUAN"); // (0032,1060) RequestedProcedureDescription - Descripción del procedimiento solicitado attrList.putNewAttribute(TagFromName.RequestedProcedureDescription).addValue("TOMOGRAFIA DE ABDOMEN"); // (0032,1066) ReasonForVisit - Motivo del estudio attrList.putNewAttribute(TagFromName.ReasonForStudy).addValue("PROBABLE STDA"); // ============================================= // Grupo 0040 - Scheduled Procedure Step Sequence // ============================================= // Crear el ítem de la secuencia (FFFE,E000 se genera automáticamente) AttributeList sequenceItem = new AttributeList(); // (0008,0060) Modality - Modalidad del estudio (CT, MR, US, etc.) sequenceItem.putNewAttribute(TagFromName.Modality).addValue("CT"); // (0040,0001) ScheduledStationAETitle - AE Title de la estación programada sequenceItem.putNewAttribute(TagFromName.ScheduledStationAETitle).addValue("CT_SCANNER_1"); // (0040,0002) ScheduledProcedureStepStartDate - Fecha programada (YYYYMMDD) sequenceItem.putNewAttribute(TagFromName.ScheduledProcedureStepStartDate).addValue("20240520"); // (0040,0003) ScheduledProcedureStepStartTime - Hora programada (HHMMSS) sequenceItem.putNewAttribute(TagFromName.ScheduledProcedureStepStartTime).addValue("143000"); // (0040,0006) ScheduledPerformingPhysicianName - Médico que realizará el estudio sequenceItem.putNewAttribute(TagFromName.ScheduledPerformingPhysicianName).addValue("LOPEZ^ANA"); // (0040,0007) ScheduledProcedureStepDescription - Descripción del paso programado sequenceItem.putNewAttribute(TagFromName.ScheduledProcedureStepDescription).addValue("ABDOMEN CON CONTRASTE"); // (0040,0009) ScheduledProcedureStepID - Identificador único del paso programado // Esta etiqueta se agrega manualmente ya que no existe en las librerías de Pixelmed AttributeTag ScheduledProcedureStepIDTag = new AttributeTag(0x0040, 0x0009); Attribute ScheduledProcedureStepID = AttributeFactory.newAttribute(ScheduledProcedureStepIDTag); ScheduledProcedureStepID.addValue("STEP2024052001"); sequenceItem.put(ScheduledProcedureStepID); // (0040,0010) ScheduledStationName - Nombre de la estación/equipo sequenceItem.putNewAttribute(TagFromName.ScheduledStationName).addValue("CT_SCANNER_ROOM1"); // (0040,0011) ScheduledProcedureStepLocation - Ubicación del procedimiento sequenceItem.putNewAttribute(TagFromName.ScheduledProcedureStepLocation).addValue("RADIOLOGY_FLOOR2"); // (0040,0012) PreMedication - Premedicación (vacío en este ejemplo) sequenceItem.putNewAttribute(TagFromName.PreMedication); // (0040,0400) CommentsOnTheScheduledProcedureStep - Comentarios (vacío en este ejemplo) // Esta etiqueta se agrega manualmente ya que no existe en las librerías de Pixelmed AttributeTag CommentsOnTheScheduledProcedureStepTag = new AttributeTag(0x0040, 0x0400); Attribute CommentsOnTheScheduledProcedureStep = AttributeFactory.newAttribute(CommentsOnTheScheduledProcedureStepTag); CommentsOnTheScheduledProcedureStep.addValue("SIN COMENTARIOS"); sequenceItem.put(CommentsOnTheScheduledProcedureStep); // Crear la secuencia y añadir el ítem // (FFFE,E000, FFFE,E00D y FFFE,E0DD se generan automáticamente) AttributeList scheduledSequence = new AttributeList(); // (0040, 0100) ScheduledProcedureStepSequence - Secuencia DICOM con información sobre el procedimiento programado // Esta etiqueta se agrega manualmente ya que no existe en las librerías de Pixelmed AttributeTag ScheduledProcedureStepSequenceTag = new AttributeTag(0x0040,0x0100); SequenceAttribute ScheduledProcedureStepSequence = new SequenceAttribute(ScheduledProcedureStepIDTag); ScheduledProcedureStepSequence.addItem(sequenceItem); attrList.put(ScheduledProcedureStepSequence); // ============================================= // Otras etiquetas del Grupo 0040 // ============================================= // (0040,1001) RequestedProcedureID - ID del procedimiento solicitado attrList.putNewAttribute(TagFromName.RequestedProcedureID).addValue("RP2024052001"); // (0040,1003) RequestedProcedurePriority - Prioridad del procedimiento (STAT, HIGH, MEDIUM, LOW) // Esta etiqueta se agrega manualmente ya que no existe en las librerías de Pixelmed AttributeTag RequestedProcedurePriorityTag = new AttributeTag(0x0040, 0x1001); Attribute RequestedProcedurePriority = AttributeFactory.newAttribute(RequestedProcedurePriorityTag); RequestedProcedurePriority.addValue("HIGH"); attrList.put(RequestedProcedurePriority); // ============================================= // Guardar el archivo DICOM // ============================================= // Al llamar a write(), PixelMed calcula automáticamente: // - (0002,0000) FileMetaInformationGroupLength // - Todas las etiquetas de delimitación (FFFE,xxxx) attrList.write("archivoDicom.wl"); System.out.println("Archivo DICOM generado exitosamente."); } catch (Exception e) { e.printStackTrace(); } } }