教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)

vscode用python开发maya联动调试设置
3dsMax Python开发环境搭建
3文联动之debugpy调试max‘python.
3文联动之socket插槽注入max‘python
本教程是max主动接收创建代码的方式(预先运行界面,通过按钮主动读取py脚本,执行断点),虽然绕过了pymxs不能在外部编辑器里运行,但是这种方式并不优雅(理想)~~

    从外部进程访问3ds Max API存在权限问题

    Max 2018 (Python 2.7) + VSCode (maxPlus)→ 不支持远程 attach。

    调试器有Eclipse公司 的pydevd,微软vs的ptvsd(py2.7,3.0+)->debugpy (py30+),max自身的maxPlus(非远程调试)

    你要么用 Eclipse的PyCharm + pydevd,要么在用微软的 VSCode + (ptvsd)里退而求其次(用日志 / socket 打印调试)

    要么升级 Max 到 2021+(Python 3.6+)支 持 debugpy。
 

在这个教程中,我们将使用visualsudio code和Python模块ptrsd(python TodksforWisualsudioDebugger)创建并调试一个名为“pyamid” 的小型3ds Maxprside2工具。该工具显示一个带有按钮的Q对话框,按下技
钮会在当前场景中添加一个黑色金字塔。
完成的教程代码可以在本主题末尾找到,供参考。
先决条件
本教程系列需要以下条件:
·安装了3ds Max2021或更高版本
·启动了3ds Max2021或更高版本,并使用Python3解释器(默认设置)
·已安装VS Code和Python扩展
·安装了PS6的3ds Max Python(参见使用pip与Python3)
创建项目
这个项目将被命名为pyramid。PEP-8(Python风格指南)建议模块使用小写的名称。
所以在我们的文件系统中的某个地方,创建一个嵌套的目录集,两者都命名为'pyramid':

mkdir -p pyramid/pyramid

我们最终会使用这个目录结构,为我们的项目添加适当的 pip 包装信息。在本教程中,我们只需在其中创建程序
启动 VS Code
·开始与代码
·使用File>OpenFolder选择我们的顶级pyramid文件夹
创建源文件
我们的项目很小,但我们将将其分为两个文件以模拟一个更大的项目。
pyramid子目录中创建一个名为 ui.py 的新文件,然后添加以下代码:

"""Provide a PySide2 dialog for the pyramid tool.
"""
from PySide2.QtWidgets import QWidget, QDialog, QLabel, QVBoxLayout, QPushButton
from pymxs import runtime as rt
from .graphics import make_pyramid_meshclass PyMaxDialog(QDialog):"""Custom dialog attached to the 3ds Max main windowMessage label and action push button to create a pyramid in the 3ds Max scene graph"""def __init__(self, parent=QWidget.find(rt.windows.getMAXHWND())):super(PyMaxDialog, self).__init__(parent)self.setWindowTitle('Pyside2 Qt Window')self.init_ui()def init_ui(self):""" Prepare Qt UI layout for custom dialog """main_layout = QVBoxLayout()label = QLabel("Click button to create a pyramid in the scene")main_layout.addWidget(label)btn = QPushButton("Pyramid")btn.clicked.connect(make_pyramid_mesh)main_layout.addWidget(btn)self.setLayout(main_layout)self.resize(250, 100)

建立一个其他的文件名 graphics.py 在同一个目录里, 并且添加代码:

"""Provide the graphic functionality for the pryamid tool.
"""
from pymxs import runtime as rtdef make_pyramid_mesh(side=20.0):'''Construct a pyramid from vertices and faces.'''halfside = side / 2.0pyr = rt.mesh(vertices=[rt.point3(0.0, 0.0, side),rt.point3(-halfside, -halfside, 0.0),rt.point3(-halfside, halfside, 0.0),rt.point3(halfside, 0.0, 0.0)],faces=[rt.point3(1, 2, 3),rt.point3(1, 3, 4),rt.point3(1, 4, 2),rt.point3(2, 3, 4),])rt.redrawViews()return pyr

在这个位置你将有以下的目录结构:

pyramid/pyramid/ui.pygraphics.py

