跳转至

STK with Python

这篇文章会告诉你如何将基于 Spyder / Pycharm 的 Python 与 STK 互联

旨在让你能够 通过Python指令控制STK显示器

我们的步骤是:

  1. 在 windows 上安装配置 anaconda
  2. 安装配置 Pycharm (Community Version)
  3. 在 Pycharm 中配置选定 Anaconda 虚拟环境
  4. 在Pycharm中,将其与STK进行第一次连接
  5. 之后就可以“随心所欲”使用Pycharm控制STK了

Windows 配置 Anaconda

参考 这篇博客

这一步尤其要注意 环境变量路径设置,建议是直接将 Anaconda 放在C盘根目录下,比较直观

这一部分只需要参考Anaconda的下载与配置,VSCode讲解不用管

Note

笔者在这一步使用conda create -n stk-env创建了stk-env这一虚拟环境

Windows 安装配置 Pycharm

参考 这篇博客

这里有个小雷,需要注意一下:

Warning

在 “选择编译环境” 这一步中,你之前创建的stk-env可能找不到,会有红字报错,说“未找到虚拟环境”

原因未知,笔者在这里耗了很长时间都没解决

最后的解决办法是:

直接在Pycharm中创建 一个虚拟环境stk-exp,这个就可以直接识别出来了,而且亲测后续都没问题

后续我们将全部基于此处创建的stk-exp进行开发 🚀

alt text

Pycharm 选定 Anaconda 虚拟环境

alt text

如果你的界面 (看右下角显示stk-exp) 也是这样,那就说明你的此 Python Project 已经关联上 stk-exp 环境了

初始化STK和Python的连接

这一步非常非常非常重要!

使用 Spyder

使用 Spyder 作为文本编辑器连接

STK和Python交互的逻辑是:

  1. 第一次必须先用“前置脚本”为环境添加STK“标记”
    • 现在在电脑看来,你的Python环境已经和“STK”连接在一起了
    • 可以在虚拟环境的文件夹中检查
  2. 后续就直接连接即可

因此我们在这里介绍如何做“第一次连接” 🚀

在虚拟环境中安装Spyder

进入你的虚拟环境并安装Spyder

Bash
1
2
conda activate stk-exp
conda install spyder

现在就安装完成了,后续可以通过在CLI中敲入 spyder 打开界面

Bash
1
2
(base) PS C:\Users\Administrator> conda activate stk-exp
(stk-exp) PS C:\Users\Administrator> spyder

alt text

配置第一次连接

1)在虚拟环境中安装 comtypes

Bash
1
conda install comtypes

2)此时检查C:\anaconda3\envs\stk-exp\Lib\site-packages\comtypes

只有你看到:C:\anaconda3\envs\stk-exp\Lib\site-packages\comtypes呈现存在类似的文件系统,才说明安装成功!

alt text

3)在 Spyder 中运行“前置脚本”进行连接

将这段代码复制进去(针对版本STK12.2)

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# import COM module
import comtypes
from comtypes.client import CreateObject

# open STK
app=CreateObject("STK12.Application")
# For STK GUI
app.Visible = True

print('STK app type is ',type(app))

# Root Obj of "Object Model": IAgStkObjectRoot
# Interface of AgStkObjectRoot
# You can create scenario / GS / Satellite by this
root = app.Personality2

print('STK root type is ',type(root))

# Register (For STK 12.2)
comtypes.client.GetModule((comtypes.GUID("{FEAEF02E-48CE-42AE-B99B-FB9871A69E4B}") ,1,0))

print('Python <------> STK all good!')
print('=============================')

点击运行即可!

注意,此代码仅运行一次,运行后,将会在上述 comtypes 文件夹下创建 gen 目录,并创建以下模块:

Bash
1
2
3
4
5
6
7
AgUiApplicationLib.py
AgUiCoreLib.py
AgSTKGraphicsLib.py
AgSTKVgtLib.py
STKObjects.py
STKUtil.py
AgStkGatorLib.py

