pyhton调用STK常用代码
使用python创建STK新实例
从零开始创建脚本
设置python的工作区
from win32api import GetSystemMetrics
导入com类型接口
from comtypes.client import CreateObject
创建句柄,root语句执行后,comtypes 库会自动创建包含 STKUtil 和 STK Objects 的 gen 文件夹,即comtypes.gen
uiApplication=CreateObject("STK11.Application") #type(uiApplication) 为 <class 'comtypes.POINTER(_IAgUiApplication)'>
设置STK界面是否可见
uiApplication.Visible=True
uiApplication.UserControl=True
获取STK根对象,root类型: IAgStkObjectRoot
Personality2 返回STK对象模型的根对象的新实例 IAgStkObjectRoot 接口,假如是 Personality, 打开现有STK对象
root = uiApplication.Personality2
from comtypes.gen import STKUtil
from comtypes.gen import STKObjects
创建仿真场景
创建新的场景
type(scenario) 为 <class ‘comtypes.POINTER(IAgStkObject)’>
root.NewScenario("Python_Starter")
scenario = root.CurrentScenario #获取当前场景
设置仿真时间
COM组件编程 对象转换 用 “QueryInterface”
“+n{Unit}” 输入时间增量仅对“StopTime结束时间”有效,并定义添加到开始时间的时间长度
n是一个整数, {Unit}取值: Day, Days, Hour, Hours, Hr, Hrs, Min, Mins, Minute, Minutes, Sec, Secs, Second, Seconds
scenario2 = scenario.QueryInterface(STKObjects.IAgScenario)
scenario2.SetTimePeriod('Today','+24hr')
STK对象模型的根对象root调用方法: 重置仿真时间
Rewind 本身是 IAgAnimation 的方法
type(root) 为 <class ‘comtypes.POINTER(_IAgStkObjectRoot)’>
root.Rewind();
创建目标
设置地面站目标,scenario 类型为 IAgStkObject
Children属性: 返回当前对象的直接后代的集合,返回类型为IAgStkObjectCollection
IAgStkObjectCollection.New 方法: 使用指定的类和实例名称创建STK对象
COM对象模型编程中的命名技巧:
则强制转换时,为QueryInterface(STKObjects.IAgTarget)
只需将前缀 e 改为前缀 IAg
target = scenario.Children.New(STKObjects.eTarget,"GroundTarget");
target2 = target.QueryInterface(STKObjects.IAgTarget)
设置位置坐标
Position 是只读属性, 但“COM对象编程”时,其接口类型为 IAgPosition
通过 IAgPosition 接口的 AssignGeodetic( Lat, # 纬度 Lon, # 经度 Alt # 海拔高度 )
target2.Position.AssignGeodetic(50,-100,0)
插入卫星,satellite 的类型 为 IAgStkObject
satellite = scenario.Children.New(STKObjects.eSatellite, "LeoSat")
卫星轨道外推,使用 IAgStkObjectRoot 接口 的 ExecuteCommand 方法
root.ExecuteCommand('SetState */Satellite/LeoSat Classical TwoBody "' + scenario2.StartTime + '" "'+ scenario2.StopTime +'" 60 ICRF "'+ scenario2.StartTime + '" 7200000.0 0.0 90 0.0 0.0 0.0')
计算卫星和地面站的可见性
使用 IAgStkObject 接口计算两个 STK 对象之间的访问
access = satellite.GetAccessToObject(target)
access.ComputeAccess()
accessDP = access.DataProviders.Item('Access Data')
accessDP2 = accessDP.QueryInterface(STKObjects.IAgDataPrvInterval)
results = accessDP2.Exec(scenario2.StartTime, scenario2.StopTime)
accessStartTimes = results.DataSets.GetDataSetByName('Start Time').GetValues()
accessStopTimes = results.DataSets.GetDataSetByName('Stop Time').GetValues()
也可以用以下代码设置开始和停止时间
accessIntervals = access.ComputedAccessIntervalTimes
accessDataProvider = access.DataProviders.Item('Access Data')
accessDataProvider2 = accessDataProvider.QueryInterface(STKObjects.IAgDataPrvInterval)
dataProviderElements = ['Start Time', 'Stop Time']
for i in range(0,accessIntervals.Count):
times = accessIntervals.GetInterval(i)
print(times)
计算access
satelliteDP = satellite.DataProviders.Item('LLA State')
satelliteDP2 = satelliteDP.QueryInterface(STKObjects.IAgDataProviderGroup)
satelliteDP3 = satelliteDP2.Group.Item('Fixed')
satelliteDP4 = satelliteDP3.QueryInterface(STKObjects.IAgDataPrvTimeVar)
rptElements = ['Time', 'Lat', 'Lon', 'Alt']
satellitDPTimeVar = satelliteDP4.ExecElements(accessStartTimes,accessStopTimes, 60, rptElements)
satelliteAltitude = satellitDPTimeVar.DataSets.GetDataSetByName('Alt').GetValues()
print(satelliteAltitude)