本文主要是介绍Python 调用STK接口的常用操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
和Python如何调用STK接口编程-CSDN博客这里说的一样,STK Help文档里面其实有讲,但也有不少坑。所以这边整理了一些对Satellite, Target, Aircraft等对象的基本操作:
生成STK场景:
import pymysql
import win32comfrom 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 STKObjectsclass STKWindow:def __init__(self,flag=False):if flag==True:self.uiApplication = win32com.client.Dispatch('STK11.Application')self.uiApplication.Visible = Trueself.uiApplication = CreateObject('STK11.Application')self.uiApplication.Visible = True# Get our IAgStkObjectRoot interfaceself.root = self.uiApplication.Personality2elif flag==False:try:self.uiApplication=GetActiveObject('STK11.Application')self.root = self.uiApplication.Personality2self.sc=self.root.CurrentScenarioself.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)except:print("no active STK or Scenario") else:self.uiApplication = win32com.client.Dispatch('STK11.Application')self.uiApplication.Visible = Trueself.uiApplication = CreateObject('STK11.Application')self.uiApplication.Visible = Trueself.root = self.uiApplication.Personality2self.root.Load(flag)self.sc=self.root.CurrentScenarioself.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)def newScenario(self,name,startTime,endTime):self.root.NewScenario(name)self.sc=self.root.CurrentScenarioself.scIAg=self.sc.QueryInterface(STKObjects.IAgScenario)scIAg.SetTimePeriod(startTime,endTime)self.root.Rewind()return self.scdef connect(sql):conn = pymysql.connect(host="127.0.0.1",user ="root", passwd ="123456", db = "task scheduling", port=3306,charset = 'utf8')cur =conn.cursor() cur.execute(sql)if sql.strip()[:6].upper()=='SELECT':res=cur.fetchall()else:coon.commit()res='ok'cur.close()conn.close()return res
Spacecraft:
class Spacecraft:def __init__(self,name,Type='',Time='1 Jan 2020 00:00:00.000',revolve=10,inclination=0,RAAN=0,argumentOfPerigee=0,eccentricity=0,MeanAnomaly=0):self.name=nameself.Type=Typeself.Time=Timeself.revolve=revolveself.inclination=inclinationself.RAAN=RAANself.argumentOfPerigee=argumentOfPerigeeself.eccentricity=eccentricityself.MeanAnomaly=MeanAnomalyself.uniqueNumber=18self.cmds=[]self.cmds.append('New / */Satellite %s' %name)self.cmds.append('New / */Satellite %s' %name)def queryFromSecenario(self,sc):try:sats=sc.Children.GetElements(self.uniqueNumber)sat=sats.Item(self.name)return satexcept:return Nonedef deleteFromSecenario(self,sc):if self.queryFromSecenario(sc):sc.Children.Unload(self.uniqueNumber,self.name)return 'already deleted'else:return 'not exist'def addToScenario(self,root,sc):if self.queryFromSecenario(sc):
# 'can not add, this name already exists'return Nonesat=sc.Children.New(self.uniqueNumber, self.name) # eSatellite satIAg= sat.QueryInterface(STKObjects.IAgSatellite)satIAg.PropagatorSupportedTypessatIAg.SetPropagatorType(STKObjects.ePropagatorJ4Perturbation)satProp = satIAg.PropagatorsatProp=satProp.QueryInterface(STKObjects.IAgVePropagatorJ4Perturbation)satProp.InitialState.Epoch=self.Timekeplerian = satProp.InitialState.Representation.ConvertTo(STKUtil.eOrbitStateClassical)keplerian2 = keplerian.QueryInterface(STKObjects.IAgOrbitStateClassical)keplerian2.SizeShapeType =STKObjects.eSizeShapeMeanMotion
# keplerian2.SizeShapeType =STKObjects.eSizeShapeSemimajorAxiskeplerian2.LocationType = STKObjects.eLocationMeanAnomalykeplerian2.Orientation.AscNodeType = STKObjects.eAscNodeRAANroot.UnitPreferences.Item('AngleUnit').SetCurrentUnit('revs')root.UnitPreferences.Item('TimeUnit').SetCurrentUnit('day')root.UnitPreferences.Item('Distance').SetCurrentUnit('km')print(keplerian2.SizeShape)keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeMeanMotion).MeanMotion = self.revolvekeplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeMeanMotion).Eccentricity = self.eccentricity
# keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeSemimajorAxis).SemimajorAxis = self.SemimajorAxis
# keplerian2.SizeShape.QueryInterface(STKObjects.IAgClassicalSizeShapeSemimajorAxis).Eccentricity = self.Eccentricityroot.UnitPreferences.Item('AngleUnit').SetCurrentUnit('deg')root.UnitPreferences.Item('TimeUnit').SetCurrentUnit('sec')keplerian2.Orientation.Inclination = self.inclinationkeplerian2.Orientation.ArgOfPerigee = self.argumentOfPerigeekeplerian2.Orientation.AscNode.QueryInterface(STKObjects.IAgOrientationAscNodeRAAN).Value = self.RAANkeplerian2.Location.QueryInterface(STKObjects.IAgClassicalLocationMeanAnomaly).Value = self.MeanAnomalysatProp.InitialState.Representation.Assign(keplerian)satProp.Propagate()self.sat=satself.satIAg=satIAgreturn satIAg
Target:
class Target:def __init__(self,name,Longitude=0,Latitude=0,Altitude=0):self.name=nameself.Longitude=Longitudeself.Latitude=Latitudeself.Altitude=Altitudeself.uniqueNumber=23def queryFromSecenario(self,sc):try:targets=sc.Children.GetElements(self.uniqueNumber)target=targets.Item(self.name)return targetexcept:return Nonedef deleteFromSecenario(self,sc):if self.queryFromSecenario(sc):sc.Children.Unload(self.uniqueNumber,self.name)return 'already deleted'else:return 'not exist'def addToScenario(self,sc):if self.queryFromSecenario(sc):
# 'can not add, this name already exists'return Nonetarget = sc.Children.New(self.uniqueNumber, self.name) targetIAg = target.QueryInterface(STKObjects.IAgTarget)pos = targetIAg.Positionpos.AssignGeodetic(self.Latitude,self.Longitude,self.Altitude)self.targetIAg=targetIAgself.target=targetreturn targetIAg
Aircraft:
class Aircraft:def __init__(self,name):self.name=nameself.uniqueNumber=1def queryFromSecenario(self,sc):try:aircrafts=sc.Children.GetElements(self.uniqueNumber)aircraft=aircrafts.Item(self.name)return aircraftexcept:return Nonedef deleteFromSecenario(self,sc):if self.queryFromSecenario(sc):sc.Children.Unload(self.uniqueNumber,self.name)return 'already deleted'else:return 'not exist'def addToScenario(self,sc):if self.queryFromSecenario(sc):
# 'can not add, this name already exists'return Noneaircraft = sc.Children.New(self.uniqueNumber, self.name) aircraftIAg = aircraft.QueryInterface(STKObjects.IAgAircraft)self.aircraftIAg=aircraftIAgself.aircraft=aircraftreturn aircraftIAgdef addWayPoints(self,points):self.aircraftIAg.SetRouteType(STKObjects.ePropagatorGreatArc)route = self.aircraftIAg.Routeroute = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)route.Method=STKObjects.AgEVeWayPtCompMethod(0)try:for point in points:waypoint = route.Waypoints.Add()waypoint.Longitude = point[0]waypoint.Latitude = point[1]waypoint.Altitude = point[2]waypoint.Speed=point[3]route.Propagate()return 'add waypoints successfully'except:return 'add waypoints unsuccessfully'def removeWayPoints(self):self.aircraftIAg.SetRouteType(STKObjects.ePropagatorGreatArc)route = self.aircraftIAg.Routeroute = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)route.Waypoints.RemoveAll()route.Propagate()
Ship:
class Ship:def __init__(self,name):self.name=nameself.uniqueNumber=21def queryFromSecenario(self,sc):try:ships=sc.Children.GetElements(self.uniqueNumber)ship=ships.Item(self.name)return shipexcept:return Nonedef deleteFromSecenario(self,sc):if self.queryFromSecenario(sc):sc.Children.Unload(self.uniqueNumber,self.name)return 'already deleted'else:return 'not exist'def addToScenario(self,sc):if self.queryFromSecenario(sc):
# 'can not add, this name already exists'return Noneship = sc.Children.New(self.uniqueNumber, self.name) shipIAg = ship.QueryInterface(STKObjects.IAgShip)self.shipIAg=shipIAgself.ship=shipreturn shipIAgdef addWayPoints(self,points):self.shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)route = self.shipIAg.Routeroute = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)route.Method=STKObjects.AgEVeWayPtCompMethod(0)try:for point in points:waypoint = route.Waypoints.Add()waypoint.Longitude = point[0]waypoint.Latitude = point[1]waypoint.Altitude = point[2]waypoint.Speed=point[3]route.Propagate()return 'add waypoints successfully'except:return 'add waypoints unsuccessfully'def removeWayPoints(self):self.shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)route = self.shipIAg.Routeroute = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)route.Waypoints.RemoveAll()route.Propagate()
获取可见性:
def addAccess(Monitor,Monitored):Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)access = Monitor.GetAccessToObject(Monitored)access.ComputeAccess()results = access.ComputedAccessIntervalTimesresults=results.ToArray(0,results.Count)return results
使用示例:
def addAccess(Monitor,Monitored):Monitor=Monitor.QueryInterface(STKObjects.IAgStkObject)Monitored=Monitored.QueryInterface(STKObjects.IAgStkObject)access = Monitor.GetAccessToObject(Monitored)access.ComputeAccess()results = access.ComputedAccessIntervalTimesresults=results.ToArray(0,results.Count)return results# open STK and creat Scenario
STKW=STKWindow('E:/AGI/STKFiles/test1/test1.sc')
sc=STKW.newScenario('test1',"1 Jan 2020 00:00:00.000 ","8 Jan 2020 00:00:00.000 ")# select satellites from datebase
sql="select name,type,time,revolve,inclination,RAAN,argumentOfPerigee,eccentricity,MeanAnomaly from spacecraft"
sat=connect(sql)[0]
# (self,name,Type,Time,revolve=10,inclination=0,RAAN=0,argumentOfPerigee=0,eccentricity=0,MeanAnomaly=0):
sat=Spacecraft(sat[0],sat[1],sat[2],sat[3],sat[4],sat[5],sat[6],sat[7],sat[8])sql='select name,Longitude,Latitude,Altitude from Target'
target=connect(sql)[0]
target=Target(target[0],target[1],target[2],target[3])# new satellite and Target
addSat=sat.addToScenario(STKW.root,STKW.sc)
addTarget=target.addToScenario(STKW.sc)# sat.deleteFromSecenario(STKW.sc)
# target.deleteFromSecenario(STKW.sc)#add access
accessTimes=addAccess(sat.satIAg,target.targetIAg)
for accessTime in accessTimes:print(accessTime)
# sats = STKW.root.CurrentScenario.Children.GetElements(18)# print(type(sats.Item('satellite1')),type(sat.satIAg))aircraft=Aircraft('aircraft1')
aircraft.addToScenario(STKW.sc)sql="select Longitude,Latitude,Altitude,Speed from aircraft"
waypoints=connect(sql)
aircraft.addWayPoints(waypoints)ship=Ship('ship1')
ship.addToScenario(STKW.sc)sql="select Longitude,Latitude,Altitude,Speed from ship"
waypoints=connect(sql)
for point in waypoints:print(point[0])
ship.addWayPoints(waypoints)STKW.root.SaveAs('E:/AGI/STKFiles/test1/test1')ship = sc.Children.New(21, 'ship1')
shipIAg = ship.QueryInterface(STKObjects.IAgShip)
shipIAg.SetRouteType(STKObjects.ePropagatorGreatArc)
route = shipIAg.Route
route = route.QueryInterface(STKObjects.IAgVePropagatorGreatArc)
route.Method=STKObjects.AgEVeWayPtCompMethod(0)waypoint1 = route.Waypoints.Add()
waypoint1.Latitude = 39
waypoint1.Longitude = -79
waypoint1.Altitude = 10
waypoint1.Speed=0.001waypoint2 = route.Waypoints.Add()
waypoint2.Latitude = 40
waypoint2.Longitude = -80
waypoint2.Altitude = 10
waypoint2.Speed=0.001waypoint3 = route.Waypoints.Add()
waypoint3.Latitude = 41
waypoint3.Longitude = -81
waypoint3.Altitude = 10
waypoint3.Speed=0.001route.Propagate()
这篇关于Python 调用STK接口的常用操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!