ну вроде чуть поменьше тормозит, но все равно неприятно. надо еще подумать

This commit is contained in:
Razvalyaev 2025-07-13 22:47:33 +03:00
parent 21082a38e0
commit 02f3124224
6 changed files with 133 additions and 110 deletions

View File

@ -149,7 +149,6 @@ class VariableSelectorDialog(QDialog):
self.selected_vars_widget.filter_tree()
def on_add_clicked(self):
# Получаем все переменные из правой таблицы (selected_vars_widget)
var_names = self.selected_vars_widget.get_all_var_names()

View File

@ -123,6 +123,7 @@ class VariableTableWidget(QTableWidget):
pt_combo.setCurrentText(value)
pt_combo.currentTextChanged.connect(on_change_callback)
pt_combo.setStyleSheet(style_with_padding)
pt_combo.wheelEvent = lambda e: e.ignore()
self.setCellWidget(row, rows.pt_type, pt_combo)
# iq_type

View File

@ -5,6 +5,8 @@ from PySide2.QtWidgets import (
)
from PySide2.QtGui import QKeyEvent
from PySide2.QtCore import Qt, QStringListModel
import pickle
import time
# Вспомогательные функции, которые теперь будут использоваться виджетом
def split_path(path):
@ -183,59 +185,30 @@ class VariableSelectWidget(QWidget):
def set_data(self, vars_list):
"""Основной метод для загрузки данных в виджет."""
self.expanded_vars = vars_list
self.expanded_vars = pickle.loads(pickle.dumps(vars_list, protocol=pickle.HIGHEST_PROTOCOL))
# self.build_completion_list() # Если нужна полная перестройка списка
self.populate_tree()
def _get_internal_selected_items(self):
"""Возвращает выделенные элементы и всех их потомков."""
selected = self.tree.selectedItems()
all_items = []
def collect_children(item):
items = [item]
for i in range(item.childCount()):
child = item.child(i)
items.extend(collect_children(child))
return items
for item in selected:
all_items.extend(collect_children(item))
return all_items
def _get_internal_selected_var_names(self):
"""Возвращает имена выделенных переменных."""
return [item.text(0) for item in self._get_internal_selected_items() if item.text(0)]
def get_selected_items(self):
"""Возвращает только конечные (leaf) выделенные элементы, исключая bitfield."""
selected = self.tree.selectedItems()
leaf_items = []
for item in selected:
# Проверка: если нет выбранных/видимых детей — это лист
if all(item.child(i).isHidden() or not item.child(i).isSelected() for i in range(item.childCount())):
item_type = item.data(0, Qt.UserRole)
if item_type and 'bitfield' in str(item_type).lower():
continue # Пропускаем битовые поля
leaf_items.append(item)
return leaf_items
def get_selected_var_names(self):
"""Возвращает имена только конечных (leaf) переменных из выделенных."""
return [item.text(0) for item in self.get_selected_items() if item.text(0)]
def populate_tree(self, vars_list=None):
if vars_list is None:
vars_list = self.expanded_vars
self.tree.setUpdatesEnabled(False)
self.tree.blockSignals(True)
self.tree.clear()
self.node_index.clear()
start_add = time.perf_counter()
stats = {'count': 0, 'time': 0.0}
for var in vars_list:
self.add_tree_item_recursively(None, var)
self.add_tree_item_recursively(None, var, stats)
end_add = time.perf_counter()
print(f" add items: {end_add - start_add:.6f} s")
print(f" └ recursive only: {stats['time']:.6f} s")
print(f" └ total items: {stats['count']} шт")
self.tree.setUpdatesEnabled(True)
self.tree.blockSignals(False)
header = self.tree.header()
header.setSectionResizeMode(QHeaderView.Interactive) # вручную можно менять
self.tree.setColumnWidth(0, 400)
@ -253,41 +226,42 @@ class VariableSelectWidget(QWidget):
return fullname
def add_tree_item_recursively(self, parent, var):
"""
Рекурсивно добавляет переменную и её дочерние поля в дерево.
Если parent == None, добавляет на верхний уровень.
"""
name = var['name']
type_str = var.get('type', '')
show_var = var.get('show_var', 'false') == 'true'
def add_tree_item_recursively(self, parent, var, stats=None, parent_path=""):
if stats is None:
stats = {'count': 0, 'time': 0.0}
start = time.perf_counter()
name = var['name']
full_name = f"{parent_path}.{name}" if parent_path else name
full_name = full_name.replace('->', '.') # если нужно
type_str = var.get('type', '')
item = QTreeWidgetItem([name, type_str])
item.setData(0, Qt.UserRole, name)
full_name = self.get_full_item_name(item)
self.node_index[full_name.lower()] = item
# Делаем bitfield-поля неактивными
if "(bitfield:" in type_str:
item.setDisabled(True)
item.setDisabled(True)
self.set_tool(item, "Битовые поля недоступны для выбора")
for i, attr in enumerate(['file', 'extern', 'static']):
item.setData(0, Qt.UserRole + 1 + i, var.get(attr))
if show_var:
item.setForeground(0, Qt.gray)
item.setForeground(1, Qt.gray)
self.set_tool(item, "Уже добавлена")
if parent is None:
self.tree.addTopLevelItem(item)
else:
parent.addChild(item)
stats['count'] += 1
for child in var.get('children', []):
self.add_tree_item_recursively(item, child)
self.add_tree_item_recursively(item, child, stats, parent_path=full_name)
end = time.perf_counter()
stats['time'] += end - start
return stats
def filter_tree(self):
text = self.search_input.text().strip().lower()
@ -309,8 +283,6 @@ class VariableSelectWidget(QWidget):
def find_node_by_path(self, root_vars, path_list):
current_level = root_vars
node = None
@ -574,3 +546,45 @@ class VariableSelectWidget(QWidget):
def get_all_var_names(self):
"""Возвращает имена всех конечных (leaf) переменных, исключая битовые поля и группы."""
return [item.text(0) for item in self.get_all_items() if item.text(0)]
def _get_internal_selected_items(self):
"""Возвращает выделенные элементы и всех их потомков."""
selected = self.tree.selectedItems()
all_items = []
def collect_children(item):
items = [item]
for i in range(item.childCount()):
child = item.child(i)
items.extend(collect_children(child))
return items
for item in selected:
all_items.extend(collect_children(item))
return all_items
def _get_internal_selected_var_names(self):
"""Возвращает имена выделенных переменных."""
return [item.text(0) for item in self._get_internal_selected_items() if item.text(0)]
def get_selected_items(self):
"""Возвращает только конечные (leaf) выделенные элементы, исключая bitfield."""
selected = self.tree.selectedItems()
leaf_items = []
for item in selected:
# Проверка: если нет выбранных/видимых детей — это лист
if all(item.child(i).isHidden() or not item.child(i).isSelected() for i in range(item.childCount())):
item_type = item.data(0, Qt.UserRole)
if item_type and 'bitfield' in str(item_type).lower():
continue # Пропускаем битовые поля
leaf_items.append(item)
return leaf_items
def get_selected_var_names(self):
"""Возвращает имена только конечных (leaf) переменных из выделенных."""
return [item.text(0) for item in self.get_selected_items() if item.text(0)]

