This commit is contained in:
2026-01-22 00:06:13 +08:00
parent f26fc95ea3
commit ed7476e54b
316 changed files with 4962 additions and 14039 deletions

View File

@@ -19,7 +19,7 @@ def show(parent):
layout = QtWidgets.QVBoxLayout()
layout.addStretch()
layout.addWidget(QtWidgets.QLabel("<h1>ngSkinTools</h1>"))
layout.addWidget(QtWidgets.QLabel("Version {0}".format(version.pluginVersion())))
layout.addWidget(QtWidgets.QLabel("当前版本 {0}".format(version.pluginVersion())))
layout.addWidget(QtWidgets.QLabel(version.COPYRIGHT))
url = QtWidgets.QLabel('<a href="{0}" style="color: #007bff;">{0}</a>'.format(version.PRODUCT_URL))
@@ -65,7 +65,7 @@ def show(parent):
def buttonsRow(window):
layout = QtWidgets.QHBoxLayout()
layout.addStretch()
btnClose = QtWidgets.QPushButton("Close")
btnClose = QtWidgets.QPushButton("退出")
btnClose.setMinimumWidth(100 * scale_multiplier)
layout.addWidget(btnClose)
layout.setContentsMargins(20 * scale_multiplier, 15 * scale_multiplier, 20 * scale_multiplier, 15 * scale_multiplier)
@@ -76,7 +76,7 @@ def show(parent):
window = QtWidgets.QWidget(parent, Qt.Window | Qt.WindowTitleHint | Qt.CustomizeWindowHint)
window.resize(600 * scale_multiplier, 500 * scale_multiplier)
window.setAttribute(Qt.WA_DeleteOnClose)
window.setWindowTitle("About ngSkinTools")
window.setWindowTitle("关于 ngSkinTools")
layout = QtWidgets.QVBoxLayout()
window.setLayout(layout)
layout.setContentsMargins(0, 0, 0, 0)

View File

@@ -35,7 +35,7 @@ def build_action_delete_custom_nodes_for_selection(parent, session):
result = define_action(
parent,
"Delete Custom Nodes For Selection",
"删除选中网格的Ng节点",
callback=lambda: removeLayerData.remove_custom_nodes_from_selection(interactive=True, session=session),
)
@@ -86,7 +86,7 @@ class Actions(Object):
self.toolsUnifyWeights, self.toolsUnifyWeightsOptions = tools.create_action__unify_weights(parent, session)
self.toolsDeleteCustomNodes = define_action(
parent, "Delete All Custom Nodes", callback=lambda: removeLayerData.remove_custom_nodes(interactive=True, session=session)
parent, "删除所有网格的Ng节点", callback=lambda: removeLayerData.remove_custom_nodes(interactive=True, session=session)
)
self.toolsDeleteCustomNodesOnSelection = build_action_delete_custom_nodes_for_selection(parent, session)
@@ -135,10 +135,10 @@ class Actions(Object):
context.addAction(self.toggle_layer_enabled)
def addInfluencesActions(self, context):
context.addAction(self.separator(context, "Actions"))
context.addAction(self.separator(context, "动作"))
context.addAction(self.toolsAssignFromClosestJointSelectedInfluences)
context.addAction(self.select_affected_vertices)
context.addAction(self.separator(context, "Clipboard"))
context.addAction(self.separator(context, "剪贴板"))
context.addAction(self.cut_influences)
context.addAction(self.copy_influences)
context.addAction(self.paste_weights)

View File