等等,我看到我的导入语句有问题。
Visualstudio code 使用一个代码检查工具来验证导入,默认情况下,它不知道在哪里查找 3ds MaxPython模块。自动补全系统也可能存在理解源代码方面的问题。为了解决这个问题,请将Visualstudio Code指向3ds Max的Python解释器:
通过文件>首选项设置打开设置
·在设置页面中,打开扩展>Python>自动完成:额外路径>在settings.json中编辑。这将打开settings.json文件。
添加:

  ,"python.pythonPath": "C:\\Program Files\\Autodesk\\3ds Max 2021\\Python37\\python.exe","python.autoComplete.extraPaths": [         "C:\\Program Files\\Autodesk\\3ds Max 2021\\Python37"     ] 

有关此问题的更多信息,请参见此处和此处。
在3ds Max中运行项目的第一版
切换到3ds Max,打开监听器窗口并选择Python选项卡。此时,我们应该看到监听器中显示的版本字符串表明正在使用Python 3.默认情况下,3dsMaxPython 解释器不知道示例的位置,但我们希望能够通过导入使其可用。因此,我们可以在Python监听器中键入此内容(用您自己的路径替换append 函数):    直接在监听窗口这里输出py执行,似乎没有反应的。

import sys
sys.path.append(r'd:\sources\hacking\python\pyramid')

注意:逐行输入,使用CtrltEnter执行它们。
然后输入:

import pyramid.ui
dialog = pyramid.ui.PyMaxDialog()
dialog.show()

这将显示对话框

如果你按下Pyramid按钮,你会得到一个异常:

现在我们需要调试这个问题。
从VS Code调试3ds Max的Python代码
在我们能够使用调试器来调试3ds Max中的Python代码之前,我们需要安装ptvsd(VisualStudio调试服务器的Python工具):
在你的3ds Max Python 3目录中,在命令行x:\Program Files\Autodesk\3ds Max 2024\Python>中,输入:

python -m pip install --user ptvsd

安装完成的样子

在3ds Max端启用调试器
ptvsd调试服务器需要在3ds Max Python解释器中运行。在3ds Max监听窗口中,输入:

import ptvsd
ptvsd.enable_attach()

这应该显示:

('0.0.0.0', 5678)

这里但是!直接输出python是没有反应的。

那只有这样了,做成一个py文件保存,ctrl+e运行。

代码如下

import sys
sys.path.append(r'd:\sources\hacking\python\pyramid')
import pyramid.ui
dialog = pyramid.ui.PyMaxDialog()
dialog.show()

(在我们的3ds Max会话中,无需重复上一步操作)。
第一次与Vs Code连接
3dsMax现在已准备好接受来自VS Code的连接,但我们仍需告诉vs Code如何与3dsMax进行连接。首次尝试与3dsMax连接时,需要在VS code中添加远程调试配置。

在VS Code中,选择运行>添加配置。
从下拉列表中选择远程附加。
然后按回车键选择localhost(默认)然后按回车键选择5678(默认值)
这将添加一个看起来像这样的配置代码:

   {"name": "Python: Remote Attach","type": "python","request": "attach","connect": {"host": "localhost","port": 5678},"pathMappings": [{"localRoot": "${workspaceFolder}","remoteRoot": "."}]}

我们不需要修改这个,除了我们需要指向
直接在我们的源处设置remoteRoot

   "remoteRoot": "${workspaceFolder}",

此配置只需设置一次。
如果我们也想调试第三方模块(例如在pyside2代码中设置断点),虽然这在本次示例中不会实现,但这是一个非常常见的调试任务,我们还需要通过在 JSON 文件中添加以下内容来启用它.

"justMyCode": false

