From c8a1cbf0450ed5596dce5621b29f2e7eed1bf15d Mon Sep 17 00:00:00 2001 From: chistogov Date: Sat, 1 Nov 2025 21:03:27 +0500 Subject: [PATCH] first commit --- .gitignore | 220 ++++ ai_worker.py | 429 ++++++++ drag_drop_handler.py | 65 ++ icon_window.py | 124 +++ main.py | 24 + main_interface.py | 251 +++++ main_window.py | 780 +++++++++++++++ rag_corpus.json | 1706 ++++++++++++++++++++++++++++++++ readme.md | 37 + scripts/drag_n_drop_handler.py | 39 + scripts/input_search.py | 37 + scripts/test.py | 12 + 12 files changed, 3724 insertions(+) create mode 100644 .gitignore create mode 100644 ai_worker.py create mode 100644 drag_drop_handler.py create mode 100644 icon_window.py create mode 100644 main.py create mode 100644 main_interface.py create mode 100644 main_window.py create mode 100644 rag_corpus.json create mode 100644 readme.md create mode 100644 scripts/drag_n_drop_handler.py create mode 100644 scripts/input_search.py create mode 100644 scripts/test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3afaa2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,220 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can ignore the whole idea folder. +.idea/ + +# VS Code +.vscode/ +*.code-workspace + +# Data files +*.db +*.sqlite +*.sqlite3 + +# ChromaDB database +chroma_db/ + +# AI Models +models/ +!models/.gitkeep + +# Downloaded data +data/ +!data/.gitkeep + +# Temporary files +*.tmp +*.temp +*.log + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Windows +*.lnk + +# Application specific +# rag_corpus.json +config.json + +# LLM cache and temporary files +.cache/ +*.gguf.tmp + +# Logs +logs/ +*.log + +# Backup files +*.bak +*.backup + +# Local configuration +local_config.py +settings_local.py + +# Large files (добавьте сюда файлы больше 100MB если они есть) +# *.largefile \ No newline at end of file diff --git a/ai_worker.py b/ai_worker.py new file mode 100644 index 0000000..fa429f9 --- /dev/null +++ b/ai_worker.py @@ -0,0 +1,429 @@ +from PyQt6.QtCore import QThread, QMutex, QWaitCondition, pyqtSignal +import time +import os +import json +import tiktoken +from typing import List, Tuple, Optional +import chromadb +from chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunction +from llama_cpp import Llama +import torch + + +class MedicalRAG: + def __init__( + self, + model_path: str, + corpus_path: str = "rag_corpus.json", + db_path: str = "./chroma_db", + embedding_model_name: str = "cointegrated/rubert-tiny2", + top_k: int = 3, + n_ctx: int = 2048, + n_threads: int = None, + token_multiplier: int = 3, + n_gpu_layers: int = 0, + use_gpu_for_embeddings: bool = False, + low_memory: bool = True + ): + self.corpus_path = corpus_path + self.top_k = top_k + self.token_multiplier = token_multiplier + self.low_memory = low_memory + + # Автоматическое определение потоков + if n_threads is None: + import multiprocessing + n_threads = max(1, multiprocessing.cpu_count() - 1) + + # Проверка доступности GPU + self.has_gpu = torch.cuda.is_available() and not low_memory + if self.has_gpu: + gpu_memory = torch.cuda.get_device_properties(0).total_memory / 1024 ** 3 + print(f"✅ GPU доступен: {torch.cuda.get_device_name()} ({gpu_memory:.1f} GB)") + if gpu_memory < 4: + n_gpu_layers = min(n_gpu_layers, 10) + elif gpu_memory < 8: + n_gpu_layers = min(n_gpu_layers, 20) + else: + print("ℹ️ Используется CPU режим") + n_gpu_layers = 0 + use_gpu_for_embeddings = False + + # Инициализация токенизатора + print("Инициализация токенизатора...") + self.encoding = None + try: + self.encoding = tiktoken.get_encoding("cl100k_base") + except Exception as e: + print(f"⚠️ Токенизатор не загружен: {e}") + + # Эмбеддинги + print("Загрузка эмбеддинг-модели...") + device = "cuda" if (self.has_gpu and use_gpu_for_embeddings) else "cpu" + + model_kwargs = {} + if low_memory: + model_kwargs = { + 'device': device, + 'model_kwargs': {'torch_dtype': torch.float16} + } + + self.embedding_function = SentenceTransformerEmbeddingFunction( + model_name=embedding_model_name, + **model_kwargs + ) + + # ChromaDB + print("Инициализация ChromaDB...") + self.client = chromadb.PersistentClient(path=db_path) + + collection_metadata = {"hnsw:space": "cosine"} + if low_memory: + collection_metadata.update({ + "hnsw:construction_ef": 100, + "hnsw:M": 16, + }) + + self.collection = self.client.get_or_create_collection( + name="medical_anamnesis", + embedding_function=self.embedding_function, + metadata=collection_metadata + ) + + if self.collection.count() == 0: + print("Загрузка данных в коллекцию...") + self._load_corpus() + else: + print(f"Коллекция содержит {self.collection.count()} записей") + + # Загрузка LLM + if not os.path.exists(model_path): + raise FileNotFoundError( + f"Модель не найдена: {model_path}\n" + "Для слабых компьютеров рекомендуется использовать меньшие модели." + ) + + print("Загрузка языковой модели...") + + llm_params = { + "model_path": model_path, + "n_ctx": n_ctx, + "n_threads": n_threads, + "verbose": False, + "low_vram": low_memory, + "use_mlock": not low_memory, + } + + if self.has_gpu and n_gpu_layers > 0: + llm_params.update({ + "n_gpu_layers": n_gpu_layers, + "main_gpu": 0, + "tensor_split": None, + }) + print(f"Используется GPU с {n_gpu_layers} слоями") + else: + print("Используется CPU") + + try: + self.llm = Llama(**llm_params) + print("✅ Система готова к работе!") + except Exception as e: + print(f"❌ Ошибка загрузки модели: {e}") + raise + + def _load_corpus(self): + """Загрузка корпуса с обработкой ошибок""" + try: + with open(self.corpus_path, "r", encoding="utf-8") as f: + data = json.load(f) + + batch_size = 50 if self.low_memory else 100 + for i in range(0, len(data), batch_size): + batch = data[i:i + batch_size] + self.collection.add( + documents=[item["full"] for item in batch], + metadatas=[{"short": item["short"]} for item in batch], + ids=[f"id_{i + j}" for j in range(len(batch))] + ) + print(f"Загружено {min(i + batch_size, len(data))}/{len(data)} записей") + + except Exception as e: + print(f"❌ Ошибка загрузки корпуса: {e}") + raise + + def count_tokens(self, text: str) -> int: + """Подсчет токенов""" + if self.encoding: + return len(self.encoding.encode(text)) + else: + return len(text.split()) + + def build_prompt_with_token_management(self, short_note: str, processing_type: str, + max_context_tokens: int = 1500) -> Tuple[str, int]: + """Строит промпт с оптимизированным управлением токенами""" + + examples = self.retrieve(short_note) + + # Разные системные сообщения для жалоб и анамнеза + if processing_type == 'complaints': + system_msg = ( + "На основе примеров напиши развёрнуто жалобы пациента, грамотно с медицинской точки зрения. " + "Напиши жалобы в одно предложение, одной строкой. " + "Не пиши вводных слов и фраз. Только жалобы пациента. " + "Неуместно писать диагнозы и план лечения. " + "Расшифруй все сокращения. " + "Отвечай сразу без размышлений." + ) + else: # history + system_msg = ( + "На основе примеров напиши развёрнутый анамнез заболевания, грамотно с медицинской точки зрения. " + # "Опиши историю развития заболевания: когда началось, как развивалось, какое лечение получал. " + "Неуместно писать диагнозы и план лечения. " + "Используй медицинскую терминологию. " + "Расшифруй все сокращения. " + "Отвечай сразу без размышлений." + ) + + system_tokens = self.count_tokens(system_msg) + note_tokens = self.count_tokens(short_note) + + available_tokens = max_context_tokens - system_tokens - note_tokens - 150 + + selected_examples = [] + current_tokens = 0 + + for example in examples: + example_tokens = self.count_tokens(example) + if current_tokens + example_tokens <= available_tokens: + selected_examples.append(example) + current_tokens += example_tokens + else: + if self.low_memory: + break + elif len(selected_examples) > 0: + break + + context = "\n".join([f"Пример: {ex}" for ex in selected_examples]) + + user_msg = f"""Примеры: +{context} + +{"Жалобы" if processing_type == 'complaints' else "Анамнез"}: "{short_note}" +""" + + prompt = ( + f"<|im_start|>system\n{system_msg}<|im_end|>\n" + f"<|im_start|>user\n{user_msg}<|im_end|>\n" + "<|im_start|>assistant\n" + ) + + prompt_tokens = self.count_tokens(prompt) + return prompt, prompt_tokens + + def retrieve(self, query: str, n: int = None) -> List[str]: + """Оптимизированный поиск""" + n = n or min(self.top_k, 3) + try: + results = self.collection.query( + query_texts=[query], + n_results=n + ) + return results["documents"][0] + except Exception as e: + print(f"⚠️ Ошибка поиска: {e}") + return [] + + def generate(self, short_note: str, processing_type: str) -> str: + """Генерация с оптимизацией памяти""" + prompt, prompt_tokens = self.build_prompt_with_token_management(short_note, processing_type) + + available_tokens = 2048 - prompt_tokens - 30 + max_tokens = min(prompt_tokens * self.token_multiplier, available_tokens, 512) + + print(f"📊 Токены: промпт={prompt_tokens}, ответ={max_tokens}") + print(f"⚡️ Устройство: {'GPU' if self.has_gpu else 'CPU'}") + + try: + output = self.llm( + prompt, + max_tokens=max_tokens, + temperature=0.1, + stop=["<|im_end|>"], + echo=False, + stream=False + ) + + result = output["choices"][0]["text"].strip() + return result + except Exception as e: + print(f"❌ Ошибка генерации: {e}") + return "" + + def __call__(self, short_note: str, processing_type: str) -> str: + return self.generate(short_note, processing_type) + + +class AIWorker(QThread): + """Worker для обработки данных нейросетью""" + text_processed = pyqtSignal(str, str) # text, processing_type + image_processed = pyqtSignal(str) + processing_finished = pyqtSignal(str) # processing_type + + def __init__(self): + super().__init__() + self.mutex = QMutex() + self.condition = QWaitCondition() + self.text_to_process = None + self.image_to_process = None + self.processing_type = None # 'complaints', 'history', 'image' + self._active = True + + # Инициализация MedicalRAG + self.rag = None + self._init_rag() + + def _init_rag(self): + """Инициализация MedicalRAG системы""" + try: + import psutil + + # Автоматическое определение режима низкой памяти + total_memory = psutil.virtual_memory().total / 1024 ** 3 + low_memory_mode = total_memory < 8 + + print(f"💾 Общая память: {total_memory:.1f} GB") + print(f"🔧 Режим низкой памяти: {'Да' if low_memory_mode else 'Нет'}") + + # Путь к модели - нужно будет настроить под вашу систему + model_path = "./models/YandexGPT-5-Lite-8B-instruct-Q4_K_M.gguf" + + # Если модель не найдена, используем имитацию + if not os.path.exists(model_path): + print("⚠️ Модель не найдена, используется имитация LLM") + self.rag = None + return + + self.rag = MedicalRAG( + model_path=model_path, + n_ctx=2048, + n_gpu_layers=10 if not low_memory_mode else 0, + use_gpu_for_embeddings=not low_memory_mode, + low_memory=low_memory_mode + ) + print("✅ MedicalRAG инициализирован успешно!") + + except Exception as e: + print(f"❌ Ошибка инициализации MedicalRAG: {e}") + print("⚠️ Будет использоваться имитация LLM") + self.rag = None + + def process_text(self, text, processing_type): + """Запускает обработку текста""" + self.mutex.lock() + self.text_to_process = text + self.image_to_process = None + self.processing_type = processing_type + self.condition.wakeOne() + self.mutex.unlock() + + def process_image(self, image_path): + """Запускает обработку изображения""" + self.mutex.lock() + self.image_to_process = image_path + self.text_to_process = None + self.processing_type = 'image' + self.condition.wakeOne() + self.mutex.unlock() + + def stop(self): + """Останавливает worker""" + self._active = False + self.condition.wakeOne() + self.wait() + + def run(self): + """Основной цикл обработки""" + while self._active: + self.mutex.lock() + if not self.text_to_process and not self.image_to_process: + self.condition.wait(self.mutex) + + if not self._active: + self.mutex.unlock() + break + + if self.processing_type in ['complaints', 'history'] and self.text_to_process: + text = self.text_to_process + processing_type = self.processing_type + self.text_to_process = None + self.mutex.unlock() + + # Обработка текста с использованием LLM + result = self.process_text_with_llm(text, processing_type) + self.text_processed.emit(result, processing_type) + + elif self.processing_type == 'image' and self.image_to_process: + image_path = self.image_to_process + self.image_to_process = None + self.mutex.unlock() + + # Обработка изображения + result = self.simulate_image_processing(image_path) + self.image_processed.emit(result) + else: + self.mutex.unlock() + + self.processing_finished.emit(self.processing_type) + + def process_text_with_llm(self, text, processing_type): + """Обработка текста с использованием LLM""" + if not text.strip(): + return "" + + # Если LLM не инициализирован, используем имитацию + if self.rag is None: + return self.simulate_text_processing(text, processing_type) + + try: + print(f"🔍 Обработка {processing_type} с помощью LLM...") + print(f"📥 Входной текст: {text}") + + # Обработка через LLM + result = self.rag(text, processing_type) + + # Если LLM вернул пустой результат, используем исходный текст + if not result or result.strip() == "": + print("⚠️ LLM вернул пустой ответ, используется исходный текст") + result = self._format_fallback_text(text, processing_type) + else: + print(f"📤 Результат LLM: {result}") + + return result + + except Exception as e: + print(f"❌ Ошибка при обработке LLM: {e}") + # В случае ошибки возвращаем форматированный исходный текст + return self._format_fallback_text(text, processing_type) + + def _format_fallback_text(self, text, processing_type): + """Форматирует исходный текст как fallback""" + if processing_type == 'complaints': + return f"🤖 Анализ жалоб ИИ:\n\n{text}\n\nВывод: Требуется дополнительное обследование." + else: + return f"🤖 Анализ анамнеза ИИ:\n\n{text}\n\nВывод: Анамнез требует уточнения." + + def simulate_text_processing(self, text, processing_type): + """Имитация обработки текста (fallback)""" + time.sleep(2) # Имитация задержки обработки + + if processing_type == 'complaints': + return f"🤖 Анализ жалоб ИИ:\n\n{text}\n\nВывод: Выявлены характерные симптомы требующие дополнительного обследования." + else: + return f"🤖 Анализ анамнеза ИИ:\n\n{text}\n\nВывод: Анамнез указывает на хронический характер заболевания." + + def simulate_image_processing(self, image_path): + """Имитация обработки изображения нейросетью""" + time.sleep(3) # Имитация задержки обработки + + filename = os.path.basename(image_path) + return f"🖼️ Анализ изображения '{filename}':\n\nОбнаружены патологические изменения. Рекомендуется консультация специалиста." \ No newline at end of file diff --git a/drag_drop_handler.py b/drag_drop_handler.py new file mode 100644 index 0000000..8b5b968 --- /dev/null +++ b/drag_drop_handler.py @@ -0,0 +1,65 @@ +from PyQt6.QtCore import QMimeData, QUrl +from PyQt6.QtGui import QDragEnterEvent, QDropEvent +import os + + +class DragDropHandler: + """Обработчик drag-n-drop событий""" + + def __init__(self, main_window): + self.main_window = main_window + + def handle_drag_enter(self, event: QDragEnterEvent): + """Обработчик события перетаскивания в окно""" + if event.mimeData().hasUrls() or event.mimeData().hasText(): + event.acceptProposedAction() + self.main_window.show_drag_drop_interface(event.mimeData()) + + def handle_drag_leave(self, event): + """Обработчик события выхода перетаскивания из окна""" + self.main_window.dragLeaveEvent(event) + + def save_image_by_url(self, url): + from PIL import Image + import requests + from io import BytesIO + + response = requests.get(url) + img = Image.open(BytesIO(response.content)) + img.save(f"data/{os.path.basename(url)}") + + return f"data/{os.path.basename(url)}" + + def handle_drop(self, event: QDropEvent): + """Обработчик события отпускания перетаскиваемого объекта""" + mime_data = event.mimeData() + + if mime_data.hasUrls(): + # Обработка файлов + urls = mime_data.urls() + if urls and urls[0].isLocalFile(): + file_path = urls[0].toLocalFile() + if self.is_image_file(file_path): + self.main_window.handle_dropped_image(file_path) + event.acceptProposedAction() + else: + # Если это не изображение, обрабатываем как текст + self.main_window.handle_dropped_text("", 'file_drop', event.position().y()) + else: + file_path = self.save_image_by_url(mime_data.text()) + if self.is_image_file(file_path): + self.main_window.handle_dropped_image(file_path) + event.acceptProposedAction() + else: + self.main_window.handle_dropped_text("", 'file_drop', event.position().y()) + elif mime_data.hasText(): + # Обработка текста + text = mime_data.text() + self.main_window.handle_dropped_text(text, 'text_drop', event.position().y()) + event.acceptProposedAction() + + + def is_image_file(self, file_path): + """Проверяет, является ли файл изображением""" + image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff', '.webp'} + return os.path.splitext(file_path.lower())[1] in image_extensions \ No newline at end of file diff --git a/icon_window.py b/icon_window.py new file mode 100644 index 0000000..89b3eb1 --- /dev/null +++ b/icon_window.py @@ -0,0 +1,124 @@ +from PyQt6.QtWidgets import QMainWindow, QVBoxLayout, QWidget, QPushButton, QGraphicsDropShadowEffect +from PyQt6.QtCore import Qt, pyqtSignal, QPoint +from PyQt6.QtGui import QMouseEvent, QColor +import time + +class IconWindow(QMainWindow): + """Окно с круглой иконкой приложения""" + icon_clicked = pyqtSignal() + + def __init__(self, parent=None): + super().__init__(parent) + self.parent = parent + self.dragging = False + self.drag_offset = QPoint() + self.setup_ui() + + def setup_ui(self): + """Настраивает интерфейс иконки""" + self.setWindowFlags(Qt.WindowType.FramelessWindowHint | + Qt.WindowType.WindowStaysOnTopHint | + Qt.WindowType.Tool) + self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) + self.setFixedSize(70, 70) + + self.moved = False + self.start_position = None + + self.icon_widget = QWidget() + self.icon_layout = QVBoxLayout(self.icon_widget) + self.icon_layout.setContentsMargins(10, 10, 10, 10) + + self.icon_button = QPushButton("P") + self.icon_button.setFixedSize(50, 50) + self.icon_button.setStyleSheet(""" + QPushButton { + background-color: rgba(30, 30, 30, 220); + border-radius: 25px; + color: white; + font-size: 22px; + font-weight: bold; + border: 4px solid #8e44ad; + } + QPushButton:hover { + background-color: rgba(0, 0, 0, 100); + } + QPushButton:pressed { + background-color: rgba(0, 0, 0, 100); + } + """) + self.icon_layout.addWidget(self.icon_button) + + # self.shadow = QGraphicsDropShadowEffect() + # self.shadow.setBlurRadius(15) + # self.shadow.setColor(QColor('#FFFFFF')) + # self.shadow.setOffset(0, 0) + + # self.icon_widget.setGraphicsEffect(self.shadow) + + self.setCentralWidget(self.icon_widget) + + # Настраиваем обработчики мыши для перемещения + self.icon_button.mousePressEvent = self.mouse_press_event + self.icon_button.mouseMoveEvent = self.mouse_move_event + self.icon_button.mouseReleaseEvent = self.mouse_release_event + + def mouse_press_event(self, event: QMouseEvent): + """Обработчик нажатия мыши на иконку""" + if event.button() == Qt.MouseButton.LeftButton: + self.moved = True + self.start_position = self.icon_button.mapToGlobal(event.position().toPoint()) + self.dragging = True + self.drag_offset = event.position().toPoint() + self.icon_button.setStyleSheet(""" + QPushButton { + background-color: rgba(0, 0, 0, 220); + border-radius: 25px; + color: white; + font-size: 22px; + font-weight: bold; + border: 3px solid #8e44ad; + } + """) + # self.shadow.setColor(QColor('#de94fd')) + event.accept() + + def mouse_move_event(self, event: QMouseEvent): + """Обработчик движения мыши для иконки""" + if self.dragging and event.buttons() & Qt.MouseButton.LeftButton: + global_pos = self.icon_button.mapToGlobal(event.position().toPoint()) + new_pos = global_pos - self.drag_offset + QPoint(-10,-10) + self.move(new_pos) + event.accept() + + def mouse_release_event(self, event: QMouseEvent): + """Обработчик отпускания мыши для иконки""" + if event.button() == Qt.MouseButton.LeftButton and self.dragging: + # Решение конфликта событий mouse_press_event и clicked + end_position = self.icon_button.mapToGlobal(event.position().toPoint()) + if abs((self.start_position - end_position).x()) + abs((self.start_position - end_position).y()) < 40: + self.icon_clicked.emit() + self.dragging = False + self.icon_button.setStyleSheet(""" + QPushButton { + background-color: rgba(30, 30, 30, 220); + border-radius: 25px; + color: white; + font-size: 22px; + font-weight: bold; + border: 4px solid #8e44ad; + } + QPushButton:hover { + background-color: rgba(0, 0, 0, 100); + } + """) + # self.shadow.setColor(QColor('#FFFFFF')) + event.accept() + + def show_icon(self): + """Показывает иконку в левом нижнем углу""" + screen_geometry = self.screen().geometry() + x_position = screen_geometry.width() - 70 + y_position = screen_geometry.height() - 120 + self.move(x_position, y_position) + self.show() \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..d4de752 --- /dev/null +++ b/main.py @@ -0,0 +1,24 @@ +import torch +import sys +from PyQt6.QtWidgets import QApplication +from PyQt6.QtGui import QFont +from main_window import TransparentWindow + +def main(): + app = QApplication(sys.argv) + app.setQuitOnLastWindowClosed(False) + + font = QFont("Segoe UI", 9) + app.setFont(font) + + window = TransparentWindow() + + print("Input Helper запущен!") + print("Панель появляется при клике на любые поля ввода") + print("Иконка приложения находится в системном трее") + print("Для выхода используйте иконку в трее -> Выход") + + sys.exit(app.exec()) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/main_interface.py b/main_interface.py new file mode 100644 index 0000000..ef4a820 --- /dev/null +++ b/main_interface.py @@ -0,0 +1,251 @@ +from PyQt6.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QProgressBar, QHBoxLayout +from PyQt6.QtCore import Qt, pyqtSignal, QSize +import qtawesome as qta + + +class MainInterface(QWidget): + """Основной интерфейс приложения с кнопками и drop-областями""" + button_clicked = pyqtSignal(int) + + def __init__(self, parent=None): + super().__init__(parent) + self.parent = parent + self.setup_ui() + + def setup_ui(self): + """Настраивает основной интерфейс""" + self.setObjectName("MainInterface") + + + self.main_layout = QVBoxLayout(self) + self.main_layout.setContentsMargins(8, 4, 8, 8) + self.main_layout.setSpacing(1) + + + # Прогресс-бар + self.progress_bar = QProgressBar() + self.progress_bar.setVisible(False) + self.progress_bar.setStyleSheet(""" + QProgressBar { + border-radius: 4px; + background-color: rgba(180, 180, 180, 100); + font-size: 1px; + margin: 0px 3px; + } + QProgressBar::chunk { + background-color: rgba(255, 255, 255, 250); + border-radius: 4px; + } + """) + self.main_layout.addWidget(self.progress_bar) + + # Кнопки основного интерфейса + button_texts = [ + " Копировать жалобы", #mdi6.text-box-edit + " Копировать анамнез", #mdi6.text-box + " ЛОР-Статус", #mdi.ear-hearing + " Заключение ИИ", #mdi.robot-excited + " Новый случай" #mdi.refresh-circle + ] + button_names = [ + "complaints", + "history", + "ent_status", + "ai_conclusion", + "refresh" + ] + + button_default_icns = [ + "mdi6.text-box-edit", + "mdi6.text-box", + "mdi.ear-hearing", + "mdi.robot-excited", + "mdi.refresh-circle" + ] + + + + + self.buttons = [] + for i, text in enumerate(button_texts): + icn = qta.icon(button_default_icns[i], color=('#FFFFFF', 255)) + button = QPushButton(icn, text) + button.setIconSize(QSize(25, 25)) + button.setObjectName(button_names[i]) + button.setStyleSheet(""" + QPushButton { + color: #FFFFFF; + background-color: rgba(0, 0, 0, 0); + padding: 8px 8px; + border-radius: 5px; + font-size: 14px; + font-weight: 650; + margin: 0px 3px; + text-align: left; + } + QPushButton:hover { + background-color: rgba(0, 0, 0, 100); + } + QPushButton:pressed { + background-color: rgba(0, 0, 0, 220); + } + QPushButton:disabled { + color: #888888; + } + """) + button.clicked.connect(lambda checked, idx=i: self.button_clicked.emit(idx)) + self.buttons.append(button) + self.main_layout.addWidget(button) + + # Drop области + self.setup_drop_areas() + + # Изначально скрываем кнопки и показываем compact область + self.hide_buttons() + self.show_compact_drop_area() + + def setup_drop_areas(self): + """Настраивает области для drag-n-drop""" + # Основная drop область для изображений + self.image_drop_area = QLabel("🖼️ Перетащите\nснимки сюда") + self.image_drop_area.setAlignment(Qt.AlignmentFlag.AlignCenter) + # self.image_drop_area.setMinimumHeight(120) + self.image_drop_area.setStyleSheet(""" + QLabel { + background-color: rgba(200, 200, 200, 100); + border: 2px dashed rgba(180, 180, 180, 150); + border-radius: 8px; + padding: 0px; + margin: 7px; + font-size: 11px; + color: #ffffff; + font-weight: 600; + } + QLabel:hover { + background-color: rgba(200, 200, 200, 150); + border: 2px dashed rgb(180, 180, 180); + } + """) + self.image_drop_area.hide() + + # Drop области для текста + self.text_drop_layout = QVBoxLayout() + self.text_drop_layout.setSpacing(5) + + self.complaints_drop_area = QLabel("📝 Перетащите текст\nжалоб сюда") + self.complaints_drop_area.setAlignment(Qt.AlignmentFlag.AlignCenter) + # self.complaints_drop_area.setMinimumHeight(60) + self.complaints_drop_area.setStyleSheet(""" + QLabel { + background-color: rgba(200, 200, 200, 100); + border: 2px dashed rgba(180, 180, 180, 150); + border-radius: 8px; + padding: 0px; + font-size: 11px; + color: #ffffff; + font-weight: 600; + } + QLabel:hover { + background-color: rgba(200, 200, 200, 150); + border: 2px dashed rgb(180, 180, 180); + } + """) + + self.history_drop_area = QLabel("📋 Перетащите текст\nанамнеза сюда") + self.history_drop_area.setAlignment(Qt.AlignmentFlag.AlignCenter) + # self.history_drop_area.setMinimumHeight(60) + self.history_drop_area.setStyleSheet(""" + QLabel { + background-color: rgba(200, 200, 200, 100); + border: 2px dashed rgba(180, 180, 180, 150); + border-radius: 8px; + padding: 0px; + font-size: 11px; + color: #ffffff; + font-weight: 600; + } + QLabel:hover { + background-color: rgba(200, 200, 200, 150); + border: 2px dashed rgb(180, 180, 180); + } + """) + + self.text_drop_layout.addWidget(self.complaints_drop_area) + self.text_drop_layout.addWidget(self.history_drop_area) + + self.text_drop_widget = QWidget() + self.text_drop_widget.setLayout(self.text_drop_layout) + self.text_drop_widget.hide() + + def show_compact_drop_area(self): + """Показывает компактную drop область""" + self.hide_all_drop_areas() + + if hasattr(self, 'compact_drop_widget'): + self.main_layout.removeWidget(self.compact_drop_widget) + self.compact_drop_widget.deleteLater() + + compact_drop_label = QLabel("📁 Перетащите снимки\nили текст сюда") + compact_drop_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + # compact_drop_label.setMinimumHeight(80) + compact_drop_label.setStyleSheet(""" + QLabel { + background-color: rgba(200, 200, 200, 100); + border: 2px dashed rgba(180, 180, 180, 150); + border-radius: 8px; + padding: 0px; + margin: 7px; + font-size: 11px; + color: #ffffff; + font-weight: 600; + } + """) + + self.compact_drop_widget = compact_drop_label + self.main_layout.insertWidget(0, self.compact_drop_widget) + self.compact_drop_widget.show() + + def show_image_drop_interface(self): + """Показывает интерфейс для перетаскивания изображений""" + self.hide_all_drop_areas() + if self.image_drop_area not in [self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count())]: + self.main_layout.insertWidget(0, self.image_drop_area) + self.image_drop_area.show() + + def show_text_drop_interface(self): + """Показывает интерфейс для перетаскивания текста""" + self.hide_all_drop_areas() + if self.text_drop_widget not in [self.main_layout.itemAt(i).widget() for i in range(self.main_layout.count())]: + self.main_layout.insertWidget(0, self.text_drop_widget) + self.text_drop_widget.show() + + def hide_all_drop_areas(self): + """Скрывает все drop области""" + self.image_drop_area.hide() + self.text_drop_widget.hide() + if hasattr(self, 'compact_drop_widget'): + self.compact_drop_widget.hide() + + def show_buttons(self): + """Показывает все кнопки""" + for button in self.buttons: + button.show() + + def hide_buttons(self): + """Скрывает все кнопки""" + for button in self.buttons: + button.hide() + + def set_processing_state(self, processing): + """Устанавливает состояние обработки""" + self.progress_bar.setVisible(processing) + if processing: + self.progress_bar.setRange(0, 0) + else: + self.progress_bar.setRange(0, 100) + + def set_buttons_enabled(self, enabled): + """Включает/выключает кнопки""" + for button in self.buttons: + if button.objectName() != "🔄 Новый случай": + button.setEnabled(enabled) \ No newline at end of file diff --git a/main_window.py b/main_window.py new file mode 100644 index 0000000..13cda44 --- /dev/null +++ b/main_window.py @@ -0,0 +1,780 @@ +import sys +import time +import os +from PyQt6.QtWidgets import (QMainWindow, QVBoxLayout, QWidget, + QSystemTrayIcon, QMenu, QApplication, QHBoxLayout, QPushButton) +from PyQt6.QtCore import Qt, pyqtSignal, QTimer, QPropertyAnimation, QEasingCurve, QPoint +from PyQt6.QtGui import QFont, QPainter, QIcon, QAction, QPixmap, QDragEnterEvent, QDropEvent, QMouseEvent +import uiautomation as auto + +from ai_worker import AIWorker +from drag_drop_handler import DragDropHandler +from icon_window import IconWindow +from main_interface import MainInterface +import qtawesome as qta +import pyperclip +import keyboard + + +class TransparentWindow(QMainWindow): + text_to_insert = pyqtSignal(str) + + def __init__(self): + super().__init__() + self.is_visible = False # Видимость окна (скрыто/показано) + self.is_expanded = False # Ширина окна (узкое/широкое) + self.hook_manager = None + + self.dragging = False + self.drag_offset = QPoint() + self.drag_n_drop_active = False + + self.setup_ui() + self.setup_tray() + self.setup_focus_monitor() + self.hide() # Изначально окно скрыто + self.last_focus_state = False + self.last_active_timestamp = time.time() + + # Инициализация AI worker + self.ai_worker = AIWorker() + self.ai_worker.text_processed.connect(self.on_text_processed) + self.ai_worker.image_processed.connect(self.on_image_processed) + self.ai_worker.processing_finished.connect(self.on_processing_finished) + self.ai_worker.start() + + # Инициализация drag-drop handler + self.drag_drop_handler = DragDropHandler(self) + + # Переменные состояния + self.current_complaints_text = "" + self.current_history_text = "" + self.current_image_path = "" + self.is_processing = False + self.pending_text_type = None + + # Настройка drag-and-drop + self.setAcceptDrops(True) + + def setup_ui(self): + """Настраивает основной интерфейс окна""" + # Устанавливаем прозрачность и убираем рамку + self.setWindowFlags(Qt.WindowType.FramelessWindowHint | + Qt.WindowType.WindowStaysOnTopHint | + Qt.WindowType.Tool) + self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) + + # Получаем размеры экрана + screen_geometry = QApplication.primaryScreen().geometry() + screen_width = screen_geometry.width() + screen_height = screen_geometry.height() + + # Размеры окон + self.collapsed_width = 70 + self.expanded_width = 200 + self.window_height = 300 + + # Позиционируем основное окно слева по центру + main_x_position = 10 + main_y_position = (screen_height - self.window_height) // 2 + + # Устанавливаем начальную позицию основного окна (свернутое состояние) + self.setGeometry(main_x_position, main_y_position, self.collapsed_width, self.window_height) + + # Создаем центральный виджет + self.central_widget = QWidget() + self.central_widget.setObjectName("CentralWidget") + self.central_widget.setAcceptDrops(True) + self.setCentralWidget(self.central_widget) + + self.central_widget.mousePressEvent = self.mouse_press_event + self.central_widget.mouseMoveEvent = self.mouse_move_event + self.central_widget.mouseReleaseEvent = self.mouse_release_event + + # Основной layout + self.main_layout = QVBoxLayout(self.central_widget) + self.main_layout.setContentsMargins(0, 0, 0, 0) + self.main_layout.setSpacing(0) + + self.top_layout = QHBoxLayout() + self.top_layout.setContentsMargins(4, 4, 4, 0) + self.top_layout.setSpacing(0) + self.top_layout.addStretch() + icn = qta.icon("ph.gear-six-bold", color=('#FFFFFF', 255)) + button_1 = QPushButton(icn, "") + button_1.setStyleSheet(""" + QPushButton { + color: #FFFFFF; + background-color: rgba(0, 0, 0, 0); + padding: 4px 4px; + border-radius: 5px; + font-size: 14px; + font-weight: 650; + margin: 0px 3px; + text-align: left; + max-width: 16px; + } + QPushButton:hover { + background-color: rgba(0, 0, 0, 100); + } + QPushButton:pressed { + background-color: rgba(0, 0, 0, 220); + } + QPushButton:disabled { + color: #888888; + } + """) + icn = qta.icon("ph.push-pin-bold", color=('#FFFFFF', 255)) + button_2 = QPushButton(icn, "") + button_2.setStyleSheet(""" + QPushButton { + color: #FFFFFF; + background-color: rgba(0, 0, 0, 0); + padding: 4px 4px; + border-radius: 5px; + font-size: 14px; + font-weight: 650; + margin: 0px 3px; + text-align: left; + max-width: 16px; + } + QPushButton:hover { + background-color: rgba(0, 0, 0, 100); + } + QPushButton:pressed { + background-color: rgba(0, 0, 0, 220); + } + QPushButton:disabled { + color: #888888; + } + """) + self.top_layout.addWidget(button_1) + self.top_layout.addWidget(button_2) + self.main_layout.addLayout(self.top_layout) + + # Создаем и показываем иконку + self.icon_window = IconWindow(self) + self.icon_window.icon_clicked.connect(self.toggle_window_visibility) + self.icon_window.show_icon() + + + # .addLayout(self.central_widget) + + # Создаем основной интерфейс + self.main_interface = MainInterface(self) + self.main_interface.button_clicked.connect(self.on_button_click) + self.main_interface.hide() # Изначально скрыт + self.main_layout.addWidget(self.main_interface) + + self.central_widget.setStyleSheet(""" + #CentralWidget { + background: qlineargradient( + x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(30, 30, 30, 220), + stop:1 rgba(40, 40, 40, 240) + ); + border-radius: 15px; + } + """) + + self.text_to_insert.connect(self.insert_text) + + def mouse_press_event(self, event: QMouseEvent): + """Обработчик нажатия мыши на иконку""" + if event.button() == Qt.MouseButton.LeftButton: + self.dragging = True + self.drag_offset = event.position().toPoint() + event.accept() + + def mouse_move_event(self, event: QMouseEvent): + """Обработчик движения мыши для иконки""" + if self.dragging and event.buttons() & Qt.MouseButton.LeftButton: + global_pos = self.central_widget.mapToGlobal(event.position().toPoint()) + new_pos = global_pos - self.drag_offset + QPoint(-10,-10) + self.move(new_pos) + event.accept() + + def mouse_release_event(self, event: QMouseEvent): + """Обработчик отпускания мыши для иконки""" + if event.button() == Qt.MouseButton.LeftButton and self.dragging: + # Решение конфликта событий mouse_press_event и clicked + self.dragging = False + event.accept() + + def toggle_window_visibility(self): + """Переключает видимость окна (скрыть/показать)""" + if self.is_visible: + self.hide_window() + else: + self.show_window() + + def show_window(self): + """Показывает окно в узком состоянии""" + if self.is_visible: + return + + self.is_visible = True + self.show() + self.raise_() + + # Показываем основной интерфейс + self.main_interface.show() + + # Устанавливаем узкую ширину и показываем compact drop область + # self.resize(self.collapsed_width, self.window_height) + # self.main_interface.hide_buttons() + # self.main_interface.show_compact_drop_area() + self.expand_for_text_field() + + def hide_window(self): + """Полностью скрывает окно""" + if not self.is_visible: + return + + self.is_visible = False + self.hide() + self.main_interface.hide_all_drop_areas() + + def expand_for_drag_drop(self, mime_data): + """Расширяет окно для drag-n-drop""" + + if not self.is_visible: + self.show_window() + + if not self.is_expanded: + self.animate_window_width(self.expanded_width) + self.is_expanded = True + + # Показываем соответствующие drop области (без кнопок) + self.main_interface.hide_buttons() + self.main_interface.hide_all_drop_areas() + + + if mime_data.hasUrls(): + urls = mime_data.urls() + if urls and urls[0].isLocalFile(): + file_path = urls[0].toLocalFile() + if self.drag_drop_handler.is_image_file(file_path): + self.main_interface.show_image_drop_interface() + else: + self.main_interface.show_text_drop_interface() + else: + urls = mime_data.urls() + file_path = urls[0] + self.main_interface.show_image_drop_interface() + elif mime_data.hasText(): + self.main_interface.show_text_drop_interface() + + def expand_for_text_field(self): + """Расширяет окно для работы с текстовым полем""" + if not self.is_visible: + self.show_window() + + if not self.is_expanded: + self.animate_window_width(self.expanded_width) + self.is_expanded = True + + # Показываем кнопки (без drop областей) + self.main_interface.show_buttons() + self.main_interface.hide_all_drop_areas() + + def collapse_to_compact(self): + """Сворачивает окно до компактного состояния""" + if not self.is_expanded: + return + + self.animate_window_width(self.collapsed_width) + self.is_expanded = False + + # Показываем compact drop область + self.main_interface.hide_buttons() + self.main_interface.show_compact_drop_area() + + def animate_window_width(self, target_width, callback=None): + """Анимирует изменение ширины окна""" + + # self.resize(target_width, self.window_height) + + if callback: + callback() + + def show_drag_drop_interface(self, mime_data): + """Показывает интерфейс для drag-n-drop""" + self.expand_for_drag_drop(mime_data) + + def handle_dropped_image(self, image_path): + """Обрабатывает перетащенное изображение""" + try: + self.current_image_path = image_path + + print("⚠️ NEW Image. URL:", image_path) + + # Запускаем обработку изображения + self.set_processing_state(True) + self.main_interface.buttons[2].setText(" ЛОР-Статус (обработка...)") + self.main_interface.buttons[3].setText(" Заключение ИИ (обработка...)") + + self.ai_worker.process_image(image_path) + self.main_interface.show_compact_drop_area() + except Exception as e: + self.show_error(f"Не удалось загрузить изображение: {str(e)}") + self.set_processing_state(False) + self.main_interface.show_compact_drop_area() + + def handle_dropped_text(self, text, drop_type, y_position): + """Обрабатывает перетащенный текст""" + if not text.strip() and drop_type == 'file_drop': + try: + text = "Текст из перетащенного файла" + except: + text = "Не удалось прочитать файл" + + if y_position < self.window_height/2: + # Обрабатываем как жалобы + self.start_text_processing(text, 'complaints') + else: + # Обрабатываем как жалобы + self.start_text_processing(text, 'history') + self.main_interface.show_compact_drop_area() + + def start_text_processing(self, text, processing_type): + """Запускает обработку текста""" + self.set_processing_state(True) + + if processing_type == 'complaints': + self.main_interface.buttons[0].setText(" Обработка...") + self.pending_text_type = 'complaints' + else: + self.main_interface.buttons[1].setText(" Обработка...") + self.pending_text_type = 'history' + + self.ai_worker.process_text(text, processing_type) + + def set_processing_state(self, processing): + """Устанавливает состояние обработки""" + self.is_processing = processing + self.main_interface.set_buttons_enabled(not processing) + self.main_interface.set_processing_state(processing) + + def on_text_processed(self, result, processing_type): + """Обработчик завершения обработки текста""" + if processing_type == 'complaints': + self.current_complaints_text = result + self.main_interface.buttons[0].setText(" Вставить жалобы (ИИ)") + else: + self.current_history_text = result + self.main_interface.buttons[1].setText(" Вставить анамнез (ИИ)") + + def on_image_processed(self, result): + """Обработчик завершения обработки изображения""" + self.current_image_path = result + self.main_interface.buttons[2].setText(" ЛОР-Статус (ИИ)") + self.main_interface.buttons[3].setText(" Заключение ИИ (готово)") + + def on_processing_finished(self, processing_type): + """Обработчик завершения любой обработки""" + self.set_processing_state(False) + + # Drag and Drop events + def dragEnterEvent(self, event: QDragEnterEvent): + """Обработчик события перетаскивания в окно""" + self.drag_drop_handler.handle_drag_enter(event) + self.drag_n_drop_active = True + + def dragLeaveEvent(self, event): + """Обработчик события выхода перетаскивания из окна""" + if self.is_visible and not self.is_processing: + self.collapse_to_compact() + self.drag_n_drop_active = False + + def dropEvent(self, event: QDropEvent): + """Обработчик события отпускания перетаскиваемого объекта""" + self.drag_drop_handler.handle_drop(event) + self.drag_n_drop_active = False + + def setup_tray(self): + """Настраиваем системный трей""" + self.tray_icon = QSystemTrayIcon(self) + pixmap = QPixmap(16, 16) + pixmap.fill(Qt.GlobalColor.blue) + self.tray_icon.setIcon(QIcon(pixmap)) + self.tray_icon.setToolTip("Input Helper\nАвтоматическая панель для ввода текста") + + tray_menu = QMenu() + show_action = QAction("Показать панель", self) + show_action.triggered.connect(self.show_window) + hide_action = QAction("Скрыть панель", self) + hide_action.triggered.connect(self.hide_window) + quit_action = QAction("Выход", self) + quit_action.triggered.connect(self.quit_application) + + tray_menu.addAction(show_action) + tray_menu.addAction(hide_action) + tray_menu.addSeparator() + tray_menu.addAction(quit_action) + + self.tray_icon.setContextMenu(tray_menu) + self.tray_icon.activated.connect(self.tray_icon_activated) + self.tray_icon.show() + + def is_editable_field(self): + try: + focused = auto.GetFocusedControl() + if not focused: + return False + + control_type = focused.ControlType + if control_type in [auto.ControlType.EditControl, auto.ControlType.ComboBoxControl, + auto.ControlType.TextControl]: + return True + + return False + except Exception as e: + return False + + def setup_focus_monitor(self): + """Мониторинг фокуса ввода через таймер""" + self.focus_timer = QTimer() + self.focus_timer.timeout.connect(self.check_focused_control) + self.focus_timer.start(200) + + def check_focused_control(self): + """Проверяет, есть ли фокус на редактируемом поле""" + try: + if self.drag_n_drop_active: + return 0 + current_focus_state = self.is_editable_field() + if current_focus_state: + self.last_active_timestamp = time.time() + if not self.last_focus_state: + # При фокусе на текстовом поле - расширяем окно и показываем кнопки + self.expand_for_text_field() + else: + if self.geometry().width() < self.expanded_width: + self.animate_window_width(self.expanded_width) + self.is_expanded = True + self.main_interface.show_buttons() + self.main_interface.hide_all_drop_areas() + else: + if time.time() - self.last_active_timestamp > 5: + self.last_active_timestamp = time.time() + if not self.last_focus_state: + # При фокусе на текстовом поле - расширяем окно и показываем кнопки + self.expand_for_text_field() + else: + if self.geometry().width() < self.expanded_width: + self.animate_window_width(self.expanded_width) + self.is_expanded = True + self.main_interface.show_buttons() + self.main_interface.hide_all_drop_areas() + + self.last_focus_state = current_focus_state + except Exception: + pass + + def on_button_click(self, index): + """Обработчик клика по кнопке""" + if index == len(self.main_interface.buttons) - 1: # Последняя кнопка - скрыть + self.restart_form() + elif index == 0: # Кнопка жалоб + self.handle_complaints_button() + elif index == 1: # Кнопка анамнеза + self.handle_history_button() + elif index == 2: # ЛОР-Статус + if "(ИИ)" in self.main_interface.buttons[2].text() and self.current_image_path: + self.insert_text(self.current_image_path) + else: + self.insert_text("""Отоскопия (эндоскопия уха): +Правое ухо: Наружный слуховой проход широкий, кожа розовая, чистая. Барабанная перепонка перламутрово-серого цвета, опознавательные знаки четко дифференцируются. + +Левое ухо: Визуализируется обтурирующая масса в костном отделе наружного слухового прохода.""") + elif index == 3: # Заключение ИИ + if "(готово)" in self.main_interface.buttons[3].text() and self.current_image_path: + self.insert_text(self.current_image_path) + else: + self.insert_text("H68.0 Воспаление слуховой (евстахиевой) трубы") + + def handle_complaints_button(self): + """Обрабатывает нажатие кнопки жалоб""" + button = self.main_interface.buttons[0] + text = button.text() + + if "Копировать" in text: + self.copy_current_text('complaints') + elif "Вставить" in text and self.current_complaints_text: + self.insert_text(self.current_complaints_text) + + def handle_history_button(self): + """Обрабатывает нажатие кнопки анамнеза""" + button = self.main_interface.buttons[1] + text = button.text() + + if "Копировать" in text: + self.copy_current_text('history') + elif "Вставить" in text and self.current_history_text: + self.insert_text(self.current_history_text) + + def copy_current_text(self, processing_type): + """Копирует текст из активного поля и запускает обработку""" + try: + self.hide_window() + self.is_visible = False + + if processing_type == 'complaints': + self.main_interface.buttons[0].setText(" Обработка...") + else: + self.main_interface.buttons[1].setText(" Обработка...") + + self.set_processing_state(True) + + QTimer.singleShot(50, lambda: self._do_copy_and_process(processing_type)) + + except Exception as e: + print(f"Ошибка при копировании: {e}") + self.set_processing_state(False) + + # def _do_copy_and_process(self, processing_type): + # """Копирует текст и запускает обработку""" + # try: + # + # original_text = pyperclip.paste() + # + # keyboard.press_and_release('ctrl+a') + # time.sleep(0.3) + # keyboard.press_and_release('ctrl+c') + # time.sleep(0.3) + # keyboard.press_and_release('end') + # time.sleep(0.3) + # + # copied_text = pyperclip.paste() + # # pyperclip.copy(original_text) + # + # print(copied_text) + # if copied_text: #and copied_text != original_text + # self.ai_worker.process_text(copied_text, processing_type) + # else: + # if processing_type == 'complaints': + # self.main_interface.buttons[0].setText(" Копировать жалобы") + # else: + # self.main_interface.buttons[1].setText(" Копировать анамнез") + # print("Не удалось скопировать текст из активного поля") + # self.show_error("Не удалось скопировать текст из активного поля") + # self.set_processing_state(False) + # + # QTimer.singleShot(100, self.show_window) + # + # except Exception as e: + # print(f"Ошибка при работе с pyperclip: {e}") + # self.set_processing_state(False) + # QTimer.singleShot(100, self.show_window) + + def _do_copy_and_process(self, processing_type): + """Копирует выделенный текст из любого окна (включая Chrome) через UI Automation""" + try: + copied_text = None + + if auto is not None: + try: + selected_text = self._get_selected_text_uia() + if selected_text: + copied_text = selected_text + except Exception as e: + print(f"UIA сбой: {e}") + copied_text = None + print("Auto:", copied_text) + # Fallback: если UIA недоступен или не сработал — используем SendInput + if not copied_text: + copied_text = self._copy_via_sendinput() + print("SendInput:", copied_text) + + # Обработка результата + if copied_text: + self.ai_worker.process_text(copied_text, processing_type) + else: + if processing_type == 'complaints': + self.main_interface.buttons[0].setText(" Копировать жалобы") + else: + self.main_interface.buttons[1].setText(" Копировать анамнез") + print("Не удалось скопировать текст из активного поля") + self.show_error("Не удалось скопировать текст из активного поля") + self.set_processing_state(False) + + QTimer.singleShot(100, self.show_window) + + except Exception as e: + print(f"Ошибка при работе с pyperclip: {e}") + self.set_processing_state(False) + QTimer.singleShot(100, self.show_window) + + def _get_selected_text_uia(self): + """Получает весь текст из активного редактируемого поля через UI Automation""" + try: + focused = auto.GetFocusedControl() + if not focused: + return None + + # Игнорируем известные "пустышки" + if focused.ClassName == "IHWindowClass" and "Input Capture" in (focused.Name or ""): + # RDP: невозможно получить текст локально + return None + + # Пытаемся получить TextPattern (даже у ComboBoxControl в Chrome он есть!) + text_pattern = focused.GetTextPattern() + if text_pattern is not None: + try: + full_range = text_pattern.DocumentRange + if full_range: + full_text = full_range.GetText(-1) + if isinstance(full_text, str): + return full_text.strip() + except Exception as e: + print(f"Ошибка при получении DocumentRange: {e}") + + # Fallback: если TextPattern недоступен, пробуем Value (осторожно!) + if hasattr(focused, 'LegacyIAccessible'): + acc = focused.LegacyIAccessible + value = getattr(acc, 'Value', None) + if isinstance(value, str) and value.strip(): + # Дополнительная проверка: если Name похож на placeholder — не доверяем Value + # Но в большинстве нативных приложений Value = реальный текст + return value.strip() + + except Exception as e: + print(f"UIA: ошибка получения текста: {e}") + return None + + def _copy_via_sendinput(self): + try: + + # Сохраняем оригинальный буфер + original_clipboard = pyperclip.paste() + # Очищаем буфер перед копированием (чтобы точно знать, что скопировалось) + pyperclip.copy("") + time.sleep(0.15) + + # Выделяем всё и копируем + keyboard.press_and_release('ctrl+a', do_press=True, do_release=False) + time.sleep(0.2) + keyboard.press_and_release('ctrl+a', do_press=False, do_release=True) + time.sleep(0.2) + keyboard.press_and_release('ctrl+c', do_press=True, do_release=False) + time.sleep(0.2) + keyboard.press_and_release('ctrl+c', do_press=False, do_release=True) + time.sleep(0.4) # Достаточно для большинства случаев + + # # Перемещаем курсор в конец (опционально) + # keyboard.press_and_release('end') + time.sleep(0.15) + + # Получаем результат + copied_text = pyperclip.paste().strip() + + # Восстанавливаем оригинальный буфер + pyperclip.copy(original_clipboard) + + if copied_text: + return copied_text + else: + return None + + except Exception as e: + print(f"Ошибка при копировании: {e}") + return None + + def insert_text(self, text): + """Вставляет текст в активное поле ввода""" + try: + self.hide_window() + self.is_visible = False + + if text: + QTimer.singleShot(50, lambda: self._do_insert_pyperclip(text)) + + except Exception as e: + print(f"Ошибка при вставке: {e}") + + def _do_insert_pyperclip(self, text): + """Вставка текста с использованием pyperclip""" + try: + import pyperclip + + original_text = pyperclip.paste() + pyperclip.copy(text) + + QTimer.singleShot(30, lambda: self._paste_and_restore(original_text)) + + except Exception as e: + print(f"Ошибка при работе с pyperclip: {e}") + QTimer.singleShot(100, self.show_window) + + def _paste_and_restore(self, original_text): + """Вставляет текст и восстанавливает буфер""" + try: + keyboard.press_and_release('ctrl+v') + QTimer.singleShot(100, lambda: pyperclip.copy(original_text)) + QTimer.singleShot(100, self.show_window) + except Exception as e: + print(f"Ошибка при вставке: {e}") + QTimer.singleShot(100, self.show_window) + + def show_error(self, message): + """Показывает сообщение об ошибке""" + print(f"Ошибка: {message}") + + def tray_icon_activated(self, reason): + """Обработчик активации иконки в трее""" + if reason == QSystemTrayIcon.ActivationReason.DoubleClick: + if self.is_visible: + self.hide_window() + else: + self.show_window() + + def quit_application(self): + """Корректный выход из приложения""" + if self.hook_manager: + try: + self.hook_manager.UnhookMouse() + except: + pass + + if self.ai_worker.isRunning(): + self.ai_worker.stop() + + self.tray_icon.hide() + QApplication.quit() + + def paintEvent(self, event): + """Отрисовывает тень вокруг окна""" + painter = QPainter(self) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + + shadow_margin = 8 + shadow_rect = self.rect().adjusted( + shadow_margin, + shadow_margin, + -shadow_margin, + -shadow_margin + ) + + painter.setPen(Qt.PenStyle.NoPen) + painter.setBrush(Qt.GlobalColor.black) + painter.setOpacity(0.2) + painter.drawRoundedRect(shadow_rect, 15, 15) + + painter.end() + super().paintEvent(event) + + def closeEvent(self, event): + """Обработчик закрытия окна""" + event.ignore() + self.hide_window() + + def restart_form(self): + self.main_interface.buttons[0].setText(" Копировать жалобы") + self.main_interface.buttons[1].setText(" Копировать анамнез") + self.main_interface.buttons[2].setText(" ЛОР-Статус") + self.main_interface.buttons[3].setText(" Заключение ИИ") + + self.current_complaints_text = "" + self.current_history_text = "" + self.current_image_path = "" diff --git a/rag_corpus.json b/rag_corpus.json new file mode 100644 index 0000000..0090fb1 --- /dev/null +++ b/rag_corpus.json @@ -0,0 +1,1706 @@ +[ + { + "short": "Жалобы на заложенность носа, гнойные выделения, головную боль в области лба. Симптомы более 2 нед. Капли использовал, временный эффект.", + "full": "Со слов пациента, предъявляет жалобы на заложенность носа, гнойные выделения из носовых ходов и головную боль в области лба. Симптомы сохраняются более двух недель. Пробовал использовать сосудосуживающие капли, отмечал временный эффект." + }, + { + "short": "Острый правосторонний отит в анамнезе. Перфорация барабанной перепонки не подтверждена. Лечился антибиотиками (название не помнит).", + "full": "Со слов пациента, в анамнезе был эпизод острого правостороннего отита. Перфорация барабанной перепонки не была подтверждена. Проходил курс лечения антибиотиками, название препарата не помнит." + }, + { + "short": "Попала вода в ухо при плавании. Через 2 дня появились зуд, боль, выделения. Самостоятельно чистил ухо.", + "full": "Со слов пациента, два дня назад в правое ухо попала вода при плавании. После этого появились зуд, боль и выделения. Пациент пытался самостоятельно чистить ухо." + }, + { + "short": "Храп, апноэ во сне по словам родственников. Носовое дыхание затн. Днем сонливость.", + "full": "Со слов пациента, родственники отмечают наличие храпа и остановок дыхания (апноэ) во сне. Носовое дыхание затруднено. Днем беспокоит повышенная сонливость." + }, + { + "short": "Инородное тело носа (бусина) у ребенка 4 лет. Родители пытались извлечь пинцетом, безуспешно.", + "full": "Со слов родителей, ребенок 4 лет поместил в нос бусину. Родители пытались извлечь инородное тело с помощью пинцета, но безуспешно." + }, + { + "short": "Внезапное снижение слуха на левое ухо, шум в ухе после простуды. Ототоксичные ЛС не принимал.", + "full": "Со слов пациента, после перенесенной простуды отметил внезапное снижение слуха на левое ухо и появление шума в нем. Ототоксичные лекарственные средства не принимал." + }, + { + "short": "Боль в горле, налеты на миндалинах, лихорадка до 39°C. Антибиотики не принимал. Контактов с больными ангиной нет.", + "full": "Со слов пациента, предъявляет жалобы на боль в горле, налеты на миндалинах и повышение температуры тела до 39°C. Антибиотики не принимал. Контактов с больными ангиной не было." + }, + { + "short": "Хр. тонзиллит, частые ангины (2-3 р/год). Пробки в миндалинах, неприятный запах изо рта.", + "full": "Со слов пациента, страдает хроническим тонзиллитом с частыми обострениями (2-3 раза в год). Беспокоят пробки в миндалинах и неприятный запах изо рта." + }, + { + "short": "Проф. вредности (пыль, хим. пары). Сухость, першение в горле, осиплость к концу рабочего дня.", + "full": "Со слов пациента, работает в условиях профессиональных вредностей (контакт с пылью и химическими парами). Беспокоят сухость и першение в горле, осиплость голоса, которые усиливаются к концу рабочего дня." + }, + { + "short": "Травма носа с хрустом. Деформация спинки носа, затруднение носового дыхания. Кровотечение было, остановилось само.", + "full": "Со слов пациента, получил травму носа, сопровождавшуюся хрустом. Отмечает деформацию спинки носа и затруднение носового дыхания. Кровотечение из носа было, остановилось самостоятельно." + }, + { + "short": "Ощущение кома в горле, усил. при глотании слюны. Связывает со стрессом. ЭГДС без патологии.", + "full": "Со слов пациента, беспокоит ощущение кома в горле, усиливающееся при глотании слюны. Связывает появление симптомов со стрессом. Ранее проходил ЭГДС, патологии выявлено не было." + }, + { + "short": "Головокружение системного хар-ра, провоцируется поворотами головы. Тошноты, рвоты нет.", + "full": "Со слов пациента, беспокоят головокружения системного характера, которые провоцируются поворотами головы. Тошноты и рвоты не отмечает." + }, + { + "short": "Рецидивир. герпес на кр. кайме губ и слизистой носа. Обострения 3-4 р/год.", + "full": "Со слов пациента, страдает рецидивирующим герпесом с высыпаниями на красной кайме губ и слизистой оболочке носа. Обострения случаются 3-4 раза в год." + }, + { + "short": "Ангины с детства. Ревм. атака в 15 лет. Сейчас жалоб нет, проф. осмотр.", + "full": "Со слов пациента, с детства страдал частыми ангинами. В возрасте 15 лет перенес ревматическую атаку. В настоящее время жалоб не предъявляет, обратился для профессионального осмотра." + }, + { + "short": "Ожог слизистой глотки горячей пищей. Боль, невозм. глотать твердую пищу. Пьет прохладную воду.", + "full": "Со слов пациента, получил ожог слизистой глотки горячей пищей. Беспокоит сильная боль, невозможность глотать твердую пищу. Для облегчения состояния пьет прохладную воду." + }, + { + "short": "Аденоиды 2 ст. у ребенка 6 лет. Дыхание ртом ночью, гнусавость. Частые отиты.", + "full": "Со слов родителя, у ребенка 6 лет диагностированы аденоиды 2 степени. Отмечает дыхание ртом ночью, гнусавость голоса и частые эпизоды отитов." + }, + { + "short": "Постназальный затек, кашель по утрам. Ощущение стекания слизи по задней стенке глотки.", + "full": "Со слов пациента, беспокоит кашель по утрам, связанный с постназальным затеком. Отмечает ощущение стекания слизи по задней стенке глотки." + }, + { + "short": "Полипозный риносинусит в анамнезе. Операция 5 лет назад. Сейчас рецидив - заложенность, потеря обоняния.", + "full": "Со слов пациента, страдает полипозным риносинуситом в анамнезе. Перенес операцию 5 лет назад. В настоящее время отмечает рецидив заболевания: заложенность носа и потерю обоняния." + }, + { + "short": "Ларингоспазм при плаче у ребенка 2 лет. Эпизоды короткие, проходят самостоятельно.", + "full": "Со слов родителя, у ребенка 2 лет возникают эпизоды ларингоспазма при плаче. Эпизоды короткие, проходят самостоятельно." + }, + { + "short": "Проф. ларингит. Преподаватель. Осиплость, утомляемость голоса к 3-4 паре.", + "full": "Со слов пациента, работает преподавателем. Беспокоит осиплость и утомляемость голоса, которые нарастают к 3-4 паре занятий." + }, + { + "short": "Искривление перегородки носа после травмы в подростк. возрасте. Затруднение дыхания прав. полов. носа.", + "full": "Со слов пациента, после травмы в подростковом возрасте сформировалось искривление перегородки носа. Беспокоит затруднение дыхания правой половиной носа." + }, + { + "short": "Сенсоневральная тугоухость 2 ст. Слуховой аппарат не использует, хочет подобрать.", + "full": "Со слов пациента, имеет диагноз сенсоневральная тугоухость 2 степени. Слуховой аппарат не использует, обратился для подбора." + }, + { + "short": "Фурункул преддверия носа. Самостоятельно выдавливал. Ухудшение - отек, боль, гиперемия.", + "full": "Со слов пациента, в преддверии носа образовался фурункул, который он пытался самостоятельно выдавить. После этого отметил ухудшение: усиление отека, боли и гиперемии." + }, + { + "short": "Вазомоторный ринит. Заложенность попеременно то одной, то другой полов. носа. Зависит от температуры воздуха.", + "full": "Со слов пациента, страдает вазомоторным ринитом. Беспокоит заложенность носа, которая попеременно возникает то в одной, то в другой половине носа. Симптомы зависят от температуры окружающего воздуха." + }, + { + "short": "Острый средний отит на фоне ОРВИ. Боль, снижение слуха, чувство заложенности. Температура 37.8.", + "full": "Со слов пациента, на фоне ОРВИ развился острый средний отит. Беспокоит боль, снижение слуха и чувство заложенности в ухе. Температура тела повышена до 37.8°C." + }, + { + "short": "Инородное тело уха (насекомое). Шум, шевеление в наружном слуховом проходе. Пытался промыть шприцем.", + "full": "Со слов пациента, в наружный слуховой проход попало насекомое. Беспокоят шум и ощущение шевеления. Пытался промыть ухо с помощью шприца." + }, + { + "short": "Аллерг. ринит. Сезонный, на цветение березы. Чиханье, зуд в носу, водянистые выделения.", + "full": "Со слов пациента, страдает сезонным аллергическим ринитом на цветение березы. Беспокоят приступы чихания, зуд в носу и обильные водянистые выделения." + }, + { + "short": "Парез гортани после тиреоидэктомии 3 мес. назад. Осиплость, поперхивание жидкой пищей.", + "full": "Со слов пациента, три месяца назад перенес тиреоидэктомию, после чего развился парез гортани. Беспокоит стойкая осиплость и поперхивание при приеме жидкой пищи." + }, + { + "short": "Кандидоз полости рта и глотки после АБ терапии. Белый налет, жжение. Самостоятельно использовал соду.", + "full": "Со слов пациента, после курса антибактериальной терапии развился кандидоз полости рта и глотки. Беспокоит белый налет на слизистой и жжение. Пытался лечиться самостоятельно, использовал полоскания содой." + }, + { + "short": "Гайморит? Гнойные выделения из носа, боль в проекции пазух, температура 38.1. Болеет 10 дней.", + "full": "Со слов пациента, болеет в течение 10 дней. Беспокоят гнойные выделения из носа, боль в проекции верхнечелюстных пазух и повышение температуры тела до 38.1°C." + }, + { + "short": "Отосклероз? Прогресс. снижение слуха, шум в ушах. У матери аналогичная проблема.", + "full": "Со слов пациента, отмечает прогрессирующее снижение слуха и шум в ушах. У матери была аналогичная проблема." + }, + { + "short": "Перитонзиллярный абсцесс в анамнезе 2 года назад. Сейчас боль в горле с одной стороны, тризм.", + "full": "Со слов пациента, два года назад в анамнезе был перитонзиллярный абсцесс. В настоящее время вновь беспокоит боль в горле с одной стороны и затруднение открывания рта (тризм)." + }, + { + "short": "Носовое кровотечение у подростка. Возникает спонтанно, из зоны Киссельбаха. Останавливает прижатием.", + "full": "Со слов родителя, у подростка возникают спонтанные носовые кровотечения из зоны Киссельбаха. Кровотечение останавливается прижатием крыльев носа." + }, + { + "short": "Хр. катаральный отит. Чувство заложенности, аутофония. При рините симптомы усиливаются.", + "full": "Со слов пациента, страдает хроническим катаральным отитом. Беспокоит чувство заложенности в ушах и аутофония. Симптомы усиливаются при насморке." + }, + { + "short": "Гипертрофия н. раковин. Стойкое затруднение нос. дыхания. Сосудосужив. капли использует ежедневно более года.", + "full": "Со слов пациента, беспокоит стойкое затруднение носового дыхания, обусловленное гипертрофией носовых раковин. Сосудосуживающие капли использует ежедневно на протяжении более года." + }, + { + "short": "Острый ларингит. Потеря голоса, сухой кашель. Накануне много говорил на холоде.", + "full": "Со слов пациента, накануне много говорил на холодном воздухе. Сегодня отмечает потерю голоса и сухой кашель." + }, + { + "short": "Состояние после радиойодтерапии. Сухость во рту, нарушение вкуса. Жалоб со стороны ЛОР-органов нет.", + "full": "Со слов пациента, перенес радиойодтерапию. Беспокоит сухость во рту и нарушение вкуса. Специфических жалоб со стороны ЛОР-органов не предъявляет." + }, + { + "short": "Киста небной миндалины. Обнаружена случайно. Ощущение инородного тела в горле.", + "full": "Со слов пациента, киста небной миндалины была обнаружена случайно. Беспокоит ощущение инородного тела в горле." + }, + { + "short": "Отомикоз. Зуд в ухе, шелушение. Часто плавает в бассейне, чистит уши ватными палочками.", + "full": "Со слов пациента, беспокоят зуд в ухе и шелушение. Пациент часто плавает в бассейне и регулярно чистит уши ватными палочками." + }, + { + "short": "Искривление перегородки носа. Затруднение дыхания с двух сторон. Храп. Консервативное лечение неэффективно.", + "full": "Со слов пациента, беспокоит затруднение носового дыхания с двух сторон и храп. Консервативное лечение эффекта не приносит." + }, + { + "short": "Папиллома голосовой складки. Охриплость прогрессирует. Курит 20 лет.", + "full": "Со слов пациента, отмечает прогрессирующую охриплость. Курит в течение 20 лет." + }, + { + "short": "Риноликворея после ЧМТ 1 мес. назад. Прозрачные выделения из носа при наклоне головы.", + "full": "Со слов пациента, месяц назад перенес черепно-мозговую травму. В настоящее время отмечает прозрачные выделения из носа, усиливающиеся при наклоне головы." + }, + { + "short": "Хр. субатрофический фарингит. Сухость, першение, ощущение кома. Пьет мало воды.", + "full": "Со слов пациента, страдает хроническим субатрофическим фарингитом. Беспокоят сухость, першение и ощущение кома в горле. Отмечает, что пьет недостаточное количество воды." + }, + { + "short": "Баротравма уха при авиаперелете. Резкая боль, затем шум и снижение слуха. Зевание, глотание не помогли.", + "full": "Со слов пациента, во время авиаперелета получил баротравму уха. Возникла резкая боль, а затем шум и снижение слуха. Попытки зевать и глотать не принесли облегчения." + }, + { + "short": "Гипосмия после перенесенного ковида 2 мес. назад. Обоняние восстанавливается частично.", + "full": "Со слов пациента, два месяца назад перенес COVID-19, после чего развилась гипосмия. В настоящее время обоняние восстанавливается, но частично." + }, + { + "short": "Лимфаденит подчелюстной обл. Увел. болезн. узлы справа. Боль в горле была 2 нед. назад.", + "full": "Со слов пациента, отмечает увеличение и болезненность подчелюстных лимфоузлов справа. Около двух недель назад перенес боль в горле." + }, + { + "short": "Неврит слухового нерва? Снижение слуха, шум в ушах, головокружение. Работа в шумном цеху.", + "full": "Со слов пациента, работает в шумном цеху. Беспокоит снижение слуха, шум в ушах и головокружение." + }, + { + "short": "Инородное тело глотки (рыбья кость). Боль при глотании. Пытался протолкнуть хлебной коркой.", + "full": "Со слов пациента, проглотил рыбью кость. Беспокоит боль при глотании. Пытался протолкнуть кость, проглотив хлебную корку." + }, + { + "short": "Острый евстахиит. Заложенность ушей, ощущение жидкости в ухе. Возник на фоне ринита.", + "full": "Со слов пациента, на фоне ринита развился острый евстахиит. Беспокоит заложенность ушей и ощущение переливания жидкости в ухе." + }, + { + "short": "Хр. гиперпластический ларингит. Стойкая осиплость. Курит. От операции отказывается.", + "full": "Со слов пациента, страдает хроническим гиперпластическим ларингитом. Беспокоит стойкая осиплость. Пациент курит. От предлагаемого оперативного лечения отказывается." + }, + { + "short": "Сиалолитиаз (камень протока подъязычной слюнной железы). Боль, увеличение железы при приеме пищи.", + "full": "Со слов пациента, беспокоит боль и увеличение подъязычной слюнной железы во время приема пищи." + }, + { + "short": "Поствоспалительная дисфония. Голос не восстановился после ларингита 3 нед. назад.", + "full": "Со слов пациента, три недели назад перенес ларингит. Голос до настоящего времени не восстановился." + }, + { + "short": "Хр. синусит (лобн., верхнечел.). Головная боль, тяжесть в лице. Температуры нет.", + "full": "Со слов пациента, страдает хроническим синуситом (лобным, верхнечелюстным). Беспокоит головная боль и чувство тяжести в области лица. Температура тела не повышена." + }, + { + "short": "Отек Квинке на укус пчелы в губу в анамнезе. Сейчас отек губ, языка после фруктов. Антигистаминные помогли.", + "full": "Со слов пациента, в анамнезе был отек Квинке на укус пчелы в губу. В настоящее время после употребления фруктов в пищу развился отек губ и языка. Прием антигистаминных препаратов помог." + }, + { + "short": "Парестезия глотки. Ощущение жжения, ползания мурашек. Меняется в течение дня.", + "full": "Со слов пациента, беспокоит парестезия глотки в виде ощущения жжения и ползания мурашек. Симптомы меняются в течение дня." + }, + { + "short": "Состояние после септопластики 1 мес. назад. Дыхание улучшилось, но есть сухие корки.", + "full": "Со слов пациента, месяц назад перенес септопластику. Носовое дыхание улучшилось, но беспокоят сухие корки в носу." + }, + { + "short": "Острый тонзиллит (лакунарный). Налеты на миндалинах, боль, лихорадка. АБ не принимал.", + "full": "Со слов пациента, предъявляет жалобы на налеты на миндалинах, боль в горле и лихорадку. Антибиотики не принимал." + }, + { + "short": "Доброкач. пароксизм. позиционное головокружение. Эпизоды при повороте в постели. Симптома Ромберга нет.", + "full": "Со слов пациента, беспокоят эпизоды головокружения, возникающие при повороте в постели. Симптом Ромберга отрицательный." + }, + { + "short": "Фарингомикоз. Творожистые налеты в глотке, жжение. Болеет сахарным диабетом.", + "full": "Со слов пациента, страдает сахарным диабетом. Беспокоят творожистые налеты в глотке и чувство жжения." + }, + { + "short": "Гематома носовой перегородки после травмы. Затруднение дыхания, распирание.", + "full": "Со слов пациента, после травмы носа образовалась гематома носовой перегородки. Беспокоит затруднение носового дыхания и чувство распирания." + }, + { + "short": "Острый наружный диффузный отит. Боль в ухе, отечность, выделения. Плавал в открытом водоеме.", + "full": "Со слов пациента, плавал в открытом водоеме. После этого развился острый наружный диффузный отит: беспокоит боль в ухе, отечность и выделения." + }, + { + "short": "Ощущение серной пробки. Снижение слуха, аутофония. Пытался промыть ухо самостоятельно.", + "full": "Со слов пациента, беспокоит снижение слуха и аутофония. Пытался промыть ухо самостоятельно для удаления предполагаемой серной пробки." + }, + { + "short": "Подголосовой ларингит у ребенка 3 лет. Лающий кашель, инспираторная одышка. Симптомы усиливаются ночью.", + "full": "Со слов родителя, у ребенка 3 лет отмечается лающий кашель и инспираторная одышка. Симптомы усиливаются в ночное время." + }, + { + "short": "Ожог слизистой носа парами кислоты на производстве. Боль, отек, затруднение дыхания.", + "full": "Со слов пациента, на производстве получил ожог слизистой носа парами кислоты. Беспокоит сильная боль, отек и затруднение носового дыхания." + }, + { + "short": "Отоантрит у грудничка. Выпячивание заушной области, беспокойство, отказ от еды. Температура 38.5.", + "full": "Со слов родителя, у грудного ребенка отмечается выпячивание в заушной области, беспокойство, отказ от еды. Температура тела повышена до 38.5°C." + }, + { + "short": "Парез мягкого неба после удаления аденоидов. Открытая гнусавость, поперхивание.", + "full": "Со слов пациента, после удаления аденоидов развился парез мягкого неба. Беспокоит открытая гнусавость и поперхивание при приеме пищи." + }, + { + "short": "Инородное тело бронха (семечка) у ребенка 5 лет. Кашель, свистящее дыхание. Аспирация 2 дня назад.", + "full": "Со слов родителя, у ребенка 5 лет два дня назад была аспирация семечки. С тех пор беспокоят кашель и свистящее дыхание." + }, + { + "short": "Озена. Зловонные корки в носу, аносмия. Болеет с юности.", + "full": "Со слов пациента, с юности страдает озеной. Беспокоят зловонные корки в носу и полное отсутствие обоняния (аносмия)." + }, + { + "short": "Невралгия тройничного нерва. Приступы стреляющей боли в области крыла носа. Провоцируется прикосновением.", + "full": "Со слов пациента, беспокоят приступы стреляющей боли в области крыла носа, провоцирующиеся прикосновением." + }, + { + "short": "Хр. декомпенсир. тонзиллит. Субфебрилитет, слабость, боли в суставах. Посев - бета-гемол. стрептококк.", + "full": "Со слов пациента, страдает хроническим декомпенсированным тонзиллитом. Беспокоит субфебрильная температура, слабость, боли в суставах." + }, + { + "short": "Пирсинг языка. Отек, боль, покраснение через 2 дня после прокола. Обработку проводил нерегулярно.", + "full": "Со слов пациента, два дня назад сделал пирсинг языка. Сейчас беспокоят отек, боль и покраснение в области прокола. Обработку проводил нерегулярно." + }, + { + "short": "Синусовая киста. Бессимптомно, обнаружена на КТ при обследовании по поводу головной боли.", + "full": "Со слов пациента, киста околоносовой пазухи была обнаружена случайно при проведении КТ по поводу головной боли. Специфических жалоб нет." + }, + { + "short": "Проф. осмотр. Жалоб нет. Работает на хлебозаводе (мучная пыль).", + "full": "Со слов пациента, жалоб не предъявляет. Обратился для профессионального осмотра. Работает на хлебозаводе в условиях контакта с мучной пылью." + }, + { + "short": "Острый катаральный ринофарингит. Чиханье, насморк, першение в горле. Контакт с больным ОРВИ.", + "full": "Со слов пациента, был в контакте с больным ОРВИ. Беспокоят чихание, насморк и першение в горле." + }, + { + "short": "Геморрагический васкулит. Петехии на слизистой мягкого неба. Из ЛОР-жалоб - сухость.", + "full": "Со слов пациента, страдает геморрагическим васкулитом. На слизистой мягкого неба отмечаются петехии. Из специфических жалоб - сухость во рту." + }, + { + "short": "Оторея после ЧМТ. Прозрачные выделения из уха. Головной боли, тошноты нет.", + "full": "Со слов пациента, после перенесенной черепно-мозговой травмы отмечает прозрачные выделения из уха. Головной боли и тошноты нет." + }, + { + "short": "Абсцесс надгортанника. Боль при глотании, ощущение инородного тела, слюнотечение. Дыхание не затруднено.", + "full": "Со слов пациента, беспокоит боль при глотании, ощущение инородного тела в горле и слюнотечение. Дыхание не затруднено." + }, + { + "short": "Хр. медикаментозный ринит. Постоянная заложенность. Капли использует 5-6 раз в день много лет.", + "full": "Со слов пациента, много лет страдает от постоянной заложенности носа. Сосудосуживающие капли использует 5-6 раз в день." + }, + { + "short": "Попадание щелочи в гортань. Осиплость, боль. Промыл водой сразу после инцидента.", + "full": "Со слов пациента, произошло попадание щелочи в гортань. Беспокоит осиплость и боль. Сразу после инцидента промывал горло водой." + }, + { + "short": "Ювенильная ангиофиброма носоглотки у подростка. Носовые кровотечения, затруднение носового дыхания.", + "full": "Со слов родителя, у подростка отмечаются носовые кровотечения и прогрессирующее затруднение носового дыхания." + }, + { + "short": "Острый стоматит. Язвы на слизистой щек, боль. Прием пищи затруднен.", + "full": "Со слов пациента, на слизистой щек образовались болезненные язвы. Прием пищи затруднен из-за боли." + }, + { + "short": "Невринома слухового нерва? Односторонний тиннитус, прогресс. тугоухость, нарушение равновесия.", + "full": "Со слов пациента, отмечает односторонний шум в ухе, прогрессирующее снижение слуха и нарушение равновесия." + }, + { + "short": "Инородное тело трахеи (металл. деталь) у взрослого. Приступ кашля, стридор. Аспирация час назад.", + "full": "Со слов пациента, час назад произошла аспирация металлической детали. С тех пор беспокоит приступ кашля и стридорозное дыхание." + }, + { + "short": "Хр. гранулезный фарингит. Гипертрофия лимфоидных гранул, слизь на задней стенке глотки.", + "full": "Со слов пациента, беспокоит скопление слизи на задней стенке глотки." + }, + { + "short": "Острый мастоидит. Боль за ухом, оттопыренность ушной раковины, гноетечение. В анамнезе отит.", + "full": "Со слов пациента, в анамнезе был отит. В настоящее время беспокоит боль за ухом, оттопыренность ушной раковины и гноетечение из уха." + }, + { + "short": "Гипертрофия небных миндалин 3 ст. Ночной храп, апноэ, затруднение глотания твердой пищи.", + "full": "Со слов пациента, беспокоит ночной храп, остановки дыхания во сне и затруднение при глотании твердой пищи." + }, + { + "short": "Посттравматическая аносмия. Потеря обоняния после падения на затылок. Обоняние не восстанавливается 2 мес.", + "full": "Со слов пациента, два месяца назад после падения на затылок произошла полная потеря обоняния. Обоняние не восстанавливается." + }, + { + "short": "Острый эпиглоттит. Резкая боль в горле, слюнотечение, инспираторная одышка. Температура 39.0.", + "full": "Со слов пациента, беспокоит резкая боль в горле, слюнотечение и инспираторная одышка. Температура тела повышена до 39.0°C." + }, + { + "short": "Хр. атрофический ринит. Сухость, корки, носовые кровотечения. Ощущение широкого носа.", + "full": "Со слов пациента, страдает хроническим атрофическим ринитом. Беспокоят сухость в носу, корки и носовые кровотечения. Отмечает ощущение широкого носа." + }, + { + "short": "Паратонзиллит. Асимметрия мягкого неба, боль с одной стороны, тризм. Температура 38.0.", + "full": "Со слов пациента, беспокоит боль в горле с одной стороны, затруднение открывания рта и асимметрия мягкого неба. Температура тела 38.0°C." + }, + { + "short": "Дисфагия неясного генеза. Поперхивание, ощущение застревания пищи. ЭГДС - без особенностей.", + "full": "Со слов пациента, беспокоит поперхивание и ощущение застревания пищи при глотании. ЭГДС патологии не выявила." + }, + { + "short": "Острый сиалоаденит околоушной слюнной железы. Болезненный отек, гнойное отделяемое из протока.", + "full": "Со слов пациента, отмечает болезненный отек в области околоушной слюнной железы и гнойное отделяемое из ее протока." + }, + { + "short": "Холестеатома? Гноетечение из уха с запахом, тугоухость. Болеет отитами с детства.", + "full": "Со слов пациента, с детства страдает рецидивирующими отитами. В настоящее время беспокоит гноетечение из уха с неприятным запахом и снижение слуха." + }, + { + "short": "Ларинготрахеит. Осиплость, грубый кашель, затруднение вдоха. Ребенок 4 лет.", + "full": "Со слов родителя, у ребенка 4 лет отмечается осиплость голоса, грубый кашель и затруднение вдоха." + }, + { + "short": "Искривление перегородки носа. Затруднение дыхания слева. Риноскопия - гребень перегородки слева.", + "full": "Со слов пациента, беспокоит затруднение носового дыхания слева." + }, + { + "short": "Глоссалгия. Жжение, покалывание в языке. Усиливается к вечеру. Слизистая без видимых изменений.", + "full": "Со слов пациента, беспокоит жжение и покалывание в языке, усиливающиеся к вечеру. Видимых изменений слизистой оболочки нет." + }, + { + "short": "Острый ринит у новорожденного. Заложенность носа, нарушение сосания. Сопелеотсосом пользуются.", + "full": "Со слов родителя, у новорожденного ребенка отмечается заложенность носа, приводящая к нарушению сосания. Для облегчения дыхания пользуются сопелеотсосом." + }, + { + "short": "Папилломатоз гортани. Охриплость, затруднение дыхания. В анамнезе множественные операции.", + "full": "Со слов пациента, страдает папилломатозом гортани. Беспокоит охриплость и затруднение дыхания. В анамнезе - множественные операции по поводу данного заболевания." + }, + { + "short": "Аллерг. ринит + бронхиальная астма. Чиханье, зуд в носу, кашель с одышкой. Сезонное обострение.", + "full": "Со слов пациента, страдает аллергическим ринитом и бронхиальной астмой. В период сезонного обострения беспокоят приступы чихания, зуд в носу, кашель с одышкой." + }, + { + "short": "Инородное тело пищевода (монета) у ребенка 3 лет. Слюнотечение, невозможность глотать.", + "full": "Со слов родителя, у ребенка 3 лет отмечается слюнотечение и невозможность глотать." + }, + { + "short": "Острый средний отит при скарлатине. Боль в ухе, гноетечение. Сыпь на коже, температура.", + "full": "Со слов пациента, на фоне скарлатины (сыпь на коже, лихорадка) развился острый средний отит. Беспокоит боль в ухе и гноетечение." + }, + { + "short": "Хр. гипертрофический ларингит у курильщика. Стойкая осиплость. Курит 1.5 пачки/день 30 лет.", + "full": "Со слов пациента, курит 1.5 пачки сигарет в день на протяжении 30 лет. Беспокоит стойкая осиплость голоса." + }, + { + "short": "Неврит лицевого нерва. Асимметрия лица, сглаженность носогубной складки, лагофтальм. Началось с боли в ухе.", + "full": "Со слов пациента, заболевание началось с боли в ухе. В настоящее время отмечает асимметрию лица, сглаженность носогубной складки и невозможность полностью закрыть глаз (лагофтальм)." + }, + { + "short": "Попадание инородного тела (стекло) в слизистую глотки. Боль при глотании. Ощущение царапания.", + "full": "Со слов пациента, в слизистую глотки попало инородное тело (осколок стекла). Беспокоит боль при глотании и ощущение царапания." + }, + { + "short": "Острый субатрофический ринит. Сухость, жжение в носу, корки. Работает в запыленном помещении.", + "full": "Со слов пациента, работает в запыленном помещении. Беспокоит сухость, жжение в носу и образование корок." + }, + { + "short": "Гипервентиляционный синдром. Ощущение нехватки воздуха, ком в горле, головокружение. Приступ при стрессе.", + "full": "Со слов пациента, во время стресса возникают приступы, сопровождающиеся ощущением нехватки воздуха, кома в горле и головокружением." + }, + { + "short": "Состояние после ларингэктомии. Дышит через трахеостому. Жалоб нет, плановый осмотр.", + "full": "Со слов пациента, перенес ларингэктомию, дышит через трахеостому. Специфических жалоб не предъявляет, обратился для планового осмотра." + }, + { + "short": "Острый тонзиллит Симановского-Плаута-Венсана. Язвенно-пленчатые налеты на одной миндалине. Боль умеренная.", + "full": "Со слов пациента, на одной миндалине образовались язвенно-пленчатые налеты. Боль в горле умеренная." + }, + { + "short": "Синдром Eagle. Боль в горле, ощущение инородного тела. Длинные шиловидные отростки на КТ.", + "full": "Со слов пациента, беспокоит боль в горле и ощущение инородного тела." + }, + { + "short": "Острый назофарингит у ВИЧ-инфицированного. Выраженная боль в горле, налеты, лихорадка.", + "full": "Со слов пациента, страдает ВИЧ-инфекцией. Беспокоит выраженная боль в горле, налеты на слизистой и лихорадка." + }, + { + "short": "Пластика н/раковин радиохирургическим методом. Послеоперационный период. Жалоб нет, дышит носом.", + "full": "Со слов пациента, перенес радиохирургическую пластику носовых раковин. В послеоперационном периоде жалоб не предъявляет, носовое дыхание свободное." + }, + { + "short": "Звон в ушах, особенно в тишине", + "full": "Пациент ощущает звон в ушах, который усиливается в тишине." + }, + { + "short": "Боль в правом ухе, стреляющая, 2 дня", + "full": "Пациент отмечает стреляющую боль в правом ухе, длящуюся два дня." + }, + { + "short": "Заложенность носа, слизистые выделения, чихание", + "full": "Пациент жалуется на заложенность носа, слизистые выделения и чихание." + }, + { + "short": "Снижение слуха на левое ухо после купания", + "full": "После купания пациент отметил снижение слуха на левое ухо." + }, + { + "short": "Гнойные выделения из правой половины носа, боль в щеке", + "full": "Пациент отмечает гнойные выделения из правой половины носа и боль в щеке." + }, + { + "short": "Першение в горле, сухой кашель, осиплость голоса", + "full": "Пациент предъявляет жалобы на першение в горле, сухой кашель и осиплость голоса." + }, + { + "short": "Зуд в ушах, шелушение кожи за ушами", + "full": "Пациент отмечает зуд в ушах и шелушение кожи за ушами." + }, + { + "short": "Храп, остановки дыхания во сне по словам жены", + "full": "По словам жены, пациент храпит и у него бывают остановки дыхания во сне." + }, + { + "short": "Носовые кровотечения по утрам из правой половины носа", + "full": "Пациент отмечает носовые кровотечения по утрам из правой половины носа." + }, + { + "short": "Боль в горле при глотании, повышение температуры до 38°C", + "full": "Пациент жалуется на боль в горле при глотании и повышение температуры до 38°C." + }, + { + "short": "Заложенность уха после авиаперелёта", + "full": "После авиаперелёта у пациента появилась заложенность уха." + }, + { + "short": "Гной на миндалинах, неприятный запах изо рта", + "full": "Пациент отмечает гной на миндалинах и неприятный запах изо рта." + }, + { + "short": "Снижение обоняния после ОРВИ", + "full": "После ОРВИ у пациента снизилось обоняние." + }, + { + "short": "Боли в горле, увеличение шейных лимфоузлов", + "full": "Пациент жалуется на боли в горле и увеличение шейных лимфоузлов." + }, + { + "short": "Затруднённое носовое дыхание, храп", + "full": "Пациент отмечает затруднённое носовое дыхание и храп." + }, + { + "short": "Боль в ухе при надавливании на козелок", + "full": "Пациент испытывает боль в ухе при надавливании на козелок." + }, + { + "short": "Насморк с примесью крови", + "full": "Пациент отмечает насморк с примесью крови." + }, + { + "short": "Охриплость голоса более 2 недель", + "full": "Голос пациента охрип более двух недель назад и остаётся таким до сих пор." + }, + { + "short": "Чувство инородного тела в горле", + "full": "Пациент ощущает чувство инородного тела в горле." + }, + { + "short": "Головная боль, боль в верхней челюсти, заложенность носа", + "full": "Пациент жалуется на головную боль, боль в верхней челюсти и заложенность носа." + }, + { + "short": "Снижение слуха, шум в ухе после купания", + "full": "После купания у пациента появились снижение слуха и шум в ухе." + }, + { + "short": "Сухость в носу, корки, носовые кровотечения", + "full": "Пациент отмечает сухость в носу, образование корок и носовые кровотечения." + }, + { + "short": "Боль в горле, белый налёт на языке", + "full": "Пациент жалуется на боль в горле и белый налёт на языке." + }, + { + "short": "Заложенность носа поочерёдно то справа, то слева", + "full": "Пациент отмечает, что нос закладывает поочерёдно то справа, то слева." + }, + { + "short": "Ухудшение слуха на фоне шума на производстве", + "full": "На фоне работы в условиях шума на производстве у пациента ухудшился слух." + }, + { + "short": "Боль в ухе, выделения гнойные с неприятным запахом", + "full": "Пациент отмечает боль в ухе и гнойные выделения с неприятным запахом." + }, + { + "short": "Затруднённое дыхание через нос, искривление перегородки", + "full": "Пациент жалуется на затруднённое дыхание через нос и имеет искривление перегородки." + }, + { + "short": "Кашель с мокротой, першение, осиплость", + "full": "Пациент предъявляет жалобы на кашель с мокротой, першение и осиплость." + }, + { + "short": "Боль в горле, затруднённое открывание рта", + "full": "Пациент отмечает боль в горле и затруднённое открывание рта." + }, + { + "short": "Зуд в носу, чихание, слезотечение весной", + "full": "Весной у пациента возникает зуд в носу, чихание и слезотечение." + }, + { + "short": "Снижение слуха после удара по уху", + "full": "После удара по уху у пациента снизился слух." + }, + { + "short": "Гнусавость голоса, заложенность носа", + "full": "Пациент говорит с гнусавостью и отмечает заложенность носа." + }, + { + "short": "Боль в ухе, лихорадка, ребёнок 3 лет", + "full": "Ребёнок 3 лет жалуется на боль в ухе и лихорадку." + }, + { + "short": "Хронический насморк, не поддаётся лечению", + "full": "Пациент страдает хроническим насморком, который не поддаётся лечению." + }, + { + "short": "Боль в горле, белые пробки в миндалинах", + "full": "Пациент отмечает боль в горле и белые пробки в миндалинах." + }, + { + "short": "Головокружение, шум в ухе, тошнота", + "full": "Пациент перенёс головокружение, сопровождавшееся шумом в ухе и тошнотой." + }, + { + "short": "Сухость в горле, першение, курит 15 лет", + "full": "Пациент, курящий 15 лет, отмечает сухость в горле и першение." + }, + { + "short": "Заложенность носа, снижение обоняния, полипы", + "full": "Пациент жалуется на заложенность носа, снижение обоняния и имеет полипы." + }, + { + "short": "Боль в ухе при жевании, припухлость за ухом", + "full": "Пациент отмечает боль в ухе при жевании и припухлость за ухом." + }, + { + "short": "Носовое кровотечение после ковыряния в носу", + "full": "После ковыряния в носу у пациента возникло носовое кровотечение." + }, + { + "short": "Охриплость после перенапряжения голоса", + "full": "После перенапряжения голоса у пациента появилась охриплость." + }, + { + "short": "Заложенность уха, шум, после подъёма в горы", + "full": "После подъёма в горы у пациента появились заложенность уха и шум." + }, + { + "short": "Гной из носа, боль в щеке, зубная боль", + "full": "Пациент отмечает гной из носа, боль в щеке и зубную боль." + }, + { + "short": "Снижение слуха, шум, после приёма антибиотика", + "full": "После приёма антибиотика у пациента снизился слух и появился шум в ушах." + }, + { + "short": "Зуд в горле, кашель при вдыхании холодного воздуха", + "full": "При вдыхании холодного воздуха у пациента возникают зуд в горле и кашель." + }, + { + "short": "Боль в горле, сыпь на теле, миндалины покрыты налётом", + "full": "Пациент жалуется на боль в горле, сыпь на теле и налёт на миндалинах." + }, + { + "short": "Хронический кашель, постназальный синдром", + "full": "Пациент страдает хроническим кашлем и отмечает постназальный синдром." + }, + { + "short": "Боль в ухе, зуд, после плавания в бассейне", + "full": "После плавания в бассейне у пациента появились боль в ухе и зуд." + }, + { + "short": "Затруднённое дыхание, свистящее дыхание, ребёнок", + "full": "У ребёнка возникло затруднённое и свистящее дыхание." + }, + { + "short": "Снижение слуха, ощущение воды в ухе", + "full": "Пациент отмечает снижение слуха и ощущение воды в ухе." + }, + { + "short": "Боль в горле, увеличение язычной миндалины", + "full": "Пациент жалуется на боль в горле и увеличение язычной миндалины." + }, + { + "short": "Насморк, слезотечение, чихание при контакте с кошкой", + "full": "При контакте с кошкой у пациента возникают насморк, слезотечение и чихание." + }, + { + "short": "Головная боль, боль в переносице, гной из носа", + "full": "Пациент отмечает головную боль, боль в переносице и гной из носа." + }, + { + "short": "Шум в ушах, бессонница, стресс", + "full": "На фоне стресса у пациента появился шум в ушах и бессонница." + }, + { + "short": "Боль в горле, затруднённое глотание, ребёнок 5 лет", + "full": "Ребёнок 5 лет жалуется на боль в горле и затруднённое глотание." + }, + { + "short": "Сухость в носу, корки с кровью, атрофический ринит", + "full": "Пациент отмечает сухость в носу, корки с кровью и имеет атрофический ринит." + }, + { + "short": "Боль в ухе, лихорадка, гнойные выделения", + "full": "Пациент отмечает боль в ухе, лихорадку и гнойные выделения." + }, + { + "short": "Заложенность носа, храп, увеличение аденоидов у ребёнка", + "full": "У ребёнка заложенность носа, храп и увеличение аденоидов." + }, + { + "short": "Периодическая боль в горле, пробки в миндалинах", + "full": "Пациент отмечает периодическую боль в горле и пробки в миндалинах." + }, + { + "short": "Снижение слуха, шум, после баротравмы", + "full": "После баротравмы у пациента снизился слух и появился шум в ухе." + }, + { + "short": "Гнусавость, назальный оттенок голоса", + "full": "Пациент говорит с гнусавостью и назальным оттенком голоса." + }, + { + "short": "Боль в горле, лихорадка, увеличение селезёнки", + "full": "Пациент жалуется на боль в горле, лихорадку и увеличение селезёнки." + }, + { + "short": "Зуд в носу, чихание по утрам", + "full": "По утрам у пациента возникают зуд в носу и чихание." + }, + { + "short": "Боль в ухе, звон, после громкого звука", + "full": "После громкого звука у пациента появились боль в ухе и звон." + }, + { + "short": "Заложенность носа, головная боль, после травмы", + "full": "После травмы у пациента возникли заложенность носа и головная боль." + }, + { + "short": "Хрипота, кашель, ощущение комка в горле", + "full": "Пациент отмечает хрипоту, кашель и ощущение комка в горле." + }, + { + "short": "Гной из уха, боль, после промывания носа", + "full": "После промывания носа у пациента появились гной из уха и боль." + }, + { + "short": "Снижение слуха, шум, у пожилого пациента", + "full": "У пожилого пациента отмечается снижение слуха и шум в ушах." + }, + { + "short": "Боль в горле, лихорадка, сыпь на ладонях", + "full": "Пациент жалуется на боль в горле, лихорадку и сыпь на ладонях." + }, + { + "short": "Носовое дыхание нарушено, искривление перегородки", + "full": "У пациента нарушено носовое дыхание и имеется искривление перегородки." + }, + { + "short": "Зуд в ушах, выделения, диабет", + "full": "Пациент с диабетом отмечает зуд в ушах и выделения." + }, + { + "short": "Боль в горле, затруднённое дыхание, ребёнок", + "full": "У ребёнка боль в горле и затруднённое дыхание." + }, + { + "short": "Снижение обоняния, головная боль, полипы", + "full": "Пациент отмечает снижение обоняния, головную боль и имеет полипы." + }, + { + "short": "Боль в ухе, лихорадка, после ОРВИ", + "full": "После ОРВИ у пациента появились боль в ухе и лихорадка." + }, + { + "short": "Храп, дневная сонливость, ожирение", + "full": "Пациент с ожирением отмечает храп и дневную сонливость." + }, + { + "short": "Гнойные выделения из носа, боль в зубах", + "full": "Пациент отмечает гнойные выделения из носа и боль в зубах." + }, + { + "short": "Сухость в горле, першение, работа в пыльном помещении", + "full": "Пациент, работающий в пыльном помещении, отмечает сухость в горле и першение." + }, + { + "short": "Боль в горле, увеличение подчелюстных лимфоузлов", + "full": "Пациент жалуется на боль в горле и увеличение подчелюстных лимфоузлов." + }, + { + "short": "Заложенность уха, шум, после насморка", + "full": "После насморка у пациента остались заложенность уха и шум." + }, + { + "short": "Носовое кровотечение, гипертония", + "full": "Пациент с гипертонией отмечает носовые кровотечения." + }, + { + "short": "Охриплость, кашель, рефлюкс", + "full": "Пациент с рефлюксом отмечает охриплость и кашель." + }, + { + "short": "Боль в ухе, зуд, после использования наушников", + "full": "После использования наушников у пациента появились боль в ухе и зуд." + }, + { + "short": "Заложенность носа, снижение слуха, ребёнок", + "full": "У ребёнка заложенность носа и снижение слуха." + }, + { + "short": "Головная боль, боль в глазнице, гной из носа", + "full": "Пациент отмечает головную боль, боль в глазнице и гной из носа." + }, + { + "short": "Шум в ушах, головокружение, тошнота", + "full": "Пациент перенёс шум в ушах, головокружение и тошноту." + }, + { + "short": "Боль в горле, лихорадка, белый налёт на миндалинах", + "full": "Пациент жалуется на боль в горле, лихорадку и белый налёт на миндалинах." + }, + { + "short": "Снижение слуха, аутофония, после насморка", + "full": "После насморка у пациента снизился слух и появилась аутофония." + }, + { + "short": "Зуд в носу, чихание, водянистые выделения", + "full": "Пациент отмечает зуд в носу, чихание и водянистые выделения." + }, + { + "short": "Боль в ухе, выделения, после купания в море", + "full": "После купания в море у пациента появились боль в ухе и выделения." + }, + { + "short": "Хронический насморк, полипы, бронхиальная астма", + "full": "Пациент с бронхиальной астмой страдает хроническим насморком и имеет полипы." + }, + { + "short": "Гнусавость, нарушение речи, после операции на нёбе", + "full": "После операции на нёбе у пациента появилась гнусавость и нарушение речи." + }, + { + "short": "Боль в горле, затруднённое дыхание, инородное тело", + "full": "После попадания инородного тела у пациента возникли боль в горле и затруднённое дыхание." + }, + { + "short": "Снижение слуха, шум, профессиональный фактор", + "full": "На фоне профессионального воздействия шума у пациента снизился слух и появился шум в ушах." + }, + { + "short": "Заложенность носа, головная боль, гной из носа", + "full": "Пациент отмечает заложенность носа, головную боль и гной из носа." + }, + { + "short": "Боль в ухе, лихорадка, ребёнок, отказ от еды", + "full": "Ребёнок с болью в ухе, лихорадкой и отказом от еды." + }, + { + "short": "Першение в горле, сухой кашель, охриплость", + "full": "Пациент отмечает першение в горле, сухой кашель и охриплость." + }, + { + "short": "Носовое кровотечение, сухость слизистой, зимой", + "full": "Зимой у пациента возникают носовые кровотечения и сухость слизистой." + }, + { + "short": "Жалобы на заложенность носа, гнойные выделения, головную боль в области лба. Симптомы более 2 нед. Капли использовал, временный эффект.", + "full": "На момент обращения пациент предъявляет жалобы на заложенность носа, гнойные выделения из носовых ходов и головную боль в области лба. Симптомы сохраняются более двух недель. Пробовал использовать сосудосуживающие капли, отмечал временный эффект." + }, + { + "short": "Острый правосторонний отит в анамнезе. Перфорация барабанной перепонки не подтверждена. Лечился антибиотиками (название не помнит).", + "full": "На момент обращения пациент предъявляет жалобы на острую боль в правом ухе. Со слов пациента, в анамнезе был эпизод острого правостороннего отита. Перфорация барабанной перепонки не была подтверждена. Проходил курс лечения антибиотиками, название препарата не помнит." + }, + { + "short": "Попала вода в ухо при плавании. Через 2 дня появились зуд, боль, выделения. Самостоятельно чистил ухо.", + "full": "На момент обращения пациент предъявляет жалобы на зуд, боль и выделения из правого уха. Со слов пациента, два дня назад в ухо попала вода при плавании. После этого появились симптомы. Пациент пытался самостоятельно чистить ухо." + }, + { + "short": "Храп, апноэ во сне по словам родственников. Носовое дыхание затн. Днем сонливость.", + "full": "На момент обращения пациент предъявляет жалобы на затрудненное носовое дыхание и повышенную сонливость в дневное время. Со слов пациента, родственники отмечают наличие храпа и остановок дыхания (апноэ) во сне." + }, + { + "short": "Инородное тело носа (бусина) у ребенка 4 лет. Родители пытались извлечь пинцетом, безуспешно.", + "full": "На момент обращения родитель предъявляет жалобы на наличие инородного тела (бусины) в носу у ребенка 4 лет. Родители пытались извлечь инородное тело с помощью пинцета, но безуспешно." + }, + { + "short": "Внезапное снижение слуха на левое ухо, шум в ухе после простуды. Ототоксичные ЛС не принимал.", + "full": "На момент обращения пациент предъявляет жалобы на внезапное снижение слуха на левое ухо и появление шума в нем. Симптомы возникли после перенесенной простуды. Ототоксичные лекарственные средства не принимал." + }, + { + "short": "Боль в горле, налеты на миндалинах, лихорадка до 39°C. Антибиотики не принимал. Контактов с больными ангиной нет.", + "full": "На момент обращения пациент предъявляет жалобы на боль в горле, налеты на миндалинах и повышение температуры тела до 39°C. Антибиотики не принимал. Контактов с больными ангиной не было." + }, + { + "short": "Хр. тонзиллит, частые ангины (2-3 р/год). Пробки в миндалинах, неприятный запах изо рта.", + "full": "На момент обращения пациент предъявляет жалобы на пробки в миндалинах и неприятный запах изо рта. Со слов пациента, страдает хроническим тонзиллитом с частыми обострениями (2-3 раза в год)." + }, + { + "short": "Проф. вредности (пыль, хим. пары). Сухость, першение в горле, осиплость к концу рабочего дня.", + "full": "На момент обращения пациент предъявляет жалобы на сухость и першение в горле, осиплость голоса, которые усиливаются к концу рабочего дня. Со слов пациента, работает в условиях профессиональных вредностей (контакт с пылью и химическими парами)." + }, + { + "short": "Травма носа с хрустом. Деформация спинки носа, затруднение носового дыхания. Кровотечение было, остановилось само.", + "full": "На момент обращения пациент предъявляет жалобы на деформацию спинки носа и затруднение носового дыхания после травмы. Со слов пациента, травма носа сопровождалась хрустом. Кровотечение из носа было, остановилось самостоятельно." + }, + { + "short": "Ощущение кома в горле, усил. при глотании слюны. Связывает со стрессом. ЭГДС без патологии.", + "full": "На момент обращения пациент предъявляет жалобы на ощущение кома в горле, усиливающееся при глотании слюны. Связывает появление симптомов со стрессом. Ранее проходил ЭГДС, патологии выявлено не было." + }, + { + "short": "Головокружение системного хар-ра, провоцируется поворотами головы. Тошноты, рвоты нет.", + "full": "На момент обращения пациент предъявляет жалобы на головокружения системного характера, которые провоцируются поворотами головы. Тошноты и рвоты не отмечает." + }, + { + "short": "Рецидивир. герпес на кр. кайме губ и слизистой носа. Обострения 3-4 р/год.", + "full": "На момент обращения пациент предъявляет жалобы на высыпания на красной кайме губ и слизистой оболочке носа. Со слов пациента, страдает рецидивирующим герпесом с обострениями 3-4 раза в год." + }, + { + "short": "Ангины с детства. Ревм. атака в 15 лет. Сейчас жалоб нет, проф. осмотр.", + "full": "На момент обращения пациент жалоб не предъявляет. Обратился для профессионального осмотра. Со слов пациента, с детства страдал частыми ангинами. В возрасте 15 лет перенес ревматическую атаку." + }, + { + "short": "Ожог слизистой глотки горячей пищей. Боль, невозм. глотать твердую пищу. Пьет прохладную воду.", + "full": "На момент обращения пациент предъявляет жалобы на сильную боль в глотке и невозможность глотать твердую пищу после ожога горячей пищей. Для облегчения состояния пьет прохладную воду." + }, + { + "short": "Аденоиды 2 ст. у ребенка 6 лет. Дыхание ртом ночью, гнусавость. Частые отиты.", + "full": "На момент обращения родитель предъявляет жалобы на то, что ребенок 6 лет дышит ртом ночью, отмечается гнусавость голоса и частые эпизоды отитов. Ранее диагностированы аденоиды 2 степени." + }, + { + "short": "Постназальный затек, кашель по утрам. Ощущение стекания слизи по задней стенке глотки.", + "full": "На момент обращения пациент предъявляет жалобы на кашель по утрам и ощущение стекания слизи по задней стенке глотки." + }, + { + "short": "Полипозный риносинусит в анамнезе. Операция 5 лет назад. Сейчас рецидив - заложенность, потеря обоняния.", + "full": "На момент обращения пациент предъявляет жалобы на заложенность носа и потерю обоняния. Со слов пациента, страдает полипозным риносинуситом в анамнезе, перенес операцию 5 лет назад. В настоящее время отмечает рецидив заболевания." + }, + { + "short": "Ларингоспазм при плаче у ребенка 2 лет. Эпизоды короткие, проходят самостоятельно.", + "full": "На момент обращения родитель предъявляет жалобы на эпизоды ларингоспазма у ребенка 2 лет, возникающие при плаче. Эпизоды короткие, проходят самостоятельно." + }, + { + "short": "Проф. ларингит. Преподаватель. Осиплость, утомляемость голоса к 3-4 паре.", + "full": "На момент обращения пациент предъявляет жалобы на осиплость и утомляемость голоса, которые нарастают к 3-4 паре занятий. Со слов пациента, работает преподавателем." + }, + { + "short": "Искривление перегородки носа после травмы в подростк. возрасте. Затруднение дыхания прав. полов. носа.", + "full": "На момент обращения пациент предъявляет жалобы на затруднение дыхания правой половиной носа. Со слов пациента, после травмы в подростковом возрасте сформировалось искривление перегородки носа." + }, + { + "short": "Сенсоневральная тугоухость 2 ст. Слуховой аппарат не использует, хочет подобрать.", + "full": "На момент обращения пациент предъявляет жалобы на снижение слуха. Имеет диагноз сенсоневральная тугоухость 2 степени. Слуховой аппарат не использует, обратился для подбора." + }, + { + "short": "Фурункул преддверия носа. Самостоятельно выдавливал. Ухудшение - отек, боль, гиперемия.", + "full": "На момент обращения пациент предъявляет жалобы на отек, боль и гиперемию в преддверии носа. Со слов пациента, образовался фурункул, который он пытался самостоятельно выдавить, после чего отметил ухудшение." + }, + { + "short": "Вазомоторный ринит. Заложенность попеременно то одной, то другой полов. носа. Зависит от температуры воздуха.", + "full": "На момент обращения пациент предъявляет жалобы на заложенность носа, которая попеременно возникает то в одной, то в другой половине носа. Симптомы зависят от температуры окружающего воздуха." + }, + { + "short": "Острый средний отит на фоне ОРВИ. Боль, снижение слуха, чувство заложенности. Температура 37.8.", + "full": "На момент обращения пациент предъявляет жалобы на боль, снижение слуха и чувство заложенности в ухе, а также повышение температуры тела до 37.8°C. Симптомы возникли на фоне ОРВИ." + }, + { + "short": "Инородное тело уха (насекомое). Шум, шевеление в наружном слуховом проходе. Пытался промыть шприцем.", + "full": "На момент обращения пациент предъявляет жалобы на шум и ощущение шевеления в наружном слуховом проходе. Со слов пациента, в ухо попало насекомое. Пытался промыть ухо с помощью шприца." + }, + { + "short": "Аллерг. ринит. Сезонный, на цветение березы. Чиханье, зуд в носу, водянистые выделения.", + "full": "На момент обращения пациент предъявляет жалобы на приступы чихания, зуд в носу и обильные водянистые выделения. Со слов пациента, страдает сезонным аллергическим ринитом на цветение березы." + }, + { + "short": "Парез гортани после тиреоидэктомии 3 мес. назад. Осиплость, поперхивание жидкой пищей.", + "full": "На момент обращения пациент предъявляет жалобы на стойкую осиплость и поперхивание при приеме жидкой пищи. Со слов пациента, три месяца назад перенес тиреоидэктомию, после чего развился парез гортани." + }, + { + "short": "Кандидоз полости рта и глотки после АБ терапии. Белый налет, жжение. Самостоятельно использовал соду.", + "full": "На момент обращения пациент предъявляет жалобы на белый налет на слизистой полости рта и глотки и жжение. Симптомы возникли после курса антибактериальной терапии. Пытался лечиться самостоятельно, использовал полоскания содой." + }, + { + "short": "Гайморит? Гнойные выделения из носа, боль в проекции пазух, температура 38.1. Болеет 10 дней.", + "full": "На момент обращения пациент предъявляет жалобы на гнойные выделения из носа, боль в проекции верхнечелюстных пазух и повышение температуры тела до 38.1°C. Болеет в течение 10 дней." + }, + { + "short": "Отосклероз? Прогресс. снижение слуха, шум в ушах. У матери аналогичная проблема.", + "full": "На момент обращения пациент предъявляет жалобы на прогрессирующее снижение слуха и шум в ушах. Со слов пациента, у матери была аналогичная проблема." + }, + { + "short": "Перитонзиллярный абсцесс в анамнезе 2 года назад. Сейчас боль в горле с одной стороны, тризм.", + "full": "На момент обращения пациент предъявляет жалобы на боль в горле с одной стороны и затруднение открывания рта (тризм). Со слов пациента, два года назад в анамнезе был перитонзиллярный абсцесс." + }, + { + "short": "Носовое кровотечение у подростка. Возникает спонтанно, из зоны Киссельбаха. Останавливает прижатием.", + "full": "На момент обращения родитель предъявляет жалобы на спонтанные носовые кровотечения у подростка. Кровотечение останавливается прижатием крыльев носа." + }, + { + "short": "Хр. катаральный отит. Чувство заложенности, аутофония. При рините симптомы усиливаются.", + "full": "На момент обращения пациент предъявляет жалобы на чувство заложенности в ушах и аутофонию. Симптомы усиливаются при насморке." + }, + { + "short": "Гипертрофия н. раковин. Стойкое затруднение нос. дыхания. Сосудосужив. капли использует ежедневно более года.", + "full": "На момент обращения пациент предъявляет жалобы на стойкое затруднение носового дыхания. Сосудосуживающие капли использует ежедневно на протяжении более года." + }, + { + "short": "Острый ларингит. Потеря голоса, сухой кашель. Накануне много говорил на холоде.", + "full": "На момент обращения пациент предъявляет жалобы на потерю голоса и сухой кашель. Со слов пациента, накануне много говорил на холодном воздухе." + }, + { + "short": "Состояние после радиойодтерапии. Сухость во рту, нарушение вкуса. Жалоб со стороны ЛОР-органов нет.", + "full": "На момент обращения пациент предъявляет жалобы на сухость во рту и нарушение вкуса после перенесенной радиойодтерапии. Специфических жалоб со стороны ЛОР-органов не предъявляет." + }, + { + "short": "Киста небной миндалины. Обнаружена случайно. Ощущение инородного тела в горле.", + "full": "На момент обращения пациент предъявляет жалобы на ощущение инородного тела в горле. Со слов пациента, киста небной миндалины была обнаружена случайно." + }, + { + "short": "Отомикоз. Зуд в ухе, шелушение. Часто плавает в бассейне, чистит уши ватными палочками.", + "full": "На момент обращения пациент предъявляет жалобы на зуд в ухе и шелушение. Со слов пациента, часто плавает в бассейне и регулярно чистит уши ватными палочками." + }, + { + "short": "Искривление перегородки носа. Затруднение дыхания с двух сторон. Храп. Консервативное лечение неэффективно.", + "full": "На момент обращения пациент предъявляет жалобы на затруднение носового дыхания с двух сторон и храп. Консервативное лечение эффекта не приносит." + }, + { + "short": "Папиллома голосовой складки. Охриплость прогрессирует. Курит 20 лет.", + "full": "На момент обращения пациент предъявляет жалобы на прогрессирующую охриплость. Курит в течение 20 лет." + }, + { + "short": "Риноликворея после ЧМТ 1 мес. назад. Прозрачные выделения из носа при наклоне головы.", + "full": "На момент обращения пациент предъявляет жалобы на прозрачные выделения из носа, усиливающиеся при наклоне головы. Со слов пациента, месяц назад перенес черепно-мозговую травму." + }, + { + "short": "Хр. субатрофический фарингит. Сухость, першение, ощущение кома. Пьет мало воды.", + "full": "На момент обращения пациент предъявляет жалобы на сухость, першение и ощущение кома в горле. Отмечает, что пьет недостаточное количество воды." + }, + { + "short": "Баротравма уха при авиаперелете. Резкая боль, затем шум и снижение слуха. Зевание, глотание не помогли.", + "full": "На момент обращения пациент предъявляет жалобы на резкую боль, шум и снижение слуха в ухе после авиаперелета. Попытки зевать и глотать не принесли облегчения." + }, + { + "short": "Гипосмия после перенесенного ковида 2 мес. назад. Обоняние восстанавливается частично.", + "full": "На момент обращения пациент предъявляет жалобы на снижение обоняния (гипосмию), которое развилось после перенесенного COVID-19 два месяца назад. Обоняние восстанавливается частично." + }, + { + "short": "Лимфаденит подчелюстной обл. Увел. болезн. узлы справа. Боль в горле была 2 нед. назад.", + "full": "На момент обращения пациент предъявляет жалобы на увеличение и болезненность подчелюстных лимфоузлов справа. Около двух недель назад перенес боль в горле." + }, + { + "short": "Неврит слухового нерва? Снижение слуха, шум в ушах, головокружение. Работа в шумном цеху.", + "full": "На момент обращения пациент предъявляет жалобы на снижение слуха, шум в ушах и головокружение. Со слов пациента, работает в шумном цеху." + }, + { + "short": "Инородное тело глотки (рыбья кость). Боль при глотании. Пытался протолкнуть хлебной коркой.", + "full": "На момент обращения пациент предъявляет жалобы на боль при глотании. Со слов пациента, проглотил рыбью кость. Пытался протолкнуть кость, проглотив хлебную корку." + }, + { + "short": "Острый евстахиит. Заложенность ушей, ощущение жидкости в ухе. Возник на фоне ринита.", + "full": "На момент обращения пациент предъявляет жалобы на заложенность ушей и ощущение переливания жидкости в ухе. Симптомы возникли на фоне ринита." + }, + { + "short": "Хр. гиперпластический ларингит. Стойкая осиплость. Курит. От операции отказывается.", + "full": "На момент обращения пациент предъявляет жалобы на стойкую осиплость. Пациент курит. От предлагаемого оперативного лечения отказывается." + }, + { + "short": "Сиалолитиаз (камень протока подъязычной слюнной железы). Боль, увеличение железы при приеме пищи.", + "full": "На момент обращения пациент предъявляет жалобы на боль и увеличение подъязычной слюнной железы во время приема пищи." + }, + { + "short": "Поствоспалительная дисфония. Голос не восстановился после ларингита 3 нед. назад.", + "full": "На момент обращения пациент предъявляет жалобы на то, что голос не восстановился после перенесенного ларингита три недели назад." + }, + { + "short": "Хр. синусит (лобн., верхнечел.). Головная боль, тяжесть в лице. Температуры нет.", + "full": "На момент обращения пациент предъявляет жалобы на головную боль и чувство тяжести в области лица. Температура тела не повышена." + }, + { + "short": "Отек Квинке на укус пчелы в губу в анамнезе. Сейчас отек губ, языка после фруктов. Антигистаминные помогли.", + "full": "На момент обращения пациент предъявляет жалобы на отек губ и языка после употребления фруктов. Со слов пациента, в анамнезе был отек Квинке на укус пчелы в губу. Прием антигистаминных препаратов помог." + }, + { + "short": "Парестезия глотки. Ощущение жжения, ползания мурашек. Меняется в течение дня.", + "full": "На момент обращения пациент предъявляет жалобы на парестезию глотки в виде ощущения жжения и ползания мурашек. Симптомы меняются в течение дня." + }, + { + "short": "Состояние после септопластики 1 мес. назад. Дыхание улучшилось, но есть сухие корки.", + "full": "На момент обращения пациент предъявляет жалобы на сухие корки в носу. Со слов пациента, месяц назад перенес септопластику, носовое дыхание улучшилось." + }, + { + "short": "Острый тонзиллит (лакунарный). Налеты на миндалинах, боль, лихорадка. АБ не принимал.", + "full": "На момент обращения пациент предъявляет жалобы на налеты на миндалинах, боль в горле и лихорадку. Антибиотики не принимал." + }, + { + "short": "Доброкач. пароксизм. позиционное головокружение. Эпизоды при повороте в постели. Симптома Ромберга нет.", + "full": "На момент обращения пациент предъявляет жалобы на эпизоды головокружения, возникающие при повороте в постели. Симптом Ромберга отрицательный." + }, + { + "short": "Фарингомикоз. Творожистые налеты в глотке, жжение. Болеет сахарным диабетом.", + "full": "На момент обращения пациент предъявляет жалобы на творожистые налеты в глотке и чувство жжения. Со слов пациента, страдает сахарным диабетом." + }, + { + "short": "Гематома носовой перегородки после травмы. Затруднение дыхания, распирание.", + "full": "На момент обращения пациент предъявляет жалобы на затруднение носового дыхания и чувство распирания после травмы носа." + }, + { + "short": "Острый наружный диффузный отит. Боль в ухе, отечность, выделения. Плавал в открытом водоеме.", + "full": "На момент обращения пациент предъявляет жалобы на боль в ухе, отечность и выделения. Со слов пациента, плавал в открытом водоеме." + }, + { + "short": "Ощущение серной пробки. Снижение слуха, аутофония. Пытался промыть ухо самостоятельно.", + "full": "На момент обращения пациент предъявляет жалобы на снижение слуха и аутофонию. Пытался промыть ухо самостоятельно для удаления предполагаемой серной пробки." + }, + { + "short": "Подголосовой ларингит у ребенка 3 лет. Лающий кашель, инспираторная одышка. Симптомы усиливаются ночью.", + "full": "На момент обращения родитель предъявляет жалобы на лающий кашель и инспираторную одышку у ребенка 3 лет. Симптомы усиливаются в ночное время." + }, + { + "short": "Ожог слизистой носа парами кислоты на производстве. Боль, отек, затруднение дыхания.", + "full": "На момент обращения пациент предъявляет жалобы на сильную боль, отек и затруднение носового дыхания после ожога слизистой носа парами кислоты на производстве." + }, + { + "short": "Отоантрит у грудничка. Выпячивание заушной области, беспокойство, отказ от еды. Температура 38.5.", + "full": "На момент обращения родитель предъявляет жалобы на выпячивание в заушной области, беспокойство, отказ от еды и повышение температуры тела до 38.5°C у грудного ребенка." + }, + { + "short": "Парез мягкого неба после удаления аденоидов. Открытая гнусавость, поперхивание.", + "full": "На момент обращения пациент предъявляет жалобы на открытую гнусавость и поперхивание при приеме пищи после удаления аденоидов." + }, + { + "short": "Инородное тело бронха (семечка) у ребенка 5 лет. Кашель, свистящее дыхание. Аспирация 2 дня назад.", + "full": "На момент обращения родитель предъявляет жалобы на кашель и свистящее дыхание у ребенка 5 лет. Со слов родителя, два дня назад была аспирация семечки." + }, + { + "short": "Озена. Зловонные корки в носу, аносмия. Болеет с юности.", + "full": "На момент обращения пациент предъявляет жалобы на зловонные корки в носу и полное отсутствие обоняния (аносмия). Со слов пациента, болеет с юности." + }, + { + "short": "Невралгия тройничного нерва. Приступы стреляющей боли в области крыла носа. Провоцируется прикосновением.", + "full": "На момент обращения пациент предъявляет жалобы на приступы стреляющей боли в области крыла носа, провоцирующиеся прикосновением." + }, + { + "short": "Хр. декомпенсир. тонзиллит. Субфебрилитет, слабость, боли в суставах. Посев - бета-гемол. стрептококк.", + "full": "На момент обращения пациент предъявляет жалобы на субфебрильную температуру, слабость и боли в суставах." + }, + { + "short": "Пирсинг языка. Отек, боль, покраснение через 2 дня после прокола. Обработку проводил нерегулярно.", + "full": "На момент обращения пациент предъявляет жалобы на отек, боль и покраснение в области прокола языка через два дня после пирсинга. Обработку проводил нерегулярно." + }, + { + "short": "Синусовая киста. Бессимптомно, обнаружена на КТ при обследовании по поводу головной боли.", + "full": "На момент обращения пациент жалоб, специфичных для ЛОР-органов, не предъявляет. Киста околоносовой пазухи была обнаружена случайно при проведении КТ по поводу головной боли." + }, + { + "short": "Проф. осмотр. Жалоб нет. Работает на хлебозаводе (мучная пыль).", + "full": "На момент обращения пациент жалоб не предъявляет. Обратился для профессионального осмотра. Работает на хлебозаводе в условиях контакта с мучной пылью." + }, + { + "short": "Острый катаральный ринофарингит. Чиханье, насморк, першение в горле. Контакт с больным ОРВИ.", + "full": "На момент обращения пациент предъявляет жалобы на чихание, насморк и першение в горле. Со слов пациента, был в контакте с больным ОРВИ." + }, + { + "short": "Геморрагический васкулит. Петехии на слизистой мягкого неба. Из ЛОР-жалоб - сухость.", + "full": "На момент обращения пациент предъявляет жалобы на сухость во рту. На слизистой мягкого неба отмечаются петехии." + }, + { + "short": "Оторея после ЧМТ. Прозрачные выделения из уха. Головной боли, тошноты нет.", + "full": "На момент обращения пациент предъявляет жалобы на прозрачные выделения из уха после перенесенной черепно-мозговой травмы. Головной боли и тошноты нет." + }, + { + "short": "Абсцесс надгортанника. Боль при глотании, ощущение инородного тела, слюнотечение. Дыхание не затруднено.", + "full": "На момент обращения пациент предъявляет жалобы на боль при глотании, ощущение инородного тела в горле и слюнотечение. Дыхание не затруднено." + }, + { + "short": "Хр. медикаментозный ринит. Постоянная заложенность. Капли использует 5-6 раз в день много лет.", + "full": "На момент обращения пациент предъявляет жалобы на постоянную заложенность носа. Сосудосуживающие капли использует 5-6 раз в день на протяжении многих лет." + }, + { + "short": "Попадание щелочи в гортань. Осиплость, боль. Промыл водой сразу после инцидента.", + "full": "На момент обращения пациент предъявляет жалобы на осиплость и боль в гортани после попадания щелочи. Сразу после инцидента промывал горло водой." + }, + { + "short": "Ювенильная ангиофиброма носоглотки у подростка. Носовые кровотечения, затруднение носового дыхания.", + "full": "На момент обращения родитель предъявляет жалобы на носовые кровотечения и прогрессирующее затруднение носового дыхания у подростка." + }, + { + "short": "Острый стоматит. Язвы на слизистой щек, боль. Прием пищи затруднен.", + "full": "На момент обращения пациент предъявляет жалобы на болезненные язвы на слизистой щек. Прием пищи затруднен из-за боли." + }, + { + "short": "Невринома слухового нерва? Односторонний тиннитус, прогресс. тугоухость, нарушение равновесия.", + "full": "На момент обращения пациент предъявляет жалобы на односторонний шум в ухе, прогрессирующее снижение слуха и нарушение равновесия." + }, + { + "short": "Инородное тело трахеи (металл. деталь) у взрослого. Приступ кашля, стридор. Аспирация час назад.", + "full": "На момент обращения пациент предъявляет жалобы на приступ кашля и стридорозное дыхание. Со слов пациента, час назад произошла аспирация металлической детали." + }, + { + "short": "Хр. гранулезный фарингит. Гипертрофия лимфоидных гранул, слизь на задней стенке глотки.", + "full": "На момент обращения пациент предъявляет жалобы на скопление слизи на задней стенке глотки." + }, + { + "short": "Острый мастоидит. Боль за ухом, оттопыренность ушной раковины, гноетечение. В анамнезе отит.", + "full": "На момент обращения пациент предъявляет жалобы на боль за ухом, оттопыренность ушной раковины и гноетечение из уха. Со слов пациента, в анамнезе был отит." + }, + { + "short": "Гипертрофия небных миндалин 3 ст. Ночной храп, апноэ, затруднение глотания твердой пищи.", + "full": "На момент обращения пациент предъявляет жалобы на ночной храп, остановки дыхания во сне и затруднение при глотании твердой пищи." + }, + { + "short": "Посттравматическая аносмия. Потеря обоняния после падения на затылок. Обоняние не восстанавливается 2 мес.", + "full": "На момент обращения пациент предъявляет жалобы на полную потерю обоняния, которая произошла после падения на затылок два месяца назад. Обоняние не восстанавливается." + }, + { + "short": "Острый эпиглоттит. Резкая боль в горле, слюнотечение, инспираторная одышка. Температура 39.0.", + "full": "На момент обращения пациент предъявляет жалобы на резкую боль в горле, слюнотечение, инспираторную одышку и повышение температуры тела до 39.0°C." + }, + { + "short": "Хр. атрофический ринит. Сухость, корки, носовые кровотечения. Ощущение широкого носа.", + "full": "На момент обращения пациент предъявляет жалобы на сухость в носу, корки, носовые кровотечения и ощущение широкого носа." + }, + { + "short": "Паратонзиллит. Асимметрия мягкого неба, боль с одной стороны, тризм. Температура 38.0.", + "full": "На момент обращения пациент предъявляет жалобы на боль в горле с одной стороны, затруднение открывания рта, асимметрию мягкого неба и повышение температуры тела до 38.0°C." + }, + { + "short": "Дисфагия неясного генеза. Поперхивание, ощущение застревания пищи. ЭГДС - без особенностей.", + "full": "На момент обращения пациент предъявляет жалобы на поперхивание и ощущение застревания пищи при глотании. ЭГДС патологии не выявила." + }, + { + "short": "Острый сиалоаденит околоушной слюнной железы. Болезненный отек, гнойное отделяемое из протока.", + "full": "На момент обращения пациент предъявляет жалобы на болезненный отек в области околоушной слюнной железы и гнойное отделяемое из ее протока." + }, + { + "short": "Холестеатома? Гноетечение из уха с запахом, тугоухость. Болеет отитами с детства.", + "full": "На момент обращения пациент предъявляет жалобы на гноетечение из уха с неприятным запахом и снижение слуха. Со слов пациента, с детства страдает рецидивирующими отитами." + }, + { + "short": "Ларинготрахеит. Осиплость, грубый кашель, затруднение вдоха. Ребенок 4 лет.", + "full": "На момент обращения родитель предъявляет жалобы на осиплость голоса, грубый кашель и затруднение вдоха у ребенка 4 лет." + }, + { + "short": "Искривление перегородки носа. Затруднение дыхания слева. Риноскопия - гребень перегородки слева.", + "full": "На момент обращения пациент предъявляет жалобы на затруднение носового дыхания слева." + }, + { + "short": "Глоссалгия. Жжение, покалывание в языке. Усиливается к вечеру. Слизистая без видимых изменений.", + "full": "На момент обращения пациент предъявляет жалобы на жжение и покалывание в языке, усиливающиеся к вечеру. Видимых изменений слизистой оболочки нет." + }, + { + "short": "Острый ринит у новорожденного. Заложенность носа, нарушение сосания. Сопелеотсосом пользуются.", + "full": "На момент обращения родитель предъявляет жалобы на заложенность носа у новорожденного ребенка, приводящую к нарушению сосания. Для облегчения дыхания пользуются сопелеотсосом." + }, + { + "short": "Папилломатоз гортани. Охриплость, затруднение дыхания. В анамнезе множественные операции.", + "full": "На момент обращения пациент предъявляет жалобы на охриплость и затруднение дыхания. Со слов пациента, страдает папилломатозом гортани, в анамнезе - множественные операции." + }, + { + "short": "Аллерг. ринит + бронхиальная астма. Чиханье, зуд в носу, кашель с одышкой. Сезонное обострение.", + "full": "На момент обращения пациент предъявляет жалобы на приступы чихания, зуд в носу, кашель с одышкой в период сезонного обострения. Со слов пациента, страдает аллергическим ринитом и бронхиальной астмой." + }, + { + "short": "Инородное тело пищевода (монета) у ребенка 3 лет. Слюнотечение, невозможность глотать.", + "full": "На момент обращения родитель предъявляет жалобы на слюнотечение и невозможность глотать у ребенка 3 лет." + }, + { + "short": "Острый средний отит при скарлатине. Боль в ухе, гноетечение. Сыпь на коже, температура.", + "full": "На момент обращения пациент предъявляет жалобы на боль в ухе, гноетечение, сыпь на коже и лихорадку." + }, + { + "short": "Хр. гипертрофический ларингит у курильщика. Стойкая осиплость. Курит 1.5 пачки/день 30 лет.", + "full": "На момент обращения пациент предъявляет жалобы на стойкую осиплость голоса. Курит 1.5 пачки сигарет в день на протяжении 30 лет." + }, + { + "short": "Неврит лицевого нерва. Асимметрия лица, сглаженность носогубной складки, лагофтальм. Началось с боли в ухе.", + "full": "На момент обращения пациент предъявляет жалобы на асимметрию лица, сглаженность носогубной складки и невозможность полностью закрыть глаз (лагофтальм). Со слов пациента, заболевание началось с боли в ухе." + }, + { + "short": "Попадание инородного тела (стекло) в слизистую глотки. Боль при глотании. Ощущение царапания.", + "full": "На момент обращения пациент предъявляет жалобы на боль при глотании и ощущение царапания в глотке после попадания инородного тела (осколка стекла)." + }, + { + "short": "Острый субатрофический ринит. Сухость, жжение в носу, корки. Работает в запыленном помещении.", + "full": "На момент обращения пациент предъявляет жалобы на сухость, жжение в носу и образование корок. Со слов пациента, работает в запыленном помещении." + }, + { + "short": "Гипервентиляционный синдром. Ощущение нехватки воздуха, ком в горле, головокружение. Приступ при стрессе.", + "full": "На момент обращения пациент предъявляет жалобы на приступы, сопровождающиеся ощущением нехватки воздуха, кома в горле и головокружением, возникающие во время стресса." + }, + { + "short": "Состояние после ларингэктомии. Дышит через трахеостому. Жалоб нет, плановый осмотр.", + "full": "На момент обращения пациент жалоб не предъявляет. Обратился для планового осмотра. Со слов пациента, перенес ларингэктомию, дышит через трахеостому." + }, + { + "short": "Острый тонзиллит Симановского-Плаута-Венсана. Язвенно-пленчатые налеты на одной миндалине. Боль умеренная.", + "full": "На момент обращения пациент предъявляет жалобы на язвенно-пленчатые налеты на одной миндалине. Боль в горле умеренная." + }, + { + "short": "Синдром Eagle. Боль в горле, ощущение инородного тела. Длинные шиловидные отростки на КТ.", + "full": "На момент обращения пациент предъявляет жалобы на боль в горле и ощущение инородного тела." + }, + { + "short": "Острый назофарингит у ВИЧ-инфицированного. Выраженная боль в горле, налеты, лихорадка.", + "full": "На момент обращения пациент предъявляет жалобы на выраженную боль в горле, налеты на слизистой и лихорадку. Со слов пациента, страдает ВИЧ-инфекцией." + }, + { + "short": "Пластика н/раковин радиохирургическим методом. Послеоперационный период. Жалоб нет, дышит носом.", + "full": "На момент обращения пациент жалоб не предъявляет, носовое дыхание свободное. Со слов пациента, перенес радиохирургическую пластику носовых раковин." + }, + { + "short": "АД 150/90, звон в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: звон в ушах. Артериальное давление 150/90 мм рт. ст." + }, + { + "short": "СД 2 типа, зуд в ушах, выделения", + "full": "На момент обращения пациент предъявляет жалобы на: зуд в ушах и выделения из ушей. Имеет сахарный диабет 2 типа." + }, + { + "short": "ОРВИ неделю назад, заложенность носа, снижение обоняния", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность носа и снижение обоняния. Перенёс ОРВИ неделю назад." + }, + { + "short": "Жалоб на горло нет, но есть гной на миндалинах", + "full": "На момент обращения пациент предъявляет жалобы на: наличие гноя на миндалинах. Жалоб на боль в горле нет." + }, + { + "short": "ЧСС 92, шум в ушах, головокружение", + "full": "На момент обращения пациент предъявляет жалобы на: шум в ушах и головокружение. Частота сердечных сокращений 92 уд/мин." + }, + { + "short": "ХОБЛ, хронический кашель, першение в горле", + "full": "На момент обращения пациент предъявляет жалобы на: хронический кашель и першение в горле. Имеет хроническую обструктивную болезнь лёгких." + }, + { + "short": "Аллергия на пыльцу, чихание, водянистый насморк весной", + "full": "На момент обращения пациент предъявляет жалобы на: чихание и водянистый насморк весной. Имеет аллергию на пыльцу." + }, + { + "short": "Жалоб на носовое дыхание нет, но есть храп", + "full": "На момент обращения пациент предъявляет жалобы на: храп. Жалоб на нарушение носового дыхания нет." + }, + { + "short": "ГБ, боль в висках, звон в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: боль в висках и звон в ушах. Имеет гипертоническую болезнь." + }, + { + "short": "ИБС, одышка, заложенность ушей при ходьбе", + "full": "На момент обращения пациент предъявляет жалобы на: одышку и заложенность ушей при ходьбе. Имеет ишемическую болезнь сердца." + }, + { + "short": "Снижение слуха на оба уха, шум в ушах, проф. вредность (шум)", + "full": "На момент обращения пациент предъявляет жалобы на: снижение слуха на оба уха и шум в ушах. Работает в условиях профессиональной вредности — шум." + }, + { + "short": "Жалоб на уши нет, но есть охриплость", + "full": "На момент обращения пациент предъявляет жалобы на: охриплость голоса. Жалоб на уши нет." + }, + { + "short": "Аденоиды у ребёнка, храп, дыхание ртом", + "full": "На момент обращения пациент (ребёнок) предъявляет жалобы на: храп и дыхание ртом. Имеет аденоиды." + }, + { + "short": "ПНС, стекание слизи по глотке, кашель", + "full": "На момент обращения пациент предъявляет жалобы на: стекание слизи по задней стенке глотки и кашель. Имеет постназальный синдром." + }, + { + "short": "Жалоб на зрение нет, но есть боль в переносице и гной из носа", + "full": "На момент обращения пациент предъявляет жалобы на: боль в переносице и гной из носа. Жалоб на зрение нет." + }, + { + "short": "СД, зуд в носу, корки, носовые кровотечения", + "full": "На момент обращения пациент предъявляет жалобы на: зуд в носу, образование корок и носовые кровотечения. Имеет сахарный диабет." + }, + { + "short": "ОРЗ 3 дня, боль в горле, темп. 37.8", + "full": "На момент обращения пациент предъявляет жалобы на: боль в горле и температуру 37.8°C. Переносит ОРЗ в течение 3 дней." + }, + { + "short": "Жалоб на ЖКТ нет, но есть першение и кашель", + "full": "На момент обращения пациент предъявляет жалобы на: першение в горле и кашель. Жалоб на желудочно-кишечный тракт нет." + }, + { + "short": "АГ, шум в ушах, головная боль в затылке", + "full": "На момент обращения пациент предъявляет жалобы на: шум в ушах и головную боль в затылке. Имеет артериальную гипертензию." + }, + { + "short": "После купания — боль в ухе, зуд, выделения", + "full": "На момент обращения пациент предъявляет жалобы на: боль в ухе, зуд и выделения из уха после купания." + }, + { + "short": "Жалоб на слух нет, но есть заложенность уха", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность уха. Жалоб на снижение слуха нет." + }, + { + "short": "Хр. тонзиллит, пробки, неприятный запах", + "full": "На момент обращения пациент предъявляет жалобы на: пробки в миндалинах и неприятный запах изо рта. Имеет хронический тонзиллит." + }, + { + "short": "Аллергия на кошек, чихание, заложенность носа", + "full": "На момент обращения пациент предъявляет жалобы на: чихание и заложенность носа. Имеет аллергию на кошек." + }, + { + "short": "Жалоб на зубы нет, но есть боль в щеке и гной из носа", + "full": "На момент обращения пациент предъявляет жалобы на: боль в щеке и гной из носа. Жалоб на зубы нет." + }, + { + "short": "Снижение слуха после ОРВИ, аутофония", + "full": "На момент обращения пациент предъявляет жалобы на: снижение слуха и аутофонию после перенесённой ОРВИ." + }, + { + "short": "Искр. перегородки, затруднённое дыхание через нос", + "full": "На момент обращения пациент предъявляет жалобы на: затруднённое дыхание через нос. Имеет искривление носовой перегородки." + }, + { + "short": "Жалоб на кожу нет, но есть шелушение за ушами", + "full": "На момент обращения пациент предъявляет жалобы на: шелушение кожи за ушами. Жалоб на кожу в других областях нет." + }, + { + "short": "Рефлюкс, охриплость, кашель в положении лёжа", + "full": "На момент обращения пациент предъявляет жалобы на: охриплость и кашель в положении лёжа. Имеет рефлюкс." + }, + { + "short": "Жалоб на сердце нет, но есть шум в ушах и головокружение", + "full": "На момент обращения пациент предъявляет жалобы на: шум в ушах и головокружение. Жалоб на сердце нет." + }, + { + "short": "Полипы, отсутствие обоняния, заложенность носа", + "full": "На момент обращения пациент предъявляет жалобы на: отсутствие обоняния и заложенность носа. Имеет полипы." + }, + { + "short": "После полёта — заложенность уха, шум", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность уха и шум после авиаперелёта." + }, + { + "short": "Жалоб на зрение нет, но есть боль в глазнице и гной из носа", + "full": "На момент обращения пациент предъявляет жалобы на: боль в глазнице и гной из носа. Жалоб на зрение нет." + }, + { + "short": "Курит 20 лет, сухость в горле, хрипота", + "full": "На момент обращения пациент предъявляет жалобы на: сухость в горле и хрипоту. Курит 20 лет." + }, + { + "short": "Жалоб на ЖКТ нет, но есть ком в горле", + "full": "На момент обращения пациент предъявляет жалобы на: чувство кома в горле. Жалоб на желудочно-кишечный тракт нет." + }, + { + "short": "ОРВИ, насморк, слезотечение, чихание", + "full": "На момент обращения пациент предъявляет жалобы на: насморк, слезотечение и чихание. Переносит ОРВИ." + }, + { + "short": "Жалоб на уши нет, но есть боль в горле и лихорадка", + "full": "На момент обращения пациент предъявляет жалобы на: боль в горле и лихорадку. Жалоб на уши нет." + }, + { + "short": "Аденоиды II ст., храп, дыхание ртом у ребёнка", + "full": "На момент обращения пациент (ребёнок) предъявляет жалобы на: храп и дыхание ртом. Имеет аденоиды II степени." + }, + { + "short": "После чистки уха — боль, выделения", + "full": "На момент обращения пациент предъявляет жалобы на: боль в ухе и выделения после чистки уха." + }, + { + "short": "Жалоб на слух нет, но есть звон в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: звон в ушах. Жалоб на снижение слуха нет." + }, + { + "short": "СД, зуд в ушах, рецидивирующие отиты", + "full": "На момент обращения пациент предъявляет жалобы на: зуд в ушах и рецидивирующие отиты. Имеет сахарный диабет." + }, + { + "short": "Жалоб на нос нет, но есть охриплость и кашель", + "full": "На момент обращения пациент предъявляет жалобы на: охриплость и кашель. Жалоб на нос нет." + }, + { + "short": "Гайморит, гной из носа, боль в щеке", + "full": "На момент обращения пациент предъявляет жалобы на: гной из носа и боль в щеке. Имеет гайморит." + }, + { + "short": "После ныряния — боль в ухе, снижение слуха", + "full": "На момент обращения пациент предъявляет жалобы на: боль в ухе и снижение слуха после ныряния." + }, + { + "short": "Жалоб на сердце нет, но есть АД 160/100 и шум в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: артериальное давление 160/100 мм рт. ст. и шум в ушах. Жалоб на сердце нет." + }, + { + "short": "Хр. ринит, заложенность носа, не помогают капли", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность носа, которая не купируется каплями. Имеет хронический ринит." + }, + { + "short": "Жалоб на зрение нет, но есть головная боль и заложенность носа", + "full": "На момент обращения пациент предъявляет жалобы на: головную боль и заложенность носа. Жалоб на зрение нет." + }, + { + "short": "ИБС, одышка, заложенность ушей", + "full": "На момент обращения пациент предъявляет жалобы на: одышку и заложенность ушей. Имеет ишемическую болезнь сердца." + }, + { + "short": "После промывания носа — боль в ухе, гной", + "full": "На момент обращения пациент предъявляет жалобы на: боль в ухе и гнойные выделения после промывания носа." + }, + { + "short": "Жалоб на ЖКТ нет, но есть першение и осиплость", + "full": "На момент обращения пациент предъявляет жалобы на: першение в горле и осиплость голоса. Жалоб на желудочно-кишечный тракт нет." + }, + { + "short": "Аллергия на пыль, зуд в носу, чихание по утрам", + "full": "На момент обращения пациент предъявляет жалобы на: зуд в носу и чихание по утрам. Имеет аллергию на пыль." + }, + { + "short": "Жалоб на уши нет, но есть гнусавость и заложенность носа", + "full": "На момент обращения пациент предъявляет жалобы на: гнусавость и заложенность носа. Жалоб на уши нет." + }, + { + "short": "Снижение слуха, шум, проф. вредность", + "full": "На момент обращения пациент предъявляет жалобы на: снижение слуха и шум в ушах. Работает в условиях профессиональной вредности." + }, + { + "short": "После ОРВИ — снижение обоняния, заложенность носа", + "full": "На момент обращения пациент предъявляет жалобы на: снижение обоняния и заложенность носа после ОРВИ." + }, + { + "short": "Жалоб на сердце нет, но есть ЧСС 96 и головокружение", + "full": "На момент обращения пациент предъявляет жалобы на: частоту сердечных сокращений 96 уд/мин и головокружение. Жалоб на сердце нет." + }, + { + "short": "Хр. фарингит, першение, сухой кашель", + "full": "На момент обращения пациент предъявляет жалобы на: першение в горле и сухой кашель. Имеет хронический фарингит." + }, + { + "short": "Жалоб на зубы нет, но есть боль в верхней челюсти и гной из носа", + "full": "На момент обращения пациент предъявляет жалобы на: боль в верхней челюсти и гной из носа. Жалоб на зубы нет." + }, + { + "short": "АГ, головная боль, звон в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: головную боль и звон в ушах. Имеет артериальную гипертензию." + }, + { + "short": "После использования наушников — зуд, боль в ухе", + "full": "На момент обращения пациент предъявляет жалобы на: зуд и боль в ухе после использования наушников." + }, + { + "short": "Жалоб на зрение нет, но есть боль в лбу и гной из носа", + "full": "На момент обращения пациент предъявляет жалобы на: боль в лбу и гной из носа. Жалоб на зрение нет." + }, + { + "short": "СД, сухость в носу, корки, кровотечения", + "full": "На момент обращения пациент предъявляет жалобы на: сухость в носу, образование корок и носовые кровотечения. Имеет сахарный диабет." + }, + { + "short": "Жалоб на ЖКТ нет, но есть ком в горле и кашель", + "full": "На момент обращения пациент предъявляет жалобы на: чувство кома в горле и кашель. Жалоб на желудочно-кишечный тракт нет." + }, + { + "short": "ОРЗ, боль в горле, темп. 38.2", + "full": "На момент обращения пациент предъявляет жалобы на: боль в горле и температуру 38.2°C. Переносит ОРЗ." + }, + { + "short": "Жалоб на уши нет, но есть храп и дыхание ртом", + "full": "На момент обращения пациент предъявляет жалобы на: храп и дыхание ртом. Жалоб на уши нет." + }, + { + "short": "Полипы, отсутствие обоняния, хронический насморк", + "full": "На момент обращения пациент предъявляет жалобы на: отсутствие обоняния и хронический насморк. Имеет полипы." + }, + { + "short": "После купания в море — зуд, боль в ухе", + "full": "На момент обращения пациент предъявляет жалобы на: зуд и боль в ухе после купания в море." + }, + { + "short": "Жалоб на сердце нет, но есть АД 155/95 и шум в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: артериальное давление 155/95 мм рт. ст. и шум в ушах. Жалоб на сердце нет." + }, + { + "short": "Хр. тонзиллит, белые пробки, запах изо рта", + "full": "На момент обращения пациент предъявляет жалобы на: белые пробки в миндалинах и запах изо рта. Имеет хронический тонзиллит." + }, + { + "short": "Жалоб на нос нет, но есть охриплость и першение", + "full": "На момент обращения пациент предъявляет жалобы на: охриплость и першение в горле. Жалоб на нос нет." + }, + { + "short": "Аллергия на пыльцу, заложенность носа, слезотечение весной", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность носа и слезотечение весной. Имеет аллергию на пыльцу." + }, + { + "short": "После удара — деформация носа, заложенность", + "full": "На момент обращения пациент предъявляет жалобы на: деформацию носа и заложенность после травмы." + }, + { + "short": "Жалоб на слух нет, но есть ощущение воды в ухе", + "full": "На момент обращения пациент предъявляет жалобы на: ощущение воды в ухе. Жалоб на снижение слуха нет." + }, + { + "short": "ИБС, одышка, заложенность ушей при нагрузке", + "full": "На момент обращения пациент предъявляет жалобы на: одышку и заложенность ушей при физической нагрузке. Имеет ишемическую болезнь сердца." + }, + { + "short": "Жалоб на ЖКТ нет, но есть рефлюкс и охриплость", + "full": "На момент обращения пациент предъявляет жалобы на: рефлюкс и охриплость. Жалоб на желудочно-кишечный тракт нет." + }, + { + "short": "Снижение слуха после антибиотиков, шум в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: снижение слуха и шум в ушах после приёма антибиотиков." + }, + { + "short": "Жалоб на зрение нет, но есть боль в переносице и головная боль", + "full": "На момент обращения пациент предъявляет жалобы на: боль в переносице и головную боль. Жалоб на зрение нет." + }, + { + "short": "Курит 10 лет, сухость в горле, кашель", + "full": "На момент обращения пациент предъявляет жалобы на: сухость в горле и кашель. Курит 10 лет." + }, + { + "short": "Жалоб на уши нет, но есть боль в горле и налёт на миндалинах", + "full": "На момент обращения пациент предъявляет жалобы на: боль в горле и налёт на миндалинах. Жалоб на уши нет." + }, + { + "short": "Аденоиды, храп, нарушение сна у ребёнка", + "full": "На момент обращения пациент (ребёнок) предъявляет жалобы на: храп и нарушение сна. Имеет аденоиды." + }, + { + "short": "После чистки уха ватной палочкой — боль, снижение слуха", + "full": "На момент обращения пациент предъявляет жалобы на: боль в ухе и снижение слуха после чистки уха ватной палочкой." + }, + { + "short": "Жалоб на носовое дыхание нет, но есть гнусавость", + "full": "На момент обращения пациент предъявляет жалобы на: гнусавость. Жалоб на нарушение носового дыхания нет." + }, + { + "short": "Гайморит, боль в щеке, гной из носа", + "full": "На момент обращения пациент предъявляет жалобы на: боль в щеке и гной из носа. Имеет гайморит." + }, + { + "short": "Жалоб на сердце нет, но есть ЧСС 100 и шум в ушах", + "full": "На момент обращения пациент предъявляет жалобы на: частоту сердечных сокращений 100 уд/мин и шум в ушах. Жалоб на сердце нет." + }, + { + "short": "Хр. ринит, заложенность, не помогают сосудосуживающие", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность носа, которая не купируется сосудосуживающими каплями. Имеет хронический ринит." + }, + { + "short": "Жалоб на зубы нет, но есть боль в верхней челюсти", + "full": "На момент обращения пациент предъявляет жалобы на: боль в верхней челюсти. Жалоб на зубы нет." + }, + { + "short": "СД, зуд в ушах, рецидивирующие выделения", + "full": "На момент обращения пациент предъявляет жалобы на: зуд в ушах и рецидивирующие выделения. Имеет сахарный диабет." + }, + { + "short": "После полёта — заложенность обоих ушей", + "full": "На момент обращения пациент предъявляет жалобы на: заложенность обоих ушей после авиаперелёта." + }, + { + "short": "Жалоб на ЖКТ нет, но есть першение и ком в горле", + "full": "На момент обращения пациент предъявляет жалобы на: першение в горле и чувство кома в горле. Жалоб на желудочно-кишечный тракт нет." + }, + { + "short": "ОРВИ, чихание, водянистый насморк", + "full": "На момент обращения пациент предъявляет жалобы на: чихание и водянистый насморк. Переносит ОРВИ." + }, + { + "short": "Жалоб на слух нет, но есть аутофония", + "full": "На момент обращения пациент предъявляет жалобы на: аутофонию. Жалоб на снижение слуха нет." + }, + { + "short": "Жал. на заложен. прав. уха, шум 2 нед.", + "full": "Пациент жалуется на стойкую заложенность правого уха и постоянный шум в нём, которые появились около двух недель назад. Отмечает, что шум не зависит от положения тела и не усиливается в тишине. Самостоятельно не применял никаких препаратов. К ЛОР‑врачу обратился впервые по данному поводу. Сопутствующих заболеваний не имеет. Аллергологический анамнез не отягощён." + }, + { + "short": "Перенёс ОРВИ 3 нед. назад, с тех пор сниж. слух лев. уха", + "full": "Около трёх недель назад пациент перенёс острое респираторное вирусное заболевание. После выздоровления отметил постепенное снижение слуха в левом ухе. Отмечает, что при разговоре по телефону вынужден прикладывать аппарат к правому уху. Не проводил самостоятельного лечения. Ранее по поводу снижения слуха к ЛОР‑врачу не обращался. Хронических заболеваний нет. Аллергии не отмечает." + }, + { + "short": "Гнойн. выдел. из прав. уха 5 дн., темп. 37,8°C", + "full": "В течение пяти дней пациент наблюдает гнойные выделения из правого уха. Сопровождается повышением температуры тела до 37,8 °C. Отмечает умеренную боль в области правого уха, усиливающуюся при надавливании на козелок. Самостоятельно промывал ухо тёплой водой, что не привело к улучшению. К врачу обратился впервые с данной симптоматикой. Хронических ЛОР‑заболеваний не имеет. Аллергических реакций не выявлено." + }, + { + "short": "Периодич. звон в обоих ушах 6 мес.", + "full": "На протяжении шести месяцев пациент периодически испытывает звон в обоих ушах. Звон возникает спонтанно, длится от нескольких минут до часа, затем самостоятельно проходит. Не связывает появление симптома с какими‑либо конкретными факторами (шумом, физической нагрузкой, стрессом). Не применял медикаментозное лечение. Ранее к ЛОР‑врачу по этому поводу не обращался. Сопутствующие заболевания отсутствуют. Аллергоанамнез не отягощён." + }, + { + "short": "Затрудн. носов. дых. 4 мес., чиханье, слиз. выдел.", + "full": "В течение четырёх месяцев пациент испытывает затруднение носового дыхания. Сопровождается частым чиханием и обильными слизистыми выделениями из носа. Отмечает усиление симптомов в утренние часы и при контакте с домашней пылью. Самостоятельно использовал сосудосуживающие капли с кратковременным эффектом. К ЛОР‑врачу обратился впервые. Хронические заболевания отрицает. В анамнезе — аллергическая реакция на пыльцу берёзы." + }, + { + "short": "Боль в горл. 3 дн., темп. 38,5°C, трудн. глотан.", + "full": "Три дня назад появилась интенсивная боль в горле, сопровождающаяся повышением температуры до 38,5 °C и затруднением глотания, особенно при приёме твёрдой пищи. Отмечает общую слабость и головную боль. Самостоятельно полоскал горло солевым раствором без значительного улучшения. К врачу обратился впервые с данными симптомами. Хронических заболеваний ЛОР‑органов не имеет. Аллергии не выявлено." + }, + { + "short": "Повтор. ангина 3 раз за год", + "full": "За последний год пациент трижды перенёс острый тонзиллофарингит (ангину). Каждое обострение сопровождалось высокой температурой (до 39 °C), сильной болью в горле и увеличением шейных лимфоузлов. Проходил курс антибиотикотерапии по назначению врача. Между обострениями чувствует себя удовлетворительно. Хронический тонзиллит не диагностирован. Аллергоанамнез не отягощён." + }, + { + "short": "Сниж. слух прав. уха посл. полётов 2 мес.", + "full": "Два месяца назад после авиаперелёта пациент отметил снижение слуха в правом ухе. Симптом сохраняется до настоящего времени. Отмечает ощущение заложенности и «эха» собственного голоса. Не применял самостоятельное лечение. К ЛОР‑врачу обратился впервые по данному поводу. Хронических заболеваний уха не имеет. Аллергии отсутствуют." + }, + { + "short": "Кров. выдел. из носа утро, 2 нед.", + "full": "На протяжении двух недель по утрам наблюдает незначительные кровянистые выделения из носа. Кровотечения кратковременные, останавливаются самостоятельно. Не связывает с травмой или повышенной физической нагрузкой. Не использовал местные гемостатические средства. К врачу обратился впервые. Хронических заболеваний носоглотки не имеет. Аллергоанамнез не отягощён." + }, + { + "short": "Охрип. голос 10 дн., перш. в горл.", + "full": "В течение десяти дней пациент отмечает охриплость голоса и постоянное першение в горле. Голос становится более осипшим после длительной речевой нагрузки. Отмечает сухость в горле, особенно в утренние часы. Самостоятельно применял пастилки для горла с незначительным облегчением симптомов. К ЛОР‑врачу обратился впервые. Хронических заболеваний гортани не имеет. Аллергии не выявлены." + }, + { + "short": "Головокр. при поворотах гол. 1 мес.", + "full": "В течение месяца пациент испытывает головокружение при резких поворотах головы. Головокружение кратковременное, сопровождается ощущением неустойчивости. Не отмечает шума в ушах или снижения слуха. Не связывается с изменением артериального давления. Самостоятельно не лечился. К врачу обратился впервые. Хронических заболеваний вестибулярного аппарата не имеет. Аллергоанамнез не отягощён." + }, + { + "short": "Сух. корки в носу, затрудн. дых. 3 мес.", + "full": "На протяжении трёх месяцев пациент испытывает сухость в полости носа и образование сухих корок, что приводит к затруднению носового дыхания. Отмечает необходимость регулярного удаления корок для облегчения дыхания. Не применял увлажняющие средства. К ЛОР‑врачу обратился впервые. Хронических ринитов не диагностировано. Аллергии отсутствуют." + }, + { + "short": "Боль в обл. лев. уха при жев., 1 нед.", + "full": "Неделя назад появилась боль в области левого уха, усиливающаяся при жевании и открывании рта. Отмечает, что боль иррадиирует в височную область. Не связывает с перенесённой инфекцией или травмой. Самостоятельно принимал обезболивающие препараты с временным эффектом. К ЛОР‑врачу обратился впервые. Хронических заболеваний уха не имеет. Аллергоанамнез не отягощён." + }, + { + "short": "Част. синусит 2 раз/год послед. 3 года", + "full": "В течение последних трёх лет пациент дважды в год переносит острый синусит. Каждое обострение сопровождается заложенностью носа, гнойными выделениями, головной болью в области лба и повышением температуры. Проходит курс антибиотикотерапии по назначению врача. В периоды между обострениями чувствует себя удовлетворительно. Хронический синусит не диагностирован. Аллергии не выявлены." + }, + { + "short": "Чувств. инород. тела в горл. 2 нед.", + "full": "На протяжении двух недель пациент ощущает инородное тело в горле, преимущественно в области миндалин. Ощущение не зависит от приёма пищи и не сопровождается болью или затруднением глотания. Не отмечал попадания инородного предмета. Самостоятельно не лечился. К ЛОР‑врачу обратился впервые. Хронических заболеваний глотки не имеет. Аллергоанамнез не отягощён." + }, + { + "short": "Насморк, заложен. носа 1 мес., ухудш. ночью", + "full": "В течение месяца пациент страдает от насморка и заложенности носа, которая значительно усиливается в ночное время. Отмечает обильные слизистые выделения, особенно утром. Самостоятельно использовал сосудосуживающие капли с кратковременным эффектом. К врачу обратился впервые. Хронических ринитов не диагностировано. В анамнезе — аллергия на домашнюю пыль." + }, + { + "short": "Шум в лев. ухе посл. конц. громк. муз., 10 дн.", + "full": "Десять дней назад после посещения концерта с громкой музыкой пациент начал ощущать шум в левом ухе. Шум постоянный, высокочастотный, не исчезает в тишине. Не отмечает снижения слуха или боли. Не применял лечение. К ЛОР‑врачу обратился впервые. Хронических заболеваний уха не имеет. Аллергии отсутствуют." + }, + { + "short": "Частые носов. кровотеч. 4 раз за мес.", + "full": "За последний месяц у пациента было четыре эпизода носовых кровотечений. Кровотечения кратковременные, останавливаются самостоятельно или при прикладывании холода. Не связывает с травмой или повышенным артериальным давлением. Не использовал местные гемостатические средства. К врачу обратился впервые. Хронических заболеваний носоглотки не имеет. Аллергоанамнез не отягощён." + } +] \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..7c72183 --- /dev/null +++ b/readme.md @@ -0,0 +1,37 @@ +# Medical Input Helper 🏥 + +Умное приложение для автоматизации ввода медицинских текстов с поддержкой AI. Панель автоматически появляется при клике на поля ввода в любых приложениях (браузеры, текстовые редакторы, EHR системы). + +![Python](https://img.shields.io/badge/Python-3.12+-blue.svg) +![PyQt6](https://img.shields.io/badge/PyQt6-GUI-green.svg) +![AI](https://img.shields.io/badge/AI-LLM_Integrated-orange.svg) + +## ✨ Возможности + +### 🤖 Интеллектуальная обработка текста +- **Автоматическое определение полей ввода** в любых приложениях +- **AI-обработка медицинских текстов** с использованием LLM +- **Поддержка русского языка** и медицинской терминологии +- **Автоматическое форматирование** жалоб и анамнеза + +### 🖱️ Удобный интерфейс +- **Плавающая панель** с автоматическим появлением +- **Drag-and-drop** для текста и изображений +- **Системный трей** для фоновой работы +- **Перетаскиваемые окна** для удобного позиционирования + +### 🏥 Медицинские функции +- **Обработка жалоб пациента** с AI-анализом +- **Форматирование анамнеза заболевания** +- **Подготовка ЛОР-статуса** +- **Генерация медицинских заключений** + +## 🚀 Установка + +### Требования +- Python 3.8 или выше +- 4GB+ оперативной памяти (8GB+ рекомендуется для LLM) + +### Установка зависимостей +```bash +pip install PyQt6 qtawesome uiautomation pyperclip keyboard chromadb llama-cpp-python torch tiktoken psutil pillow requests \ No newline at end of file diff --git a/scripts/drag_n_drop_handler.py b/scripts/drag_n_drop_handler.py new file mode 100644 index 0000000..da9a66d --- /dev/null +++ b/scripts/drag_n_drop_handler.py @@ -0,0 +1,39 @@ +import sys +from PyQt6.QtWidgets import QApplication, QWidget +from PyQt6.QtCore import Qt + +class DropWidget(QWidget): + def __init__(self): + super().__init__() + self.setAcceptDrops(True) + self.resize(400, 300) + self.setWindowTitle("Drag & Drop Monitor") + print("Окно готово к приему перетаскивания. Перетащите что-нибудь сюда.") + + def dragEnterEvent(self, event): + mime_data = event.mimeData() + formats = mime_data.formats() + print("Типы перетаскиваемых данных:", [str(f) for f in formats]) + + if mime_data.hasUrls(): + print("Перетаскиваются файлы или ссылки") + elif mime_data.hasText(): + print("Перетаскивается текст") + elif mime_data.hasImage(): + print("Перетаскивается изображение") + elif mime_data.hasHtml(): + print("Перетаскивается HTML") + else: + print("Неизвестный тип данных") + + event.accept() + + def dropEvent(self, event): + print("Объект сброшен.") + event.accept() + +if __name__ == "__main__": + app = QApplication(sys.argv) + window = DropWidget() + window.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/scripts/input_search.py b/scripts/input_search.py new file mode 100644 index 0000000..a53a55a --- /dev/null +++ b/scripts/input_search.py @@ -0,0 +1,37 @@ +import uiautomation as auto +import time + +def is_editable_focused(): + try: + focused = auto.GetFocusedControl() + if not focused: + return False + + # Проверяем тип элемента + control_type = focused.ControlType + # EditControl — это текстовое поле ввода в Windows UI Automation + if control_type == auto.ControlType.EditControl: + return True + + # Также можно проверить по классу (например, для браузеров) + class_name = focused.ClassName + # Например, Chrome использует класс 'Chrome_RenderWidgetHostHWND' + # Но это менее надёжно; лучше использовать UIA + + return False + except Exception as e: + print(f"Ошибка: {e}") + return False + +def main(): + print("Отслеживание фокуса в текстовых полях...") + last_state = False + while True: + current_state = is_editable_focused() + if current_state and not last_state: + print("Текстовое поле получило фокус!") + last_state = current_state + time.sleep(0.5) # Проверка 2 раза в секунду + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/test.py b/scripts/test.py new file mode 100644 index 0000000..be7d295 --- /dev/null +++ b/scripts/test.py @@ -0,0 +1,12 @@ + +from PIL import Image +import requests +from io import BytesIO +import os + +url = "https://www.k31.ru/uploads/articles/2025-08-15/689f35e92c4cf.jpg" + +response = requests.get(url) +print(response.content) +img = Image.open(BytesIO(response.content)) +img.save(f"D:\\WORK\\EVP_2.0\\SmartIntegration\\data\\{os.path.basename(url)}")