Инструменты пользователя

Инструменты сайта


converterdicom

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
converterdicom [2021/04/27 04:25]
sector
converterdicom [2022/06/16 03:56]
sector
Строка 1: Строка 1:
-====== Меняем кодировку в DICOM и конвертируем кириллицу в латиницу. ======+====== Меняем кодировку в DICOM и конвертируем кириллицу в латиницу, пишем в базу и отправляем в ORTHANC. ======
 Есть у нас рентген аппарат у которого в xml файле написана кодировка ISO-8859-5, а русские символы в Windows-1251. Есть у нас рентген аппарат у которого в xml файле написана кодировка ISO-8859-5, а русские символы в Windows-1251.
-Изменим тег с кодировкой и конвертируем кириkлицу в латиницу с помощью python и отправим это все дело в ORTHANC. +Изменим тег с кодировкой и конвертируем кириллицу в латиницу с помощью python и отправим это все дело в ORTHANC. 
    
  
 ОСТОРОЖНО ! ГОВНОКОД !  ОСТОРОЖНО ! ГОВНОКОД ! 
  
 +
 +Создадим базу данных:
  
 <code | INI> <code | INI>
  
--*- codingutf--*-+-- phpMyAdmin SQL Dump 
 +-- version 5.0.4deb2 
 +-- https://www.phpmyadmin.net/ 
 +-- 
 +-- Хост: localhost:3306 
 +-- Время создания: Июн 16 2022 г., 10:49 
 +-- Версия сервера: 10.5.15-MariaDB-0+deb11u1 
 +-- Версия PHP: 7.4.28 
 + 
 +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
 +START TRANSACTION; 
 +SET time_zone = "+00:00"; 
 + 
 + 
 +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 
 +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 
 +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 
 +/*!40101 SET NAMES utf8mb4 */; 
 + 
 +-
 +-- База данных`DicomConvert` 
 +-- 
 + 
 +-- -------------------------------------------------------- 
 + 
 +-- 
 +-- Структура таблицы `DicomSend` 
 +-- 
 + 
 +CREATE TABLE `DicomSend` ( 
 +  `id` int(11) NOT NULL, 
 +  `FileName` text NOT NULL, 
 +  `SendDate` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), 
 +  `PatientName` text NOT NULL 
 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 
 + 
 +-- 
 +-- Индексы сохранённых таблиц 
 +-- 
 + 
 +-- 
 +-- Индексы таблицы `DicomSend` 
 +-- 
 +ALTER TABLE `DicomSend` 
 +  ADD PRIMARY KEY (`id`); 
 + 
 +-- 
 +-- AUTO_INCREMENT для сохранённых таблиц 
 +-- 
 + 
 +-- 
 +-- AUTO_INCREMENT для таблицы `DicomSend` 
 +-- 
 +ALTER TABLE `DicomSend` 
 +  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; 
 +COMMIT; 
 + 
 +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 
 +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 
 +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 
 + 
 +</code> 
 + 
 +Подключимся к базе: 
 + 
 +<code | INI> 
 + 
 +cat connector.py 
 + 
 +import mysql.connector 
 +cnx = mysql.connector.connect(user='DicomConvert', password='d85El4459kqOq2q0', 
 +                              host='127.0.0.1', 
 +                              database='DicomConvert', 
 +                              use_pure=False) 
 +</code> 
 + 
 + 
 +server = '192.168.1.43 4242' куда будем слать снимки 
 +fileList = open("/root/python/files_to_copy", "r") - путь до списка файлов, пример: /home/ololoev/DCM/777_888.DCM 
 + 
 +Сам скрипт отправки:  
 + 
 +<code | INI> 
 + 
 +cat dicomSend.py 
 import glob import glob
 import subprocess import subprocess
 import os import os
 import signal import signal
-import fileinput 
 import sys import sys
 import time import time
