Dockable UI

24 篇文章 1 订阅
# -*- coding: utf-8 -*-
from PySide2 import QtWidgets
from PySide2 import QtCore
from shiboken2 import getCppPointer

import maya.OpenMayaUI as omui
import maya.cmds as cmds

class WorkspaceControl(object):
    def __init__(self, name):
        self.name = name
        self.widget = None

    def create(self, label, widget, ui_script=None):
        cmds.workspaceControl(self.name, label=label)

        if ui_script:
            cmds.workspaceControl(self.name, e=True, uiScript=ui_script)

        self.add_widget_to_layout(widget)
        self.set_visible(True)

    def restore(self, widget):
        self.add_widget_to_layout(widget)

    def add_widget_to_layout(self, widget):
        if widget:
            self.widget = widget
            self.widget.setAttribute(QtCore.Qt.WA_DontCreateNativeAncestors)

            workspace_control_ptr = long(omui.MQtUtil.findControl(self.name))
            widget_ptr = long(getCppPointer(self.widget)[0])

            omui.MQtUtil.addWidgetToMayaLayout(widget_ptr, workspace_control_ptr)

    def exists(self):
        return cmds.workspaceControl(self.name, q=True, exists=True)

    def is_visible(self):
        return cmds.workspaceControl(self.name, q=True, visible=True)

    def set_visible(self, visible):
        if visible:
            cmds.workspaceControl(self.name, e=True, restore=True)
        else:
            cmds.workspaceControl(self.name, e=True, visible=False)

    def set_label(self, label):
        cmds.workspaceControl(self.name, e=True, label=label)

    def is_floating(self):
        return cmds.workspaceControl(self.name, q=True, floating=True)

    def is_collapsed(self):
        return cmds.workspaceControl(self.name, q=True, collapse=True)


class DockableUI(QtWidgets.QWidget):
    WINDOW_TITLE = "Dockable UI"

    ui_instance = None

    @classmethod
    def display(cls):
        if cls.ui_instance:
            cls.ui_instance.show_workspace_control()
        else:
            cls.ui_instance = cls()

    @classmethod
    def get_workspace_control_name(cls):
        return "{0}WorkspaceControl".format(cls.__name__)

    @classmethod
    def get_ui_script(cls):
        module_name = cls.__module__
        if module_name == "__main__":
            module_name = cls.module_name_override

        ui_script = "from {0} import {1}\n{1}.display()".format(module_name, cls.__name__)
        return ui_script

    def __init__(self):
        super(DockableUI, self).__init__()

        self.setObjectName(self.__class__.__name__)

        self.create_widgets()
        self.create_layout()
        self.create_connections()
        self.create_workspace_control()

    def create_widgets(self):
        self.apply_bttn = QtWidgets.QPushButton("Apply")

    def create_layout(self):
        main_layout = QtWidgets.QVBoxLayout(self)
        main_layout.setContentsMargins(5, 5, 5, 5)
        main_layout.addStretch()
        main_layout.addWidget(self.apply_bttn)

    def create_connections(self):
        self.apply_bttn.clicked.connect(self.on_clicked)

    def create_workspace_control(self):
        self.workspace_control_instance = WorkspaceControl(self.get_workspace_control_name())
        if self.workspace_control_instance.exists():
            self.workspace_control_instance.restore(self)
        else:
            self.workspace_control_instance.create(self.WINDOW_TITLE, self, ui_script=self.get_ui_script())

    def show_workspace_control(self):
        self.workspace_control_instance.set_visible(True)

    def on_clicked(self):
        print("Button Clicked!")

    def showEvent(self, event):
        if self.workspace_control_instance.is_floating():
            self.workspace_control_instance.set_label("Floating Window")
        else:
            self.workspace_control_instance.set_label("Docked Window")

if __name__ == '__main__':
    workspace_control_name = DockableUI.get_workspace_control_name()
    if cmds.window(workspace_control_name, exists=True):
        cmds.deleteUI(workspace_control_name)

    try:
        sample_ui.setParent(None)
        sample_ui.deleteLater()
    except:
        pass
    DockableUI.module_name_override = "Dockable"
    sample_ui = DockableUI()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在ArcMap中创建定制的可停靠窗口,可以使用C# AddIn。下面是一些步骤: 1. 打开Visual Studio并创建一个新的ArcMap Add-In项目。 2. 在“解决方案资源管理器”中,右键单击“项目”并选择“添加”>“新项”>“ArcGIS”>“Dockable Window”。 3. 在“Dockable Window”对话框中,输入窗口的名称和标题,并选择窗口的位置和初始状态。 4. 在“解决方案资源管理器”中,打开“Config.esriaddinx”文件并添加以下代码: ```xml <DockableWindows> <DockableWindow id="YourAddin_DockableWindow1" class="DockableWindow1+YourAddin" caption="Your Dockable Window" image="Images\DockableWindow1.png"> <InitialPlacement height="300" width="300" state="pinned" position="left" /> </DockableWindow> </DockableWindows> ``` 5. 在“解决方案资源管理器”中,打开“DockableWindow1.cs”文件并添加以下代码: ```csharp public partial class DockableWindow1 : UserControl { public DockableWindow1(object hook) { InitializeComponent(); this.Hook = hook; } public object Hook { get; private set; } } ``` 6. 在“解决方案资源管理器”中,打开“YourAddin.cs”文件并添加以下代码: ```csharp protected override void OnStartup() { base.OnStartup(); // Get the hook (the ArcMap application) UID dockWinID = new UIDClass(); dockWinID.Value = ThisAddIn.IDs.DockableWindow1; IDockableWindow dockWindow = ArcMap.DockableWindowManager.GetDockableWindow(dockWinID); // Create the dockable window DockableWindow1 dockableWindow = new DockableWindow1(dockWindow); // Add the dockable window to the ArcMap application dockWindow.AddChild((System.Windows.Forms.Control)dockableWindow); } ``` 7. 构建并部署Add-In,然后在ArcMap中启用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值