////////////////////////////////////////////////////////////////////////////// //文件: 格式转换类 //主要功能: // 转换GeoMap3.2的的线型库文件 // //程序编写: 2009-8-04 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "GeoMapDataType.h" namespace NFormatReader { namespace NGeoMapReader { //***************************************** // 线型数据结构定义(Geomap 3.2 lsl) //***************************************** // Geomap 线型索引 struct GMShapeLineIndex { int pos; // 数据开始位置 int len; // 数据长度 }; // Geomap 线型图元 struct GMShapeLineElement { ::byte eType; // 图元类型(0:矩形,1:直线,2:椭圆,3:三角形,4:弧,5:半圆形) ::byte isFill; // 是否填充 GColor lineColor; // 线/边界颜色 GColor fillColor; // 填充颜色 char x1,y1,x2,y2; // 图元控制点坐标 }; // Geomap 线型层 struct GMShapeLineLayer { ::byte yTop; // 上部高度 ::byte yBottom; // 下部高度 ::byte width; // 横向宽度 ::byte nElement; // 图元个数 ::byte type; // 层类型(1:开始层,2:循环层,4:结束层) ::byte res1; // 未知(?=1) GMShapeLineElement *elem; // 图元数据 }; // Geomap 线型 struct GMShapeLine { ::byte nameLen; // 线型名称长度 char name[256]; // 线型名称 int user; // 是否用户线型(0:系统线型,1:用户线型) ::byte nLayer; // 线型层数 GMShapeLineLayer *layer; // 图层数据 }; // Windows 系统缺省调色板 static GColor GMsysColors[48] = { {255,128,128,0},{255,255,128,0},{128,255,128,0},{ 0,255,128,0},{128,255,255,0},{ 0,128,255,0},{255,128,192,0},{255,128,255,0}, {255, 0, 0,0},{255,255, 0,0},{128,255, 0,0},{ 0,255, 64,0},{ 0,255,255,0},{ 0,128,192,0},{128,128,192,0},{255, 0,255,0}, {128, 64, 64,0},{255,128, 64,0},{ 0,255, 0,0},{ 0,128,128,0},{ 0, 64,128,0},{128,128,255,0},{128, 0, 64,0},{255, 0,128,0}, {128, 0, 0,0},{255,128, 0,0},{ 0,128, 0,0},{ 0,128, 64,0},{ 0, 0,255,0},{ 0, 0,160,0},{128, 0,128,0},{128, 0,255,0}, { 64, 0, 0,0},{128, 64, 0,0},{ 0, 64, 0,0},{ 0, 64, 64,0},{ 0, 0,128,0},{ 0, 0, 64,0},{ 64, 0, 64,0},{ 64, 0,128,0}, { 0, 0, 0,0},{128,128, 0,0},{128,128, 64,0},{128,128,128,0},{ 64,128,128,0},{192,192,192,0},{ 64, 0, 64,0},{255,255,255,0} }; class CGeoMapLineShapeLib { public: CGeoMapLineShapeLib(void); virtual ~CGeoMapLineShapeLib(void); public: // 用指定线型绘制折线(采用GDI坐标)(当前未作交点处理) bool DrawLine( CDC *pDC, int lineID, bool useColor, GColor color, int size, int nVertex, CPoint *vertex); public: // 加载线型数据库 static bool LoadLine(CString *fname=NULL); // 释放线型数据库 static void FreeLine(); private: static GMShapeLine *lineShapes; // 当前线型数据 static int nLine; // 线型库中的线型个数 private: void DrawLayer( GMShapeLineLayer layer); // 绘制一个层 void DrawLineSeg( GMShapeLineLayer layer, int DrawType ); // 绘制线段 void convert(CPoint &pt); void convert(CPoint *pt, int n); // 计算两条线段的交点 bool CalcIntersectedPoint( CPoint pt11,CPoint pt12, CPoint pt21, CPoint pt22, CPoint &pt); private: int lineID = 0; // 线型ID IPoint ptStart{}; // 实际绘制的起点坐标 int BegPos = 0, EndPos = 0; // 绘制的部分在线型长度方向上的起止位置 double sina = 0,cosa = 0; // 当前线段倾角参数 private: CDC *pDC = nullptr; // 画布 bool useColor = false; // 采用用户指定颜色绘制线型 GColor color{}; // 用户指定颜色 int size = 0; // 线宽 int nVertex = 0; // 折线的顶点数 CPoint *vertex = nullptr; // 折线的顶点坐标数组 }; }; };