View File

@ -6,6 +6,8 @@ from generateVars import map_type_to_pt, get_iq_define, type_map
from enum import IntEnum
import scanVars
import myXML
import pickle
# Вспомогательные функции, которые теперь будут использоваться виджетом
def split_path(path):
@ -543,9 +545,7 @@ def add_to_nested_tree(tree, var, path_parts, full_names=None, depth=0, source_t
def split_vars_by_show_flag(expanded_vars):
from copy import deepcopy
unselected_vars = deepcopy(expanded_vars)
unselected_vars = pickle.loads(pickle.dumps(expanded_vars, protocol=pickle.HIGHEST_PROTOCOL))
selected_vars = []
def find_and_remove(var_list, target_name):

View File

@ -3,34 +3,34 @@
// Èíêëþäû äëÿ äîñòóïà ê ïåðåìåííûì
#include "vector.h"
#include "RS_Functions_modbus.h"
#include "v_pwm24.h"
#include "f281xpwm.h"
#include "xp_project.h"
#include "adc_tools.h"
#include "errors.h"
#include "xp_write_xpwm_time.h"
#include "log_can.h"
#include "RS_Functions_modbus.h"
#include "pwm_vector_regul.h"
#include "errors.h"
#include "rotation_speed.h"
#include "teta_calc.h"
#include "v_pwm24.h"
#include "vector.h"
#include "adc_tools.h"
#include "log_can.h"
#include "xp_write_xpwm_time.h"
#include "dq_to_alphabeta_cos.h"
#include "RS_Functions.h"
#include "x_serial_bus.h"
#include "svgen_dq.h"
#include "x_parallel_bus.h"
#include "x_serial_bus.h"
#include "xPeriphSP6_loader.h"
#include "Spartan2E_Functions.h"
#include "xp_controller.h"
#include "xp_rotation_sensor.h"
#include "xPeriphSP6_loader.h"
#include "RS_Functions.h"
#include "detect_phase_break2.h"
#include "CRC_Functions.h"
#include "CAN_Setup.h"
#include "log_params.h"
#include "log_to_memory.h"
#include "global_time.h"
#include "pid_reg3.h"
#include "svgen_dq.h"
#include "log_params.h"
#include "CRC_Functions.h"
#include "global_time.h"
#include "CAN_Setup.h"
#include "log_to_memory.h"
#include "IQmathLib.h"
#include "doors_control.h"
#include "isolation.h"
@ -261,6 +261,7 @@ extern T_controller_read r_controller;
extern FIFO refo;
extern TMS_TO_TERMINAL_STRUCT reply;
extern TMS_TO_TERMINAL_TEST_ALL_STRUCT reply_test_all;
extern long return_var;
extern RMP_MY1 rmp_freq;
extern RMP_MY1 rmp_wrot;
extern T_rotation_sensor rotation_sensor;
@ -296,6 +297,7 @@ extern int time_pause_logs;
extern int time_pause_titles;
extern volatile int tryNumb;
extern UNITES_CAN_SETUP unites_can_setup;
extern long var_numb;
extern VECTOR_CONTROL vect_control;
extern WaterCooler water_cooler;
extern _iq winding_displacement;
@ -312,26 +314,33 @@ extern int zero_ADC[20];
// Îïðåäåëåíèå ìàññèâà ñ óêàçàòåëÿìè íà ïåðåìåííûå äëÿ îòëàäêè
int DebugVar_Qnt = 19;
int DebugVar_Qnt = 26;
#pragma DATA_SECTION(dbg_vars,".dbgvar_info")
DebugVar_t dbg_vars[] = {\
{(char *)&ADC0finishAddr, pt_int16, t_iq_none, t_iq_none, "ADC0EndAdr" }, \
{(char *)&ADC_f[0][0], pt_int16, t_iq_none, t_iq_none, "ADC_f00" }, \
{(char *)&ADC_f[0][1], pt_int16, t_iq_none, t_iq_none, "ADC_f01" }, \
{(char *)&ADC_f[0][2], pt_int16, t_iq_none, t_iq_none, "ADC_f02" }, \
{(char *)&ADC_f[0][3], pt_int16, t_iq_none, t_iq_none, "ADC_f03" }, \
{(char *)&ADC_f[0][4], pt_int16, t_iq_none, t_iq_none, "ADC_f04" }, \
{(char *)&ADC_f[0][5], pt_int16, t_iq_none, t_iq_none, "ADC_f05" }, \
{(char *)&ADC_f[0][6], pt_int16, t_iq_none, t_iq_none, "ADC_f06" }, \
{(char *)&ADC_f[0][7], pt_int16, t_iq, t_iq_none, "ADC_f07" }, \
{(char *)&ADC_f[0][8], pt_int16, t_iq_none, t_iq_none, "ADC_f08" }, \
{(char *)&ADC_f[0][9], pt_int16, t_iq_none, t_iq_none, "ADC_f09" }, \
{(char *)&ADC_f[0][10], pt_int16, t_iq_none, t_iq_none, "ADC_f010" }, \
{(char *)&ADC_f[0][11], pt_int16, t_iq_none, t_iq_none, "ADC_f011" }, \
{(char *)&ADC_f[0][12], pt_int16, t_iq_none, t_iq_none, "ADC_f012" }, \
{(char *)&ADC_f[0][13], pt_int16, t_iq_none, t_iq_none, "ADC_f013" }, \
{(char *)&ADC_f[0][14], pt_int16, t_iq_none, t_iq_none, "ADC_f014" }, \
{(char *)&ADC_f[0][15], pt_int16, t_iq_none, t_iq_none, "ADC_f015" }, \
{(char *)&project.cds_tk[2].read.sbus.mask_protect_tk.all, pt_uint16, t_iq_none, t_iq_none, "tk2_ackcur" }, \
{(char *)&project.cds_tk[1].plane_address, pt_uint16, t_iq_none, t_iq_none, "tk1_adr" }, \
{(char *)&ADC0finishAddr, pt_int16, t_iq_none, t_iq_none, "ADC0finish" }, \
{(char *)&ADC_f[0][11], pt_int32, t_iq_none, t_iq_none, "ADC_f[0][1" }, \
{(char *)&ADC_f[0][12], pt_int16, t_iq_none, t_iq_none, "ADC_f[0][1" }, \
{(char *)&ADC_f[0][13], pt_int32, t_iq_none, t_iq_none, "ADC_f[0][1" }, \
{(char *)&ADC_f[0][14], pt_int16, t_iq_none, t_iq_none, "ADC_f[0][1" }, \
{(char *)&ADC_f[0][15], pt_int16, t_iq_none, t_iq_none, "ADC_f[0][1" }, \
{(char *)&ADC_f[1][0], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][0" }, \
{(char *)&ADC_f[1][1], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \
{(char *)&ADC_f[1][2], pt_int64, t_iq_none, t_iq_none, "ADC_f[1][2" }, \
{(char *)&ADC_f[1][3], pt_int32, t_iq_none, t_iq_none, "ADC_f[1][3" }, \
{(char *)&ADC_f[1][4], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][4" }, \
{(char *)&ADC_f[1][5], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][5" }, \
{(char *)&ADC_f[1][6], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][6" }, \
{(char *)&ADC_f[1][7], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][7" }, \
{(char *)&ADC_f[1][8], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][8" }, \
{(char *)&ADC_f[1][9], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][9" }, \
{(char *)&ADC_f[1][10], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \
{(char *)&ADC_f[1][11], pt_int16, t_iq1, t_iq_none, "ADC_f[1][1" }, \
{(char *)&ADC_f[1][12], pt_int32, t_iq_none, t_iq_none, "ADC_f[1][1" }, \
{(char *)&ADC_f[1][13], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \
{(char *)&ADC_f[1][14], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \
{(char *)&ADC_f[1][15], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \
{(char *)&project.cds_in[0].plane_address, pt_uint16, t_iq_none, t_iq_none, "project.cd" }, \
{(char *)&Bender[0].KOhms, pt_uint16, t_iq_none, t_iq_none, "Bender[0]." }, \
{(char *)&Bender[0].Times, pt_uint16, t_iq_none, t_iq_none, "Bender[0]." }, \
{(char *)&Bender[0].Error.all, pt_uint16, t_iq_none, t_iq_none, "Bender[0]." }, \
};

View File

@ -2,12 +2,12 @@
<analysis proj_path="E:/.WORK/TMS/TMS_new_bus" makefile_path="Debug/makefile" structs_path="Src/DebugTools/structs.xml">
<variables>
<var name="ADC0finishAddr">
<show_var>false</show_var>
<enable>false</enable>
<show_var>true</show_var>
<enable>true</enable>
<shortname>ADC0finishAddr</shortname>
<pt_type>pt_int16</pt_type>
<iq_type>t_iq_none</iq_type>
<return_type>int</return_type>
<return_type>t_iq_none</return_type>
<type>int</type>
<file>Src/myXilinx/x_example_all.c</file>
<extern>false</extern>
@ -3737,7 +3737,7 @@
<show_var>true</show_var>
<enable>true</enable>
<shortname>ADC_f[0][13]</shortname>
<pt_type>pt_int32</pt_type>
<pt_type>pt_int16</pt_type>
<iq_type>t_iq_none</iq_type>
<return_type>t_iq_none</return_type>
<type>int</type>
@ -3797,7 +3797,7 @@
<show_var>true</show_var>
<enable>true</enable>
<shortname>ADC_f[1][2]</shortname>
<pt_type>pt_int64</pt_type>
<pt_type>pt_int16</pt_type>
<iq_type>t_iq_none</iq_type>
<return_type>t_iq_none</return_type>
<type>int</type>
@ -3809,7 +3809,7 @@
<show_var>true</show_var>
<enable>true</enable>
<shortname>ADC_f[1][3]</shortname>
<pt_type>pt_int32</pt_type>
<pt_type>pt_int16</pt_type>
<iq_type>t_iq_none</iq_type>
<return_type>t_iq_none</return_type>
<type>int</type>
@ -3906,7 +3906,7 @@
<enable>true</enable>
<shortname>ADC_f[1][11]</shortname>
<pt_type>pt_int16</pt_type>
<iq_type>t_iq1</iq_type>
<iq_type>t_iq_none</iq_type>
<return_type>t_iq_none</return_type>
<type>int</type>
<file>Src/main/adc_tools.c</file>
@ -3917,7 +3917,7 @@
<show_var>true</show_var>
<enable>true</enable>
<shortname>ADC_f[1][12]</shortname>
<pt_type>pt_int32</pt_type>
<pt_type>pt_int16</pt_type>
<iq_type>t_iq_none</iq_type>
<return_type>t_iq_none</return_type>
<type>int</type>