"""Необязательные известные элементы последовательного эквивалента RLC.""" # Ввод не смешивает номиналы реального RC-снаббера с параметрами идентифицируемых полюсов. try: # Поддерживаем современные и совместимые Windows-сборки. from PySide6.QtCore import Signal # Одно изменение любого элемента делает старый подбор моделей неактуальным. from PySide6.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QWidget # Используем стандартные числовые поля Qt6. except ImportError: # Qt5 получает тот же интерфейс без дополнительных зависимостей. from PySide2.QtCore import Signal # Контракт сигналов одинаков на Windows 7 и новых системах. from PySide2.QtWidgets import QDoubleSpinBox, QHBoxLayout, QLabel, QWidget # Набор полей и единицы не зависят от версии Qt. class CircuitParameters(QWidget): # Компонент можно встроить в подробные параметры любого вида сравнения. changed = Signal() # Владелец решает, запускать ли автоматический пересчёт или ожидать кнопку. def __init__(self, parent=None): # По умолчанию ни один электрический элемент не предполагается известным. super().__init__(parent) # Жизненным циклом компонента управляет родительская панель сравнения. row = QHBoxLayout(self) # Три поля и пояснение занимают одну строку. row.setContentsMargins(0, 0, 0, 0) # Сохраняем существующие отступы формы. row.addWidget(QLabel('Эквивалентный последовательный RLC:')) # Явно называем топологию, к которой относятся формулы R/L и LC. self.inductance, self.capacitance, self.resistance = QDoubleSpinBox(), QDoubleSpinBox(), QDoubleSpinBox() # Отдельное неизвестное значение разрешено у каждого элемента. self.controls = (self.inductance, self.capacitance, self.resistance) # Общий список позволяет блокировать ввод во время рабочего задания. for title, box, suffix in (('L', self.inductance, ' нГн'), ('C', self.capacitance, ' нФ'), ('R', self.resistance, ' Ом')): # Удобные единицы соответствуют обычным масштабам коммутационного контура. row.addWidget(QLabel(title)) # Подпись отделяет физическую величину от единицы в поле. box.setDecimals(6) # Дробные нГн, нФ и Ом сохраняются без грубого округления. box.setRange(0., 1e12) # Ноль означает неизвестное значение; отрицательные пассивные элементы не допускаются. box.setSpecialValueText('неизвестно') # Не скрываем отсутствие исходных электрических данных за произвольным номиналом. box.setSuffix(suffix) # Единица видна при вводе любого положительного значения. box.setMaximumWidth(170) # Ширина в логических пикселях оставляет место всем трём элементам. box.setToolTip('Введите известный элемент последовательного эквивалента. Ноль — неизвестно. Это не автоматическая модель топологии RC-снаббера.') # Объяснение предотвращает неверную интерпретацию восстановленных номиналов. box.valueChanged.connect(lambda _value: self.changed.emit()) # Любое изменение требует нового численного подбора и отчёта. row.addWidget(box) # Поля располагаются в порядке L, C и R. row.addStretch(1) # Свободная ширина не растягивает числовые поля. def values(self): # Снимок значений фиксируется до запуска фоновой идентификации. return dict(inductance_h=self.inductance.value() * 1e-9, capacitance_f=self.capacitance.value() * 1e-9, resistance_ohm=self.resistance.value()) # нГн и нФ переводятся в СИ; Ом уже соответствует внутренним формулам.