feat: 完善 STEP 一级参数化编辑识别与关系式建模

This commit is contained in:
2026-08-14 18:42:39 +08:00
parent 70b59c1de6
commit a633b5a338
26 changed files with 4676 additions and 77 deletions
+102 -1
View File
@@ -12,13 +12,14 @@ import vtkmodules.vtkInteractionWidgets # noqa: F401
import vtkmodules.vtkInteractionStyle # noqa: F401
import vtkmodules.vtkRenderingFreeType # noqa: F401
import vtkmodules.vtkRenderingOpenGL2 # noqa: F401
from PySide6.QtCore import Qt, QThread, QTimer, Signal, Slot
from PySide6.QtCore import Qt, QThread, QTimer, Signal, Slot, QStringListModel
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import (
QAbstractItemView,
QApplication,
QCheckBox,
QComboBox,
QCompleter,
QFileDialog,
QFrame,
QGridLayout,
@@ -161,6 +162,9 @@ class StepEditorWindow(WindowCoreMixin, WindowStateMixin, WindowActionMixin, Inf
self.selected_face_id: int | None = None
self.selected_edge_id: int | None = None
self.selected_pick_position: tuple[float, float, float] | None = None
self.multi_selected_feature_face_ids: list[int] = []
self.multi_selected_hole_entries: list[dict[str, object]] = []
self.multi_selection_active = False
self.model_actor = None
self.edge_actor = None
@@ -253,6 +257,9 @@ class StepEditorWindow(WindowCoreMixin, WindowStateMixin, WindowActionMixin, Inf
self.pending_scan_kind: str | None = None
self.pending_scan_context: dict[str, object] | None = None
self.scan_wait_cursor_active = False
self.asitus_thread: QThread | None = None
self.asitus_worker: ScanWorker | None = None
self.pending_asitus_context: dict[str, object] | None = None
self.load_in_progress = False
self.load_thread: QThread | None = None
self.load_worker: LoadWorker | None = None
@@ -278,6 +285,8 @@ class StepEditorWindow(WindowCoreMixin, WindowStateMixin, WindowActionMixin, Inf
self.property_editor_selected_row: int | None = None
self.property_command_active_key = ""
self.property_command_buttons: dict[str, QPushButton] = {}
self.relation_formula_items: list[dict[str, object]] = []
self.relation_formula_next_id = 1
self._build_ui()
self._build_vtk()
@@ -879,6 +888,47 @@ class StepEditorWindow(WindowCoreMixin, WindowStateMixin, WindowActionMixin, Inf
QLineEdit#propertyCardTargetEditor:focus {
border-color: #2563eb;
}
QGroupBox#relationFormulaBox {
margin-top: 2px;
}
QLineEdit#relationFormulaInput {
background: #ffffff;
border: 1px solid #b7c6d9;
border-radius: 5px;
color: #172033;
min-height: 24px;
padding: 3px 6px;
}
QLineEdit#relationFormulaInput:focus {
border: 1px solid #2563eb;
}
QPushButton#relationFormulaAddButton,
QPushButton#relationFormulaRemoveButton {
background: #f8fafc;
border: 1px solid #94a3b8;
border-radius: 5px;
color: #1f2937;
font-weight: 700;
min-height: 26px;
padding: 3px 8px;
}
QPushButton#relationFormulaAddButton:hover,
QPushButton#relationFormulaRemoveButton:hover {
background: #eef6ff;
border-color: #2563eb;
color: #1e3a8a;
}
QPushButton#relationFormulaAddButton:disabled,
QPushButton#relationFormulaRemoveButton:disabled {
background: #eef2f6;
border: 1px dashed #bcc7d4;
color: #8f99a8;
}
QListWidget#relationFormulaList {
background: #ffffff;
border: 1px solid #d8e0eb;
border-radius: 5px;
}
QTabWidget::pane {
border: 1px solid #d8e0eb;
border-radius: 6px;
@@ -1237,6 +1287,57 @@ class StepEditorWindow(WindowCoreMixin, WindowStateMixin, WindowActionMixin, Inf
self.property_expand_button.setMaximumHeight(22)
self.property_expand_button.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
object_edit_layout.addWidget(self.property_expand_button)
self.relation_formula_box = QGroupBox("关系式")
self.relation_formula_box.setObjectName("relationFormulaBox")
help_tip(
self.relation_formula_box,
"用 FaceID.参数 = 表达式 的形式建立关系式。第一版会先计算公式并回填当前参数表目标值,再执行参数化建模。",
)
relation_layout = QVBoxLayout(self.relation_formula_box)
relation_layout.setContentsMargins(6, 8, 6, 6)
relation_layout.setSpacing(5)
relation_input_row = QHBoxLayout()
relation_input_row.setContentsMargins(0, 0, 0, 0)
relation_input_row.setSpacing(5)
self.relation_formula_input = QLineEdit("")
self.relation_formula_input.setObjectName("relationFormulaInput")
self.relation_formula_input.setPlaceholderText("Face87.直径 = Face85.直径")
help_tip(
self.relation_formula_input,
"示例:Face87.直径 = Face85.直径,或 Face87.位置 = Face85.位置 + (0, 0, -3.5)。输入 Face87. 后会提示当前可用参数。",
)
self.relation_formula_completer_model = QStringListModel(self)
self.relation_formula_completer = QCompleter(self.relation_formula_completer_model, self)
self.relation_formula_completer.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
self.relation_formula_completer.setCompletionMode(QCompleter.CompletionMode.PopupCompletion)
self.relation_formula_input.setCompleter(self.relation_formula_completer)
self.relation_formula_input.installEventFilter(self)
self.relation_formula_input.textChanged.connect(self._on_relation_formula_input_changed)
self.relation_formula_input.returnPressed.connect(self.add_relation_formula)
self.add_relation_formula_button = QPushButton("添加公式")
self.add_relation_formula_button.setObjectName("relationFormulaAddButton")
self.add_relation_formula_button.clicked.connect(self.add_relation_formula)
relation_input_row.addWidget(self.relation_formula_input, stretch=1)
relation_input_row.addWidget(self.add_relation_formula_button)
relation_layout.addLayout(relation_input_row)
self.relation_formula_list = QListWidget()
self.relation_formula_list.setObjectName("relationFormulaList")
self.relation_formula_list.setMinimumHeight(54)
self.relation_formula_list.setMaximumHeight(86)
self.relation_formula_list.itemSelectionChanged.connect(self._update_relation_formula_buttons)
help_tip(self.relation_formula_list, "已建立的关系式。失效或暂不能映射的公式会在这里标出原因。")
relation_layout.addWidget(self.relation_formula_list)
relation_button_row = QHBoxLayout()
relation_button_row.setContentsMargins(0, 0, 0, 0)
relation_button_row.addStretch(1)
self.remove_relation_formula_button = QPushButton("删除公式")
self.remove_relation_formula_button.setObjectName("relationFormulaRemoveButton")
self.remove_relation_formula_button.clicked.connect(self.remove_selected_relation_formula)
relation_button_row.addWidget(self.remove_relation_formula_button)
relation_layout.addLayout(relation_button_row)
object_edit_layout.addWidget(self.relation_formula_box)
property_action_row = QHBoxLayout()
property_action_row.setContentsMargins(0, 0, 0, 0)
self.apply_property_button = QPushButton("参数化建模")