有没有办法使用python自动创建VBA宏文件?

问题描述

作为一些工作流优化的一部分,我想将大量 Solidworks 函数映射到热键。程序本身具有将功能分配给热键的能力,但这只是整个命令集的一小部分。其余的可以通过一种变通方法分配给热键,即创建一个运行该功能的宏并将该宏分配给热键。

在 Solidworks 中创建宏的方式有两种:

  1. 在 Solidworks 中,可以记录一系列命令,然后将它们保存为 .swb 文件。运行该宏会重复记录的命令。 (这个方法有问题,真的一无所获)

  2. 可以使用 Microsoft Visual Basic for Applications 直接创建宏,Solidworks 将其用作宏编辑器。生成文件又是一个 .swb 文件,运行它会执行它调用的 Solidworks 函数。这种方法是创建多个热键的最简单方法,因为我只需要编辑一行代码,就可以执行我想要的任何功能

这是它的样子:

Dim swApp As Object
Dim Part As Object

Sub main()
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
swApp.runcommand swCommands_leader_Add_Bent,""
End Sub

上面的示例宏,在 VB 中,为选定的引导线添加一个转折点。下面一行是负责执行 Solidworks 功能的一行。

swApp.runcommand swCommands_leader_Add_Bent,""

例如,将 swCommands_leader_Add_Bent 更改为 swCommands_Select_Midpoint 现在会使代码选择一条线或一条边的中点。

使用该方法,我可以创建可以运行 Solidworks 的三千个左右命令中的任何一个的宏。问题是,这个过程有点乏味,并且为数十或数百个命令执行此操作将非常耗时。我有所有 SolidWorks 函数的列表,所以理想情况下,我想将该列表提供给一些 python 代码代码使用列表中的函数编辑 swApp.runcommand 行,并且该代码输出 .swb 文件准备分配给热键的宏。

其他一些评论

  • 我不太确定 .swb 文件是什么类型的文件,所以如果我的术语不正确,请原谅我。我知道它们不是文本文件,因为在文本编辑器中打开它会导致废话。它们使用 Microsoft Visual Basic for Applications 7.1 进行编辑。 Solidworks 称它们为 SW VBA 宏。

  • 我不想从 python 运行宏或 VBA 代码本身。我已经开始工作了,但它对于我的需求来说太慢了。我想用python生成VBA文件

  • 我四处搜索,没有找到一种方法可以让 python 编辑、写入或生成 VBA 文件

  • 解决方案不一定非要使用 python,但那是我最熟悉的语言。我对其他语言或方法持开放态度。

总而言之,我希望自动创建大量 SW VBA 宏 (*.swb),你们能提供任何指导或建议吗?

解决方法

如果我正确理解了您的问题,以下应该可以工作(未测试!!);

您可以创建一个函数来将任何命令名称替换为您提供的代码,如下所示;

def macro_code_text(command_name):
    return f"""
Dim swApp As Object
Dim Part As Object

Sub main()
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
swApp.RunCommand {command_name},""
End Sub
"""

..然后你可以创建一个包含所有命令名称的列表;

command_names = ['swCommands_Leader_Add_Bent','swCommands_Select_Midpoint']

..然后遍历列表,将结果文本保存到扩展名为“.swb”的文件中;

generic_file_name = 'my_solidworks_macro_'

for i,command_name in enumerate(command_names):
    with open(generic_file_name + str(i) + '.swb','w+') as file:
        file.write(macro_code_text(command_name))

..这应该会生成许多名为“my_solidworks_macro_0”、“my_solidworks_macro_1”等的文件,每个文件的命令名称都与您提供的列表不同。