运行完成后,将打开的STK程序关闭即可。

小心

这个例子现在不要关,放在后台运行就行,后面会提到用处

4)安装 AGI 库

在STK的安装目录里找到 <your path>:STK\bin\AgPythonAPI里面的agi.stk12-12.2.0-py3-none-any.whl

比如笔者的在: "C:\Program Files\AGI\STK 12\bin\AgPythonAPI\agi.stk12-12.2.0-py3-none-any.whl"

右击,“用终端打开”,然后输入: pip install agi.stk12-12.2.0-py3-none-any.whl

alt text

Bash
1
2
conda activate stk-exp
pip install agi.stk12-12.2.0-py3-none-any.whl

alt text

至此,你的“第一次连接”就全部完成了 🎉🎉🎉

后续连接

这里我们会给出一个例子,在“首次连接”之后

我们想在 Spyder 中写一段代码,它能跟STK交互,让STK生成一条纵向、经过南北极的环

获得STK_PID

还记得我们上面提到 “这个例子现在不要关,放在后台运行就行”吗?

用处就在这里体现!因为我们要看它(一个执行程序)的PID!

如何查看STK_PID

直接在Anaconda的Shell中敲入 tasklist 指令,找到 AgUiApplication.exe:

alt text

alt text

记住它的PID,这就是STK_PID!

Warning

特别注意,PID每次运行的都不相同,这与系统线程有关

每次运行STK的时候,都要取得“当前”的STK_PID

进行连接

将“第一次连接”的例子代码全部删除,复制下面的代码进去,点击运行:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from agi.stk12.stkdesktop import STKDesktop
from agi.stk12.stkobjects import *
from agi.stk12.stkutil import *
from agi.stk12.vgt import *
import os

STK_PID = XXX  # mentioned above
stk = STKDesktop.AttachToApplication(pid=int(STK_PID))
root = stk.Root
print(type(root))

如果你得到的结果是:

Bash
1
<class 'agi.stk12.stkobjects.AgStkObjectRoot'>

那就说明一切OK!

添加场景

将原来在Spyder中的代码全部删去,用下面这段代码:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from agi.stk12.stkdesktop import STKDesktop
from agi.stk12.stkobjects import *
from agi.stk12.stkutil import *
from agi.stk12.vgt import *
import os

STK_PID = 764  # By Tasklist
stk = STKDesktop.AttachToApplication(pid=int(STK_PID))
root = stk.Root
print(type(root))

if root.CurrentScenario is not None:
    root.CloseScenario()

root.NewScenario("NewScenario")

print("===================new=======================")

scenario = root.CurrentScenario # link: current scenario
root.Rewind() # reset

# Add: GS
target = AgTarget(scenario.Children.New(AgESTKObjectType.eTarget,"GroundTarget"))
target.Position.AssignGeodetic(50,-100,0)

# Add: Satellite
satellite = AgSatellite(root.CurrentScenario.Children.New(AgESTKObjectType.eSatellite,"LeoSat"))
print(scenario.StartTime)
print(scenario.StopTime)
root.ExecuteCommand('SetState */Satellite/LeoSat Classical TwoBody "' + 
                    str(scenario.StartTime) + '" "' + str(scenario.StopTime) + 
                    '" 60 ICRF "' + str(scenario.StartTime) + '" 7200000.0 0.0 90 0.0 0.0 0.0');

点击运行即可!

在STK中稍等几十秒,应该就可以看见这样的场景了:

alt text

我的工作流

每当我想使用Python控制STK行为时,我会按如下的顺序去做

  1. 双击STK桌面图标,开启应用
  2. 在PowerShell中

    Bash
    1
    2
    conda activate stk-exp
    tasklist
    

    找到对应的AgUiApplication.exe的STK_PID

  3. 在虚拟环境中开启Spyder去做

使用 Pycharm

使用 Pycharm 作为文本编辑器连接