Drawing#
The following script draws three objects for a vessel in orbit around Kerbin. A dashed green path shows a circular target orbit 250 km up. A flag marks the north pole in the map view, and a yellow arrow points prograde from the vessel. The script updates the label on the arrow with the vessel’s orbital speed.
#include <stdio.h>
#include <string.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#define sleep(seconds) Sleep((seconds) * 1000)
#else
#include <unistd.h>
#endif
#include <krpc_cnano.h>
#include <krpc_cnano/services/space_center.h>
#include <krpc_cnano/services/std_lib.h>
#include <krpc_cnano/services/ui.h>
#include <krpc_cnano/services/drawing.h>
int main() {
krpc_connection_t conn;
krpc_open(&conn, "COM0");
krpc_connect(conn, "Drawing Example");
krpc_SpaceCenter_Vessel_t vessel;
krpc_SpaceCenter_ActiveVessel(conn, &vessel);
krpc_dictionary_string_object_t bodies = KRPC_NULL_DICTIONARY;
krpc_SpaceCenter_Bodies(conn, &bodies);
krpc_SpaceCenter_CelestialBody_t kerbin;
for (size_t i = 0; i < bodies.size; i++)
if (!strcmp(bodies.entries[i].key, "Kerbin"))
kerbin = bodies.entries[i].value;
krpc_SpaceCenter_ReferenceFrame_t kerbin_ref;
krpc_SpaceCenter_CelestialBody_ReferenceFrame(conn, &kerbin_ref, kerbin);
// Draw a circular orbit 250 km above Kerbin, as a dashed green path with
// a label
double radius;
krpc_SpaceCenter_CelestialBody_EquatorialRadius(conn, &radius, kerbin);
double ut;
krpc_SpaceCenter_UT(conn, &ut);
krpc_SpaceCenter_Orbit_t orbit;
krpc_SpaceCenter_Orbit_CreateFromOrbitalElements(
conn, &orbit, kerbin, radius + 250000, 0, 0, 0, 0, 0, ut);
krpc_Drawing_OrbitPath_t path;
krpc_Drawing_AddOrbit(conn, &path, orbit, true);
krpc_StdLib_ColorRGB_t green = {0, 1, 0};
krpc_Drawing_OrbitPath_set_Color(conn, path, &green);
krpc_Drawing_OrbitPath_set_Dashed(conn, path, true);
krpc_Drawing_OrbitPath_set_Label(conn, path, "Target orbit");
// Mark the north pole in the map view, with the game's flag icon
krpc_tuple_double_double_double_t site;
krpc_SpaceCenter_CelestialBody_SurfacePosition(
conn, &site, kerbin, 90, 0, kerbin_ref);
krpc_Drawing_AddMapMarker(
conn, NULL, &site, kerbin_ref, KRPC_DRAWING_MAPMARKERICON_FLAG,
"North pole", true);
// Draw a yellow arrow from the vessel, pointing prograde
krpc_SpaceCenter_ReferenceFrame_t orbital_ref;
krpc_SpaceCenter_Vessel_OrbitalReferenceFrame(conn, &orbital_ref, vessel);
krpc_tuple_double_double_double_t prograde = {0, 1, 0};
krpc_Drawing_Line_t arrow;
krpc_Drawing_AddDirectionFromCom(conn, &arrow, &prograde, orbital_ref, 10, true);
krpc_StdLib_ColorRGB_t yellow = {1, 1, 0};
krpc_Drawing_Line_set_Color(conn, arrow, &yellow);
krpc_Drawing_Line_set_EndArrow(conn, arrow, true);
// Label the arrow with the orbital speed of the vessel
krpc_SpaceCenter_Orbit_t vessel_orbit;
krpc_SpaceCenter_Vessel_Orbit(conn, &vessel_orbit, vessel);
while (true) {
double speed;
krpc_SpaceCenter_Orbit_Speed(conn, &speed, vessel_orbit);
char label[32];
snprintf(label, sizeof(label), "%d m/s", (int)speed);
krpc_Drawing_Line_set_Label(conn, arrow, label);
sleep(1);
}
}
using System;
using KRPC.Client;
using KRPC.Client.Services.Drawing;
using KRPC.Client.Services.SpaceCenter;
using KRPC.Client.Services.StdLib;
class DrawingExample
{
public static void Main ()
{
var conn = new Connection ("Drawing Example");
var spaceCenter = conn.SpaceCenter ();
var drawing = conn.Drawing ();
var vessel = spaceCenter.ActiveVessel;
var kerbin = spaceCenter.Bodies ["Kerbin"];
// Draw a circular orbit 250 km above Kerbin, as a dashed green path
// with a label
var orbit = Orbit.CreateFromOrbitalElements (
conn, kerbin, kerbin.EquatorialRadius + 250000, 0, 0, 0, 0, 0,
spaceCenter.UT);
var path = drawing.AddOrbit (orbit);
path.Color = new ColorRGB (0, 1, 0);
path.Dashed = true;
path.Label = "Target orbit";
// Mark the north pole in the map view, with the game's flag icon
var site = kerbin.SurfacePosition (90, 0, kerbin.ReferenceFrame);
drawing.AddMapMarker (
site, kerbin.ReferenceFrame, MapMarkerIcon.Flag, "North pole");
// Draw a yellow arrow from the vessel, pointing prograde
var arrow = drawing.AddDirectionFromCom (
Tuple.Create (0.0, 1.0, 0.0), vessel.OrbitalReferenceFrame);
arrow.Color = new ColorRGB (1, 1, 0);
arrow.EndArrow = true;
// Label the arrow with the orbital speed of the vessel
while (true) {
arrow.Label = (int)vessel.Orbit.Speed + " m/s";
System.Threading.Thread.Sleep (1000);
}
}
}
#include <chrono>
#include <string>
#include <thread>
#include <krpc.hpp>
#include <krpc/services/space_center.hpp>
#include <krpc/services/std_lib.hpp>
#include <krpc/services/ui.hpp>
#include <krpc/services/drawing.hpp>
using SpaceCenter = krpc::services::SpaceCenter;
using Drawing = krpc::services::Drawing;
int main() {
krpc::Client conn = krpc::connect("Drawing Example");
SpaceCenter space_center(&conn);
Drawing drawing(&conn);
auto vessel = space_center.active_vessel().value();
auto kerbin = space_center.bodies()["Kerbin"];
// Draw a circular orbit 250 km above Kerbin, as a dashed green path with
// a label
auto orbit = SpaceCenter::Orbit::create_from_orbital_elements(
conn, kerbin, kerbin.equatorial_radius() + 250000, 0, 0, 0, 0, 0,
space_center.ut());
auto path = drawing.add_orbit(orbit);
path.set_color(krpc::services::StdLib::ColorRGB(0, 1, 0));
path.set_dashed(true);
path.set_label("Target orbit");
// Mark the north pole in the map view, with the game's flag icon
auto site = kerbin.surface_position(90, 0, kerbin.reference_frame());
drawing.add_map_marker(
site, kerbin.reference_frame(), Drawing::MapMarkerIcon::flag, "North pole");
// Draw a yellow arrow from the vessel, pointing prograde
auto arrow = drawing.add_direction_from_com(
std::make_tuple(0, 1, 0), vessel.orbital_reference_frame());
arrow.set_color(krpc::services::StdLib::ColorRGB(1, 1, 0));
arrow.set_end_arrow(true);
// Label the arrow with the orbital speed of the vessel
while (true) {
arrow.set_label(std::to_string((int)vessel.orbit().speed()) + " m/s");
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
import krpc.client.Connection;
import krpc.client.RPCException;
import krpc.client.services.Drawing;
import krpc.client.services.Drawing.Line;
import krpc.client.services.Drawing.MapMarkerIcon;
import krpc.client.services.Drawing.OrbitPath;
import krpc.client.services.SpaceCenter;
import krpc.client.services.SpaceCenter.CelestialBody;
import krpc.client.services.SpaceCenter.Orbit;
import krpc.client.services.SpaceCenter.Vessel;
import krpc.client.services.StdLib;
import org.javatuples.Triplet;
import java.io.IOException;
public class DrawingExample {
public static void main(String[] args)
throws IOException, RPCException, InterruptedException {
Connection connection = Connection.newInstance("Drawing Example");
SpaceCenter spaceCenter = SpaceCenter.newInstance(connection);
Drawing drawing = Drawing.newInstance(connection);
Vessel vessel = spaceCenter.getActiveVessel();
CelestialBody kerbin = spaceCenter.getBodies().get("Kerbin");
// Draw a circular orbit 250 km above Kerbin, as a dashed green path
// with a label
Orbit orbit = Orbit.createFromOrbitalElements(
connection, kerbin, kerbin.getEquatorialRadius() + 250000, 0, 0, 0, 0, 0,
spaceCenter.getUT());
OrbitPath path = drawing.addOrbit(orbit, true);
path.setColor(new StdLib.ColorRGB(0f, 1f, 0f));
path.setDashed(true);
path.setLabel("Target orbit");
// Mark the north pole in the map view, with the game's flag icon
Triplet<Double, Double, Double> site =
kerbin.surfacePosition(90, 0, kerbin.getReferenceFrame());
drawing.addMapMarker(
site, kerbin.getReferenceFrame(), MapMarkerIcon.FLAG, "North pole", true);
// Draw a yellow arrow from the vessel, pointing prograde
Line arrow = drawing.addDirectionFromCom(
new Triplet<Double, Double, Double>(0.0, 1.0, 0.0),
vessel.getOrbitalReferenceFrame(), 10, true);
arrow.setColor(new StdLib.ColorRGB(1f, 1f, 0f));
arrow.setEndArrow(true);
// Label the arrow with the orbital speed of the vessel
while (true) {
arrow.setLabel(String.format("%.0f m/s", vessel.getOrbit().getSpeed()));
Thread.sleep(1000);
}
}
}
local krpc = require 'krpc'
local platform = require 'krpc.platform'
local List = require 'pl.List'
local conn = krpc.connect('Drawing Example')
local space_center = conn.space_center
local drawing = conn.drawing
local vessel = space_center.active_vessel
local kerbin = space_center.bodies['Kerbin']
-- Draw a circular orbit 250 km above Kerbin, as a dashed green path with a label
local orbit = space_center.Orbit.create_from_orbital_elements(
kerbin, kerbin.equatorial_radius + 250000, 0, 0, 0, 0, 0, space_center.ut)
local path = drawing.add_orbit(orbit)
path.color = conn.std_lib.ColorRGB(0, 1, 0)
path.dashed = true
path.label = 'Target orbit'
-- Mark the north pole in the map view, with the game's flag icon
local site = kerbin:surface_position(90, 0, kerbin.reference_frame)
drawing.add_map_marker(
site, kerbin.reference_frame, drawing.MapMarkerIcon.flag, 'North pole')
-- Draw a yellow arrow from the vessel, pointing prograde
local arrow = drawing.add_direction_from_com(List{0, 1, 0}, vessel.orbital_reference_frame)
arrow.color = conn.std_lib.ColorRGB(1, 1, 0)
arrow.end_arrow = true
-- Label the arrow with the orbital speed of the vessel
while true do
arrow.label = string.format('%.0f m/s', vessel.orbit.speed)
platform.sleep(1)
end
import time
import krpc
conn = krpc.connect(name="Drawing Example")
space_center = conn.space_center
drawing = conn.drawing
vessel = space_center.active_vessel
kerbin = space_center.bodies["Kerbin"]
# Draw a circular orbit 250 km above Kerbin, as a dashed green path with a label
orbit = space_center.Orbit.create_from_orbital_elements(
kerbin, kerbin.equatorial_radius + 250000, 0, 0, 0, 0, 0, space_center.ut
)
path = drawing.add_orbit(orbit)
path.color = conn.std_lib.ColorRGB(0, 1, 0)
path.dashed = True
path.label = "Target orbit"
# Mark the north pole in the map view, with the game's flag icon
site = kerbin.surface_position(90, 0, kerbin.reference_frame)
drawing.add_map_marker(
site, kerbin.reference_frame, drawing.MapMarkerIcon.flag, "North pole"
)
# Draw a yellow arrow from the vessel, pointing prograde
arrow = drawing.add_direction_from_com((0, 1, 0), vessel.orbital_reference_frame)
arrow.color = conn.std_lib.ColorRGB(1, 1, 0)
arrow.end_arrow = True
# Label the arrow with the orbital speed of the vessel
while True:
arrow.label = "%d m/s" % vessel.orbit.speed
time.sleep(1)
The arrow is drawn in the flight scene. Switch to the map view to see the target orbit and the flag. Drawn objects remain until the script disconnects, which is why the script ends in a loop.
See also
Drawing for the other objects you can draw, including circles, arcs,
boxes, spheres, points and navball markers.