-import transliterate - https://gist.github.com/ledovsky/6398962 +import fileinput 
-reload(sys+import connector 
-sys.setdefaultencoding('utf-8')+import transliterate 
 + 
 + 
 +server = '192.168.1.43 4242' 
 +fileList = open("/root/python/files_to_copy", "r"
 + 
 +from datetime import datetime 
 +now= datetime.now()
  
-path="/mnt/data/raid1/sendDCM/"+while True: 
 +        lineFileList fileList.readline() 
 +        if not lineFileList: 
 +                break 
 +        filePath=lineFileList.strip() 
 +        fileName=filePath.split('/')[-1]
  
-for filepath in glob.iglob(path+'*.[dD][cC][mM]'):+        cursor = connector.cnx.cursor() 
 +        select_query = (f"select from DicomSend where FileName=%s"
 +        cursor.execute(select_query,[fileName]) 
 +        row = cursor.fetchone()
  
-    a=filepath +        if row == None:
-    b=a.split('/')[5]+
  
-    c=subprocess.Popen("dcm2xml +M +Wb " + filepath + " "path  + b + ".xml", shell=True) +                dcmToXml=subprocess.Popen("dcm2xml +M +Wb "filePath + " " + filePath + ".xml", shell=True) 
-    c.communicate()+                dcmToXml.communicate() 
 +                fin = open(filePath + ".xml",encoding = "WINDOWS-1251"
 +                fout = open(filePath +".xml.mod", "wt"
 +                for line in fin: 
 +                        fout.write( line.replace('ISO-8859-5', 'UTF-8') ) 
 +                fin.close() 
 +                fout.close()
  
-    def replaceAll(file,searchExp,replaceExp): +                fullpathxml filePath +'.xml.mod'
-        for line in fileinput.input(file, inplace=1): +
-            if searchExp in line: +
-                line = line.replace(searchExp,replaceExp) +
-            sys.stdout.write(line)+
  
-    replaceAll(filepath + ".xml","ISO-8859-5","WINDOWS-1251")+                import xml.etree.ElementTree as ET 
 +                tree = ET.parse(fullpathxml)
  
-    fullpathxml path + b +'.xml'+                PatientName=tree.findall('data-set/element[@name="PatientName"]')[0].text 
 +                if PatientName: 
 +                        PatientNameTrans=transliterate.transliterate(PatientName) 
 +                else: 
 +                        PatientNameTrans="NameErr"
  
-    import xml.etree.ElementTree as ET +                tree.findall('data-set/element[@name="PatientName"]')[0].text = PatientNameTrans
-    tree = ET.parse(fullpathxml)+
  
-    PatientName=tree.findall('data-set/element[@name="PatientName"]')[0].text +                BodyPE=tree.findall('data-set/element[@name="BodyPartExamined"]')[0].text 
-    BodyPE=tree.findall('data-set/element[@name="BodyPartExamined"]')[0].text +                if BodyPE: 
-    if BodyPE: +                        BodyPETrans=transliterate.transliterate(BodyPE) 
-        BodyPE=BodyPE +                else: 
-    else: +                        BodyPETrans="BodyErr"
-        BodyPE="Не заполнено"+
  
-    ViewPos=tree.findall('data-set/element[@name="ViewPosition"]')[0].text +                tree.findall('data-set/element[@name="BodyPartExamined"]')[0].text = BodyPETrans
-    if ViewPos: +
-        ViewPos=ViewPos +
-    else: +
-        ViewPos="Не заполнено"+
  
-    PatientNameTranstransliterate.transliterate(PatientName+                try: 
-    BodyPETrans= transliterate.transliterate(BodyPE+                        ViewPos=tree.findall('data-set/element[@name="ViewPosition"]')[0].text 
-    ViewPosTrans= transliterate.transliterate(ViewPos)+                        ViewPosTrans=transliterate.transliterate(ViewPos
 +                except: 
 +                        ViewPosTrans="ViewErr"
  
-    PatientNameClean=tree.findall('data-set/element[@name="PatientName"]')[0].text = PatientNameTrans +                tree.findall('data-set/element[@name="ViewPosition"]')[0].text = ViewPosTrans
-    BodyPEClean=tree.findall('data-set/element[@name="BodyPartExamined"]')[0].text = BodyPETrans +
-    ViewPosClean=tree.findall('data-set/element[@name="ViewPosition"]')[0].text = ViewPosTrans+
  
-    tree.write(fullpathxml)+                tree.write(fullpathxml)
  
-    d=subprocess.Popen("xml2dcm -f "+path + b + ".xml "path + b +".mod", shell=True) +                xmlToDcm=subprocess.Popen("xml2dcm -f "fullpathxml + " "fullpathxml +".dcm", shell=True) 
-    time.sleep(5) +                xmlToDcm.communicate()
-    e=subprocess.Popen("dcmsend -nuc +ma orthanc.medcorp.local 4242 "+ path + b +".mod", shell=True) +
-    time.sleep(5) +
-    e.communicate() +
-    os.remove(filepath) +
-    for xmlpath in glob.iglob(os.path.join(path, '*.xml')): +
-        os.remove(xmlpath) +
-    for modpath in glob.iglob(os.path.join(path, '*.mod')):+
  
 +                dcmSend=subprocess.Popen("dcmsend -nuc +ma "+server+" "+fullpathxml+".dcm", shell=True, text=True, stderr=subprocess.PIPE)
 +                data=dcmSend.communicate()
 +                for line in data:
 +                        if line:
 +                                line = line.strip()
 +                line=line.split(':')[0]
 +                if line=='W':
 +                        cursor = connector.cnx.cursor()
 +                        insert_query=(f"INSERT INTO DicomSend (id, FileName, SendDate, PatientName) values(NULL, %s, NULL, %s)")
 +                        cursor.execute(insert_query,[fileName, PatientNameTrans])
 +                        connector.cnx.commit()
 +                        fullpath='/'.join(fullpathxml.split('/')[:-1])
 +                        for xmlpath in glob.iglob(os.path.join(fullpath, '*.xml')):
 +                                os.remove(xmlpath)
 +                        for modpath in glob.iglob(os.path.join(fullpath, '*.mod')):
 +                                os.remove(modpath)
 +                        for moddcmpath in glob.iglob(os.path.join(fullpath, '*.mod.dcm')):
 +                                os.remove(moddcmpath)
 +                else:
 +                        print('ERROR. ORTHANC NOT ANSWER = ',now)
 +        else:
 +                print('RECORD IS DUPLICATED = ', now)
  
 </code> </code>
converterdicom.txt · Последнее изменение: 2023/01/29 05:35 — sector

Яндекс.Метрика