教程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
英文地址,請注明出處:http://en.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 邏…