ну вроде чуть поменьше тормозит, но все равно неприятно. надо еще подумать
This commit is contained in:
parent
21082a38e0
commit
02f3124224
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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)]
|
||||
|
||||
|
@ -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):
|
||||
|
81
debug_vars.c
81
debug_vars.c
@ -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]." }, \
|
||||
};
|
||||
|
16
vars.xml
16
vars.xml
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user