@@ -36,7 +36,7 @@ def open_as_dialog(parent, matcher, result_callback):
window.close()
def save_defaults():
if not yesNo("Save current settings as default?"):
if not yesNo("将当前设置保存为默认设置?"):
return
config.mirrorInfluencesDefaults = matcher.config.as_json()
@@ -47,18 +47,18 @@ def open_as_dialog(parent, matcher, result_callback):
return widgets.button_row(
[
("Apply", apply),
("Cancel", window.close),
("应用", apply),
("取消", window.close),
],
side_menu=[
("Save As Default", save_defaults),
("Load Defaults", load_defaults),
("储存为默认值", save_defaults),
("加载默认值", load_defaults),
],
)
window = QtWidgets.QDialog(parent)
cleanup.registerCleanupHandler(window.close)
window.setWindowTitle("Influence Mirror Mapping")
window.setWindowTitle("影响镜像映射")
window.setAttribute(QtCore.Qt.WA_DeleteOnClose)
window.resize(720 * scale_multiplier, 500 * scale_multiplier)
window.setLayout(QtWidgets.QVBoxLayout())
@@ -102,10 +102,10 @@ def build_ui(parent, matcher):
split_path = path.rsplit("|", 1)
parent_path, name = split_path if len(split_path) == 2 else ["", split_path[0]]
item = QtWidgets.QTreeWidgetItem([name, '-', '(not in skin cluster)' if is_intermediate else '?'])
item = QtWidgets.QTreeWidgetItem([name, '-', '(不在皮肤簇中)' if is_intermediate else '?'])
tree_items[path] = item
parent_item = None if parent_path == "" else find_item(parent_path, True)
parent_item = None if parent_path is "" else find_item(parent_path, True)
if parent_item is not None:
parent_item.addChild(item)
@@ -142,7 +142,7 @@ def build_ui(parent, matcher):
def pattern():
result = QtWidgets.QTableWidget()
result.setColumnCount(2)
result.setHorizontalHeaderLabels(["Pattern", "Opposite"] if mirror_mode else ["Source", "Destination"])
result.setHorizontalHeaderLabels(["", ""] if mirror_mode else ["来源", "目标"])
result.setEditTriggers(QtWidgets.QTableWidget.AllEditTriggers)
result.verticalHeader().setVisible(False)
@@ -209,12 +209,12 @@ def build_ui(parent, matcher):
def automaticRules():
form = QtWidgets.QFormLayout()
use_joint_names = QtWidgets.QCheckBox("Match by joint name")
use_joint_names = QtWidgets.QCheckBox("匹配骨骼名称")
naming_patterns = pattern()
use_position = QtWidgets.QCheckBox("Match by position")
use_position = QtWidgets.QCheckBox("匹配位置")
tolerance_scroll = tolerance()
use_joint_labels = QtWidgets.QCheckBox("Match by joint label")
use_dg_links = QtWidgets.QCheckBox("Match by dependency graph links")
use_joint_labels = QtWidgets.QCheckBox("匹配骨骼标签")
use_dg_links = QtWidgets.QCheckBox("匹配依存关系图连接")
def update_enabled_disabled():
def enable_form_row(form_item, e):
@@ -260,27 +260,27 @@ def build_ui(parent, matcher):
use_dg_links.setChecked(matcher.config.use_dg_link_matching)
update_enabled_disabled()
g = QtWidgets.QGroupBox("Rules")
g = QtWidgets.QGroupBox("规则")
g.setLayout(form)
form.addRow(use_dg_links)
form.addRow("Attribute name:", dg_attribute)
form.addRow("属性名称:", dg_attribute)
form.addRow(use_joint_labels)
form.addRow(use_joint_names)
form.addRow("Naming scheme:", naming_patterns)
form.addRow("命名方案:", naming_patterns)
form.addRow(use_position)
form.addRow("Position tolerance:", tolerance_scroll.layout())
form.addRow("位置容差:", tolerance_scroll.layout())
update_values()
return g
def scriptedRules():
g = QtWidgets.QGroupBox("Scripted rules")
g = QtWidgets.QGroupBox("脚本规则")
g.setLayout(QtWidgets.QVBoxLayout())
g.layout().addWidget(QtWidgets.QLabel("TODO"))
return g
def manualRules():
g = QtWidgets.QGroupBox("Manual overrides")
g = QtWidgets.QGroupBox("手动覆盖")
g.setLayout(QtWidgets.QVBoxLayout())
g.layout().addWidget(QtWidgets.QLabel("TODO"))
return g
@@ -302,7 +302,7 @@ def build_ui(parent, matcher):
def createMappingView():
view = QtWidgets.QTreeWidget()
view.setColumnCount(3)
view.setHeaderLabels(["Source", "Destination", "Matched by rule"])
view.setHeaderLabels(["来源", "目标", "按规则匹配"])
view.setIndentation(7)
view.setExpandsOnDoubleClick(False)
@@ -316,14 +316,14 @@ def build_ui(parent, matcher):
:type mapping: dict[InfluenceInfo, InfluenceInfo]
"""
for treeItem in list(usedItems.values()):
treeItem.setText(1, "(not matched)")
treeItem.setText(1, "(不匹配)")
treeItem.setText(2, "")
for k, v in list(mapping.items()):
treeItem = usedItems.get(k.path_name(), None)
if treeItem is None:
continue
treeItem.setText(1, "(self)" if k == v['infl'] else v["infl"].shortestPath)
treeItem.setText(1, "(自己)" if k == v['infl'] else v["infl"].shortestPath)
treeItem.setText(2, v["matchedRule"])
treeItem.setData(1, linkedItemRole, v["infl"].path)
@@ -343,7 +343,7 @@ def build_ui(parent, matcher):
matches = matcher.calculate()
mappingView_updateMatches(matches)
g = QtWidgets.QGroupBox("Calculated mapping")
g = QtWidgets.QGroupBox("计算映射")
g.setLayout(QtWidgets.QVBoxLayout())
mappingView, mappingView_updateMatches = createMappingView()
g.layout().addWidget(mappingView)

View File

@@ -19,9 +19,9 @@ def build_used_influences_action(parent):
result = actions.define_action(
parent,
"Used Influences Only",
"只显示有权重的影响物",
callback=toggle,
tooltip="If enabled, influences view will only show influences that have weights on current layer",
tooltip="如果启用,影响视图将仅显示当前层上有权重的影响。",
)
@signal.on(config.influences_show_used_influences_only.changed, qtParent=parent)
@@ -46,7 +46,7 @@ def build_set_influences_sorted_action(parent):
parent,
"Show influences sorted",
callback=toggle,
tooltip="Sort influences by name",
tooltip="按名称排序影响",
)
@signal.on(config.influences_show_used_influences_only.changed, qtParent=parent)
@@ -108,7 +108,7 @@ def build_view(parent, actions, session, filter):
targets = (item_id,)
layer.locked_influences = add_or_remove(layer.locked_influences, targets, lock)
log.info("updated locked influences to %r", layer.locked_influences)
log.info("更新锁定的影响为 %r", layer.locked_influences)
session.events.influencesListUpdated.emit()
return handler
@@ -170,14 +170,14 @@ def build_view(parent, actions, session, filter):
view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
view.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
actions.addInfluencesActions(view)
view.addAction(actions.separator(parent, "View Options"))
view.addAction(actions.separator(parent, "显示设置"))
view.addAction(actions.show_used_influences_only)
view.addAction(actions.set_influences_sorted)
view.setIndentation(10 * scale_multiplier)
view.header().setStretchLastSection(False)
view.header().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
view.setHeaderLabels(["Influences", ""])
view.setHeaderLabels(["影响物", ""])
view.header().setSectionResizeMode(1, QtWidgets.QHeaderView.Fixed)
view.setColumnWidth(1, 25 * scale_multiplier)
@@ -208,7 +208,7 @@ def build_view(parent, actions, session, filter):
if not session.state.currentLayer.layer:
build_items(view, [], None)
else:
log.info("current layer changed to %s", session.state.currentLayer.layer)
log.info("当前图层更改为 %s", session.state.currentLayer.layer)
refresh_items()
current_influence_changed()
@@ -217,7 +217,7 @@ def build_view(parent, actions, session, filter):
if session.state.currentLayer.layer is None:
return
log.info("current influence changed - updating item selection")
log.info("当前影响已更改-更新项目选择")
with qt.signals_blocked(view):
targets = session.state.currentLayer.layer.paint_targets
first = True
@@ -239,12 +239,12 @@ def build_view(parent, actions, session, filter):
if not session.state.currentLayer.layer:
return
log.info("focused item changed: %r", get_item_id(curr))
log.info("焦点项已更改: %r", get_item_id(curr))
sync_paint_targets_to_selection()
@qt.on(view.itemSelectionChanged)
def sync_paint_targets_to_selection():
log.info("syncing paint targets")
log.info("同步绘画目标")
selected_ids = [get_item_id(item) for item in view.selectedItems()]
selected_ids = [i for i in selected_ids if i is not None]

View File

@@ -48,12 +48,12 @@ def build_view(parent, actions):
child_layer = item_to_layer(child)
if child_layer.parent_id != parent_layer_id:
log.info("changing layer parent: %r->%r (was %r)", parent_layer_id, child_layer, child_layer.parent_id)
log.info("更改图层父级: %r->%r (was %r)", parent_layer_id, child_layer, child_layer.parent_id)
child_layer.parent = parent_layer_id
new_index = tree_item.childCount() - i - 1
if child_layer.index != new_index:
log.info("changing layer index: %r->%r (was %r)", child_layer, new_index, child_layer.index)
log.info("更改图层索引: %r->%r (was %r)", child_layer, new_index, child_layer.index)
child_layer.index = new_index
sync_item(child, child_layer.id)
@@ -82,7 +82,7 @@ def build_view(parent, actions):
view.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
actions.addLayersActions(view)
view.setHeaderLabels(["Layers", ""])
view.setHeaderLabels(["图层", ""])
# view.setHeaderHidden(True)
view.header().setMinimumSectionSize(1)
view.header().setStretchLastSection(False)
@@ -100,7 +100,7 @@ def build_view(parent, actions):
bar = QtWidgets.QToolBar(parent=parent)
bar.setMovable(False)
bar.setIconSize(QtCore.QSize(visibility_icon_size * scale_multiplier, visibility_icon_size * scale_multiplier))
a = bar.addAction(icon_visible if layer is None or layer.enabled else icon_hidden, "Toggle enabled/disabled")
a = bar.addAction(icon_visible if layer is None or layer.enabled else icon_hidden, "切换 启用/禁用")
@qt.on(a.triggered)
def handler():
@@ -117,11 +117,11 @@ def build_view(parent, actions):
# build map "parent id->list of children "
log.info("syncing items...")
log.info("同步项目q...")
# save selected layers IDs to restore item selection later
selected_layer_ids = {item_to_layer(item).id for item in view.selectedItems()}
log.info("selected layer IDs: %r", selected_layer_ids)
log.info("选择层 IDs: %r", selected_layer_ids)
current_item_id = None if view.currentItem() is None else item_to_layer(view.currentItem()).id
hierarchy = {}
@@ -167,7 +167,7 @@ def build_view(parent, actions):
@signal.on(session.events.layerListChanged, qtParent=view)
def refresh_layer_list():
log.info("event handler for layer list changed")
log.info("图层列表更改的事件处理程序")
if not session.state.layersAvailable:
build_items([])
else:
@@ -177,7 +177,7 @@ def build_view(parent, actions):
@signal.on(session.events.currentLayerChanged, qtParent=view)
def current_layer_changed():
log.info("event handler for currentLayerChanged")
log.info("当前图层更改的事件处理程序")
layer = session.state.currentLayer.layer
current_item = view.currentItem()
if layer is None:
@@ -189,14 +189,14 @@ def build_view(parent, actions):
if prev_layer is None or prev_layer.id != layer.id:
item = tree_items.get(layer.id, None)
if item is not None:
log.info("setting current item to " + item.text(0))
log.info("将当前项目设置为 " + item.text(0))
view.setCurrentItem(item, 0, QtCore.QItemSelectionModel.SelectCurrent | QtCore.QItemSelectionModel.ClearAndSelect)
item.setSelected(True)
@qt.on(view.currentItemChanged)
def current_item_changed(curr, _):
log.info("current item changed")
log.info("当前项目已更改")
if curr is None:
return
@@ -209,7 +209,7 @@ def build_view(parent, actions):
@qt.on(view.itemChanged)
def item_changed(item, column):
log.info("item changed")
log.info("项目已更改")
layers.renameLayer(item_to_layer(item), item.text(column))
@qt.on(view.itemSelectionChanged)
@@ -217,7 +217,7 @@ def build_view(parent, actions):
selection = [item_to_layer(item) for item in view.selectedItems()]
if selection != session.context.selected_layers(default=[]):
log.info("new selected layers: %r", selection)
log.info("新选择图层: %r", selection)
session.context.selected_layers.set(selection)
refresh_layer_list()

View File

@@ -46,20 +46,20 @@ def build_menu(parent, actions):
sub_item.setTearOffEnabled(True)
return sub_item
sub = top_level_menu("File")
sub.addSeparator().setText("Import/Export")
sub = top_level_menu("文件")
sub.addSeparator().setText("导入/导出")
sub.addAction(actions.importFile)
sub.addAction(actions.exportFile)
sub = top_level_menu("Layers")
sub.addSeparator().setText("Layer actions")
sub = top_level_menu("图层")
sub.addSeparator().setText("图层操作")
sub.addAction(actions.initialize)
sub.addAction(actions.import_v1)
actions.addLayersActions(sub)
sub.addSeparator().setText("Copy")
sub.addSeparator().setText("复制")
sub.addAction(actions.transfer)
sub = top_level_menu("Tools")
sub = top_level_menu("工具")
sub.addAction(actions.add_influences)
sub.addAction(actions.toolsAssignFromClosestJoint)
sub.addSeparator()
@@ -68,17 +68,17 @@ def build_menu(parent, actions):
sub.addAction(actions.toolsDeleteCustomNodesOnSelection)
sub.addAction(actions.toolsDeleteCustomNodes)
sub = top_level_menu("View")
sub = top_level_menu("查看")
sub.addAction(actions.show_used_influences_only)
sub = top_level_menu("Help")
sub = top_level_menu("帮助")
sub.addAction(actions.documentation.user_guide)
sub.addAction(actions.documentation.api_root)
sub.addAction(actions.documentation.changelog)
sub.addAction(actions.documentation.contact)
sub.addSeparator()
sub.addAction(actions.check_for_updates)
sub.addAction("About...").triggered.connect(lambda: aboutwindow.show(parent))
sub.addAction("关于...").triggered.connect(lambda: aboutwindow.show(parent))
return menu
@@ -107,11 +107,11 @@ def build_ui(parent):
tabs = QtWidgets.QTabWidget(window)
tabs.addTab(tabPaint.build_ui(tabs, actions), "Paint")
tabs.addTab(tabSetWeights.build_ui(tabs), "Set Weights")
tabs.addTab(tabMirror.build_ui(tabs), "Mirror")
tabs.addTab(tabLayerEffects.build_ui(), "Effects")
tabs.addTab(tabTools.build_ui(actions, session), "Tools")
tabs.addTab(tabPaint.build_ui(tabs, actions), "绘制")
tabs.addTab(tabSetWeights.build_ui(tabs), "设置权重")
tabs.addTab(tabMirror.build_ui(tabs), "镜像")
tabs.addTab(tabLayerEffects.build_ui(), "样式")
tabs.addTab(tabTools.build_ui(actions, session), "工具")
@signal.on(options.current_tab.changed)
def set_current_tab():

View File

@@ -19,4 +19,4 @@ def bind(ui, model):
model.set(ui.value())
else:
raise Exception("could not bind control to model")
raise Exception("无法将控件绑定到模型")

View File

@@ -99,10 +99,10 @@ def save_option(varName, value):
elif is_string(value):
key = 'sv'
else:
raise ValueError("could not save option %s: invalid value %r" % (varName, value))
raise ValueError("无法保存选项 %s: 无效值 %r" % (varName, value))
kvargs = {key: (varName, value)}
log.info("saving optionvar: %r", kvargs)
log.info("保存选项变量: %r", kvargs)
cmds.optionVar(**kvargs)
@@ -153,11 +153,11 @@ class Config(Object):
def __get_value__(self, name, default_value):
result = self.__state__.get(name, default_value)
log.info("config: return %s=%r", name, result)
log.info("配置: return %s=%r", name, result)
return result
def __set_value__(self, name, value):
log.info("config: save %s=%r", name, value)
log.info("配置: save %s=%r", name, value)
self.__state__[name] = value
self.save()

View File

@@ -36,9 +36,9 @@ def build_ui():
def build_properties():
layout = QtWidgets.QVBoxLayout()
opacity = widgets.NumberSliderGroup(tooltip="multiply layer mask to control overall transparency of the layer.")
opacity = widgets.NumberSliderGroup(tooltip="多层蒙版来控制图层的整体透明度.")
opacity.set_value(1.0)
layout.addLayout(createTitledRow("Opacity:", opacity.layout()))
layout.addLayout(createTitledRow("不透明度:", opacity.layout()))
def default_selection_opacity(layers):
if len(layers) > 0:
@@ -65,7 +65,7 @@ def build_ui():
update_values()
group = QtWidgets.QGroupBox("Layer properties")
group = QtWidgets.QGroupBox("图层属性")
group.setLayout(layout)
return group
@@ -76,18 +76,18 @@ def build_ui():
i.effects.configure_mirror(**{option: value})
mirror_direction = QtWidgets.QComboBox()
mirror_direction.addItem("Positive to negative", MirrorOptions.directionPositiveToNegative)
mirror_direction.addItem("Negative to positive", MirrorOptions.directionNegativeToPositive)
mirror_direction.addItem("Flip", MirrorOptions.directionFlip)
mirror_direction.addItem("从正到负", MirrorOptions.directionPositiveToNegative)
mirror_direction.addItem("从负到正", MirrorOptions.directionNegativeToPositive)
mirror_direction.addItem("翻转", MirrorOptions.directionFlip)
mirror_direction.setMinimumWidth(1)
@qt.on(mirror_direction.currentIndexChanged)
def value_changed():
configure_mirror_all_layers("mirror_direction", mirror_direction.currentData())
configure_mirror_all_layers("镜像方向", mirror_direction.currentData())
influences = QtWidgets.QCheckBox("Influence weights")
mask = QtWidgets.QCheckBox("Layer mask")
dq = QtWidgets.QCheckBox("Dual quaternion weights")
influences = QtWidgets.QCheckBox("影响物权重")
mask = QtWidgets.QCheckBox("图层蒙板")
dq = QtWidgets.QCheckBox("双四元数权重")
def configure_checkbox(checkbox, option):
@qt.on(checkbox.stateChanged)
@@ -125,21 +125,21 @@ def build_ui():
return result
layout = QtWidgets.QVBoxLayout()
layout.addLayout(createTitledRow("Mirror effect on:", elements()))
layout.addLayout(createTitledRow("Mirror direction:", mirror_direction))
layout.addLayout(createTitledRow("镜像效果打开:", elements()))
layout.addLayout(createTitledRow("镜像方向:", mirror_direction))
group = QtWidgets.QGroupBox("Mirror")
group = QtWidgets.QGroupBox("镜像")
group.setLayout(layout)
return group
def build_skin_properties():
use_max_influences = QtWidgets.QCheckBox("Limit max influences per vertex")
use_max_influences = QtWidgets.QCheckBox("限制每个顶点的最大影响物")
max_influences = widgets.NumberSliderGroup(min_value=1, max_value=5, tooltip="", value_type=int)
use_prune_weight = QtWidgets.QCheckBox("Prune small weights before writing to skin cluster")
use_prune_weight = QtWidgets.QCheckBox("在写入蒙皮簇之前修剪小权重")
prune_weight = widgets.NumberSliderGroup(decimals=6, min_value=0.000001, max_value=0.05, tooltip="")
prune_weight.set_value(prune_weight.min_value)
prune_weight.set_expo("start", 3)
prune_weight.set_expo("开始", 3)
@signal.on(session.events.targetChanged)
def update_ui():
@@ -164,7 +164,7 @@ def build_ui():
@qt.on(use_max_influences.stateChanged, use_prune_weight.stateChanged)
@signal.on(max_influences.valueChanged, prune_weight.valueChanged)
def update_values():
log.info("updating effects tab")
log.info("更新效果标签页")
if session.state.layersAvailable:
session.state.layers.influence_limit_per_vertex = max_influences.value() if use_max_influences.isChecked() else 0
@@ -174,11 +174,11 @@ def build_ui():
layout = QtWidgets.QVBoxLayout()
layout.addWidget(use_max_influences)
layout.addLayout(createTitledRow("Max influences:", max_influences.layout()))
layout.addLayout(createTitledRow("最大影响物:", max_influences.layout()))
layout.addWidget(use_prune_weight)
layout.addLayout(createTitledRow("Prune below:", prune_weight.layout()))
layout.addLayout(createTitledRow("修剪以下:", prune_weight.layout()))
group = QtWidgets.QGroupBox("Skin Properties")
group = QtWidgets.QGroupBox("蒙皮属性")
group.setLayout(layout)
update_ui()

View File

@@ -16,10 +16,10 @@ def build_ui(parent_window):
def build_mirroring_options_group():
def get_mirror_direction():
mirror_direction = QtWidgets.QComboBox()
mirror_direction.addItem("Guess from stroke", MirrorOptions.directionGuess)
mirror_direction.addItem("Positive to negative", MirrorOptions.directionPositiveToNegative)
mirror_direction.addItem("Negative to positive", MirrorOptions.directionNegativeToPositive)
mirror_direction.addItem("Flip", MirrorOptions.directionFlip)
mirror_direction.addItem("从笔划猜测", MirrorOptions.directionGuess)
mirror_direction.addItem("从正到负", MirrorOptions.directionPositiveToNegative)
mirror_direction.addItem("从负到正", MirrorOptions.directionNegativeToPositive)
mirror_direction.addItem("翻转", MirrorOptions.directionFlip)
mirror_direction.setMinimumWidth(1)
qt.select_data(mirror_direction, config.mirror_direction())
@@ -65,19 +65,19 @@ def build_ui(parent_window):
return seam_width_ctrl.layout()
def elements():
influences = bind_checkbox(QtWidgets.QCheckBox("Influence weights"), config.mirror_weights)
mask = bind_checkbox(QtWidgets.QCheckBox("Layer mask"), config.mirror_mask)
dq = bind_checkbox(QtWidgets.QCheckBox("Dual quaternion weights"), config.mirror_dq)
influences = bind_checkbox(QtWidgets.QCheckBox("影响物权重"), config.mirror_weights)
mask = bind_checkbox(QtWidgets.QCheckBox("图层遮罩"), config.mirror_mask)
dq = bind_checkbox(QtWidgets.QCheckBox("双四元权重"), config.mirror_dq)
return influences, mask, dq
result = QtWidgets.QGroupBox("Mirroring options")
result = QtWidgets.QGroupBox("镜像选项")
layout = QtWidgets.QVBoxLayout()
result.setLayout(layout)
layout.addLayout(createTitledRow("Axis:", axis()))
layout.addLayout(createTitledRow("Direction:", get_mirror_direction()))
layout.addLayout(createTitledRow("Seam width:", mirror_seam_width()))
layout.addLayout(createTitledRow("Elements to mirror:", *elements()))
layout.addLayout(createTitledRow("镜像轴:", axis()))
layout.addLayout(createTitledRow("方向:", get_mirror_direction()))
layout.addLayout(createTitledRow("接缝宽度:", mirror_seam_width()))
layout.addLayout(createTitledRow("镜像要素:", *elements()))
return result
@@ -86,10 +86,10 @@ def build_ui(parent_window):
def mirror_mesh_group():
mesh_name_edit = QtWidgets.QLineEdit("mesh1")
mesh_name_edit.setReadOnly(True)
select_button = QtWidgets.QPushButton("Select")
create_button = QtWidgets.QPushButton("Create")
select_button = QtWidgets.QPushButton("选择")
create_button = QtWidgets.QPushButton("创建")
set_button = QtWidgets.QPushButton("Set")
set_button.setToolTip("Select symmetry mesh and a skinned target first")
set_button.setToolTip("首先选择对称网格和蒙皮目标")
layout = QtWidgets.QHBoxLayout()
layout.addWidget(mesh_name_edit)
@@ -144,13 +144,13 @@ def build_ui(parent_window):
return layout
vertex_mapping_mode = QtWidgets.QComboBox()
vertex_mapping_mode.addItem("Closest point on surface", VertexTransferMode.closestPoint)
vertex_mapping_mode.addItem("UV space", VertexTransferMode.uvSpace)
vertex_mapping_mode.addItem("曲面上最近的点", VertexTransferMode.closestPoint)
vertex_mapping_mode.addItem("UV空间", VertexTransferMode.uvSpace)
result = QtWidgets.QGroupBox("Vertex Mapping")
result = QtWidgets.QGroupBox("顶点映射")
layout = QtWidgets.QVBoxLayout()
layout.addLayout(createTitledRow("Mapping mode:", vertex_mapping_mode))
layout.addLayout(createTitledRow("Symmetry mesh:", mirror_mesh_group()))
layout.addLayout(createTitledRow("映射模式:", vertex_mapping_mode))
layout.addLayout(createTitledRow("对称网格:", mirror_mesh_group()))
result.setLayout(layout)
@qt.on(vertex_mapping_mode.currentIndexChanged)
@@ -166,7 +166,7 @@ def build_ui(parent_window):
def influence_mapping_group():
def edit_mapping():
mapping = QtWidgets.QPushButton("Preview and edit mapping")
mapping = QtWidgets.QPushButton("预览和编辑映射")
single_window_policy = qt.SingleWindowPolicy()
@@ -182,7 +182,7 @@ def build_ui(parent_window):
layout = QtWidgets.QVBoxLayout()
layout.addWidget(edit_mapping())
result = QtWidgets.QGroupBox("Influences mapping")
result = QtWidgets.QGroupBox("影响物映射")
result.setLayout(layout)
return result
@@ -192,7 +192,7 @@ def build_ui(parent_window):
tab.innerLayout.addWidget(influence_mapping_group())
tab.innerLayout.addStretch()
btn_mirror = QtWidgets.QPushButton("Mirror")
btn_mirror = QtWidgets.QPushButton("镜像")
tab.lowerButtonsRow.addWidget(btn_mirror)
@qt.on(btn_mirror.clicked)

View File

@@ -50,14 +50,14 @@ def build_ui(parent, global_actions):
t.addAction(a)
t = QtWidgets.QToolBar()
create_brush_mode_button(t, PaintMode.replace, "Replace", "Whatever")
create_brush_mode_button(t, PaintMode.add, "Add", "")
create_brush_mode_button(t, PaintMode.scale, "Scale", "")
create_brush_mode_button(t, PaintMode.replace, "替换", "替换")
create_brush_mode_button(t, PaintMode.add, "添加", "")
create_brush_mode_button(t, PaintMode.scale, "减少", "")
row.addWidget(t)
t = QtWidgets.QToolBar()
create_brush_mode_button(t, PaintMode.smooth, "Smooth", "")
create_brush_mode_button(t, PaintMode.sharpen, "Sharpen", "")
create_brush_mode_button(t, PaintMode.smooth, "平滑", "")
create_brush_mode_button(t, PaintMode.sharpen, "锐化", "")
row.addWidget(t)
@on_signal(et.tool_settings_changed, scope=row)
@@ -96,9 +96,9 @@ def build_ui(parent, global_actions):
update_to_tool()
qt.on(a.toggled)(toggled)
add_brush_shape_action(':/circleSolid.png', 'Solid', BrushShape.solid, checked=True)
add_brush_shape_action(':/circlePoly.png', 'Smooth', BrushShape.smooth)
add_brush_shape_action(':/circleGaus.png', 'Gaus', BrushShape.gaus)
add_brush_shape_action(':/circleSolid.png', '硬边圆', BrushShape.solid, checked=True)
add_brush_shape_action(':/circlePoly.png', '软边圆', BrushShape.smooth)
add_brush_shape_action(':/circleGaus.png', '喷枪', BrushShape.gaus)
return result
@@ -136,23 +136,23 @@ def build_ui(parent, global_actions):
update_to_tool()
add(
'Surface',
'Using first surface hit under the mouse, update all nearby vertices that are connected by surface to the hit location. '
+ 'Only current shell will be updated.',
'表面',
'绘制由与曲面相连的模型顶点.'
+ '仅更新当前shell.',
BrushProjectionMode.surface,
use_volume=False,
checked=True,
)
add(
'Volume',
'Using first surface hit under the mouse, update all nearby vertices, including those from other shells.',
'体积',
'绘制附近所有模型顶点,包括没有连接的顶点.',
BrushProjectionMode.surface,
use_volume=True,
checked=False,
)
add(
'Screen',
'Use screen projection of a brush, updating all vertices on all surfaces that are within the brush radius.',
'屏幕',
'从屏幕方向投影到笔刷半径内所有曲面上的顶点.',
BrushProjectionMode.screen,
use_volume=False,
checked=False,
@@ -163,53 +163,53 @@ def build_ui(parent, global_actions):
def stylus_pressure_selection():
# noinspection PyShadowingNames
result = QtWidgets.QComboBox()
result.addItem("Unused")
result.addItem("Multiply intensity")
result.addItem("Multiply opacity")
result.addItem("Multiply radius")
result.addItem("未使用")
result.addItem("倍增强度")
result.addItem("倍增不透明度")
result.addItem("倍增半径")
return result
layout = QtWidgets.QVBoxLayout()
layout.addLayout(createTitledRow("Brush projection:", brush_projection_mode_row()))
layout.addLayout(createTitledRow("Brush mode:", brush_mode_row3()))
layout.addLayout(createTitledRow("Brush shape:", brush_shape_row()))
layout.addLayout(createTitledRow("笔刷投影:", brush_projection_mode_row()))
layout.addLayout(createTitledRow("笔刷模式:", brush_mode_row3()))
layout.addLayout(createTitledRow("笔刷形状:", brush_shape_row()))
intensity = widgets.NumberSliderGroup()
radius = widgets.NumberSliderGroup(
max_value=100, tooltip="You can also set brush radius by just holding <b>B</b> " "and mouse-dragging in the viewport"
max_value=100, tooltip="可以通过在视口中按住 <b>B</b> " "并鼠标左键按住拖动来设置笔刷半径"
)
iterations = widgets.NumberSliderGroup(value_type=int, min_value=1, max_value=100)
layout.addLayout(createTitledRow("Intensity:", intensity.layout()))
layout.addLayout(createTitledRow("Brush radius:", radius.layout()))
layout.addLayout(createTitledRow("Brush iterations:", iterations.layout()))
layout.addLayout(createTitledRow("强度:", intensity.layout()))
layout.addLayout(createTitledRow("笔刷半径:", radius.layout()))
layout.addLayout(createTitledRow("笔刷迭代次数:", iterations.layout()))
influences_limit = widgets.NumberSliderGroup(value_type=int, min_value=0, max_value=10)
layout.addLayout(createTitledRow("Influences limit:", influences_limit.layout()))
layout.addLayout(createTitledRow("影响物限制:", influences_limit.layout()))
@signal.on(influences_limit.valueChanged)
def influences_limit_changed():
paint.influences_limit = influences_limit.value()
update_ui()
fixed_influences = QtWidgets.QCheckBox("Only adjust existing vertex influences")
fixed_influences = QtWidgets.QCheckBox("仅调整顶点现有影响物,防止周围权重扩散")
fixed_influences.setToolTip(
"When this option is enabled, smooth will only adjust existing influences per vertex, "
"and won't include other influences from nearby vertices"
"启用此选项后,平滑-将仅调整每个顶点的现有影响物, "
"而不会包含来自附近顶点的影响物,防止周围权重扩散"
)
layout.addLayout(createTitledRow("Weight bleeding:", fixed_influences))
layout.addLayout(createTitledRow("平滑辅助:", fixed_influences))
@qt.on(fixed_influences.stateChanged)
def fixed_influences_changed():
paint.fixed_influences_per_vertex = fixed_influences.isChecked()
limit_to_component_selection = QtWidgets.QCheckBox("Limit to component selection")
limit_to_component_selection.setToolTip("When this option is enabled, smoothing will only happen between selected components")
layout.addLayout(createTitledRow("Isolation:", limit_to_component_selection))
limit_to_component_selection = QtWidgets.QCheckBox("限制在选中组件中平滑")
limit_to_component_selection.setToolTip("启用此选项后,仅在选定组件之间进行平滑")
layout.addLayout(createTitledRow("隔离选中组件:", limit_to_component_selection))
@qt.on(limit_to_component_selection.stateChanged)
def limit_to_component_selection_changed():
paint.limit_to_component_selection = limit_to_component_selection.isChecked()
interactive_mirror = QtWidgets.QCheckBox("Interactive mirror")
interactive_mirror = QtWidgets.QCheckBox("交互式镜像")
layout.addLayout(createTitledRow("", interactive_mirror))
@qt.on(interactive_mirror.stateChanged)
@@ -217,7 +217,7 @@ def build_ui(parent, global_actions):
paint.mirror = interactive_mirror.isChecked()
update_ui()
sample_joint_on_stroke_start = QtWidgets.QCheckBox("Sample current joint on stroke start")
sample_joint_on_stroke_start = QtWidgets.QCheckBox("在笔画开始时取样当前骨骼")
layout.addLayout(createTitledRow("", sample_joint_on_stroke_start))
@qt.on(sample_joint_on_stroke_start.stateChanged)
@@ -225,8 +225,8 @@ def build_ui(parent, global_actions):
paint.sample_joint_on_stroke_start = sample_joint_on_stroke_start.isChecked()
update_ui()
redistribute_removed_weight = QtWidgets.QCheckBox("Distribute to other influences")
layout.addLayout(createTitledRow("Removed weight:", redistribute_removed_weight))
redistribute_removed_weight = QtWidgets.QCheckBox("分配给其它影响物")
layout.addLayout(createTitledRow("移除的权重:", redistribute_removed_weight))
@qt.on(redistribute_removed_weight.stateChanged)
def redistribute_removed_weight_changed():
@@ -234,12 +234,12 @@ def build_ui(parent, global_actions):
update_ui()
stylus = stylus_pressure_selection()
layout.addLayout(createTitledRow("Stylus pressure:", stylus))
layout.addLayout(createTitledRow("手绘板压力:", stylus))
@on_signal(et.tool_settings_changed, scope=layout)
def update_ui():
log.info("updating paint settings ui")
log.info("brush mode:%s, brush shape: %s", paint.mode, paint.brush_shape)
log.info("更新的绘制设置的ui")
log.info("画笔模式:%s, 画笔形状: %s", paint.mode, paint.brush_shape)
paint.update_plugin_brush_radius()
paint.update_plugin_brush_intensity()
@@ -280,7 +280,7 @@ def build_ui(parent, global_actions):
@signal.on(radius.valueChanged, qtParent=layout)
def radius_edited():
log.info("updated brush radius")
log.info("更新笔刷半径")
paint.brush_radius = radius.value()
update_ui()
@@ -301,18 +301,18 @@ def build_ui(parent, global_actions):
update_ui()
result = QtWidgets.QGroupBox("Brush behavior")
result = QtWidgets.QGroupBox("笔刷行为")
result.setLayout(layout)
return result
def build_display_settings():
result = QtWidgets.QGroupBox("Display settings")
result = QtWidgets.QGroupBox("显示设置")
layout = QtWidgets.QVBoxLayout()
influences_display = QtWidgets.QComboBox()
influences_display.addItem("All influences, multiple colors", WeightsDisplayMode.allInfluences)
influences_display.addItem("Current influence, grayscale", WeightsDisplayMode.currentInfluence)
influences_display.addItem("Current influence, colored", WeightsDisplayMode.currentInfluenceColored)
influences_display.addItem("所有权重,多种颜色", WeightsDisplayMode.allInfluences)
influences_display.addItem("当前权重,灰度", WeightsDisplayMode.currentInfluence)
influences_display.addItem("当前权重,彩色", WeightsDisplayMode.currentInfluenceColored)
influences_display.setMinimumWidth(1)
influences_display.setCurrentIndex(paint.display_settings.weights_display_mode)
@@ -327,11 +327,11 @@ def build_ui(parent, global_actions):
display_layout = QtWidgets.QVBoxLayout()
display_layout.addWidget(influences_display)
display_layout.addWidget(display_toolbar)
layout.addLayout(createTitledRow("Influences display:", display_layout))
layout.addLayout(createTitledRow("权重显示:", display_layout))
mask_display = QtWidgets.QComboBox()
mask_display.addItem("Default", MaskDisplayMode.default_)
mask_display.addItem("Color ramp", MaskDisplayMode.color_ramp)
mask_display.addItem("默认", MaskDisplayMode.default_)
mask_display.addItem("彩色渐变", MaskDisplayMode.color_ramp)
mask_display.setMinimumWidth(1)
mask_display.setCurrentIndex(paint.display_settings.weights_display_mode)
@@ -340,14 +340,14 @@ def build_ui(parent, global_actions):
paint.display_settings.mask_display_mode = mask_display.currentData()
update_ui_to_tool()
layout.addLayout(createTitledRow("Mask display:", mask_display))
layout.addLayout(createTitledRow("表面显示:", mask_display))
show_effects = QtWidgets.QCheckBox("Show layer effects")
show_effects = QtWidgets.QCheckBox("显示图层效果")
layout.addLayout(createTitledRow("", show_effects))
show_masked = QtWidgets.QCheckBox("Show masked weights")
show_masked = QtWidgets.QCheckBox("显示蒙皮权重")
layout.addLayout(createTitledRow("", show_masked))
show_selected_verts_only = QtWidgets.QCheckBox("Hide unselected vertices")
show_selected_verts_only = QtWidgets.QCheckBox("隐藏未选择的顶点")
layout.addLayout(createTitledRow("", show_selected_verts_only))
@qt.on(show_effects.stateChanged)
@@ -363,7 +363,7 @@ def build_ui(parent, global_actions):
paint.display_settings.show_selected_verts_only = show_selected_verts_only.isChecked()
mesh_toolbar = QtWidgets.QToolBar()
toggle_original_mesh = QAction("Show Original Mesh", mesh_toolbar)
toggle_original_mesh = QAction("显示原本模型", mesh_toolbar)
toggle_original_mesh.setCheckable(True)
mesh_toolbar.addAction(toggle_original_mesh)
layout.addLayout(createTitledRow("", mesh_toolbar))
@@ -374,7 +374,7 @@ def build_ui(parent, global_actions):
update_ui_to_tool()
wireframe_color_button = widgets.ColorButton()
layout.addLayout(createTitledRow("Wireframe color:", wireframe_color_button))
layout.addLayout(createTitledRow("线框颜色:", wireframe_color_button))
@signal.on(wireframe_color_button.color_changed)
def update_wireframe_color():

View File

@@ -1,3 +1,4 @@
# -*- coding: UTF-8 -*-
from ngSkinTools2 import signal
from ngSkinTools2.api import PaintMode, PaintModeSettings, flood_weights
from ngSkinTools2.api.log import getLogger
@@ -70,14 +71,14 @@ def build_ui(parent):
toolbar.addAction(a)
t = QtWidgets.QToolBar()
create_mode_button(t, PaintMode.replace, "Replace", "")
create_mode_button(t, PaintMode.add, "Add", "")
create_mode_button(t, PaintMode.scale, "Scale", "")
create_mode_button(t, PaintMode.replace, "替换", "")
create_mode_button(t, PaintMode.add, "添加", "")
create_mode_button(t, PaintMode.scale, "减少", "")
row.addWidget(t)
t = QtWidgets.QToolBar()
create_mode_button(t, PaintMode.smooth, "Smooth", "")
create_mode_button(t, PaintMode.sharpen, "Sharpen", "")
create_mode_button(t, PaintMode.smooth, "平滑", "")
create_mode_button(t, PaintMode.sharpen, "锐化", "")
row.addWidget(t)
actions[model.current_settings.mode].setChecked(True)
@@ -109,20 +110,20 @@ def build_ui(parent):
model.current_settings.iterations = iterations.value()
update_ui()
fixed_influences = QtWidgets.QCheckBox("Only adjust existing vertex influences")
fixed_influences = QtWidgets.QCheckBox("仅调整顶点现有影响物,防止周围权重扩散")
fixed_influences.setToolTip(
"When this option is enabled, smooth will only adjust existing influences per vertex, "
"and won't include other influences from nearby vertices"
"启用此选项后,平滑-将仅调整每个顶点的现有影响物, "
"而不会包含来自附近顶点的影响物,防止周围权重扩散"
)
volume_neighbours = QtWidgets.QCheckBox("Smooth across gaps and thin surfaces")
volume_neighbours = QtWidgets.QCheckBox("平滑间隙和薄表面")
volume_neighbours.setToolTip(
"Use all nearby neighbours, regardless if they belong to same surface. "
"This will allow for smoothing to happen across gaps and thin surfaces."
"使用所有附近相邻的面,无论它们是否属于同一个曲面."
"这将允许在间隙和薄曲面之间进行平滑."
)
limit_to_component_selection = QtWidgets.QCheckBox("Limit to component selection")
limit_to_component_selection.setToolTip("When this option is enabled, smoothing will only happen between selected components")
limit_to_component_selection = QtWidgets.QCheckBox("在选择的组件中平滑")
limit_to_component_selection.setToolTip("启用此选项后,仅在选定组件之间进行平滑")
@qt.on(fixed_influences.stateChanged)
@ui_lock.skip_if_updating
@@ -154,16 +155,16 @@ def build_ui(parent):
volume_neighbours.setChecked(model.current_settings.use_volume_neighbours)
volume_neighbours.setEnabled(model.current_settings.mode == PaintMode.smooth)
settings_group = QtWidgets.QGroupBox("Mode Settings")
settings_group = QtWidgets.QGroupBox("模式设置")
layout = QtWidgets.QVBoxLayout()
layout.addLayout(createTitledRow("Mode:", mode_row()))
layout.addLayout(createTitledRow("Intensity:", intensity.layout()))
layout.addLayout(createTitledRow("Iterations:", iterations.layout()))
layout.addLayout(createTitledRow("Influences limit:", influences_limit.layout()))
layout.addLayout(createTitledRow("Weight bleeding:", fixed_influences))
layout.addLayout(createTitledRow("Volume smoothing:", volume_neighbours))
layout.addLayout(createTitledRow("Isolation:", limit_to_component_selection))
layout.addLayout(createTitledRow("模式:", mode_row()))
layout.addLayout(createTitledRow("强度:", intensity.layout()))
layout.addLayout(createTitledRow("迭代次数:", iterations.layout()))
layout.addLayout(createTitledRow("影响物限制:", influences_limit.layout()))
layout.addLayout(createTitledRow("平滑辅助:", fixed_influences))
layout.addLayout(createTitledRow("体积平滑:", volume_neighbours))
layout.addLayout(createTitledRow("隔离选中组件:", limit_to_component_selection))
settings_group.setLayout(layout)
update_ui()
@@ -173,7 +174,7 @@ def build_ui(parent):
def common_settings():
layout = QtWidgets.QVBoxLayout()
mirror = QtWidgets.QCheckBox("Mirror")
mirror = QtWidgets.QCheckBox("镜像")
layout.addLayout(createTitledRow("", mirror))
@qt.on(mirror.stateChanged)
@@ -182,8 +183,8 @@ def build_ui(parent):
for _, v in model.presets.items():
v.mirror = mirror.isChecked()
redistribute_removed_weight = QtWidgets.QCheckBox("Distribute to other influences")
layout.addLayout(createTitledRow("Removed weight:", redistribute_removed_weight))
redistribute_removed_weight = QtWidgets.QCheckBox("分配给其它影响物")
layout.addLayout(createTitledRow("移除的权重:", redistribute_removed_weight))
@qt.on(redistribute_removed_weight.stateChanged)
def redistribute_removed_weight_changed():
@@ -195,7 +196,7 @@ def build_ui(parent):
mirror.setChecked(model.current_settings.mirror)
redistribute_removed_weight.setChecked(model.current_settings.distribute_to_other_influences)
group = QtWidgets.QGroupBox("Common Settings")
group = QtWidgets.QGroupBox("常用设置")
group.setLayout(layout)
update_ui()
@@ -203,8 +204,8 @@ def build_ui(parent):
return group
def apply_button():
btn = QtWidgets.QPushButton("Apply")
btn.setToolTip("Apply selected operation to vertex")
btn = QtWidgets.QPushButton("应用")
btn.setToolTip("将设定操作应用于选中顶点")
@qt.on(btn.clicked)
def clicked():

View File

@@ -1,3 +1,4 @@
# -*- coding: UTF-8 -*-
from ngSkinTools2 import signal
from ngSkinTools2.api.pyside import QtWidgets
from ngSkinTools2.api.session import Session
@@ -20,7 +21,7 @@ def build_ui(actions, session):
def influences_options():
result = QtWidgets.QVBoxLayout()
button_group = QtWidgets.QButtonGroup()
for index, i in enumerate(["Use all available influences", "Use selected influences"]):
for index, i in enumerate(["使用所有可用的影响物", "使用选定的影响物"]):
radio = QtWidgets.QRadioButton(i)
button_group.addButton(radio, index)
result.addWidget(radio)
@@ -38,7 +39,7 @@ def build_ui(actions, session):
return result
new_layer = QtWidgets.QCheckBox("Create new layer")
new_layer = QtWidgets.QCheckBox("创建新图层")
@qt.on(new_layer.toggled)
def update_new_layer():
@@ -53,11 +54,11 @@ def build_ui(actions, session):
update_ui()
result = QtWidgets.QGroupBox("Assign weights from closest joint")
result = QtWidgets.QGroupBox("从最近的关节指定权重")
layout = QtWidgets.QVBoxLayout()
result.setLayout(layout)
layout.addLayout(createTitledRow("Target layer", new_layer))
layout.addLayout(createTitledRow("Influences", influences_options()))
layout.addLayout(createTitledRow("目标层", new_layer))
layout.addLayout(createTitledRow("影响物", influences_options()))
layout.addWidget(btn)
return result
@@ -69,25 +70,25 @@ def build_ui(actions, session):
model_binds.bind(intensity, options.overall_effect)
single_cluster_mode = QtWidgets.QCheckBox(
"Single group mode",
"单组模式",
)
single_cluster_mode.setToolTip("average weights across whole selection, ignoring separate shells or selection gaps")
single_cluster_mode.setToolTip("整个选择的平均权重,忽略单独的壳或选择间隙")
model_binds.bind(single_cluster_mode, options.single_cluster_mode)
btn = QtWidgets.QPushButton()
qt.bind_action_to_button(actions.toolsUnifyWeights, btn)
result = QtWidgets.QGroupBox("Unify weights")
result = QtWidgets.QGroupBox("统一权重")
layout = QtWidgets.QVBoxLayout()
result.setLayout(layout)
layout.addLayout(createTitledRow("Intensity:", intensity.layout()))
layout.addLayout(createTitledRow("Clustering:", single_cluster_mode))
layout.addLayout(createTitledRow("强度:", intensity.layout()))
layout.addLayout(createTitledRow("集群:", single_cluster_mode))
layout.addWidget(btn)
return result
def other_tools_group():
result = QtWidgets.QGroupBox("Other")
result = QtWidgets.QGroupBox("其它")
layout = QtWidgets.QVBoxLayout()
result.setLayout(layout)
layout.addWidget(to_button(actions.fill_layer_transparency))

View File

@@ -25,7 +25,7 @@ def build_layers_ui(parent, actions, session):
filter = QtWidgets.QComboBox()
filter.setMinimumHeight(22 * scale_multiplier)
filter.setEditable(True)
filter.lineEdit().setPlaceholderText("Search...")
filter.lineEdit().setPlaceholderText("搜索...")
result.addWidget(filter)
# noinspection PyShadowingNames
clear = QAction(result)
@@ -83,7 +83,7 @@ def build_no_layers_ui(parent, actions, session):
selection_display = QtWidgets.QLabel("pPlane1")
selection_display.setStyleSheet("font-weight: bold")
selection_note = QtWidgets.QLabel("Skinning Layers cannot be attached to this object")
selection_note = QtWidgets.QLabel("蒙皮层无法附加到此对象")
selection_note.setWordWrap(True)
layout.addStretch(1)
@@ -104,11 +104,11 @@ def build_no_layers_ui(parent, actions, session):
selection_display.setText(session.state.selectedSkinCluster)
selection_display.setVisible(is_skinned)
note = "Select a mesh with a skin cluster attached."
note = "选择附着蒙皮节点的网格."
if is_skinned:
note = "Skinning layers are not yet initialized for this mesh."
note = "尚未为此网格初始化蒙皮层."
if import_v1_actions.can_import(session):
note = "Skinning layers from previous ngSkinTools version are initialized on this mesh."
note = "ngSkinTools的旧版本的蒙皮层在此网格上初始化."
selection_note.setText(note)

View File

@@ -1,3 +1,4 @@
# -*- coding: UTF-8 -*-
from ngSkinTools2 import api, cleanup, signal
from ngSkinTools2.api import VertexTransferMode
from ngSkinTools2.api.pyside import QtCore, QtWidgets
@@ -43,8 +44,8 @@ def open(parent, model):
return widgets.button_row(
[
("Transfer", apply),
("Cancel", window.close),
("传递", apply),
("取消", window.close),
]
)
@@ -55,32 +56,32 @@ def open(parent, model):
result = QtWidgets.QVBoxLayout()
vertexMappingMode = QtWidgets.QComboBox()
vertexMappingMode.addItem("Closest point on surface", VertexTransferMode.closestPoint)
vertexMappingMode.addItem("UV space", VertexTransferMode.uvSpace)
vertexMappingMode.addItem("By vertex ID (source and destination vert count must match)", VertexTransferMode.vertexId)
vertexMappingMode.addItem("表面上最近的点", VertexTransferMode.closestPoint)
vertexMappingMode.addItem("UV空间", VertexTransferMode.uvSpace)
vertexMappingMode.addItem("按顶点ID(源和目标顶点数必须匹配)", VertexTransferMode.vertexId)
g = QtWidgets.QGroupBox("Selection")
g = QtWidgets.QGroupBox("选择")
layout = QtWidgets.QVBoxLayout()
g.setLayout(layout)
sourceLabel = QtWidgets.QLabel()
layout.addLayout(createTitledRow("Source:", sourceLabel))
layout.addLayout(createTitledRow("来源:", sourceLabel))
destinationLabel = QtWidgets.QLabel()
layout.addLayout(createTitledRow("Destination:", destinationLabel))
layout.addLayout(createTitledRow("目标:", destinationLabel))
result.addWidget(g)
g = QtWidgets.QGroupBox("Vertex mapping")
g = QtWidgets.QGroupBox("顶点映射")
layout = QtWidgets.QVBoxLayout()
layout.addLayout(createTitledRow("Mapping mode:", vertexMappingMode))
layout.addLayout(createTitledRow("映射模式:", vertexMappingMode))
g.setLayout(layout)
result.addWidget(g)
g = QtWidgets.QGroupBox("Influences mapping")
g = QtWidgets.QGroupBox("影响物映射")
layout = QtWidgets.QVBoxLayout()
g.setLayout(layout)
edit = QtWidgets.QPushButton("Configure")
edit = QtWidgets.QPushButton("配置")
qt.on(edit.clicked)(view_influences_settings)
button_row = QtWidgets.QHBoxLayout()
@@ -90,12 +91,12 @@ def open(parent, model):
result.addWidget(g)
g = QtWidgets.QGroupBox("Other options")
g = QtWidgets.QGroupBox("其他选项")
layout = QtWidgets.QVBoxLayout()
g.setLayout(layout)
keep_layers = QtWidgets.QCheckBox("Keep existing layers on destination")
keep_layers_row = qt.wrap_layout_into_widget(createTitledRow("Destination layers:", keep_layers))
keep_layers = QtWidgets.QCheckBox("保留目标网格的已有图层")
keep_layers_row = qt.wrap_layout_into_widget(createTitledRow("目标图层:", keep_layers))
layout.addWidget(keep_layers_row)
@qt.on(keep_layers.stateChanged)
@@ -137,12 +138,12 @@ def open(parent, model):
tabs = QtWidgets.QTabWidget()
tabs.addTab(qt.wrap_layout_into_widget(build_settings()), "Settings")
tabs.addTab(qt.wrap_layout_into_widget(build_influenes_tab()), "Influences mapping")
tabs.addTab(qt.wrap_layout_into_widget(build_settings()), "设置")
tabs.addTab(qt.wrap_layout_into_widget(build_influenes_tab()), "影响物映射")
window = QtWidgets.QDialog(parent)
cleanup.registerCleanupHandler(window.close)
window.setWindowTitle("Transfer")
window.setWindowTitle("传递")
window.setAttribute(QtCore.Qt.WA_DeleteOnClose)
window.resize(720 * scale_multiplier, 500 * scale_multiplier)
window.setLayout(QtWidgets.QVBoxLayout())
@@ -196,7 +197,7 @@ def build_transfer_action(session, parent):
t.customize_callback = transfer_dialog
t.execute()
result = define_action(parent, "Transfer layers...", callback=handler)
result = define_action(parent, "传递图层...", callback=handler)
@signal.on(session.events.nodeSelectionChanged)
def on_selection_changed():

View File

@@ -1,3 +1,4 @@
# -*- coding: UTF-8 -*-
import webbrowser
from ngSkinTools2.api import versioncheck
@@ -27,10 +28,10 @@ def show(parent, silent_mode):
result.setLayout(layout)
layout.setContentsMargins(20, 30, 20, 20)
header = QtWidgets.QLabel("<strong>Checking for update...</strong>")
result1 = QtWidgets.QLabel("Current version: <strong>2.0.0</strong>")
result2 = QtWidgets.QLabel("Update available: 2.0.1")
download = QtWidgets.QPushButton("Download ngSkinTools v2.0.1")
header = QtWidgets.QLabel(u"<strong>检查更新中...</strong>")
result1 = QtWidgets.QLabel(u"当前版本: <strong>2.1.4</strong>")
result2 = QtWidgets.QLabel("最新版本: 2.1.4")
download = QtWidgets.QPushButton("下载 中文ngSkinTools v2.0.1")
# layout.addWidget(QtWidgets.QLabel("Checking for updates..."))
layout.addWidget(header)
layout.addWidget(result1)
@@ -52,16 +53,16 @@ def show(parent, silent_mode):
:type info: ngSkinTools2.api.versioncheck.
"""
header.setText("<strong>{0}</strong>".format('Update available!' if info.update_available else 'ngSkinTools is up to date.'))
header.setText("<strong>{0}</strong>".format('更新可用!' if info.update_available else '中文ngSkinTools 已经是最新版.'))
result1.setVisible(True)
result1.setText("Current version: <strong>{0}</strong>".format(version.pluginVersion()))
result1.setText(u"当前版本: <strong>{0}</strong>".format(version.pluginVersion()))
if info.update_available:
result2.setVisible(True)
result2.setText(
"Update available: <strong>{0}</strong>, released on {1}".format(info.latest_version, info.update_date.strftime("%d %B, %Y"))
u"最新版本: <strong>{0}</strong>, 发布于 {1}".format(info.latest_version, info.update_date.strftime("%d %B, %Y"))
)
download.setVisible(True)
download.setText("Download ngSkinTools v" + info.latest_version)
download.setText(u"下载 中文ngSkinTools v" + info.latest_version)
@qt.on(download.clicked)
def open_link():
@@ -71,10 +72,10 @@ def show(parent, silent_mode):
# noinspection PyShadowingNames
def buttonsRow(window):
btn_close = QtWidgets.QPushButton("Close")
btn_close = QtWidgets.QPushButton("取消")
btn_close.setMinimumWidth(100 * scale_multiplier)
check_do_on_startup = bind_checkbox(QtWidgets.QCheckBox("Check for updates at startup"), config.checkForUpdatesAtStartup)
check_do_on_startup = bind_checkbox(QtWidgets.QCheckBox("启动时检查更新"), config.checkForUpdatesAtStartup)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(check_do_on_startup)
@@ -88,7 +89,7 @@ def show(parent, silent_mode):
window = QtWidgets.QWidget(parent, Qt.Window | Qt.WindowTitleHint | Qt.CustomizeWindowHint)
window.resize(400 * scale_multiplier, 200 * scale_multiplier)
window.setAttribute(Qt.WA_DeleteOnClose)
window.setWindowTitle("ngSkinTools2 version update")
window.setWindowTitle("ngSkinTools2 (中文) 版本更新")
layout = QtWidgets.QVBoxLayout()
window.setLayout(layout)
layout.setContentsMargins(0, 0, 0, 0)
@@ -106,14 +107,14 @@ def show(parent, silent_mode):
if info.update_available:
window.show()
else:
log.info("not showing the window")
log.info("未显示窗口")
window.close()
cleanup.registerCleanupHandler(window.close)
@qt.on(window.destroyed)
def closed():
log.info("deleting update window")
log.info("删除更新窗口")
versioncheck.download_update_info(success_callback=success_signal.emit, failure_callback=error_signal.emit)
@@ -129,4 +130,4 @@ def show_and_start_update(parent):
def build_action_check_for_updates(parent):
from ngSkinTools2.ui import actions
return actions.define_action(parent, "Check for Updates...", callback=lambda: show_and_start_update(parent))
return actions.define_action(parent, "检查更新...", callback=lambda: show_and_start_update(parent))