You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

933 lines
33 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using EmbedIO.WebSockets;
using GeoSigma.SigmaDrawerUtil;
using GeoSigmaDrawLib;
using KevDrawServer.Drawer;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace KevDrawServer
{
/// <summary>
/// 图形操作类.
/// </summary>
public class EventResponse
{
/// <summary>
/// Initializes a new instance of the <see cref="EventResponse"/> class.
/// </summary>
/// <param name="drawer">The drawer.</param>
/// <param name="context">The context.</param>
public EventResponse(WebDrawer drawer, IWebSocketContext context)
{
Drawer = drawer;
Context = context;
}
/// <summary>
/// Gets or sets 图形操作实例.
/// </summary>
public WebDrawer Drawer { get; set; } = null;
/// <summary>
/// Gets or sets 连接上下文.
/// </summary>
public IWebSocketContext Context { get; set; } = null;
private string imageFile = "temp/K1.png";
public JsEvent ExcuteOperator(string evtentType, Dictionary<string, object> keyValues)
{
if(this.Drawer == null)
{
return null;
}
object objDrawerWidth = null;
object objDrawerHeight = null;
if (keyValues != null)
{
keyValues.TryGetValue("width", out objDrawerWidth);
keyValues.TryGetValue("height", out objDrawerHeight);
}
if (objDrawerWidth != null && objDrawerHeight != null)
{
double dDrawerWidth = 0;
double dDrawerHeight = 0;
double.TryParse($"{objDrawerWidth}", out dDrawerWidth);
double.TryParse($"{objDrawerHeight}", out dDrawerHeight);
if(dDrawerWidth>0&& dDrawerHeight > 0)
{
this.Drawer.DrawerSize = new Size((int)dDrawerWidth, (int)dDrawerHeight);
}
}
JsEvent evtResult = null;
switch (evtentType)
{
case "OpenFile":
evtResult = ShowImg();
break;
case "ZoomIn":
evtResult = ZoomIn(keyValues);
break;
case "ZoomOut":
evtResult = ZoomOut(keyValues);
break;
case "ViewAll":
evtResult = ViewAll(keyValues);
break;
case "Refresh":
evtResult = ReFresh();
break;
case "Center":
evtResult = DrawCenter();
break;
case "ViewPan":
evtResult = ViewPan(keyValues);
break;
case "ViewWindow":
evtResult = ViewWindow(keyValues);
break;
case "Redraw":
evtResult = Redraw();
break;
case "MouseDown":
//double dX = Convert.ToDouble(dictionary["x"]);
//double dY = Convert.ToDouble(dictionary["y"]);
//await ClickImageAsync(dX, dY);
break;
case "LButtonUp":
double dUpX = Convert.ToDouble(keyValues["x"]);
double dUpY = Convert.ToDouble(keyValues["y"]);
int nKeyCode = 0;
if(keyValues["keyCode"] != null)
{
nKeyCode = Convert.ToInt32(keyValues["keyCode"]);
}
evtResult = LButtonUp(dUpX, dUpY, nKeyCode);
break;
case "MouseMove":
double dMoveX = Convert.ToDouble(keyValues["x"]);
double dMoveY = Convert.ToDouble(keyValues["y"]);
int nHandle = Convert.ToInt32(keyValues["handleIndex"]);
evtResult = MouseMove(dMoveX, dMoveY);
break;
case "DragElement":
double dDragX = Convert.ToDouble(keyValues["x"]);
double dDragY = Convert.ToDouble(keyValues["y"]);
evtResult = this.TranslateElements(dDragX, dDragY);
break;
case "SelectMouseDown":
double dX = Convert.ToDouble(keyValues["x"]);
double dY = Convert.ToDouble(keyValues["y"]);
//await ClickImageAsync(dX, dY);
evtResult = SelectLButtonDown(dX, dY);
break;
case "SelectMouseUp":
double dSelectUpX = Convert.ToDouble(keyValues["x"]);
double dSelectUpY = Convert.ToDouble(keyValues["y"]);
int nMouseUpKeyCode = 0;
if (keyValues["keyCode"] != null)
{
nMouseUpKeyCode = Convert.ToInt32(keyValues["keyCode"]);
}
evtResult = SelectMouseUp(dSelectUpX, dSelectUpY, nMouseUpKeyCode);
break;
case "GetElementProperty":
evtResult = GetSelectElementProperty();
break;
case "SetElementProperty":
long elementID = 0;
string strPropertyData = @"";
strPropertyData = string.Empty;
if (keyValues.ContainsKey("elementID"))
{
long.TryParse($"{keyValues["elementID"]}", out elementID);
}
if (keyValues.ContainsKey("data"))
{
strPropertyData = $"{keyValues["data"]}";
}
evtResult = SetSelectElementProperty(strPropertyData);
break;
case "WellGroupClone":
long wellGroupID = 0;
if (keyValues.ContainsKey("elementID"))
{
long.TryParse($"{keyValues["elementID"]}", out elementID);
}
evtResult = SelectWellGroupClone(wellGroupID);
break;
case "GetWellGroupData":
evtResult = SelectGetWellGroupData();
break;
case "SaveFile":
evtResult = SaveFile();
break;
case "GetLayers":
evtResult = GetLayersJson(); // GetLayers();
break;
case "GetLayersNorm":
evtResult = GetLayers(); // GetLayers();
break;
case "GetElementsCount":
evtResult = GetElementsCount(); // GetLayers();
break;
case "SetLayersStatus":
string strData = $"{ keyValues["layerData"]}";
evtResult = SetLayersStatus(strData);
break;
case "DeleteLayers":
string strLayersData = $"{keyValues["layers"]}";
int nWithChilden = 1;
if (keyValues.ContainsKey("widthChild"))
{
Int32.TryParse($"{keyValues["widthChild"]}", out nWithChilden);
}
evtResult = this.DeleteLayers(strLayersData, nWithChilden == 1);
break;
case "ClearAll":
int needUndo = 0;
string strNeedUndo = $"{keyValues["needUndo"]}";
if (!string.IsNullOrEmpty(strNeedUndo))
{
int.TryParse(strNeedUndo, out needUndo);
}
evtResult = this.ClearAll(needUndo == 1 ? true : false);
break;
case "AddBufferData":
string strBuffer = $"{ keyValues["bufferData"]}";
evtResult = AddBufferData(strBuffer);
break;
case "AddBasicDraw":
{
string strDrawBuffer = $"{ keyValues["bufferData"]}";
string strLayer = $"{ keyValues["layer"]}";
bool bCreateBlock = Convert.ToBoolean(keyValues["CreateBlock"]);
evtResult = InsertDataBottom(strDrawBuffer, strLayer, bCreateBlock);
}
break;
case "MergeFile": // 合并图件
string strFileName = $"{ keyValues["fileName"]}";
evtResult = MergeFile(strFileName);
break;
case "QueryRangeScreen2Real":
double dScreenStartX = Convert.ToDouble(keyValues["startX"]);
double dScreenEndX = Convert.ToDouble(keyValues["endX"]);
double dScreenStartY = Convert.ToDouble(keyValues["startY"]);
double dScreenEndY = Convert.ToDouble(keyValues["endY"]);
evtResult = QueryRangeScreen2RealX(dScreenStartX, dScreenEndX, dScreenStartY, dScreenEndY);
break;
case "CreateFavorableArea":
string strToken = $"{keyValues["token"]}";
var drawer = GlobalSession.GetData(strToken);
string filename = Path.GetFileNameWithoutExtension(((WebDrawer)drawer).DrawFileName);
double min = Convert.ToDouble(keyValues["min"]);
double max = Convert.ToDouble(keyValues["max"]);
string layer = Convert.ToString(keyValues["layer"]);
string dir = keyValues["dir"].ToString();
evtResult = CreateFavorableArea(dir,filename, layer, min, max);
break;
case "MergeFavorableArea":
strToken = $"{keyValues["token"]}";
drawer = GlobalSession.GetData(strToken);
filename = Path.GetFileName(((WebDrawer)drawer).DrawFileName);
dir = keyValues["dir"].ToString();
strFileName = $"{ keyValues["fileName"]}";
evtResult = MergeFavorableArea(dir, filename, strFileName);
break;
default:
break;
}
return evtResult;
}
public JsEvent ShowImg(string file = "", int w = 0, int h = 0, bool sendContent = false)
{
if (this.Drawer == null)
{
return null;
}
Bitmap bmp = null;
if (w != 0 && h != 0)
{
this.Drawer.DrawerSize = new Size(w, h);
}
bmp = new Bitmap(this.Drawer.DrawerSize.Width, this.Drawer.DrawerSize.Height);
bmp.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
using (Graphics g = Graphics.FromImage(bmp))
{
this.Drawer.OnPaint(g);
}
JsEvent jsEvent = CreateImgEvent(bmp, "", sendContent);
jsEvent.Success = true;
return jsEvent;
}
public JsEvent ZoomIn(Dictionary<string, object> keyValues)
{
if (this.Drawer == null)
{
return null;
}
this.Drawer.ZoomIn();
return ShowImg();
}
public JsEvent ZoomOut(Dictionary<string, object> keyValues)
{
//this.drawer = GetCurrentDrawer();
if (this.Drawer == null)
{
return null;
}
this.Drawer.ZoomOut();
return ShowImg();
}
public JsEvent ViewAll(Dictionary<string, object> keyValues)
{
if (this.Drawer == null)
{
return null;
}
this.Drawer.ViewAll();
return ShowImg();
}
/// <summary>
/// 移动浏览
/// </summary>
/// <returns></returns>
public JsEvent ViewPan(Dictionary<string, object> keyValues)
{
if (this.Drawer == null)
{
return null;
}
double dStartX = Convert.ToDouble(keyValues["startX"]);
double dStartY = Convert.ToDouble(keyValues["startY"]);
double dEndX = Convert.ToDouble(keyValues["endX"]);
double dEndY = Convert.ToDouble(keyValues["endY"]);
Bitmap bmp = null;
bmp = this.Drawer.ViewOperatorPan(dStartX, dStartY, dEndX, dEndY);
return CreateImgEvent(bmp);
}
/// <summary>
/// 移动浏览
/// </summary>
/// <returns></returns>
public JsEvent ViewWindow(Dictionary<string, object> keyValues)
{
if (this.Drawer == null)
{
return null;
}
double dStartX = Convert.ToDouble(keyValues["startX"]);
double dStartY = Convert.ToDouble(keyValues["startY"]);
double dEndX = Convert.ToDouble(keyValues["endX"]);
double dEndY = Convert.ToDouble(keyValues["endY"]);
Bitmap bmp = this.Drawer.ViewOperatorWindow(dStartX, dStartY, dEndX, dEndY);
return CreateImgEvent(bmp);
}
public JsEvent LButtonUp(double x, double y, int keyCode)
{
if (this.Drawer == null)
{
return null; ;
}
Bitmap bmp = this.Drawer.LButtonUp(x, y, keyCode);
return CreateImgEvent(bmp);
}
public JsEvent MouseMove(double x, double y)
{
if (this.Drawer == null)
{
return null;
}
int result = 0;
result = this.Drawer.MouseMove(x, y);
//Console.WriteLine($"MouseMove hanle:{result}");
JsEvent responseEvent = new JsEvent("SelectHandle")
{
Data = result,
};
return responseEvent;
}
public JsEvent TranslateElements(double x, double y)
{
if (this.Drawer == null)
{
return null;
}
try
{
Bitmap bmp = this.Drawer.TranslateElements(x, y);
return CreateImgEvent(bmp);
}
catch (EmbedIO.WebSockets.WebSocketException ex)
{
//Console.WriteLine($"WebSocketException: {ex.Message}");
}
catch (Exception ex)
{
//Console.WriteLine($"Exception: {ex.Message}");
}
return null;
}
public JsEvent SelectLButtonDown(double x, double y)
{
if (this.Drawer == null)
{
return null;
}
Bitmap bmp = this.Drawer.OnLButtonDown(x, y);
if (bmp != null)
{
bmp.MakeTransparent(Color.White);
Point pt = this.Drawer.CacheImgLocation;
string strFile = string.Empty;
try
{
strFile = Path.Combine(WebConfig.HtmlRoot, imageFile);
bmp.Save(strFile);
}
catch (Exception ex)
{
//Console.WriteLine($"SendImg: {ex.Message}");
return null;
}
string strEventName = "DragElement";
var responseEvent = new JsEvent(strEventName);
Dictionary<string, object> keyValues = new Dictionary<string, object>();
keyValues.Add("Data", imageFile);
keyValues.Add("ImgLeft", pt.X);
keyValues.Add("ImgTop", pt.Y);
responseEvent.Data = keyValues;
return responseEvent;
}
return null;
}
/// <summary>
/// 选中对象
/// </summary>
/// <returns></returns>
public JsEvent SelectMouseUp(double endX, double endY, int keyCode)
{
Bitmap bmp = this.Drawer.LButtonUp(endX, endY, keyCode);
return CreateImgEvent(bmp);
}
/// <summary>
/// 井组克隆.
/// </summary>
/// <param name="elementID">The element i d.</param>
/// <returns>A JsEvent.</returns>
public JsEvent SelectWellGroupClone(long elementID=0)
{
bool bSuccess = this.Drawer.SelectWellGroupClone(elementID);
if (bSuccess == true)
{
return Redraw();
}
return null;
}
/// <summary>
/// 获得选中的井组相关数据
/// </summary>
/// <returns></returns>
public JsEvent SelectGetWellGroupData()
{
string strWellGroupData = this.Drawer.SelectGetWellGroupData();
var responseEvent = new JsEvent("WellGroupData");
responseEvent.Data = strWellGroupData;
return responseEvent;
}
/// <summary>
/// 设置选中图元的属性
/// </summary>
/// <param name="propertyData"></param>
/// <returns></returns>
public JsEvent SetSelectElementProperty(string propertyData)
{
bool success = this.Drawer.SetElementProperty(propertyData);
if(success == false)
{
return null;
}
return Redraw();
}
public JsEvent GetSelectElementProperty()
{
string strElementData = string.Empty;
long lPosition = 0;
this.Drawer.GetSelectedElement(ref strElementData, ref lPosition);
var responseEvent = new JsEvent("ElementProperty");
Dictionary<string, object> keyValues = new Dictionary<string, object>();
keyValues.Add("ElementID", lPosition);
keyValues.Add("ElementData", strElementData);
responseEvent.Data = keyValues;
return responseEvent;
}
/// <summary>
/// 保存图形.
/// </summary>
/// <returns>A JsEvent.</returns>
public JsEvent SaveFile()
{
bool bSuccess = this.Drawer.SaveFile();
var responseEvent = new JsEvent("Save");
responseEvent.Data = bSuccess;
return responseEvent;
}
private JsEvent CreateImgEvent(Bitmap bmp, string eventName = "", bool sendContent = false)
{
if(bmp == null)
{
return null;
}
byte[] image = null;
string strFile = string.Empty;
try
{
if (sendContent == false)
{
strFile = Path.Combine(WebConfig.HtmlRoot, imageFile);
bmp.Save(strFile);
}
else
{
image = ConvertBitmapToByteArray(bmp);
}
}
catch (Exception ex)
{
//Console.WriteLine($"SendImg: {ex.Message}");
return null;
}
string strEventName = eventName;
if (string.IsNullOrEmpty(eventName))
{
strEventName = "Redraw";
}
var responseEvent = new JsEvent(strEventName);
if (sendContent)
{
string base64Header = $"data:image/png;base64,";
responseEvent.Data = (base64Header + Convert.ToBase64String(image));
}
else
{
responseEvent.Data = imageFile;
}
return responseEvent;
}
public JsEvent Redraw()
{
return this.ShowImg();
}
/// <summary>
/// Refresh-刷新
/// </summary>
/// <returns></returns>
public JsEvent ReFresh()
{
this.Drawer.Geo.ReloadFile();
return this.ShowImg();
}
/// <summary>
/// ReCenter -全图居中
/// </summary>
/// <returns></returns>
public JsEvent DrawCenter()
{
this.Drawer.Geo.ReloadFile();
return this.ShowImg();
}
/// <summary>
/// Gets 所有图元的数量.
/// </summary>
/// <returns>A JsEvent.</returns>
public JsEvent GetElementsCount()
{
var responseEvent = new JsEvent("GetElementsCount");
int nCount = this.Drawer.Geo.GetElementCount();
responseEvent.Data = nCount;
return responseEvent;
}
#region 图层管理
/// <summary>
/// 获得图层数据.获取层位字符串(常规格式)
/// </summary>
/// <returns>A Task.</returns>
public JsEvent GetLayers()
{
var responseEvent = new JsEvent("ReloadLayer")
{
Data = this.Drawer.LayerTree.Layers
};
return responseEvent;
}
/// <summary>
/// 获取图层获得JSON结构化图层数据.
/// </summary>
/// <returns>A Task.</returns>
public JsEvent GetLayersJson()
{
var responseEvent = new JsEvent("ReloadLayer")
{
Data = this.Drawer.LayerTree.LayersJson
};
// responseEvent.Data = this.Drawer.LayerTree.LayersJson;
return responseEvent;
}
/// <summary>
/// Sets the layers status.
/// </summary>
/// <param name="layersStatus">The layers status.
/// VIEW_EDIT = 10,
/// VIEW_NOT_EDIT = 11,
/// NOT_VIEW_NOT_EDIT = 12</param>
/// <returns>A Task.</returns>
public JsEvent SetLayersStatus(string layersStatus)
{
GeoLayerTree layerTree = this.Drawer?.LayerTree;
if (layerTree.SetLayersStatus(layersStatus))
{
return ShowImg();
}
return null;
}
/// <summary>
/// 删除图层
/// </summary>
/// <param name="layers"></param>
/// <param name="withSubLayer"></param>
/// <returns></returns>
public JsEvent DeleteLayers(string layers, bool withSubLayer)
{
var layerArray = layers.Split(new string[] { Environment.NewLine, "," }, StringSplitOptions.RemoveEmptyEntries);
int nCount = layerArray.Length;
if (nCount == 0)
{
return null;
}
for (int i = 0; i < nCount; i++)
{
int nIndexFind = layerArray[i].IndexOf("Layer:\\", 0, StringComparison.CurrentCultureIgnoreCase);
if (nIndexFind >= 0)
{
layerArray[i] = layerArray[i].Remove(0, 7+ nIndexFind);
}
}
this.Drawer.DeleteLayers(layerArray, withSubLayer);
return this.ShowImg();
//var responseEvent = new JsEvent("DeleteLayers")
//{
// Data = string.Empty,
//};
//await SendTargetedEvent(socketContex, responseEvent).ConfigureAwait(true);
//await this.ShowImgAsync();
}
public JsEvent ClearAll(bool needUndo)
{
bool bSuccess = this.Drawer.ClearAll(needUndo);
var responseEvent = new JsEvent("ClearAll")
{
Data = bSuccess,
};
return responseEvent;
}
#endregion
#region 合并图件
/// <summary>
/// 合并图件
/// </summary>
/// <param name="fileName">图件地址</param>
/// <returns></returns>
public JsEvent MergeFile(string fileName)
{
DrawerConfig.StartupPath = WebConfig.StartupPath;
//string strServerPath = WebConfig.MapDirectory;// 获取配置文件中的MapDirectory目录
// string strMapFile = Path.Combine(strServerPath, fileName);
if (!File.Exists(fileName))
{
var responseEventError = new JsEvent("MergeFile")
{
Data = false,
};
return responseEventError;
}
bool isSuccess = this.Drawer.MergeFile(fileName);
var responseEvent = new JsEvent("MergeFile")
{
Data = isSuccess,
};
return responseEvent;
}
#endregion
#region 数据操作
/// <summary>
/// 添加数据.
/// </summary>
/// <param name="data">The data.</param>
/// <returns>A Task.</returns>
public JsEvent AddBufferData(string data)
{
int nResult = this.Drawer.AddBufferData(data);
var responseEvent = new JsEvent("AddBufferData")
{
Data = nResult,
};
return responseEvent;
}
public JsEvent InsertDataBottom(string data, string newLayer, bool createBlock)
{
bool nResult = false;
if (createBlock)
{
string strData = $"Layer M {newLayer}{Environment.NewLine}Block{Environment.NewLine}{data}{Environment.NewLine}EndBlock{Environment.NewLine}";
nResult = this.Drawer.InsertDataBottom(data, "");
}
else
{
nResult = this.Drawer.InsertDataBottom(data, newLayer);
}
var responseEvent = new JsEvent("AddBasicDraw")
{
Data = nResult,
};
return responseEvent;
}
#endregion
#region 坐标工具
/// <summary>
/// 屏幕坐标转换为实际坐标.
/// </summary>
/// <param name="startX">The start x.</param>
/// <param name="endX"></param>
/// <param name="startY">The start y.</param>
/// <param name="endY"></param>
/// <returns>A Task.</returns>
public JsEvent QueryRangeScreen2RealX(double startX, double endX, double startY, double endY)
{
double dRectLeft = 0, dRectRight = 0, dRectTop = 0, dRectBottom = 0;
this.Drawer.Geo.GetScreenReal((int)startX, (int)startY, (int)endX, (int)endY
, ref dRectLeft, ref dRectTop, ref dRectRight, ref dRectBottom);
Dictionary<string, object> keyValues = new Dictionary<string, object>();
keyValues.Add("left", dRectLeft);
keyValues.Add("bottom", dRectBottom);
keyValues.Add("right", dRectRight);
keyValues.Add("top", dRectTop);
var responseEvent = new JsEvent("MapRangeReal")
{
Data = keyValues,
};
return responseEvent;
}
/// <summary>
/// 创建有利区
/// </summary>
/// <param name="dir">图件存储目录</param>
/// <param name="layerName">将创建有利区的图层,如果不存在,则会自动创建图层</param>
/// <param name="sourceFileName">原文件名,不带路径</param>
/// <param name="zMin">最小 z 值</param>
/// <param name="zMax">最大 z 值</param>
/// <returns></returns>
public JsEvent CreateFavorableArea(string dir,string sourceFileName, string layerName, double zMin, double zMax)
{
var drawerData = new DrawerData();
this.Drawer.Geo.CreateFavorableArea(drawerData.pXy, "有利区", zMin, zMax);
string filename = $"{sourceFileName}-有利区-{DateTime.Now:yyyyMMddHHmmssff}.kev";
string strMapFile = Path.Combine(dir, filename);
drawerData.SaveAs(strMapFile);
var keyValues = new Dictionary<string, object>()
{
{ "filename", filename },
};
return new JsEvent("CreateFavorableArea")
{
Data = keyValues,
};
}
/// <summary>
/// 合并有利区底图
/// </summary>
/// <param name="dir">目录</param>
/// <param name="sourceFileName">原图文件</param>
/// <param name="bottomFileName">底层</param>
/// <returns></returns>
public JsEvent MergeFavorableArea(string dir, string sourceFileName, string bottomFileName)
{
string filename = $"{Path.GetFileNameWithoutExtension(sourceFileName)}-有利区-{DateTime.Now:HHmmssff}-带底图.kev";
string sourcePath = Path.Combine(dir, sourceFileName);
string targetPath = Path.Combine(dir, filename);
string bottomPath = Path.Combine(dir, bottomFileName);
string type = "MergeFavorableArea";
var drawerData = new DrawerData();
if (!drawerData.OpenFile(sourcePath))
{
return ErrorEvent(type, $"打开原文件失败,原文件路径: {sourcePath}");
}
if (!drawerData.MergeFile(bottomPath))
{
return ErrorEvent(type, $"合并文件失败,合并文件路径: {bottomPath}");
}
if (!drawerData.SaveAs(targetPath))
{
return ErrorEvent(type, $"保存文件失败,保存文件路径: {targetPath}");
}
return new JsEvent(type)
{
Success = true,
Data = new Dictionary<string, object>()
{
{ "filename", $"{Path.GetFileName(targetPath)}" },
}
};
}
private JsEvent ErrorEvent(string type, string message)
{
return new JsEvent(type)
{
Success = false,
Data = new Dictionary<string, object>()
{
{ "error", message },
}
};
}
#endregion
/// <summary>
/// Creates the drawer.
/// </summary>
/// <param name="file">The file.</param>
/// <param name="w">The w.</param>
/// <param name="h">The h.</param>
/// <param name="context"></param>
public async static Task<string> CreateDrawerAsync(string file, int w, int h, IWebSocketContext context, string token)
{
DrawerConfig.StartupPath = WebConfig.StartupPath;
string strServerPath = WebConfig.MapDirectory;
WebDrawer drawer = new WebDrawer(w, h);
string strMapFile = Path.Combine(strServerPath, file);
//ImageFile = Path.Combine(strServerPath, "K1.png");
string strToken = string.Empty;
await Task.Run(() =>
{
GeoSigmaXY geo = drawer.OpenFile(strMapFile);
if (geo != null)
{
strToken = geo.GetDrawerXy().ToInt64().ToString();
}
});
if (!string.IsNullOrEmpty(strToken))
{
GlobalSession.StoreData(token, drawer);
//Context.Session["DrawerFile"] = file;
GlobalSession.StoreData($"Lock_{token}", new SemaphoreSlim(1, 1));
}
Logger.Info("CreateDrawerAsync:" + token);
return strToken;
}
/// <summary>
/// 资源销毁
/// </summary>
public static async Task CloseDrawerAsync(string token, IWebSocketContext context)
{
SemaphoreSlim drawerLock = (SemaphoreSlim)GlobalSession.GetData($"Lock_{token}");
if(drawerLock == null)
{
return;
}
// 确保在销毁前没有其他线程访问Drawer对象
await drawerLock.WaitAsync();
try
{
WebDrawer drawer = (WebDrawer)GlobalSession.GetData(token);
if (drawer != null)
{
drawer.Dispose(); // 释放资源
GlobalSession.TryRemove(token, out object objDrawer); // 从Session中移除Drawer对象
GlobalSession.TryRemove($"Lock_{token}", out object objLock); // 从Session中移除锁对象
drawer = null;
}
}
finally
{
drawerLock.Release();
drawerLock.Dispose(); // 释放 SemaphoreSlim 资源
}
}
/// <summary>
/// Converts the bitmap to byte array.
/// </summary>
/// <param name="bitmap">The bitmap.</param>
/// <returns>An array of byte.</returns>
public static byte[] ConvertBitmapToByteArray(Bitmap bitmap)
{
if (bitmap == null)
{
return null;
}
using (MemoryStream memoryStream = new MemoryStream())
{
// 选择图像格式可以是Png、Jpeg等
bitmap.Save(memoryStream, ImageFormat.Png);
return memoryStream.ToArray();
}
}
}
}