mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-11-04 00:00:04 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			217 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#include <scwx/common/geographic.hpp>
 | 
						|
 | 
						|
#include <chrono>
 | 
						|
#include <istream>
 | 
						|
#include <memory>
 | 
						|
#include <optional>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include <boost/gil/typedefs.hpp>
 | 
						|
#include <units/angle.h>
 | 
						|
#include <units/length.h>
 | 
						|
 | 
						|
namespace scwx
 | 
						|
{
 | 
						|
namespace gr
 | 
						|
{
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief Place File
 | 
						|
 *
 | 
						|
 * Implementation based on:
 | 
						|
 * Place File Specification
 | 
						|
 * Mike Gibson
 | 
						|
 * Gibson Ridge Software, LLC.  Used with permission.
 | 
						|
 * http://www.grlevelx.com/manuals/gis/files_places.htm
 | 
						|
 */
 | 
						|
class Placefile
 | 
						|
{
 | 
						|
public:
 | 
						|
   explicit Placefile();
 | 
						|
   ~Placefile();
 | 
						|
 | 
						|
   Placefile(const Placefile&)            = delete;
 | 
						|
   Placefile& operator=(const Placefile&) = delete;
 | 
						|
 | 
						|
   Placefile(Placefile&&) noexcept;
 | 
						|
   Placefile& operator=(Placefile&&) noexcept;
 | 
						|
 | 
						|
   enum class ItemType
 | 
						|
   {
 | 
						|
      Icon,
 | 
						|
      Font,
 | 
						|
      Text,
 | 
						|
      Line,
 | 
						|
      Triangles,
 | 
						|
      Image,
 | 
						|
      Polygon,
 | 
						|
      Unknown
 | 
						|
   };
 | 
						|
 | 
						|
   struct IconFile
 | 
						|
   {
 | 
						|
      std::size_t fileNumber_ {};
 | 
						|
      std::size_t iconWidth_ {};
 | 
						|
      std::size_t iconHeight_ {};
 | 
						|
      std::size_t hotX_ {};
 | 
						|
      std::size_t hotY_ {};
 | 
						|
      std::string filename_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct Font
 | 
						|
   {
 | 
						|
      std::size_t  fontNumber_ {};
 | 
						|
      std::size_t  pixels_ {};
 | 
						|
      std::int32_t flags_ {};
 | 
						|
      std::string  face_ {};
 | 
						|
 | 
						|
      bool IsBold() { return flags_ & 1; }
 | 
						|
      bool IsItalic() { return flags_ & 2; }
 | 
						|
   };
 | 
						|
 | 
						|
   struct DrawItem
 | 
						|
   {
 | 
						|
      ItemType                                    itemType_ {ItemType::Unknown};
 | 
						|
      units::length::nautical_miles<double>       threshold_ {};
 | 
						|
      std::chrono::sys_time<std::chrono::seconds> startTime_ {};
 | 
						|
      std::chrono::sys_time<std::chrono::seconds> endTime_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct IconDrawItem : DrawItem
 | 
						|
   {
 | 
						|
      IconDrawItem() { itemType_ = ItemType::Icon; }
 | 
						|
 | 
						|
      boost::gil::rgba8_pixel_t modulate_ {};
 | 
						|
      double                    latitude_ {};
 | 
						|
      double                    longitude_ {};
 | 
						|
      double                    x_ {};
 | 
						|
      double                    y_ {};
 | 
						|
      units::degrees<double>    angle_ {};
 | 
						|
      std::size_t               fileNumber_ {0u};
 | 
						|
      std::size_t               iconNumber_ {0u};
 | 
						|
      std::string               hoverText_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct TextDrawItem : DrawItem
 | 
						|
   {
 | 
						|
      TextDrawItem() { itemType_ = ItemType::Text; }
 | 
						|
 | 
						|
      boost::gil::rgba8_pixel_t color_ {};
 | 
						|
      double                    latitude_ {};
 | 
						|
      double                    longitude_ {};
 | 
						|
      double                    x_ {};
 | 
						|
      double                    y_ {};
 | 
						|
      std::size_t               fontNumber_ {0u};
 | 
						|
      std::string               text_ {};
 | 
						|
      std::string               hoverText_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct LineDrawItem : DrawItem
 | 
						|
   {
 | 
						|
      LineDrawItem() { itemType_ = ItemType::Line; }
 | 
						|
 | 
						|
      boost::gil::rgba8_pixel_t color_ {};
 | 
						|
      double                    width_ {};
 | 
						|
      std::int32_t              flags_ {};
 | 
						|
      std::string               hoverText_ {};
 | 
						|
 | 
						|
      struct Element
 | 
						|
      {
 | 
						|
         double latitude_ {};
 | 
						|
         double longitude_ {};
 | 
						|
         double x_ {};
 | 
						|
         double y_ {};
 | 
						|
      };
 | 
						|
 | 
						|
      std::vector<Element> elements_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct TrianglesDrawItem : DrawItem
 | 
						|
   {
 | 
						|
      TrianglesDrawItem() { itemType_ = ItemType::Triangles; }
 | 
						|
 | 
						|
      boost::gil::rgba8_pixel_t color_ {};
 | 
						|
 | 
						|
      struct Element
 | 
						|
      {
 | 
						|
         double latitude_ {};
 | 
						|
         double longitude_ {};
 | 
						|
         double x_ {};
 | 
						|
         double y_ {};
 | 
						|
 | 
						|
         std::optional<boost::gil::rgba8_pixel_t> color_ {};
 | 
						|
      };
 | 
						|
 | 
						|
      std::vector<Element> elements_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct ImageDrawItem : DrawItem
 | 
						|
   {
 | 
						|
      ImageDrawItem() { itemType_ = ItemType::Image; }
 | 
						|
 | 
						|
      std::string imageFile_ {};
 | 
						|
 | 
						|
      struct Element
 | 
						|
      {
 | 
						|
         double latitude_ {};
 | 
						|
         double longitude_ {};
 | 
						|
         double x_ {};
 | 
						|
         double y_ {};
 | 
						|
         double tu_ {};
 | 
						|
         double tv_ {};
 | 
						|
      };
 | 
						|
 | 
						|
      std::vector<Element> elements_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   struct PolygonDrawItem : DrawItem
 | 
						|
   {
 | 
						|
      PolygonDrawItem() { itemType_ = ItemType::Polygon; }
 | 
						|
 | 
						|
      boost::gil::rgba8_pixel_t color_ {};
 | 
						|
 | 
						|
      struct Element
 | 
						|
      {
 | 
						|
         double latitude_ {};
 | 
						|
         double longitude_ {};
 | 
						|
         double x_ {};
 | 
						|
         double y_ {};
 | 
						|
 | 
						|
         std::optional<boost::gil::rgba8_pixel_t> color_ {};
 | 
						|
      };
 | 
						|
 | 
						|
      std::vector<std::vector<Element>> contours_ {};
 | 
						|
      scwx::common::Coordinate          center_ {};
 | 
						|
   };
 | 
						|
 | 
						|
   bool IsValid() const;
 | 
						|
 | 
						|
   /**
 | 
						|
    * @brief Gets the list of draw items defined in the placefile
 | 
						|
    *
 | 
						|
    * @return vector of draw item pointers
 | 
						|
    */
 | 
						|
   std::vector<std::shared_ptr<DrawItem>> GetDrawItems();
 | 
						|
 | 
						|
   std::vector<std::shared_ptr<const IconFile>> icon_files();
 | 
						|
 | 
						|
   std::string                                            name() const;
 | 
						|
   std::string                                            title() const;
 | 
						|
   std::chrono::seconds                                   refresh() const;
 | 
						|
   std::unordered_map<std::size_t, std::shared_ptr<Font>> fonts();
 | 
						|
   std::shared_ptr<Font>                                  font(std::size_t i);
 | 
						|
 | 
						|
   static std::shared_ptr<Placefile> Load(const std::string& filename);
 | 
						|
   static std::shared_ptr<Placefile> Load(const std::string& name,
 | 
						|
                                          std::istream&      is);
 | 
						|
 | 
						|
private:
 | 
						|
   class Impl;
 | 
						|
   std::unique_ptr<Impl> p;
 | 
						|
};
 | 
						|
 | 
						|
} // namespace gr
 | 
						|
} // namespace scwx
 |