如何在 python (pywin32) 中创建和使用来自 Inventor COM API 的对象
How to create and use objects from the Inventor COM API in python (pywin32)
我正在尝试使用 Autodesk Inventor 的 COM API 创建一个 python 脚本,该脚本将生成 Inventor 工程图上所选内容的 PDF,然后将以特定方式处理这些 PDF这对我的问题很重要。我正在使用 pywin32 访问 COM API,但我不是特别熟悉 COM API 的使用方式和 pywin32 模块。
This is the extent of the documentation for Inventor's API that I have been able to find (diagram of API Object Model Reference Document),我无法找到列出的各个对象的文档。因此,我对这些对象的使用的理解基于我可以从在线示例中找到的内容(全部在 VB 或 iLogic - Inventor 自己的简单内置语言中)。
我遇到的一个大问题是创建我想使用的对象。下面的简化示例:
from win32com.client import *
# user chooses file paths for open and save here...
drawing_filepath = ""
# Open Inventor application, and set visible (so I can tell it's opened for now)
app = Dispatch('Inventor.Application')
app.Visible = True
# Open the file to be saved as a pdf (returns a Document object)
app.Documents.Open(drawing_filepath)
# Cast the opened Document object to a DrawingDocument object (it is guaranteed to be a drawing)
drawing = CastTo(app.ActiveDocument, "DrawingDocument")
# Create and setup a print manager (so can use "Adobe PDF" printer to convert the drawings to PDF)
print_manager = ??? # How can I create this object
# I've tried:
# print_manager = Dispatch("Inventor.Application.Documents.DrawingDocument.DrawingPrintManager") #"Invalid class string"
# print_manager = drawing.DrawingPrintManager() #"object has no attribute 'DrawingPrintManger'
# print_manager = drawing.DrawingPrintManager # same as above
# print_manager = drawing.PrintManger # worked in the end
print_manager.Printer = "Adobe PDF"
print_manager.NumberOfCopies = 1
print_manager.ScaleMode = print_manager.PrintScaleModeEnum.kPrintFullScale
print_manager.PaperSize = print_manager.PrintSizeEnum.kPaperSizeA3
# Print PDF
print_manager.SubmitPrint()
所以我不知道如何创建一个 DrawingPrintManager 来使用!您可以看到我在创建 DrawingDocument 对象时避免了这个问题,因为我刚好知道有一个 ActiveDocument 属性可以从应用程序本身获取。
我也:
- 不知道 DrawingPrintManager 的属性和方法的完整列表是什么,所以我不知道如何设置保存位置
- 不确定我尝试使用的两个枚举实际上是在 DrawingPrintManager 中定义的,但是一旦我真正拥有一个 DrawingPrintManager 可以使用时我就可以弄清楚
如果任何在使用 COM APIs 或 pywin32 方面有更多经验的人可以帮助我,我将不胜感激。同样,如果有人可以向我指出 Inventor API 对象的任何实际文档,这将使事情变得容易得多。
谢谢
编辑:发布后我几乎立即发现我可以通过访问 drawing.PrintManager
而不是 drawing.DrawingPrintManager
.[=16 来获得 PrintManager(无法判断是 PrintManager 还是 DrawingPrintManager) =]
这是一种解决方法,但它没有回答我关于如何在 pywin32 中创建对象的问题。
我接下来的问题是找到可以访问 PrintScaleModeEnum 和 PrintSizeEnum 对象的位置,并找到如何设置打印 PDF 的保存位置(我认为这将是一个单独的问题,因为它可能与 COM 无关API).
我不熟悉 python 和 pywin32,但我尽量回答你的问题。
Inventor 文档 API 可在本地安装 "C:\Users\Public\Documents\Autodesk\Inventor 2020\Local Help" 或在线 https://help.autodesk.com/view/INVNTOR/2020/ENU/
通常您无法创建 Inventor API 对象的新实例。您必须通过适当的方法或 属性 值获得它们。
例如:
你不能这样做
doc = new Inventor.Document()
你必须这样做
doc = app.Documents.Add(...)
打印管理器是这个
print_manager = drawing.PrintManger
# this returns object of type Inventor.DrawingPrintManager
# when drawing is of type Inventor.DrawingDocument
See this了解更多详情
我正在尝试使用 Autodesk Inventor 的 COM API 创建一个 python 脚本,该脚本将生成 Inventor 工程图上所选内容的 PDF,然后将以特定方式处理这些 PDF这对我的问题很重要。我正在使用 pywin32 访问 COM API,但我不是特别熟悉 COM API 的使用方式和 pywin32 模块。
This is the extent of the documentation for Inventor's API that I have been able to find (diagram of API Object Model Reference Document),我无法找到列出的各个对象的文档。因此,我对这些对象的使用的理解基于我可以从在线示例中找到的内容(全部在 VB 或 iLogic - Inventor 自己的简单内置语言中)。
我遇到的一个大问题是创建我想使用的对象。下面的简化示例:
from win32com.client import *
# user chooses file paths for open and save here...
drawing_filepath = ""
# Open Inventor application, and set visible (so I can tell it's opened for now)
app = Dispatch('Inventor.Application')
app.Visible = True
# Open the file to be saved as a pdf (returns a Document object)
app.Documents.Open(drawing_filepath)
# Cast the opened Document object to a DrawingDocument object (it is guaranteed to be a drawing)
drawing = CastTo(app.ActiveDocument, "DrawingDocument")
# Create and setup a print manager (so can use "Adobe PDF" printer to convert the drawings to PDF)
print_manager = ??? # How can I create this object
# I've tried:
# print_manager = Dispatch("Inventor.Application.Documents.DrawingDocument.DrawingPrintManager") #"Invalid class string"
# print_manager = drawing.DrawingPrintManager() #"object has no attribute 'DrawingPrintManger'
# print_manager = drawing.DrawingPrintManager # same as above
# print_manager = drawing.PrintManger # worked in the end
print_manager.Printer = "Adobe PDF"
print_manager.NumberOfCopies = 1
print_manager.ScaleMode = print_manager.PrintScaleModeEnum.kPrintFullScale
print_manager.PaperSize = print_manager.PrintSizeEnum.kPaperSizeA3
# Print PDF
print_manager.SubmitPrint()
所以我不知道如何创建一个 DrawingPrintManager 来使用!您可以看到我在创建 DrawingDocument 对象时避免了这个问题,因为我刚好知道有一个 ActiveDocument 属性可以从应用程序本身获取。
我也:
- 不知道 DrawingPrintManager 的属性和方法的完整列表是什么,所以我不知道如何设置保存位置
- 不确定我尝试使用的两个枚举实际上是在 DrawingPrintManager 中定义的,但是一旦我真正拥有一个 DrawingPrintManager 可以使用时我就可以弄清楚
如果任何在使用 COM APIs 或 pywin32 方面有更多经验的人可以帮助我,我将不胜感激。同样,如果有人可以向我指出 Inventor API 对象的任何实际文档,这将使事情变得容易得多。
谢谢
编辑:发布后我几乎立即发现我可以通过访问 drawing.PrintManager
而不是 drawing.DrawingPrintManager
.[=16 来获得 PrintManager(无法判断是 PrintManager 还是 DrawingPrintManager) =]
这是一种解决方法,但它没有回答我关于如何在 pywin32 中创建对象的问题。
我接下来的问题是找到可以访问 PrintScaleModeEnum 和 PrintSizeEnum 对象的位置,并找到如何设置打印 PDF 的保存位置(我认为这将是一个单独的问题,因为它可能与 COM 无关API).
我不熟悉 python 和 pywin32,但我尽量回答你的问题。
Inventor 文档 API 可在本地安装 "C:\Users\Public\Documents\Autodesk\Inventor 2020\Local Help" 或在线 https://help.autodesk.com/view/INVNTOR/2020/ENU/
通常您无法创建 Inventor API 对象的新实例。您必须通过适当的方法或 属性 值获得它们。
例如:
你不能这样做
doc = new Inventor.Document()
你必须这样做
doc = app.Documents.Add(...)
打印管理器是这个
print_manager = drawing.PrintManger
# this returns object of type Inventor.DrawingPrintManager
# when drawing is of type Inventor.DrawingDocument
See this了解更多详情