记得先跑通:Python如何调用STK接口编程-优快云博客
STK场景调用模块:
import win32com
from win32com.client import GetActiveObject
import comtypes
from comtypes.client import CreateObject
from comtypes.gen import STKUtil
from comtypes.gen import STKObjects
from comtypes.gen import AgSTKGraphicsLib
from comtypes.gen import AgSTKVgtLib
from comtypes.gen import AgUiApplicationLib
from comtypes.gen import AgUiCoreLib
from comtypes.gen import stdole
from comtypes.gen import STKObjects
import time
SatelliteNumber = 18
class STKWindow:
def __init__(self,flag=False):
if flag==True:
self.uiApplication = win32com.client.Dispatch('STK11.Application')
self.uiApplication.Visible = True
self.uiApplication = CreateObject('STK11.Application')
self.uiApplication.Visible = True
# Get our IAgStkObjectRoot interface
self.root = self.uiApplication.Personality2
elif flag==False:
try:
self.uiApplication=GetActiveObject('STK11.Application')
self.root = self.uiApplication.Personality2
self.sc=self.root.CurrentScenario
self.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)
except:
print("no active STK or Scenario")
else:
self.uiApplication = win32com.client.Dispatch('STK11.Application')
self.uiApplication.Visible = True
self.uiApplication = CreateObject('STK11.Application')
self.uiApplication.Visible = True
self.root = self.uiApplication.Personality2
self.root.Load(flag)
self.sc=self.root.CurrentScenario
self.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)
def newScenario(self,name,startTime,endTime):
self.root.NewScenario(name)
self.sc=self.root.CurrentScenario
self.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)
scIAg.SetTimePeriod(startTime,endTime)
self.root.Rewind()
STK 场景中各种对象的编号:
# <!-- Member Value Description -->
number_eAdvCat = 0 # AdvCAT.
number_eAircraft = 1 # Aircraft.
number_eAreaTarget = 2 # Area Target.
number_eAttitudeCoverage = 3 # Attitude Coverage.
number_eChain = 4 # Chain.
number_eCommSystem = 5 # CommSystem.
number_eConstellation = 6 # Constellation.
number_eCoverageDefinition = 7 # Coverage Definition.
number_eFacility = 8 # Facility.
number_eGroundVehicle = 9 # Ground Vehicle.
number_eLaunchVehicle = 10 # Launch Vehicle.
number_eLineTarget = 11 # Line Target.
number_eMTO = 12 # MTO (Multi-Track Object).
number_eMissile = 13 # Missile.
number_eMissileSystem = 14 # Missile System.
number_ePlanet = 15 # Planet.
number_eRadar = 16 # Radar.
number_eReceiver = 17 # Receiver.
number_eSatellite = 18 # Satellite.
number_eScenario = 19 # Scenario.
number_eSensor = 20 # Sensor.
number_eShip = 21 # Ship.
number_eStar = 22 # Star.
number_eTarget = 23 # Target.
number_eTransmitter = 24 # Transmitter.
number_eFigureOfMerit = 25 # Figure of Merit.
number_eRoot = 26 # Root.
number_eAccess = 27 # Access.
number_eObjectCoverage = 28 # Coverage.
number_eAttitudeFigureOfMerit = 29 # Attitude Figure of Merit.
number_eAntenna = 31 # Antenna.
number_ePlace = 32 # Place.
number_eVolumetric = 33 # Volumetric
获取场景:
STKW = STKWindow('G:\AGI\STK Files\test.sc')
可见性函数和相关辅助模块:
def get_default_time_ticks():
time_str = STKW.scIAg.StartTime
ticks = time.mktime(time.strptime(time_str[:-4],"%d %b %Y %H:%M:%S"))
return int(ticks)
default_time_ticks = get_default_time_ticks()
def addAccess(Monitor,Monitored):
Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)
Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)
access = Monitor.GetAccessToObject(Monitored)
access.SpecifyAccessTimePeriod(STKW.scIAg.StartTime, add_on_date(STKW.scIAg.StartTime, 7))
access.ComputeAccess()
results = access.ComputedAccessIntervalTimes
if results.Count > 0:
results = results.ToArray(0,results.Count)
else:
results = []
return results
def time_convert(time_str):
ticks = time.mktime(time.strptime(time_str[:-4],"%d %b %Y %H:%M:%S"))
# print (from_time[:], time.strftime("%d %b %Y %H:%M:%S", time.localtime(ticks)), end = ' ~ ')
return int(ticks - default_time_ticks)
def time_convert_reverse(ticks):
time_str = time.strftime("%d %b %Y %H:%M:%S", time.localtime(ticks))
# print (from_time[:], time.strftime("%d %b %Y %H:%M:%S", time.localtime(ticks)), end = ' ~ ')
return time_str
def add_on_date(time_str, days = 7):
ticks = time_convert(time_str) + default_time_ticks
ticks += days*24*3600
return time_convert_reverse(ticks)
获取所有对象:
number_all_elements = 0
elementName_to_idx = {}
f_log = open("log.txt", mode="w", encoding="utf-8")
f_contact = open("contact_graph.csv", mode="w", encoding="utf-8")
print('src,des,period_start,period_end,rate,owlt', file = f_contact)
sats = STKW.sc.Children.GetElements(number_eSatellite)
places = STKW.sc.Children.GetElements(number_ePlace)
targets = STKW.sc.Children.GetElements(number_eTarget)
facilities = STKW.sc.Children.GetElements(number_eFacility)
sats_P = sats
sats = []
Exclude_sats = ['Not_need_to_add_access']
for sat in sats_P:
if sat.InstanceName not in Exclude_sats:
sats.append(sat)
for target in targets:
if target.InstanceName not in elementName_to_idx:
number_all_elements += 1
elementName_to_idx[target.InstanceName] = number_all_elements
for place in places:
if place.InstanceName not in elementName_to_idx:
number_all_elements += 1
elementName_to_idx[place.InstanceName] = number_all_elements
for facility in facilities:
if facility.InstanceName not in elementName_to_idx:
number_all_elements += 1
elementName_to_idx[facility.InstanceName] = number_all_elements
for sat in sats:
if sat.InstanceName not in elementName_to_idx:
number_all_elements += 1
elementName_to_idx[sat.InstanceName] = number_all_elements
获取所有可见性:
used_sats = set()
for sat1 in sats:
used_sats.add(sat1.InstanceName)
for sat2 in sats:
# number_sat1 = int(sat1.InstanceName[-2:])
# number_sat2 = int(sat2.InstanceName[-2:])
# if number_sat1 < number_sat2:
if sat2.InstanceName not in used_sats:
accessTimes = addAccess(sat1, sat2)
for accessTime in accessTimes:
time_tick_0 = time_convert(accessTime[0])
time_tick_1 = time_convert(accessTime[1])
if time_tick_0 + 30 >= time_tick_1:
continue
print(sat1.InstanceName, sat2.InstanceName, elementName_to_idx[sat1.InstanceName],\
elementName_to_idx[sat2.InstanceName], ':', end = ' ', file = f_log)
print(time_tick_0, time_tick_1, file = f_log)
out_data = str(elementName_to_idx[sat1.InstanceName]) + ',' +\
str(elementName_to_idx[sat2.InstanceName]) + ',' +\
str(time_tick_0) + ','+ str(time_tick_1) +\
',1,1'
print(accessTime[0], accessTime[1])
print(out_data, file = f_contact)
for place in places:
for sat in sats:
accessTimes = addAccess(place, sat)
for accessTime in accessTimes:
time_tick_0 = time_convert(accessTime[0])
time_tick_1 = time_convert(accessTime[1])
if time_tick_0 + 30 >= time_tick_1:
continue
print(place.InstanceName, sat.InstanceName, elementName_to_idx[place.InstanceName],\
elementName_to_idx[sat.InstanceName], ':', end = ' ', file = f_log)
print(time_tick_0, time_tick_1, file = f_log)
out_data = str(elementName_to_idx[place.InstanceName]) + ',' +\
str(elementName_to_idx[sat.InstanceName]) + ',' +\
str(time_tick_0) + ',' + str(time_tick_1) +\
',1,1'
print(out_data, file = f_contact)
for facility in facilities:
for sat in sats:
acces_from = facility
accessTimes = addAccess(acces_from, sat)
for accessTime in accessTimes:
time_tick_0 = time_convert(accessTime[0])
time_tick_1 = time_convert(accessTime[1])
if time_tick_0 + 30 >= time_tick_1:
continue
print(acces_from.InstanceName, sat.InstanceName, \
elementName_to_idx[acces_from.InstanceName],\
elementName_to_idx[sat.InstanceName], ':', end = ' ', file = f_log)
print(time_tick_0, time_tick_1, file = f_log)
out_data = str(elementName_to_idx[acces_from.InstanceName]) + ',' +\
str(elementName_to_idx[sat.InstanceName]) + ',' +\
str(time_tick_0) + ',' + str(time_tick_1) +\
',1,1'
print(out_data, file = f_contact)
for target in targets:
for sat in sats:
accessTimes = addAccess(target, sat)
for accessTime in accessTimes:
time_tick_0 = time_convert(accessTime[0])
time_tick_1 = time_convert(accessTime[1])
if time_tick_0 + 30 >= time_tick_1:
continue
print(target.InstanceName, sat.InstanceName, elementName_to_idx[target.InstanceName],\
elementName_to_idx[sat.InstanceName], ':', end = ' ', file = f_log)
print(time_tick_0, time_tick_1, file = f_log)
out_data = str(elementName_to_idx[target.InstanceName]) + ',' +\
str(elementName_to_idx[sat.InstanceName]) + ',' +\
str(time_tick_0) + ',' + str(time_tick_1) +\
',1,1'
print(out_data, file = f_contact)
f_log.close()
f_contact.close()
查询编号和名称的对应关系:
idx_to_elementName = {}
for key in elementName_to_idx:
idx_to_elementName[elementName_to_idx[key]] = key
for key in idx_to_elementName:
print(key, idx_to_elementName[key])
结果: