RevitPythonShell - IronPython.Runtime.UnboundNameException: 未定义全局名称 'doc'
RevitPythonShell - IronPython.Runtime.UnboundNameException: global name 'doc' is not defined
我正在用 RPS 编写我的第一个按钮,但似乎在启动时或单击按钮时未读取 init 文件。这是我在尝试按照 youtube 上提供的教程进行操作时遇到的错误。
IronPython.Runtime.UnboundNameException: global name 'doc' is not defined
在我将初始化脚本中的导入复制并粘贴到我的按钮文件之前,过滤元素收集器也出现了类似的错误。
有没有人对此有任何问题或找到任何解决方案?
这是我的代码出错的部分:
import os
import csv
import rpw
from rpw.ui.forms import Console
from rpw.ui.forms import SelectFromList
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
filepath = os.path.join(desktop, 'RevisionClouds.csv')
cl = FilteredElementCollector(doc)
cl.OfCategory(BuiltInCategory.OST_RevisionClouds)
cl.WhereElementIsNotElementType()
我在 Revit 2019 中使用 RPS 运行 python 2.7.7
这是我的 init.py 文件。我已经向它添加了更多的导入,并且它可以与 RPS 及其控制台一起正常工作。但是当涉及到 pyRevit 按钮表单时,当它已经在初始化脚本中定义时,它会在文档中出错。
init.py
# these commands get executed in the current scope
# of each new shell (but not for canned commands)
import clr
import rpw
from rpw import revit, db, ui, DB, UI
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
clr.AddReferenceByPartialName('PresentationCore')
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName('System')
clr.AddReferenceByPartialName('System.Windows.Forms')
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Architecture import *
from Autodesk.Revit.DB.Analysis import *
from Autodesk.Revit.UI import *
from Autodesk.Revit import DB
from Autodesk.Revit import UI
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
from Autodesk.Revit.UI import TaskDialog
from Autodesk.Revit.UI import UIApplication
def alert(msg):
TaskDialog.Show('RevitPythonShell', msg)
def quit():
__window__.Close()
exit = quit
def get_selected_elements(doc):
"""API change in Revit 2016 makes old method throw an error"""
try:
# Revit 2016
return [doc.GetElement(id)
for id in __revit__.ActiveUIDocument.Selection.GetElementIds()]
except:
# old method
return list(__revit__.ActiveUIDocument.Selection.Elements)
selection = get_selected_elements(doc)
# convenience variable for first element in selection
if len(selection):
s0 = selection[0]
#------------------------------------------------------------------------------
import clr
from Autodesk.Revit.DB import ElementSet, ElementId
class RevitLookup(object):
def __init__(self, uiApplication):
'''
for RevitSnoop to function properly, it needs to be instantiated
with a reference to the Revit Application object.
'''
# find the RevitLookup plugin
try:
rlapp = [app for app in uiApplication.LoadedApplications
if app.GetType().Namespace == 'RevitLookup'
and app.GetType().Name == 'App'][0]
except IndexError:
self.RevitLookup = None
return
# tell IronPython about the assembly of the RevitLookup plugin
clr.AddReference(rlapp.GetType().Assembly)
import RevitLookup
self.RevitLookup = RevitLookup
# See note in CollectorExt.cs in the RevitLookup source:
self.RevitLookup.Snoop.CollectorExts.CollectorExt.m_app = uiApplication
self.revit = uiApplication
def lookup(self, element):
if not self.RevitLookup:
print 'RevitLookup not installed. Visit https://github.com/jeremytammik/RevitLookup to install.'
return
if isinstance(element, int):
element = self.revit.ActiveUIDocument.Document.GetElement(ElementId(element))
if isinstance(element, ElementId):
element = self.revit.ActiveUIDocument.Document.GetElement(element)
if isinstance(element, list):
elementSet = ElementSet()
for e in element:
elementSet.Insert(e)
element = elementSet
form = self.RevitLookup.Snoop.Forms.Objects(element)
form.ShowDialog()
_revitlookup = RevitLookup(__revit__)
def lookup(element):
_revitlookup.lookup(element)
#------------------------------------------------------------------------------
# a fix for the __window__.Close() bug introduced with the non-modal console
class WindowWrapper(object):
def __init__(self, win):
self.win = win
def Close(self):
self.win.Dispatcher.Invoke(lambda *_: self.win.Close())
def __getattr__(self, name):
return getattr(self.win, name)
__window__ = WindowWrapper(__window__)
感谢任何帮助!
根据我的经验,'init' 文件仅适用于即时使用控制台。将脚本部署到按钮(也称为 'canned command')时,需要包含 'init' 文件中的所有 up-front 定义。
这可以解释为什么当您从控制台 运行 您的脚本时 doc
工作正常,但在部署到功能区按钮时未定义。
这也是 init 文件的第一行所指的内容:
# these commands get executed in the current scope
# of each new shell (but not for canned commands)
尝试将所有 import
和 clr.AddReference
行代码添加到部署的按钮文件中,看看会发生什么
我正在用 RPS 编写我的第一个按钮,但似乎在启动时或单击按钮时未读取 init 文件。这是我在尝试按照 youtube 上提供的教程进行操作时遇到的错误。
IronPython.Runtime.UnboundNameException: global name 'doc' is not defined
在我将初始化脚本中的导入复制并粘贴到我的按钮文件之前,过滤元素收集器也出现了类似的错误。
有没有人对此有任何问题或找到任何解决方案?
这是我的代码出错的部分:
import os
import csv
import rpw
from rpw.ui.forms import Console
from rpw.ui.forms import SelectFromList
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
filepath = os.path.join(desktop, 'RevisionClouds.csv')
cl = FilteredElementCollector(doc)
cl.OfCategory(BuiltInCategory.OST_RevisionClouds)
cl.WhereElementIsNotElementType()
我在 Revit 2019 中使用 RPS 运行 python 2.7.7
这是我的 init.py 文件。我已经向它添加了更多的导入,并且它可以与 RPS 及其控制台一起正常工作。但是当涉及到 pyRevit 按钮表单时,当它已经在初始化脚本中定义时,它会在文档中出错。
init.py
# these commands get executed in the current scope
# of each new shell (but not for canned commands)
import clr
import rpw
from rpw import revit, db, ui, DB, UI
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
clr.AddReferenceByPartialName('PresentationCore')
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName('System')
clr.AddReferenceByPartialName('System.Windows.Forms')
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Architecture import *
from Autodesk.Revit.DB.Analysis import *
from Autodesk.Revit.UI import *
from Autodesk.Revit import DB
from Autodesk.Revit import UI
uidoc = __revit__.ActiveUIDocument
doc = __revit__.ActiveUIDocument.Document
from Autodesk.Revit.UI import TaskDialog
from Autodesk.Revit.UI import UIApplication
def alert(msg):
TaskDialog.Show('RevitPythonShell', msg)
def quit():
__window__.Close()
exit = quit
def get_selected_elements(doc):
"""API change in Revit 2016 makes old method throw an error"""
try:
# Revit 2016
return [doc.GetElement(id)
for id in __revit__.ActiveUIDocument.Selection.GetElementIds()]
except:
# old method
return list(__revit__.ActiveUIDocument.Selection.Elements)
selection = get_selected_elements(doc)
# convenience variable for first element in selection
if len(selection):
s0 = selection[0]
#------------------------------------------------------------------------------
import clr
from Autodesk.Revit.DB import ElementSet, ElementId
class RevitLookup(object):
def __init__(self, uiApplication):
'''
for RevitSnoop to function properly, it needs to be instantiated
with a reference to the Revit Application object.
'''
# find the RevitLookup plugin
try:
rlapp = [app for app in uiApplication.LoadedApplications
if app.GetType().Namespace == 'RevitLookup'
and app.GetType().Name == 'App'][0]
except IndexError:
self.RevitLookup = None
return
# tell IronPython about the assembly of the RevitLookup plugin
clr.AddReference(rlapp.GetType().Assembly)
import RevitLookup
self.RevitLookup = RevitLookup
# See note in CollectorExt.cs in the RevitLookup source:
self.RevitLookup.Snoop.CollectorExts.CollectorExt.m_app = uiApplication
self.revit = uiApplication
def lookup(self, element):
if not self.RevitLookup:
print 'RevitLookup not installed. Visit https://github.com/jeremytammik/RevitLookup to install.'
return
if isinstance(element, int):
element = self.revit.ActiveUIDocument.Document.GetElement(ElementId(element))
if isinstance(element, ElementId):
element = self.revit.ActiveUIDocument.Document.GetElement(element)
if isinstance(element, list):
elementSet = ElementSet()
for e in element:
elementSet.Insert(e)
element = elementSet
form = self.RevitLookup.Snoop.Forms.Objects(element)
form.ShowDialog()
_revitlookup = RevitLookup(__revit__)
def lookup(element):
_revitlookup.lookup(element)
#------------------------------------------------------------------------------
# a fix for the __window__.Close() bug introduced with the non-modal console
class WindowWrapper(object):
def __init__(self, win):
self.win = win
def Close(self):
self.win.Dispatcher.Invoke(lambda *_: self.win.Close())
def __getattr__(self, name):
return getattr(self.win, name)
__window__ = WindowWrapper(__window__)
感谢任何帮助!
根据我的经验,'init' 文件仅适用于即时使用控制台。将脚本部署到按钮(也称为 'canned command')时,需要包含 'init' 文件中的所有 up-front 定义。
这可以解释为什么当您从控制台 运行 您的脚本时 doc
工作正常,但在部署到功能区按钮时未定义。
这也是 init 文件的第一行所指的内容:
# these commands get executed in the current scope
# of each new shell (but not for canned commands)
尝试将所有 import
和 clr.AddReference
行代码添加到部署的按钮文件中,看看会发生什么