最后,你的Launch.json配置文件是这样的:(官方代码里没有版号和configuaratiions是不能正常运作的,端口号和localhost及得在connect字段里,排在前面的字段后面的逗号记得加

{"version": "0.2.0","configurations": [{"name": "Python: Remote Attach","type": "python","request": "attach","justMyCode": false,"connect": {"host": "localhost","port": 5678},"pathMappings": [{"localRoot": "${workspaceFolder}","remoteRoot": "${workspaceFolder}"}]}]
}

连接到vs Code
首先通过选择View>Open View... 并选择“Run and Debug”来打开运行和调试视图。我们需要在VS Code中选择调试配置:

确保选择了我们的 Python:Remote Attach 配置。在这种情况下,我们可以通过在 Vs Code 菜单中选择“调试”“开始调试”来将调试器连接到 3ds Max Python.如果我们回到3ds Max,我们会看到UI不再冻结。然而,我们的程序仍然没有运行。运行程序
要运行我们的脚本,我们需要在3ds Max监听器窗口中输入:

dialog.show()

这将运行我们想要但不起作用的对话框。

添加断点
通过我们程序之前的运行,我们知道graphics.py的第11行存在一个问题。因此,在VScode中,我们可以通过点击该行左侧的边距来添加断点:

触发断点
此时,当你点击对话框中的Pyramid按钮时,你的断点将被到达,并且你将在VS Code中看到它被高亮显示。

你可以检查局部变量,你会发现 side 变量是 False,这不是我们想要的。

修复代码
发生的问题是side为False。我们将make_pyramid mesh()连接到对话框按钮的代码如下:

  btn.clicked.connect(make_pyramid_mesh)

这是有误的,因为btn.cicked 传递给我们的是一个布尔值,它告诉我们按钮是否处于选中状态。我们的代码接收了这个布尔值,而不是我们期望的默认值 20.0.因此我们可以修改这段代码,传递一个将side设置为20.0的lambda函数。

  btn.clicked.connect(lambda: make_pyramid_mesh(20.0))

然后我们保存
使新代码运行
为了将控制权交还给max,我们按下F5(运行->继续)。我们看到3ds Max再次变得响应。关闭对话框
在监听器窗口的Python命令提示符中输入

import importlib

然后

importlib.reload(pyramid.ui)

这显示类似的内容:

<module 'pyramid.ui' from 'd:\\sources\\hacking\\python\\pyramid\\pyramid\\ui.py'>

我们现在必须通过以下操作重新创建一个全新的对话版本:

dialog = pyramid.ui.PyMaxDialog()

然后:

dialog.show()

临时的aaa.py内容如下

import sys
sys.path.append(r'd:\sources\hacking\python\pyramid')
import pyramid.ui
import importlib
importlib.reload(pyramid.ui)
dialog = pyramid.ui.PyMaxDialog()
dialog.show()

我们的断点已到达,但此时 side=20 和 halfside=10 。如果我们按 F5,代码现在将成功完成,并在视图中显示我们的黑色金字塔。

完整代码:

ui.py:

"""Provide a PySide2 dialog for the pyramid tool.
"""
from PySide2.QtWidgets import QWidget, QDialog, QLabel, QVBoxLayout, QPushButton
from pymxs import runtime as rt
from .graphics import make_pyramid_meshclass PyMaxDialog(QDialog):"""Custom dialog attached to the 3ds Max main windowMessage label and action push button to create a pyramid in the 3ds Max scene graph"""def __init__(self, parent=QWidget.find(rt.windows.getMAXHWND())):super(PyMaxDialog, self).__init__(parent)self.setWindowTitle('Pyside2 Qt Window')self.init_ui()def init_ui(self):""" Prepare Qt UI layout for custom dialog """main_layout = QVBoxLayout()label = QLabel("Click button to create a pyramid in the scene")main_layout.addWidget(label)btn = QPushButton("Pyramid")btn.clicked.connect(lambda: make_pyramid_mesh(20.0))main_layout.addWidget(btn)self.setLayout(main_layout)self.resize(250, 100)

graphics.py:

"""Provide the graphic functionality for the pryamid tool.
"""
from pymxs import runtime as rtdef make_pyramid_mesh(side=20.0):'''Construct a pyramid from vertices and faces.'''halfside = side / 2.0pyr = rt.mesh(vertices=[rt.point3(0.0, 0.0, side),rt.point3(-halfside, -halfside, 0.0),rt.point3(-halfside, halfside, 0.0),rt.point3(halfside, 0.0, 0.0)],faces=[rt.point3(1, 2, 3),rt.point3(1, 3, 4),rt.point3(1, 4, 2),rt.point3(2, 3, 4),])rt.redrawViews()return pyr

父页:  教程

下一页:教程2-添加NumPy,一个外部组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95005.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!

1. 描述LT7621GX是一款高性能两路HDMI2.1/DP1.4转HDMI2.1混合开关芯片&#xff0c;用于显示应用。 HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合&#xff0c;实现中继器功能。 对于HDMI2.1输入&#xff0c;LT7621GX可以配置为3/4通道。自适应均衡使其适…

【Ruoyi 解密 - 12. JDK17的新特性】------ 从Java 8 到 Java 17:向Scala看齐的“简洁革命”,同宗JVM下的效率狂飙

从Java 8到Java 17&#xff1a;抄作业Scala&#xff1f;JVM同宗下的Ruoyi开发效率狂飙&#xff01; 上一篇我们聊到JDK 17对Python的柔性借鉴&#xff0c;可深入用下来才发现——这哪够&#xff01;对Ruoyi开发者来说&#xff0c;JDK 17真正的“王炸”&#xff0c;是把同根JVM的…

大模型 “轻量化” 之战:从千亿参数到端侧部署,AI 如何走进消费电子?

一、大模型 “轻量化” 的行业背景在 AI 技术蓬勃发展的当下&#xff0c;大模型已然成为行业焦点。从 GPT-4 突破万亿级参数量&#xff0c;到 DeepSeek-R1 迈向千亿参数规模&#xff0c;大模型的参数扩张趋势显著。然而&#xff0c;这种规模的增长也带来了诸多挑战。以 GPT-4 为…

香港电讯与Microsoft香港推出新世代“Teams Phone” 解决方案

香港电讯成为香港首家提供 “Microsoft Operator Connect”的本地电讯营运商1 香港电讯&#xff08;股份代号&#xff1a;6823&#xff09;【香港 • 2025年2月11日】 – 香港电讯宣布与 Microsoft 香港合作推出 “Operator Connect”&#xff0c;成为全港首家为企业客户提供全…

PlantUML描述《分析模式》第3章观察和测量(2)

lantUML描述《分析模式》第2章“当责”&#xff08;1&#xff09; PlantUML描述《分析模式》第2章“当责”&#xff08;2&#xff09; PlantUML描述《分析模式》第3章观察和测量&#xff08;1&#xff09; 原图3.8 EA绘制 图3.8 递归关系用于记录证据和评估。 PlantUML sta…

轮廓周长,面积,外界圆,外界矩形近似轮廓和模板匹配和argparse模块实现代码参数的动态配置

目录 一.轮廓操作 1.轮廓特征的引入与筛选 2.轮廓排序和精准定位 3.外接圆与外接矩形的计算与绘制 二.轮廓近似 1.轮廓近似的基本概念 2.轮廓近似的实现方法和核心步骤 3. 近似精度参数的设定逻辑 4.轮廓定位方法 三.模板匹配 1.模板匹配技术原理与实现流程 2.技术要…

【第三方网站测评:会话管理漏洞的测试与加固】

会话管理是Web应用安全的用于在无状态的HTTP协议上维持用户状态。漏洞主要源于会话令牌(Session Token)的生成、传输、验证和销毁过程中的缺陷。攻击者利用这些缺陷可劫持用户会话,未经授权访问敏感数据或执行特权操作,属于OWASP TOP 10中身份验证失效的高频风险。 会话管…

理想汽车智驾方案介绍专题 3 MoE+Sparse Attention 高效结构解析

一、前言 【理想汽车智驾方案介绍专题 -1】端到端VLM 方案介绍 【理想汽车智驾方案介绍专题 -2】MindVLA 方案详解 在上述两篇系列帖子中&#xff0c;笔者已对理想汽车 VLM 和 VLA 方案的框架进行了全面介绍&#xff0c;但对于其中的前沿技术仅做了初步探讨&#xff0c;未进…

如何将yolo训练图像数据库的某个分类的图像取出来

COCO 数据集 - Ultralytics YOLO 文档 比如我只想从数据集中取手机的图像&#xff0c;来用于我的训练&#xff0c;懒得自己一张一张标注&#xff0c;方法如下 # -*- coding: utf-8 -*- import json import os import shutil from pathlib import Path from tqdm import tqdm i…

【WPF】WPF 自定义控件实战:从零打造一个可复用的 StatusIconTextButton (含避坑指南)

&#x1f527; WPF 自定义控件实战&#xff1a;从零打造一个可复用的 StatusIconTextButton&#xff08;含避坑指南&#xff09;发布于&#xff1a;2025年8月29日 标签&#xff1a;WPF、C#、自定义控件、MVVM、Generic.xaml、属性绑定、TemplateBinding&#x1f4cc; 引言 在 W…

中国国际商会副秘书长徐梁一行到访国联股份

2025年08月27日&#xff0c;中国国际商会副秘书长徐梁等一行到访国联股份&#xff0c;国联股份创始人、CEO/总裁钱晓钧&#xff0c;国联股份副总裁、卫多多/纸多多CEO黄莎莎等热情招待来访一行&#xff0c;并展开深入交流。来访一行首先参观了国联股份数字经济展厅&#xff0c;…

换公司如何快速切入软件项目工程

一、前言 作为程序员&#xff0c;根据自身职业发展&#xff0c;会通过跳槽谋求更进一步的发展&#xff0c;这时进入新公司&#xff0c;接触全新的项目工程和业务&#xff0c;如何快速的切入&#xff0c;形成认识呢&#xff1f;就算不跳槽&#xff0c;公司业务调整&#xff0c;也…

Linux系统——EXT2 文件系统

磁盘文件 文件属性 文件内容文件内容 —— 数据块&#xff0c;文件属性 —— inodeLinux 文件在磁盘中的存储&#xff0c;是将 属性 与 内容 分开存储的内存&#xff1a;掉电易失&#xff0c;磁盘&#xff1a;永久性存储介质图片来自百度磁盘访问的基本单元&#xff1a;扇区 …

Qt中的锁(1)

Qt中的锁&#xff08;1&#xff09; 加锁&#xff0c;把多个要访问的公共资源通过锁保护起来&#xff0c;把并行执行变成串行执行&#xff0c; 多个线程执行加锁的对象得是同一个对象&#xff0c;不同对象不会互斥 代码&#xff1a;//添加一个static成员static int num;//创建锁…

数据结构 02(线性:顺序表)

目录 线性表 顺序表 概念与结构 动态顺序表的实现 头文件的创建 顺序表初始化 顺序表的扩容 尾插功能 头插功能 尾删功能 头删功能 查找功能 任意位置前插入 任意位置前删除 销毁 动态顺序表整体呈现 SeqList.h SeqList.c 线性表 线性表是n个具有相同特性的数…

自助餐厅:自主取餐的平衡术

自助餐厅&#xff0c;本质是通过 “固定客单价 自主取餐” 的模式&#xff0c;把 “吃什么、吃多少” 的选择权还给用户&#xff0c;同时用运营设计平衡 “用户体验” 与 “餐厅成本”—— 它不是 “让用户吃垮餐厅” 的游戏&#xff0c;而是餐饮行业里 “效率与体验结合” 的…

TypeScript: Reflect.ownKeys 操作(针对 Symbol)

Reflect.ownKeys 是 JavaScript ES6 引入的 Reflect API 中的一个方法&#xff0c;用于获取目标对象的所有自身属性键&#xff08;包括字符串键和 Symbol 键&#xff09;。1.基本概念&#xff1a;Reflect.ownKeys(target)&#xff1a;接受一个对象 target 作为参数&#xff0c;…

一般纳税人

目录 一文详解&#xff1a;什么是一般纳税人&#xff1f; 一、核心定义&#xff1a;什么是一般纳税人&#xff1f; 二、成为一般纳税人的两种途径 三、一般纳税人的关键特点与运作机制 四、一般纳税人的优点与缺点 五、与小规模纳税人的核心区别 六、企业应如何选择&…

@HAProxy 介绍部署使用

文章目录**1. HAProxy 简介****1.1 什么是 HAProxy&#xff1f;****1.2 核心特性****1.3 关键术语****2. 安装 HAProxy****2.1 在 Ubuntu/Debian 上安装****2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安装****3. 配置与使用****3.1 核心配置文件结构****3.2 基础配置示例&am…

Two-Twer模型做歌曲智能推荐与规则算法对比的优缺点分析

基于规则与机器学习驱动的音乐推荐&#xff1a;核心差异分析1.推荐精度2. 个性化能力3. 模型适应性&#xff08;潜在特征关联发现&#xff09;4. 可扩展性与复杂性成本5. 冷启动/数据稀疏阶段表现6. 听感匹配与主观反馈1.推荐精度 规则推荐&#xff1a; 依赖预设的 if-then 逻…