diff --git a/.gitignore b/.gitignore index e3e326c..18650be 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ HSI_HexagonMI_EF3/x64/Debug/ .vscode/ HSI_HexagonMI_EF3/obj/ HSI_SEVENOCEAN_EF1_CsTest/bin/ +EF3/obj/ diff --git a/EF3/EF3.csproj b/EF3/EF3.csproj new file mode 100644 index 0000000..b238f14 --- /dev/null +++ b/EF3/EF3.csproj @@ -0,0 +1,32 @@ + + + + WinExe + net6.0-windows + enable + true + enable + + + + + + + + + + + True + True + Resource.resx + + + + + + PublicResXFileCodeGenerator + Resource.Designer.cs + + + + \ No newline at end of file diff --git a/EF3/EF3.sln b/EF3/EF3.sln new file mode 100644 index 0000000..cfb9382 --- /dev/null +++ b/EF3/EF3.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32929.385 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EF3", "EF3.csproj", "{47C34DC7-67A1-425E-9460-E045F8BE14CE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47C34DC7-67A1-425E-9460-E045F8BE14CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47C34DC7-67A1-425E-9460-E045F8BE14CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47C34DC7-67A1-425E-9460-E045F8BE14CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47C34DC7-67A1-425E-9460-E045F8BE14CE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0458C7C0-2145-4A08-B4D5-D26EC3638A5A} + EndGlobalSection +EndGlobal diff --git a/EF3/HSI/HSI.cs b/EF3/HSI/HSI.cs new file mode 100644 index 0000000..23a43fd --- /dev/null +++ b/EF3/HSI/HSI.cs @@ -0,0 +1,661 @@ +using System.Runtime.InteropServices; +using static EF3.HSI.HSI.Def; + +namespace EF3.HSI; + +internal class HSI +{ + internal class Interface + { + // >>>> In Interfaces + //引用回调 + public delegate void PEventCallback( + HSI_EVENT_TYPE eventType, HSI_EVENT_RESPONSE_TYPE responseType, uint eventId, string eventData, + ref uint eventCallbackId); + + public static PEventCallback HsiCallback; + + [DllImport("HSI.dll", EntryPoint = "HSI_GET_INTERFACE_VERSION", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetInterfaceVersion(ref uint apiVersionMajor, ref uint apiVersionMinor); + + [DllImport("HSI.dll", EntryPoint = "HSI_GET_MACHINE_INFO", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetMachineInfo(ref int numMachineTypes); + + //引用返回值表示一个方法的返回值是一个引用,而不是值类型对象的副本或者引用类型的地址, + //而一个方法要实现引用返回值,需要满足两个条件: + //1、返回值不能为void,且需要使用ref关键字(或者ref readonly表示只读)修饰返回类型 + //2、方法的每一个return语句需要是一个ref引用 + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_FIREWAREVERION", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS MotionGetFirewareVerion(IntPtr firewareVerion); + + [DllImport("HSI.dll", EntryPoint = "HSI_STARTUP", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS Startup(IntPtr hWnd, bool bOfflineOnly); + + [DllImport("HSI.dll", EntryPoint = "HSI_SET_EVENT_CALLBACK", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS SetEventCallback(PEventCallback pCallback); + + [DllImport("HSI.dll", EntryPoint = "HSI_SHUTDOWM", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS Shutdown(); + + // <<<< Out Interfacess + //事件回调函数 + public static void EventCallback(HSI_EVENT_TYPE eventType, HSI_EVENT_RESPONSE_TYPE responseType, + uint eventId, string eventData, ref uint eventCallbackId) + { + var msgBtn = MessageBoxButtons.OK; + switch (responseType) + { + case HSI_EVENT_RESPONSE_TYPE.HSI_EVENT_RESPONSE_OK: + msgBtn = MessageBoxButtons.OK; + break; + case HSI_EVENT_RESPONSE_TYPE.HSI_EVENT_RESPONSE_RETRY: + msgBtn = MessageBoxButtons.RetryCancel; + break; + case HSI_EVENT_RESPONSE_TYPE.HSI_EVENT_RESPONSE_CANCEL: + msgBtn = MessageBoxButtons.OKCancel; + break; + case HSI_EVENT_RESPONSE_TYPE.HSI_EVENT_RESPONSE_YES: + msgBtn = MessageBoxButtons.YesNo; + break; + } + + switch (eventType) + { + case HSI_EVENT_TYPE.HSI_EVENT_NONE: + break; + case HSI_EVENT_TYPE.HSI_EVENT_ERROR: + break; + case HSI_EVENT_TYPE.HSI_EVENT_FUNCTION: + var eventFunctionId = (HSI_EVENT_FUNCTION_ID)eventId; + switch (eventFunctionId) + { + case HSI_EVENT_FUNCTION_ID.HSI_EVENT_MOTION_DCC_HOME: //准备回家 + { + MessageBox.Show(Resource.Interface_Tips_Home_Machine, Resource.Interface_Tips, + msgBtn, MessageBoxIcon.Information); + break; + } + case HSI_EVENT_FUNCTION_ID.HSI_EVENT_DEBUG_LOG: + { + MessageBox.Show(eventData, Resource.Interface_Tips, + msgBtn, MessageBoxIcon.Information); + break; + } + case HSI_EVENT_FUNCTION_ID.HSI_EVENT_MOVE_POINT: //定位完成 + { + MessageBox.Show(Resource.Interface_Tips_Motion_Finished, Resource.Interface_Tips, + msgBtn, MessageBoxIcon.Information); + ; //Motion completed + break; + } + } + + break; + } + } + } + + internal class Motion + { + //public static bool IsActive(bool bForce = false) + //{ + // if (_bFirst || bForce) + // { + // IsSupported(ref _supported); + // _bFirst = false; + // } + // return (_supported != 0); + //} + + private static bool _bFirst; + private static uint _supported; + + // <<<< Out Interfaces + public Motion() + { + _supported = 0; + _bFirst = true; + } + // >>>> In Interfaces + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS IsSupported(ref uint types); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_STARTUP", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS Startup(bool bHome); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_HOMED", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS IsHomed(ref bool bHomed); + + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_SPEED_XYZ", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetSpeedXyz(ref double speed); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_SPEED_XYZ", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS SetSpeedXyz(double speed); + + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_DCC_SCAN_SET_DATA", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS DCCScanSetData(uint axisTypes, HSI_SCAN_MOTION_TYPE eType, uint lTrigNumber, + double[] dTrigDis); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_DCC_SCAN_START", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS DCCScanStart(); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_DCC_SCAN_STOP", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS DCCScanStop(); + + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_POSITION_XYZ_CACHE", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetPositionXyzCache(IntPtr CacheData, ref int DataCount); + + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_SPEED_R", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS GetSpeedR(ref double speed); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_SPEED_R", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS SetSpeedR(double speed); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_SCALE_RESOLUTION", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS GetScaleResolution( + // ref double scaleX, ref double scaleY, ref double scaleZ); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_SCALE_RESOLUTION", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS SetScaleResolution(double scaleX, double scaleY, double scaleZ); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_DEADBAND", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS GetDeadBand( + // ref double deadbandX, ref double deadbandY, ref double deadbandZ, ref double deadbandR); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_REFRESH_DEADBAND", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS GetRefreshDeadBand(ref double deadband); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_JOG", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS Jog(uint axisTypes, double speed); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_STOP_JOG", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS StopJog(); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_POSITION_XYZ", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetPositionXyz( + uint axisTypes, ref double positionX, ref double positionY, ref double positionZ, ref double time); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_POSITION_XYZ", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS SetPositionXyz( + uint axisTypes, double positionX, double positionY, double positionZ, HSI_MOTION_MOVE_TYPE eType, + double dFlyRadius); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_POSITION_R", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS GetPositionR(uint axisTypes, ref double positionR, ref double time); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_POSITION_R", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS SetPositionR( + // uint axisTypes, double positionR, Def.HSI_MOTION_AXIS_R_MOVE_TYPE directionType, bool bWait); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_ABORT_MOTION", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS AbortMotion(); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_DIO", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetDIO(uint ioChannel, ref uint status); + + //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_DIO", CharSet = CharSet.Unicode)] + //public static extern Def.HSI_STATUS SetDIO(uint ioChannel, uint status); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SHUTDOWN", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS Shutdown(); + } + + + //internal class Illumination + // { + // // >>>> In Interfaces + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS IsSupported(ref uint types); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_STARTUP(); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_GET_LAMP_COUNT(ref int nLamps); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_GET_LAMP_INFO(ref int lampInfo, ref int numLamps, + // int[] lampsType, + // int[] numRings, int[] numSectors, int[] color, double[] angle, ref bool bCanBeCalibrated); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_GET_LAMP_STATE( + // int nLamp, bool[] bBulbStates, double[] intensities, ref int color, ref double angle); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_SET_LAMP_STATE( + // int nLamp, bool[] bBulbStates, double[] intensities, int color, double angle, bool bWait); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_GET_LAMP_STATE_ALL( + // int lampInfo, int numLamps, int[] lampsType, int[,] bBulbStates, double[,] intensities); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_SET_LAMP_STATE_ALL( + // int lampInfo, int numLamps, int[] lampsType, int[,] bBulbStates, double[,] intensities, bool bWait); + + // [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_IS_SUPPORTED", CharSet = CharSet.Unicode)] + // public static extern Def.HSI_STATUS HSI_ILLUMINATION_SHUTDOWN(); + + // // <<<< Out Interfaces + // public Illumination() + // { + // _supported = 0; + // _bFirst = true; + // } + + // public static bool IsActive(bool bForce = false) + // { + // if (_bFirst || bForce) + // { + // IsSupported(ref _supported); + // _bFirst = false; + // } + // return (_supported != 0); + // } + + // private static bool _bFirst; + // private static uint _supported; + // } + + internal class Def + { + public enum HSI_EVENT_FUNCTION_ID //EventData + { + //SendReceive + // V4.2 & V4.3 + + HSI_EVENT_DONE = 0, //N/A N/A + HSI_EVENT_TAKE_HIT = 1, //N/A N/A + HSI_EVENT_ERASE_HIT = 2, //N/AN/A + HSI_EVENT_TIME_CRITICAL = 3, //"ON", or "OFF" N/A + HSI_EVENT_ZOOM_IN = 4, //"MAX", "COARSE", or "FINE" N/A + HSI_EVENT_ZOOM_OUT = 5, //"MAX", "COARSE", or "FINE" N/A + HSI_EVENT_REFRESH_LIVE_VIEW = 6, //N/AN/A + HSI_EVENT_UPDATE_READOUTS = 7, //"AxisFlags,%lf{x},%lf{y},%lf{z},%lf{r}"N/A + HSI_EVENT_READ_MC_POSITION = 8, //"AxisFlags""AxisFlags,%lf{x},%lf{y},%lf{z},%lf{r}" + HSI_EVENT_MOVE_MC_POSITION = 9, //"AxisFlags,%lf{x},%lf{y},%lf{z},%lf{r},%lf{speed},%1d{bWait}"N/A + HSI_EVENT_CONVERT_MC_TO_GLOBAL = 10, //"%lf{x},%lf{y},%lf{z}" "%lf{x},%lf{y},%lf{z}" + HSI_EVENT_UPDATE_STATUS_MESSAGE = 11, //N/AN/A + HSI_EVENT_OPENFILE_DLG = 12, //N/A"FileName" + HSI_EVENT_DISPLAY_YESNO_MESSAGE = 13, //N/AN/A + HSI_EVENT_DISPLAY_OKCANCEL_MESSAGE = 14, //N/AN/A + HSI_EVENT_DISPLAY_OK_MESSAGE = 15, //N/AN/A + + // V4.3 + Only + HSI_EVENT_DEBUG_LOG = 20, //"%s" N/A + HSI_EVENT_MOVE_MC_POSITION_AND_SETTLE = 21, //"AxisFlags,%lf{x},%lf{y},%lf{z},%lf{r},%lf{speed}" N/A + HSI_EVENT_CONVERT_GLOBAL_TO_MM = 22, //"%lf{x},%lf{y},%lf{z}" "%lf{x},%lf{y},%lf{z}" + HSI_EVENT_CONVERT_ROT_TO_TABLE_POINT = 23, //"%lf{x},%lf{y},%lf{z}" "%lf{x},%lf{y},%lf{z}" + HSI_EVENT_CONVERT_ROT_OUT_TABLE_POINT = 24, //"%lf{x},%lf{y},%lf{z}" "%lf{x},%lf{y},%lf{z}" + HSI_EVENT_CONVERT_ROT_TO_TABLE_VECTOR = 25, //"%lf{x},%lf{y},%lf{z}" "%lf{x},%lf{y},%lf{z}" + HSI_EVENT_CONVERT_ROT_OUT_TABLE_VECTOR = 26, //"%lf{x},%lf{y},%lf{z}" "%lf{x},%lf{y},%lf{z}" + HSI_EVENT_ILLUMINATION_REFRESH = 27, + HSI_EVENT_ILLUMINATION_LOCK = 28, + HSI_EVENT_ILLUMINATION_STORE_SET = 29, + HSI_EVENT_ILLUMINATION_RESTORE_SET = 30, + HSI_EVENT_ILLUMINATION_DECREASE_ACTIVE = 31, // "%d" + HSI_EVENT_ILLUMINATION_INCREASE_ACTIVE = 32, // "%d" + HSI_EVENT_ILLUMINATION_DECREASE_ALL = 33, // "%d" + HSI_EVENT_ILLUMINATION_INCREASE_ALL = 34, // "%d" + HSI_EVENT_ILLUMINATION_SELECT_LAMP = 35, // "%d" + HSI_EVENT_ILLUMINATION_SET_LAMP_INTENSITY = 36, // "%d" + HSI_EVENT_ILLUMINATION_GET_LAMP_INTENSITY = 37, // "%d" + HSI_EVENT_ILLUMINATION_SET_LAMP_CALIBRATION_OVERRIDE = 38, // "%d" + HSI_EVENT_ILLUMINATION_NEXT_RING = 39, + HSI_EVENT_ILLUMINATION_PREV_RING = 40, + HSI_EVENT_ILLUMINATION_NEXT_SECTOR = 41, + HSI_EVENT_ILLUMINATION_PREV_SECTOR = 42, + HSI_EVENT_ILLUMINATION_NUM_LAMPS_INSTALLED = 43, + HSI_EVENT_ILLUMINATION_IS_LAMP_INSTALLED = 44, + HSI_EVENT_ILLUMINATION_APPLY = 45, + HSI_EVENT_ILLUMINATION_ALLOFF = 46, + HSI_EVENT_ILLUMINATION_ALLON = 47, + HSI_EVENT_ILLUMINATION_UNLOCK = 48, + HSI_EVENT_IS_PROGRAMMING_MODE = 49, //1/0 + HSI_EVENT_IS_PORTLOCK_DCC = 50, //1/0 + HSI_EVENT_IS_ROTAB_ENABLED = 51, //1/0 + HSI_EVENT_IS_TIME_CRITICAL = 52, // 1/0 + HSI_EVENT_CONVERT_MM_TO_GLOBAL = 53, + HSI_EVENT_CONVERT_GLOBAL_TO_MC = 54, + HSI_EVENT_LASER_FOCUS_ENABLE = 55, // "%d" 0 = not available, 1 = available + HSI_EVENT_MOVE_POINT = 56, //N/AN/A + HSI_EVENT_MAG_CHANGED = 57, + HSI_EVENT_ILLUMINATION_SET_LAMP_INTENSITY_IN_MACHINE_LEVELx100 = 58, + + // "%d" //PR251359-- Instructed to "Please focus on slide" but it's rather unhelpfully turned the lights off for us. + HSI_EVENT_DCC_SCAN_POINTS_AVAILABLE = 59, //"%d"= more to come, 1 = last set N/A + HSI_EVENT_ILLUMINATION_IS_ALL_OFF = 60, + + //1/0//PR253777-- Sensilight does not work if the target has 'ALL OFF' for illum setting--4/16/2008 + HSI_EVENT_ILLUMINATION_DECREASE_ALL_NONZERO = 61, + + // Sensilight command that wont change a lamp currently set to zero + HSI_EVENT_ILLUMINATION_INCREASE_ALL_NONZERO = 62, + // Sensilight command that wont change a lamp currently set to zero22 + + HSI_EVENT_LP_QUALITY = 63, //"%d" 0-100% + HSI_EVENT_TP_QUALITY = 64, //"%d" 0-100% + HSI_EVENT_VP_QUALITY = 65, //"%d" 0-100% + + HSI_EVENT_FLYMODE_MOVE_COMPLETE = 66, // A queued flymode move has completed + HSI_EVENT_PENDANT_SPEED_PERCENT = 67, // 108336 HMV : Add calls to HSI.H for Speed + HSI_EVENT_PENDANT_AXES_SELECTED = 68, // 108335 HMV : Need to add calls to the HSI.H for Stacked Rotary + + HSI_EVENT_MOTION = 500, + HSI_EVENT_MOTION_DCC_HOME = 501, + HSI_EVENT_SHUTDOWN_ = 999 //N/AN/A + } + + public enum HSI_EVENT_RESPONSE_TYPE + { + HSI_EVENT_CALLBACK = 0, + HSI_EVENT_RESPONSE_OK = 1, + HSI_EVENT_RESPONSE_RETRY = 2, + HSI_EVENT_RESPONSE_CANCEL = 3, + HSI_EVENT_RESPONSE_YES = 4, + HSI_EVENT_RESPONSE_NO = 5, + HSI_EVENT_FUNCTION_OK = 6, + HSI_EVENT_FUNCTION_FAILED = 7 + } + + public enum HSI_EVENT_TYPE + { + HSI_EVENT_NONE = 0, + HSI_EVENT_ERROR = 1, + HSI_EVENT_FUNCTION = 2 + } + + public enum HSI_ILLUMINATION_BULB_STATE + { + HSI_ILLUMINATION_BULB_STATE_TURN_ON = 0, + HSI_ILLUMINATION_BULB_STATE_TURN_OFF = 1, + HSI_ILLUMINATION_BULB_STATE_TOTAL + } + + public enum HSI_ILLUMINATION_BULB_TYPE + { + HSI_ILLUMINATION_BULB_ROUND = 1, + HSI_ILLUMINATION_BULB_SQUARE = 2, + HSI_ILLUMINATION_BULB_RING = 3, + HSI_ILLUMINATION_BULB_GRID = 4 + } + + /////////////////////////////////////////////////////////////////////////////// + //Illumination API + /////////////////////////////////////////////////////////////////////////////// + public enum HSI_ILLUMINATION_INFO + { + HSI_ILLUMINATION_INFO_UNKNOWN = 0, + HSI_ILLUMINATION_INFO_HSI = 0x01, + HSI_ILLUMINATION_INFO_HSI_II = 0x02, //lvgang + HSI_ILLUMINATION_INFO_HSI_III = 0x04, //shixuyong + HSI_ILLUMINATION_INFO_TOTAL + } + + public enum HSI_ILLUMINATION_LAMP_CONTROL_TYPE + { + HSI_ILLUMINATION_LAMP_CONTROL_NONE = 0x0000, + HSI_ILLUMINATION_LAMP_CONTROL_BY_WHOLE_LAMP = 0x0001, + HSI_ILLUMINATION_LAMP_CONTROL_BY_RINGS = 0x0002, + HSI_ILLUMINATION_LAMP_CONTROL_BY_OCTANTS = 0x0004, + HSI_ILLUMINATION_LAMP_CONTROL_BY_SEGMENTS = 0x0008, + HSI_ILLUMINATION_LAMP_CONTROL_BY_OTHER + } + + public enum HSI_ILLUMINATION_LAMP_LOCATION_TYPE + { + HSI_ILLUMINATION_LAMP_LOCATION_NONE = 0, + HSI_ILLUMINATION_LAMP_LOCATION_TOP_ON_AXIS = 1, + HSI_ILLUMINATION_LAMP_LOCATION_TOP_ANGLED = 2, + HSI_ILLUMINATION_LAMP_LOCATION_BOTTOM = 3, + HSI_ILLUMINATION_LAMP_LOCATION_MOVABLE = 4 + } + + public enum HSI_ILLUMINATION_LAMP_TYPE + { + HSI_ILLUMINATION_LAMP_NONE = 0, + HSI_ILLUMINATION_LAMP_COAXIAL = 1, + HSI_ILLUMINATION_LAMP_SURFACE = 2, + HSI_ILLUMINATION_LAMP_PROFILE = 3, + HSI_ILLUMINATION_LAMP_PROFILE_OUTER = 4 + } + + public enum HSI_ILLUMINATION_TYPE + { + HSI_ILLUMINATION_SUPPORTS_DCC_CONTROL = 0x0001, + HSI_ILLUMINATION_SUPPORTS_MANUAL_CONTROL = 0x0002 + } + + public enum HSI_MACHINE_TYPE + { + HSI_MACHINE_UNKNOWN = 0, + HSI_MACHINE_SO7 = 1, + HSI_MACHINE_TYPE_TOTAL + } + + public enum HSI_MOTION_AXIS_R_MOVE_TYPE + { + HSI_MOTION_AXIS_R_CLOCKWISE = 1, + HSI_MOTION_AXIS_R_ANTICLOCKWISE = 2, + HSI_MOTION_AXIS_R_FASTEST = 3 + } + + public enum HSI_MOTION_AXIS_TYPE + { + //HSI_MOTION_AXIS_X = 0x0001, //对应ACS 0轴 X + //HSI_MOTION_AXIS_Y = 0x0000, //对应ACS 1轴 Y + //HSI_MOTION_AXIS_Z = 0x0004, //对应ACS 4轴 Z + HSI_MOTION_AXIS_X = 0x0001, // This is the default "Sensor level" X Axis - use on single X axis machines + HSI_MOTION_AXIS_Y = 0x0002, // This is the default "Sensor level" Y Axis - use on single Y axis machines + HSI_MOTION_AXIS_Z = 0x0004, // This is the default "Sensor level" Z Axis - use on single Z axis machines + HSI_MOTION_AXIS_R = 0x0008, // This is the default "Sensor level" R Axis - use on single R axis machines + + HSI_MOTION_AXIS_X1 = + 0x0010, // This is the 1st X Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_Y1 = + 0x0020, // This is the 1st Y Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_Z1 = + 0x0040, // This is the 1st Z Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_R1 = + 0x0080, // This is the 1st R Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_X2 = + 0x0100, // This is the 2nd X Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_Y2 = + 0x0200, // This is the 2nd Y Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_Z2 = + 0x0400, // This is the 2nd Z Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_R2 = + 0x0800, // This is the 2nd R Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_X3 = + 0x1000, // This is the 3rd X Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_Y3 = + 0x2000, // This is the 3rd Y Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_Z3 = + 0x4000, // This is the 3rd Z Axis - use on multiple axis machines when specific axis needed + + HSI_MOTION_AXIS_R3 = + 0x8000 // This is the 3rd R Axis - use on multiple axis machines when specific axis needed + } + + public enum HSI_MOTION_IO_TYPE + { + HSI_MOTION_INPUT1 = 0x0001, + HSI_MOTION_INPUT2, + + HSI_MOTION_OUTPUT1 = 0x0100, + HSI_MOTION_OUTPUT2 + } + + public enum HSI_MOTION_MOVE_TYPE + { + HSI_MOTION_MOVE_WAIT = 1, + HSI_MOTION_MOVE_NOWAIT = 2, + HSI_MOTION_MOVE_INTERMEDIATE_POSITION = 3, + HSI_MOTION_MOVE_FINAL_POSITION = 4, + HSI_MOTION_IN_POSITION_EVENT = 5, + HSI_MOTION_MOVE_FLYMODE = 6, + HSI_MOTION_MOVE_START_POSITION = 7, + HSI_MOTION_MOVE_START_FINAL_POSITION = 8 + } + + + /////////////////////////////////////////////////////////////////////////////// + // Motion API + /////////////////////////////////////////////////////////////////////////////// + + public enum HSI_MOTION_TYPE + { + HSI_MOTION_SUPPORTS_DCC_CONTROL = 0x0001, + HSI_MOTION_SUPPORTS_MANUAL_CONTROL = 0x0002, + HSI_MOTION_SUPPORTS_HOMING = 0x0004, + HSI_MOTION_SUPPORTS_CIRCULAR_MOVES = 0x0008, + HSI_MOTION_SUPPORTS_CMM_WRIST = 0x0010, + HSI_MOTION_SUPPORTS_BUFFERED_MOVES = 0x0020, + HSI_MOTION_SUPPORTS_FLY_MOVES = 0x0040, + HSI_MOTION_SUPPORTS_SCAN = 0x0080, + HSI_MOTION_SUPPORTS_ALL_AXIS_MOVE = 0x0100, + HSI_MOTION_SUPPORTS_MEASPOINT_VW = 0x0200 + } + + public enum HSI_NOTIFY_TYPE + { + HSI_NOTIFY_PROGRAM_EXECUTION_START = 0, + HSI_NOTIFY_PROGRAM_EXECUTION_STOP = 1, + + HSI_NOTIFY_TIME_CRITICAL_EVENT_START = 2, + HSI_NOTIFY_TIME_CRITICAL_EVENT_STOP = 3, + HSI_NOTIFY_PROGRAM_OPEN = 4, + HSI_NOTIFY_PROGRAM_CLOSE = 5, + HSI_NOTIFY_PCDMIS_SHUTDOWN = 6 + } + + public enum HSI_SCAN_MOTION_TYPE + { + HSI_SCAN_MOTION_LINEAR = 1, + HSI_SCAN_MOTION_CIRCULAR, + HSI_SCAN_MOTION_SPEC_LOCA = 100, //EF1 + HSI_SCAN_MOTION_EQ_DIS, + HSI_SCAN_MOTION_EQ_DIS_II, + HSI_SCAN_MOTION_LINEAR_TEST, //测试使用 + HSI_SCAN_MOTION_EQ_TEST, //测试使用 + HSI_SCAN_MOTION_MANUAL_TEST //测试使用 + } + + /////////////////////////////////////////////////////////////////////////////// + // Interface API + /////////////////////////////////////////////////////////////////////////////// + public enum HSI_STATUS + { + HSI_STATUS_NOT_SUPPORTED = -1, + HSI_STATUS_NORMAL = 0, + HSI_STATUS_FAILED, + HSI_FAILED_DLL_LOAD, + + HSI_STATUS_PORTLOCK_HSI_MISMATCH, + + HSI_STATUS_FILE_NOT_FOUND, + HSI_STATUS_HARDWARE_NOT_FOUND, + HSI_STATUS_INVALID_PARAMETERS, + HSI_STATUS_INVALID_POINTS, + HSI_STATUS_PART_NOT_DETECTED, + HSI_STATUS_MEASURE_ERROR, + HSI_STATUS_TEMPERATURE_ERROR, + + HSI_STATUS_ILLUMINATION_COMM = 50, + + HSI_STATUS_OPTICS_COMM = 100, + HSI_STATUS_OPTICS_HOMING, + HSI_STATUS_OPTICS_TIMEOUT, + HSI_STATUS_OPTICS_CALIBRATIONDATA, + HSI_STATUS_OPTICS_CALIBRATIONDATADEFAULT, + HSI_STATUS_OPTICS_CALFILEDATACOUNTMISMATCH, + + HSI_STATUS_MOTION_COMM = 150, + HSI_STATUS_MOTION_HOMING, + HSI_STATUS_MOTION_TIMEOUT, + HSI_STATUS_MOTION_EMERGENCY_STOP, + HSI_STATUS_MOTION_EXCEED_LIMIT, + HSI_STATUS_MOTION_UNKNOWN_ERROR, + HSI_STATUS_MOTION_EXCEED_SW_LIMIT, + HSI_STATUS_MOTION_POSITION_ERROR, + HSI_STATUS_MOTION_MOVING, + + HSI_STATUS_TP_UNEXPECTED_HIT = 200, + HSI_STATUS_TP_TIMEOUT = 201, + HSI_STATUS_TP_APPROACH_TIMEOUT = 202, + HSI_STATUS_TP_WRIST_ERROR, + + HSI_STATUS_FG_COMM = 250, + HSI_STATUS_FG_TIMEOUT, + HSI_STATUS_FG_DIRECTX, + HSI_STATUS_FG_COLORDEPTH, + + HSI_STATUS_LP_TIMEOUT = 300, + HSI_STATUS_LP_EXCEED_LIMIT = 301, + + HSI_STATUS_VP_TIMEOUT = 350, + HSI_STATUS_VP_IMAGEPROCESS_FAIL + } + + public const int HSI_APIVersionMajor = 1; + public const int HSI_APIVersionMinor = 3; + public const int HSI_MaxStringLength = 255; // Maximum string length (buffer size - 1) + + public const int HSI_EF3Version = 0; //默认EF3版本号 + + public const uint HSI_MOTION_AXIS_ALL = + (uint) + (HSI_MOTION_AXIS_TYPE.HSI_MOTION_AXIS_X | HSI_MOTION_AXIS_TYPE.HSI_MOTION_AXIS_Y | + HSI_MOTION_AXIS_TYPE.HSI_MOTION_AXIS_Z); + + public const int HSI_MAX_POSITIONS_STORED = 500; + + public const int HSI_ILLUMINATION_MAX_LAMPS = 6; + public const int HSI_ILLUMINATION_MAX_BULB_COLORS = 3; + public const int HSI_ILLUMINATION_MAX_RINGS = 12; + public const int HSI_ILLUMINATION_MAX_SECTORS = 16; + public const int HSI_ILLUMINATION_MAX_BULBS = HSI_ILLUMINATION_MAX_RINGS * HSI_ILLUMINATION_MAX_SECTORS; + + public const int HSI_MaxLampNameLength = 29, HSI_MaxLampDescriptionLength = 255; + + public struct Point + { + private double x; + private double y; + private double z; + } + + public struct SHsiEventProperties + { + public uint EventId; + public uint EventCallbackId; + public HSI_EVENT_TYPE EventType; + public HSI_EVENT_RESPONSE_TYPE EventResponse; + public char[] EventData; + + public void Init() + { + EventId = (uint)HSI_EVENT_FUNCTION_ID.HSI_EVENT_DONE; + EventCallbackId = 0; + EventType = HSI_EVENT_TYPE.HSI_EVENT_NONE; + EventResponse = HSI_EVENT_RESPONSE_TYPE.HSI_EVENT_CALLBACK; + EventData = new char[HSI_MaxStringLength + 1]; + } + } + // Maximum string length (buffer size - 1) + } +} \ No newline at end of file diff --git a/EF3/HexagonNew.ico b/EF3/HexagonNew.ico new file mode 100644 index 0000000..4d44afa Binary files /dev/null and b/EF3/HexagonNew.ico differ diff --git a/EF3/MainForm.Designer.cs b/EF3/MainForm.Designer.cs new file mode 100644 index 0000000..d79c841 --- /dev/null +++ b/EF3/MainForm.Designer.cs @@ -0,0 +1,190 @@ +namespace EF3 +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.formsPlot1 = new ScottPlot.FormsPlot(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btn_GoHome = new System.Windows.Forms.Button(); + this.txt_EF3Version = new System.Windows.Forms.TextBox(); + this.btn_GetPoints = new System.Windows.Forms.Button(); + this.btn_StopScan = new System.Windows.Forms.Button(); + this.btn_StartSCan = new System.Windows.Forms.Button(); + this.btn_GetEF3Version = new System.Windows.Forms.Button(); + this.btn_Plot = new System.Windows.Forms.Button(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // formsPlot1 + // + this.formsPlot1.Location = new System.Drawing.Point(320, 12); + this.formsPlot1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.formsPlot1.Name = "formsPlot1"; + this.formsPlot1.Size = new System.Drawing.Size(467, 417); + this.formsPlot1.TabIndex = 0; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btn_GoHome); + this.groupBox1.Controls.Add(this.txt_EF3Version); + this.groupBox1.Controls.Add(this.btn_GetPoints); + this.groupBox1.Controls.Add(this.btn_StopScan); + this.groupBox1.Controls.Add(this.btn_StartSCan); + this.groupBox1.Controls.Add(this.btn_GetEF3Version); + this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(299, 173); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "操作面板"; + // + // btn_GoHome + // + this.btn_GoHome.Location = new System.Drawing.Point(18, 86); + this.btn_GoHome.Name = "btn_GoHome"; + this.btn_GoHome.Size = new System.Drawing.Size(75, 23); + this.btn_GoHome.TabIndex = 7; + this.btn_GoHome.Text = "回家"; + this.btn_GoHome.UseVisualStyleBackColor = true; + this.btn_GoHome.Click += new System.EventHandler(this.btn_GoHome_Click); + // + // txt_EF3Version + // + this.txt_EF3Version.Location = new System.Drawing.Point(111, 37); + this.txt_EF3Version.Name = "txt_EF3Version"; + this.txt_EF3Version.Size = new System.Drawing.Size(149, 23); + this.txt_EF3Version.TabIndex = 6; + // + // btn_GetPoints + // + this.btn_GetPoints.Location = new System.Drawing.Point(18, 135); + this.btn_GetPoints.Name = "btn_GetPoints"; + this.btn_GetPoints.Size = new System.Drawing.Size(75, 23); + this.btn_GetPoints.TabIndex = 3; + this.btn_GetPoints.Text = "获取点"; + this.btn_GetPoints.UseVisualStyleBackColor = true; + this.btn_GetPoints.Click += new System.EventHandler(this.btn_GetPoints_Click); + // + // btn_StopScan + // + this.btn_StopScan.Location = new System.Drawing.Point(192, 86); + this.btn_StopScan.Name = "btn_StopScan"; + this.btn_StopScan.Size = new System.Drawing.Size(75, 23); + this.btn_StopScan.TabIndex = 2; + this.btn_StopScan.Text = "结束扫描"; + this.btn_StopScan.UseVisualStyleBackColor = true; + this.btn_StopScan.Click += new System.EventHandler(this.btn_StopScan_Click); + // + // btn_StartSCan + // + this.btn_StartSCan.Location = new System.Drawing.Point(105, 86); + this.btn_StartSCan.Name = "btn_StartSCan"; + this.btn_StartSCan.Size = new System.Drawing.Size(75, 23); + this.btn_StartSCan.TabIndex = 1; + this.btn_StartSCan.Text = "开始扫描"; + this.btn_StartSCan.UseVisualStyleBackColor = true; + this.btn_StartSCan.Click += new System.EventHandler(this.btn_StartSCan_Click); + // + // btn_GetEF3Version + // + this.btn_GetEF3Version.Location = new System.Drawing.Point(18, 37); + this.btn_GetEF3Version.Name = "btn_GetEF3Version"; + this.btn_GetEF3Version.Size = new System.Drawing.Size(75, 23); + this.btn_GetEF3Version.TabIndex = 0; + this.btn_GetEF3Version.Text = "获取固件版本"; + this.btn_GetEF3Version.UseVisualStyleBackColor = true; + this.btn_GetEF3Version.Click += new System.EventHandler(this.btn_GetEF3Version_Click); + // + // btn_Plot + // + this.btn_Plot.Location = new System.Drawing.Point(687, 406); + this.btn_Plot.Name = "btn_Plot"; + this.btn_Plot.Size = new System.Drawing.Size(75, 23); + this.btn_Plot.TabIndex = 4; + this.btn_Plot.Text = "绘制"; + this.btn_Plot.UseVisualStyleBackColor = true; + this.btn_Plot.Click += new System.EventHandler(this.btn_Plot_Click); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.textBox1); + this.groupBox2.Location = new System.Drawing.Point(12, 203); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(299, 226); + this.groupBox2.TabIndex = 2; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "打印日志"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(16, 33); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(261, 184); + this.textBox1.TabIndex = 3; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.btn_Plot); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.formsPlot1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "Form1"; + this.Text = "EF3测试"; + this.Load += new System.EventHandler(this.Form1_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private ScottPlot.FormsPlot formsPlot1; + private GroupBox groupBox1; + private TextBox txt_EF3Version; + private Button btn_Plot; + private Button btn_GetPoints; + private Button btn_StopScan; + private Button btn_StartSCan; + private Button btn_GetEF3Version; + private GroupBox groupBox2; + private TextBox textBox1; + private Button btn_GoHome; + } +} \ No newline at end of file diff --git a/EF3/MainForm.cs b/EF3/MainForm.cs new file mode 100644 index 0000000..657b4ee --- /dev/null +++ b/EF3/MainForm.cs @@ -0,0 +1,118 @@ +using ScottPlot; +using System.Runtime.InteropServices; +using static EF3.HSI.HSI; + +namespace EF3; + +public partial class Form1 : Form +{ + public Form1() + { + InitializeComponent(); + } + + private void btn_StartSCan_Click(object sender, EventArgs e) + { + //ɨ + Motion.DCCScanStart(); + } + + private void btn_GetEF3Version_Click(object sender, EventArgs e) + { + } + + private void btn_StopScan_Click(object sender, EventArgs e) + { + //ɨ + Motion.DCCScanStop(); + } + + private void btn_GetPoints_Click(object sender, EventArgs e) + { + //ȡɨ + var dataCache = Marshal.AllocHGlobal(1000); + var pointCount = 0; + var data = new byte[1000]; + Motion.GetPositionXyzCache(dataCache, ref pointCount); + Console.WriteLine("pointCount = " + pointCount); + Marshal.Copy(dataCache, data, 0, pointCount); + + //Point + //ӡɨ + for (var i = 0; i < pointCount; i++) Console.WriteLine("Hex:{0} {1:X}", i, data[i]); + } + + + private void Form1_Load(object sender, EventArgs e) + { + //1 ȡHSI Dll汾 + uint major = Def.HSI_APIVersionMajor; + uint minjor = Def.HSI_APIVersionMinor; + var rStatus = Interface.GetInterfaceVersion(ref major, ref minjor); + Console.WriteLine("Interface.GetInterfaceVersion: {0}", rStatus); + Console.WriteLine("HSI.dll Version: {0}.{1}", major, minjor); + + //2 HSI ʼ + var mainIntPtr = User32Api.GetCurrentWindowHandle(); + rStatus = Interface.Startup(mainIntPtr, false); + Console.WriteLine("Interface.Startup: {0}", rStatus); + + //3 ȡ + var machineVersion = Def.HSI_EF3Version; + rStatus = Interface.GetMachineInfo(ref machineVersion); + Console.WriteLine("Interface.GetMachineInfo: {0}", rStatus); + Console.WriteLine("HSI EF3 Version: {0}", machineVersion); + + //4 ûصݻص + Interface.HsiCallback = Interface.EventCallback; + rStatus = Interface.SetEventCallback(Interface.HsiCallback); + Console.WriteLine("SetEventCallback:{0}", rStatus); //¼صɹ + } + + private void btn_GoHome_Click(object sender, EventArgs e) + { + var rStatus = Motion.Startup(true); //˶ʼؼж + Console.WriteLine("Motion.Startup:{0}", rStatus); + } + + private void btn_Plot_Click(object sender, EventArgs e) + { + //double[] dataX = { 1, 2, 3, 4, 5 }; + //double[] dataY = { 1, 4, 9, 16, 25 }; + //formsPlot1.Plot.AddScatter(dataX, dataY); + //formsPlot1.Refresh(); + + var plt = new ScottPlot.Plot(600, 400); + + // plot some sample data + plt.AddSignal(DataGen.Sin(51)); + + // add arrows using coordinates + plt.AddArrow(25, 0, 27, .2); + + // you can define a minimum length so the line persists even when zooming out + var arrow2 = plt.AddArrow(27, -.25, 23, -.5); + arrow2.Color = System.Drawing.Color.Red; + arrow2.MinimumLengthPixels = 100; + + // the shape of the arrowhead can be adjusted + var skinny = plt.AddArrow(12, 1, 12, .5); + skinny.Color = System.Drawing.Color.Green; + skinny.ArrowheadLength = 5; + skinny.ArrowheadWidth = 2; + + var fat = plt.AddArrow(20, .6, 20, 1); + fat.Color = System.Drawing.Color.Blue; + fat.ArrowheadLength = 2; + fat.ArrowheadWidth = 5; + + // a marker can be drawn at the base of the arrow + var arrow3 = plt.AddArrow(30, -.58, 35, -.4); + arrow3.MarkerSize = 15; + + plt.SaveFig("plottable_arrow_quickstart.png"); + formsPlot1.Plot.Add(plt.GetPlottables()[1]); + + formsPlot1.Refresh(); + } +} \ No newline at end of file diff --git a/EF3/MainForm.resx b/EF3/MainForm.resx new file mode 100644 index 0000000..d695920 --- /dev/null +++ b/EF3/MainForm.resx @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + AP2YeQD+mXsA/Zl7AP2afAD+mXsA/Zl7AP2afAD/5r9C/+a/Qv/kvUD95r9C/+a/Qv/vxkb9q4gE/4lr + AP+RcgD9hmQA/+nbt///9er/elYA/cCsXP//+vH9/////9/NnP+ScwD9lXUA/5t9AP+ZewD9m30A/5t9 + AP+ZewD95r9C/+a/Qv/kvUD95r9C/+nBQf/JqT/9zbh2/9G6cP/KsmH9z7x5///////9+/X/w6ZK/cCl + SP///v39/Pjw///+/P/////9sZo7/5Z3AP+ZewD9m30A/5t9AP+ZewD95L1A/eS9QP3lvkH+5L1A/eS7 + Nv3025v+knUA/ebSn/3/8NH+/////f7///3////9+eS8/vnmwP33687+/////f7///3////+xbJq/ZJy + AP2afAD+mXsA/Zl7AP2XeQD+5r9C/+a/Qv/kvUD95r9C/+S7Nv/33Z390Lt4/3tYAP/ItWz9//////// + ////////8tyt/fXiuf/z3Kz9/fz3///////////9wq9k/5R0AP+ZewD9m30A/5Z4AP+mhgn95r9C/+a/ + Qv/kvUD95r9C/+S7Nv/v1Y79//Te/5R1AP//+O79+u3V//z06f//////+OO6/fXiuf/z37X99eK8//// + ///////9wq9k/5R0AP+ZewD9lngA/51+Af/xyUz95r9C/+a/Qv/kvUD95r9C/+S7Nv/v1Y799eK6///5 + 7v/779z9+u/b//vv2//269P/xKlT/f/02v/45cD99N6v//z06P/////9wq9k/5R0AP+UdwD9nX4B//DI + S//mv0L95L1A/eS9QP3lvkH+5L1A/eO6NP3v1Iz+9eTC/f////368uL++OzX/frv3f388eL9gF4A/pl7 + AP3l0p7+//DU/fXgtf3////+wq9k/Y1uAP2dfgH+8chL/ea/Qv3lvkH+5r9C/+a/Qv/kvUD95r9C/+S7 + Nv/tz4H9/v7//////////v/9+evU//zx3v/88uP/i2oA/Zl6AP+MbAD9rI8l/+3asv/////9vq5o/5Z1 + AP/wyEv96MBD/+a/Qv/kvUD95L1A/eS9QP3lvkH+5L1A/eK4MP3047P+/////f39/v3+///+/PXr/fnu + 2f388uP9i2oA/pl7AP2YegD+iGwA/dKqHf311oP+yrhz/enAPP3mv0L+5L1A/eS9QP3lvkH+5r9C/+a/ + Qv/kvUD95r9C/+W+P//lvT399uvI///////+///9/v////ru2v/88uP/i2oA/Zp8AP+OcQD937k8/+zE + R//jujf96b87/+fAQ//kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvD3947Yn/+fD + Tv/8+vH9///////9+v/8797/imkA/Y5xAP/huz797MRH/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/ + Qv/kvUD95L1A/+S9QP/lvkH+5L1A/eS9QP3lvkH+5L1A/eO7Of3hsyD+7dF5/f////3++fX9gF8A/uG7 + Pv3qwkX+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+9MpGVua/Qv/kvUD/5r9C/+a/ + Qv/kvUD95r9C/+a/Qv/kvUD95Lo1/+O3KP/v3af/1K0n/evER//kvUD95r9C/+a/Qv/kvUD95r9C/+a/ + Qv/kvUD95r9C/+a/Qv/kvUD9AAAAAAAAAADtxEOi5r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a+ + QP/luzb/58BD/ea/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD9AAAAAAAA + AAAAAAAA/9hKHejAQdTlvkH/5L1A/+S9QP3lvkH+5L1A/eS9QP3kvUD95b5B/uS9QP3lvkH+5L1A/eS9 + QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+AAAAAAAAAAAAAAAAAAAAAAAAAAD6z0dM58BC+Oa/ + Qv/kvUD+5r9C/+a/Qv/mv0L/5L1A/ea/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/ + Qv/kvUD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPKRn7kvUD/5r9C/+a/Qv/mv0L/5L1A/ea/ + Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADwx0QD5L1AoOS9QPzkvUD+5b5B/uS9QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9 + QP3lvkH+5L1A/eS9QP/lvkHpAAA/AAAADwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADgAAAA+AAAAP4AAAD/AAAAKAAAACAA + AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAOa/Qtjmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7GSf/XsjX/lHUA/5p9AP+bfQD/m30A/5t9 + AP+bfQDBm30AKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/uxkn/064x/4xuAP+afQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30AtaaGAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/7sZJ/9OuMf+MbgD/mn0A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5x+AIIAAAAAAAAAAAAAAAAAAAAAAAAAAOa/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7GSf/TrjH/jG4A/5p9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9APqegABOAAAAAAAA + AAAAAAAA5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/uxkn/064x/4xu + AP+afQD/lXYA/5NzAP+YegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQDWooMAHwAAAADmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/7sZJ/9Ou + Mf+MbgD/mn0A/5R1AP+5o03/39Gk/5t9AP+QbwD/mnwA/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30AeOa/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7G + Sf/TrjH/jG4A/5p9AP+ZewD/kXIA///58f+dgAX//////9G9gf+MawD/lHQA/5t8AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/uxkn/064x/4xuAP+afQD/m30A/45tAP/dzJn///bq/39bAP/j06j////7///79f+6o0z/iGcA/5d4 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/7sZI/9KtL/+LbQD/mnwA/5p8AP+XeAD/nYAI///////47tr/i2kA/5N0AP////7//PHf///+ + 9//269b/pIcX/4xrAP+ZegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+nCRP/Oqi3/h2sA/5FyAP+RcgD/kXIA/4VjAP/u4sT///Tl//fq0/+CYAD/hmQA/8Gr + XP//9+r/+e3X//zx3v////3/4dCi/5l7AP+ZegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/6b87/8y0bP/p16n////y///02v//8NH///no///////////////////u + zP//8tb/+ua+////////////////////////////3NKn/5FwAP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/kujL//+3J/4ZnAP+pjCD/9eO///nluv/+//////////// + ///+/v7/892u//Xiuf/04LT/9+nM///////////////////////VyJT/kXAA/5t9AP+bfQD/m30A/5t9 + AP+bfQD/mXsA/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6Mv/55Lj/38uU/4hoAP+DYgD/3c6f//// + //////////////7+/v/z3a7/9eK5//Xiuf/z3Kv//fz5/////////////////9XIlP+RcAD/m30A/5t9 + AP+bfQD/m30A/5h6AP+dfwL/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5Loy//Perv//89v/o4YT/45v + AP///Pf/+e3Y//348//+/////v////Pdrv/14rn/9eK5//Thtv/1473/////////////////1ciU/5Fw + AP+bfQD/m30A/5t9AP+YegD/lHcA/+7GSf/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/kujL/896u//jm + wv/o0pz/1sOK///26P/67tr/+e3W//rw3f///v3//unE//fkvP/14rn/9eK5//Per//79ur///////// + ///VyJT/kXAA/5t9AP+bfQD/mHoA/5R3AP/txUj/6cFE/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6 + Mv/z3q7/9eK6//jpyf///v3/+e3Y//rv2//679v//PHe//HkyP+hhA//+ejG//7szP/14rr/9OG3//Tf + sv///////////9XIlP+RcAD/m30A/5h6AP+UdwD/7cVI/+nBRP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5Loy//Perv/z3a///v38///////57NX/+u7a//rv2//88d//+O7a/4hmAP+LawD/xa1b///x + 1v/76cX/9N+y//ju2f//////1ciU/5FwAP+YegD/lHcA/+3FSP/pwUT/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/kujL/89yp//fs0/////////////v48P/57db/+u/b//zx3//47tr/jWwA/5p8 + AP+ScwD/knMA/9rEh///89n/9N2x///////VyZX/jm4A/5R3AP/txUj/6cFE/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6Mf/x2qP//////////////////v////ju2v/67tr//PHf//ju + 2v+NbAD/m30A/5t9AP+ZewD/jm4A/5h7CP/14bP///fr/9PLnv+KagD/7cVI/+nBRP/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/47cr//v27f///////////////////////fv5//ns + 1P/88d//+O7a/41sAP+bfQD/m30A/5t9AP+McAD/xqEg/+m9Mf/tzG3/1MWN/+S6NP/pwUT/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvTz/5sJM//v26P////////////// + ////////+vDi//zw3f/47tr/jWwA/5t9AP+bfQD/jHAA/8uoK//wyEv/5r9B/+W8Ov/ovjj/58BD/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvTz/4bMg/+vM + bP/////////////////+/v//++7X//ju2v+NbAD/m30A/4xwAP/NqCv/8MhL/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5Ls2/+C0If/y25v////////////++O7/+OzX/41sAP+McAD/zagr//DIS//mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r5B/+O5L//juC//9uvI///////47tz/fl8A/82oK//wyEv/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQlvmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+W+Pv/itif/6cdV//Hr3P+/mA7/8MhL/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAPTL + RgXmv0K05r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvDv/5bow/+vD + Rv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv8AAAAAAAAAAAAAAADtxUQs5r9C4ua/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/wAAAAAAAAAAAAAAAAAAAAAAAAAA6cFDXea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa/QpDmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHI + RRDmv0LD5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADrw0M65r9C7ea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5r9CZea/QuHmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/QtgAAAD/AAAAPwAA + AB8AAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAOAAAAD4AAAA/gAAAP8AAAD/wAAA//AAACgA + AAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAADmv0Ko5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+fAQ//zyk3/ro8S/5d6AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9APqbfQC6m30AOwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9 + AP+ZewD/mXsA/5t9AMWZewAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3nwEP/88lM/aeHCv2UdgD/mXsA/Zl7AP2bfQD/mXsA/Zl7 + AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD/mXsAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQ//zyUz/pocK/5R2AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQBhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7 + AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD/mXsA4pt9ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3nwEP/88lM/aeH + Cv2UdgD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/5t9AP+ZewC2mXsACQAAAAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fA + Q//zyUz/pocK/5R2AP+bfQD/m30A/5l6AP+YeQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AIUAAAAAAAAAAAAA + AADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/l3gA/aSIGP2uljH/jGsA/Zh5AP2bfQD/mXsA/Zl7 + AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/pt9 + AP+ZewD4mXsAUgAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/eS9QP3nwEP/88lM/aeHCv2UdgD/mXsA/Zl7AP2bfAD/jG0A/ePUq/3dzJz/5NWs/ZFx + AP2ScgD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD/mXsA/5l7AIDmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQ//zyUz/pocK/5R2AP+bfQD/m30A/5t9AP+TcwD/wKpZ//vw + 4P+CYAD////////////Fr2T/i2oA/5V2AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/mXsA/Zh6 + AP2PbgD////5/fLlyv2GZAD/wKlY/f/89f3//PP//PLj/a+WNP2KaQD/lngA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7AP7mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/nwEP/88lM/6eHCv+TdgD/m30A/5t9 + AP+bfQD/m30A/49vAP/SwIX///31//Djx/+ObQD/imoA//ju3P/98uH//PLg////+//r3r7/mn4D/49u + AP+aewD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/efAQ//zyUz9pogK/ZJ1 + AP2bfQD/mXsA/Zl7AP2bfQD/lngA/Zl7AP3//////PHh/fDjx/2ObgD/lHUA/amQJv3///7/+O3Z/fjt + 2f3+9OX//////dbFjf+PbwD9kXEA/Zt8AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zl7AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5b5A/fLI + Sv+lhgj9kXQA/ph6AP2afAD/mHoA/Zh6AP2afAD/imkA/ejbt/3/9eX/+/Hg/fDjx/2NbQD/mHoA/Ytp + AP3m2LL//fPk/fjt2f3679r/+O3Z/f/47P///PT9v6hW/YpqAP+VdQD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mnwA/pp8AP7mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/6sNF/amLEf+OcQD9lHUA/ZR1AP2UdQD/lHUA/ZR1AP2PcAD/rZMu/f/++f357dn//PHg/e3g + wf2FYgD/kXEA/Y5uAP2QcQD///ry/fnu2v357dn/+e3Z/fnt2f/679v9//vz/fnu2/+pkCb9lXYA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7AP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/lvj7/7Mhe/72nYP//9N3///zn///y1v//8dX///HV///x1f//7cn///////// + ////////////////////7s3///LW///y1v//7Mr/+/Xo//////////////////////////////////// + ////////jWsA/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP/mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/7MdZ/eDNn/9+XQD9xq5i/f/x1f376MT/8+C3/fLe + sf347tf//////f39/f3//////f7//f78+P3z3q//8+C3/fPgt/314bj/8t6w/f////3//////f39/f// + ///9/f39/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7 + AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JR/f/25P+ojiL9i2sA/ZV2 + AP3cx47///LX/fTgtP3//////f7+/f39/f3//////f7//f78+P3z3q//8+C3/fPgt/314rn/8t6x/fjr + 0f3//////f39/f/////9/f39/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zl7AP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//np + zf/14r3/i2wA/5l6AP+NbgD/nX4F//nz5/////////////////////////////77+P/z3q//9eK5//Xi + uf/14rn/9eK5//Pcq//+/f3////////////////////////////6+PT/jWsA/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/mnwA/5Z4AP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3lvj3/58JQ/ffmyP/+7Mz9v6VR/ZFyAP2YeQD/nH4D/f/78v389On//v///f7+//3//////f7//f78 + +P3z3q//8+C3/fPgt/314rn/8+C3/fPftP315cL//////f/////9/f39/f39/f/////6+PT9i2kA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+YegD9jnAA/d65PP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/04bn9/+3R/ZByAP2IaAD/7eHC/fzy4v357tj/+ezV/fz4 + 8P3+/////v///f78+P3z3q//8+C3/fPgt/314rn/8+C3/fPgt/3z3a7/+/fu/f/////9/f39/f39/f// + ///6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zp8AP+OcAD927Y5/evDRv3mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//fmyP/14rn//OrH/8+3cP+pjyT///76//rv + 2//679v/+u/a//nt1v/47tr//fz7///////24bT/9eK5//Xiuf/14rn/9eK5//Xiuf/04bf/9OG1//// + ///////////////////6+PT/jWsA/5t9AP+bfQD/m30A/5t9AP+bfQD/mnwA/41wAP/ctjn/7cVI/+a/ + Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/z4Lf98+C3/fnk + vf327dz/+u/c/fjt2f3679v/+O3Z/fjt2f367tr/++7Z/fHnzv3p1KL//u3N/fThuf314rn/8+C3/fPg + t/314rn/8t2w/frx3v/+///9/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+YegD9jnAA/du2 + Of/rw0b95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffm + yP/z4Lf98t2w/frx3v3/////+ezU/fjt2f3679v/+O3Z/fjt2f3679v/+/Hg/e7gwv1/XAD/vaRO/f/u + 0v386sf/9OG4/fPgt/314rn/8+C3/fPdrf/+///9/f7//f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zp8 + AP+OcAD927Y5/e3FSP/kvUD95L1A/eS9QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/lvT3/58JQ//fmyP/14bf/9N+1////////////+vLl//ru2P/679v/+u/b//rv2//679v//fPi//Dj + x/+ObQD/k3QA/45vAP/TvXn///LX//nnwf/14rn/9eK5//TgtP/36cz////////////6+PT/jWsA/5t9 + AP+bfQD/mnwA/41wAP/ctjn/7cVI/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/y3a79/Pft/f7///3//////////fnr1P3679v/+O3Z/fjt + 2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zh6AP2PcAD/nH4G/ebSov3/8NP/9eK7/fXiuf/z3Kz9/fz5/f// + ///6+PT9i2kA/Zt9AP+YegD9jnAA/du2Of/rw0b95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/fblxf/15cD9/////f39/f3//////v///fz3 + 7f357df/+O3Z/fjt2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zl7AP2bfQD/lngA/YtrAP2uky3/+ObD/f/t + zf/z4Lb99eO9/f/////6+fT9i2kA/Zp8AP+OcAD927Y5/e3FSP/kvUD95L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//Xhuv/+/fz///////// + //////////////7////47tj/+u/a//rv2//679v//fPi//Djx/+ObQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+WdwD/imsA/8GoVv/458z/9eG3//758P/7+vn/jGoA/41wAP/ctjn/7cVI/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58BL/fnw + 3//////9/f39/f39/f3//////f39/f7+//39+vb/9+vV/fjt2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zl7 + AP2bfQD/mXsA/Zl7AP2bfQD/lHYA/ZR0AP/mvjz98NeY/fjnzf/6/v/9gF4A/du2Of/rw0b95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3lvT3/5sJR/f/////+///9/f39/f39/f3//////f39/f39/f3+////+vHf/fjs2P3679v/+/Hg/fDj + x/2ObgD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2WeAD/m30A/e7HSv/mvj/95Low/ejCTP/s4L/9zqcf/e3F + SP/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0H/5Lk0/+3Ug/////////////////////////////////////////3+//ns + 1P/679v//fPi//Djx/+ObQD/m30A/5t9AP+bfQD/m30A/5V4AP+egAP/8MZJ/+jBRP/mv0L/5r9C/+W9 + Pf/luzP/6cJF/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS6M//htin98+Ow/f////3//////f39/f39 + /f3//////v///fr05/367tj/+/Hg/fDjx/2ObgD/mXsA/Zl7AP2bfQD/lHYA/Z6AAv3xyUz/5r9C/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mvkD/47cr/+a+ + P//5893////////////////////////////57dX//fPi//Djx/+ObQD/m30A/5t9AP+VeAD/noAC//HI + S//nwEP/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/eS8O/3itCL/6sli/f3+//3//////f7//f7///389/D/++/c/fDjx/2ObgD/mXsA/ZR2 + AP2ggQT/8clM/ea/Qv3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/47o2/eGzIP3w2ZD//////f////3//////PLg/fDj + xv2ObgD/lHYA/Z6AAv3xyUz/5r5B/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L25r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qf/juTH/47cu//Xo + u////////////+/gwf+IaQD/noAC//HIS//nwEP/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0Ja5L1A/+S9 + QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5Lw9/eG1KP3lwEb///zz/fDs5P2TcQD/8clM/ea/Qv3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9 + QP0AAAAA5L1AI+S9QNLmv0L/5L1A/+S9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvTz/47Ym/ePGZ/3nvz7/5r5B/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAADmv0JO5r9C+ea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a+PP/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAOS9QIDmv0L/5L1A/+S9 + QP7mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADmv0IK5L1As+S9QP/mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa/Qi3mv0Li5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5L1AXea/Qv/kvUD/5L1A/uS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADkvUCQ5L1A/+S9QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA5r9CE+a/QsLmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0I65L1A6uS9QP/mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOS9 + QGvmv0L/5L1A/+S9QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95b5B/uW+ + Qf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA5L1Ah+S9QOPmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + 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 + MZeYvYdTAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/EF3/Program.cs b/EF3/Program.cs new file mode 100644 index 0000000..14db088 --- /dev/null +++ b/EF3/Program.cs @@ -0,0 +1,17 @@ +namespace EF3 +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/EF3/Resource.Designer.cs b/EF3/Resource.Designer.cs new file mode 100644 index 0000000..50a00b1 --- /dev/null +++ b/EF3/Resource.Designer.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace EF3 { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resource { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resource() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EF3.Resource", typeof(Resource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 提示 的本地化字符串。 + /// + public static string Interface_Tips { + get { + return ResourceManager.GetString("Interface_Tips", resourceCulture); + } + } + + /// + /// 查找类似 准备回家 的本地化字符串。 + /// + public static string Interface_Tips_Home_Machine { + get { + return ResourceManager.GetString("Interface_Tips_Home_Machine", resourceCulture); + } + } + + /// + /// 查找类似 定位完成 的本地化字符串。 + /// + public static string Interface_Tips_Motion_Finished { + get { + return ResourceManager.GetString("Interface_Tips_Motion_Finished", resourceCulture); + } + } + } +} diff --git a/EF3/Resource.resx b/EF3/Resource.resx new file mode 100644 index 0000000..aad10f8 --- /dev/null +++ b/EF3/Resource.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 提示 + + + 准备回家 + + + 定位完成 + + \ No newline at end of file diff --git a/EF3/User32Api.cs b/EF3/User32Api.cs new file mode 100644 index 0000000..34adaaa --- /dev/null +++ b/EF3/User32Api.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace EF3 +{ + class User32Api + { + private static readonly Hashtable ProcessWnd = null; + + public delegate bool Wndenumproc(IntPtr hwnd, uint lParam); + + static User32Api() + { + if (ProcessWnd == null) + { + ProcessWnd = new Hashtable(); + } + } + + [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)] + public static extern bool EnumWindows(Wndenumproc lpEnumFunc, uint lParam); + + [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)] + public static extern IntPtr GetParent(IntPtr hWnd); + + [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")] + public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); + + [DllImport("user32.dll", EntryPoint = "IsWindow")] + public static extern bool IsWindow(IntPtr hWnd); + + [DllImport("kernel32.dll", EntryPoint = "SetLastError")] + public static extern void SetLastError(uint dwErrCode); + + public static IntPtr GetCurrentWindowHandle() + { + IntPtr ptrWnd = IntPtr.Zero; + uint uiPid = (uint)System.Diagnostics.Process.GetCurrentProcess().Id; // 当前进程 ID + object objWnd = ProcessWnd[uiPid]; + + if (objWnd != null) + { + ptrWnd = (IntPtr)objWnd; + if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd)) // 从缓存中获取句柄 + { + return ptrWnd; + } + else + { + ptrWnd = IntPtr.Zero; + } + } + + bool bResult = EnumWindows(new Wndenumproc(EnumWindowsProc), uiPid); + // 枚举窗口返回 false 并且没有错误号时表明获取成功 + if (!bResult && Marshal.GetLastWin32Error() == 0) + { + objWnd = ProcessWnd[uiPid]; + if (objWnd != null) + { + ptrWnd = (IntPtr)objWnd; + } + } + + return ptrWnd; + } + + private static bool EnumWindowsProc(IntPtr hwnd, uint lParam) + { + uint uiPid = 0; + + if (GetParent(hwnd) == IntPtr.Zero) + { + GetWindowThreadProcessId(hwnd, ref uiPid); + if (uiPid == lParam) // 找到进程对应的主窗口句柄 + { + ProcessWnd[uiPid] = hwnd; // 把句柄缓存起来 + SetLastError(0); // 设置无错误 + return false; // 返回 false 以终止枚举窗口 + } + } + + return true; + } + + } +} diff --git a/EF3/bin/Debug/net6.0-windows/EF3.deps.json b/EF3/bin/Debug/net6.0-windows/EF3.deps.json new file mode 100644 index 0000000..f9b0657 --- /dev/null +++ b/EF3/bin/Debug/net6.0-windows/EF3.deps.json @@ -0,0 +1,697 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": { + "EF3/1.0.0": { + "dependencies": { + "Avalonia": "0.10.18", + "Avalonia.Desktop": "0.10.18", + "ScottPlot.WinForms": "4.1.59" + }, + "runtime": { + "EF3.dll": {} + } + }, + "Avalonia/0.10.18": { + "dependencies": { + "Avalonia.Remote.Protocol": "0.10.18", + "JetBrains.Annotations": "10.3.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Memory": "4.5.3", + "System.Reactive": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.6.0", + "System.ValueTuple": "4.5.0" + }, + "runtime": { + "lib/netcoreapp2.0/Avalonia.Animation.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Base.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Controls.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.DesignerSupport.dll": { + "assemblyVersion": "0.7.0.0", + "fileVersion": "0.7.0.0" + }, + "lib/netcoreapp2.0/Avalonia.DesktopRuntime.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Dialogs.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Input.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Interactivity.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Layout.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Markup.Xaml.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Markup.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.MicroCom.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.OpenGL.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Styling.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Themes.Default.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Themes.Fluent.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.Visuals.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + }, + "lib/netcoreapp2.0/Avalonia.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "Avalonia.Angle.Windows.Natives/2.1.0.2020091801": { + "runtimeTargets": { + "runtimes/win-arm64/native/av_libglesv2.dll": { + "rid": "win-arm64", + "assetType": "native", + "fileVersion": "2.1.0.0" + }, + "runtimes/win7-x64/native/av_libglesv2.dll": { + "rid": "win7-x64", + "assetType": "native", + "fileVersion": "2.1.0.0" + }, + "runtimes/win7-x86/native/av_libglesv2.dll": { + "rid": "win7-x86", + "assetType": "native", + "fileVersion": "2.1.0.0" + } + } + }, + "Avalonia.Desktop/0.10.18": { + "dependencies": { + "Avalonia": "0.10.18", + "Avalonia.Native": "0.10.18", + "Avalonia.Skia": "0.10.18", + "Avalonia.Win32": "0.10.18", + "Avalonia.X11": "0.10.18" + }, + "runtime": { + "lib/netstandard2.0/Avalonia.Desktop.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "Avalonia.FreeDesktop/0.10.18": { + "dependencies": { + "Avalonia": "0.10.18", + "Tmds.DBus": "0.9.0" + }, + "runtime": { + "lib/netstandard2.0/Avalonia.FreeDesktop.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "Avalonia.Native/0.10.18": { + "dependencies": { + "Avalonia": "0.10.18" + }, + "runtime": { + "lib/netstandard2.0/Avalonia.Native.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + }, + "runtimeTargets": { + "runtimes/osx/native/libAvaloniaNative.dylib": { + "rid": "osx", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "Avalonia.Remote.Protocol/0.10.18": { + "runtime": { + "lib/netstandard2.0/Avalonia.Remote.Protocol.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "Avalonia.Skia/0.10.18": { + "dependencies": { + "Avalonia": "0.10.18", + "HarfBuzzSharp": "2.8.2.1-preview.108", + "HarfBuzzSharp.NativeAssets.Linux": "2.8.2.1-preview.108", + "HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2.1-preview.108", + "SkiaSharp": "2.88.1-preview.108", + "SkiaSharp.NativeAssets.Linux": "2.88.1-preview.108", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.1-preview.108" + }, + "runtime": { + "lib/netstandard2.0/Avalonia.Skia.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "Avalonia.Win32/0.10.18": { + "dependencies": { + "Avalonia": "0.10.18", + "Avalonia.Angle.Windows.Natives": "2.1.0.2020091801", + "System.Drawing.Common": "4.6.1", + "System.Numerics.Vectors": "4.5.0" + }, + "runtime": { + "lib/netstandard2.0/Avalonia.Win32.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "Avalonia.X11/0.10.18": { + "dependencies": { + "Avalonia": "0.10.18", + "Avalonia.FreeDesktop": "0.10.18", + "Avalonia.Skia": "0.10.18" + }, + "runtime": { + "lib/netstandard2.0/Avalonia.X11.dll": { + "assemblyVersion": "0.10.18.0", + "fileVersion": "0.10.18.0" + } + } + }, + "HarfBuzzSharp/2.8.2.1-preview.108": { + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "2.8.2.1-preview.108", + "HarfBuzzSharp.NativeAssets.macOS": "2.8.2.1-preview.108" + }, + "runtime": { + "lib/net6.0/HarfBuzzSharp.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "2.8.2.1" + } + } + }, + "HarfBuzzSharp.NativeAssets.Linux/2.8.2.1-preview.108": { + "dependencies": { + "HarfBuzzSharp": "2.8.2.1-preview.108" + }, + "runtimeTargets": { + "runtimes/linux-arm/native/libHarfBuzzSharp.so": { + "rid": "linux-arm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-arm64/native/libHarfBuzzSharp.so": { + "rid": "linux-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-x64/native/libHarfBuzzSharp.so": { + "rid": "linux-musl-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-x64/native/libHarfBuzzSharp.so": { + "rid": "linux-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "HarfBuzzSharp.NativeAssets.macOS/2.8.2.1-preview.108": { + "runtimeTargets": { + "runtimes/osx/native/libHarfBuzzSharp.dylib": { + "rid": "osx", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "HarfBuzzSharp.NativeAssets.WebAssembly/2.8.2.1-preview.108": {}, + "HarfBuzzSharp.NativeAssets.Win32/2.8.2.1-preview.108": { + "runtimeTargets": { + "runtimes/win-arm64/native/libHarfBuzzSharp.dll": { + "rid": "win-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x64/native/libHarfBuzzSharp.dll": { + "rid": "win-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x86/native/libHarfBuzzSharp.dll": { + "rid": "win-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "JetBrains.Annotations/10.3.0": { + "dependencies": { + "System.Runtime": "4.1.0" + }, + "runtime": { + "lib/netstandard1.0/JetBrains.Annotations.dll": { + "assemblyVersion": "10.3.0.0", + "fileVersion": "10.3.0.0" + } + } + }, + "Microsoft.NETCore.Platforms/3.0.0": {}, + "Microsoft.NETCore.Targets/1.0.1": {}, + "Microsoft.Win32.SystemEvents/4.6.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "ScottPlot/4.1.59": { + "dependencies": { + "System.Drawing.Common": "4.6.1", + "System.Numerics.Vectors": "4.5.0" + }, + "runtime": { + "lib/net6.0/ScottPlot.dll": { + "assemblyVersion": "4.1.59.0", + "fileVersion": "4.1.59.0" + } + } + }, + "ScottPlot.WinForms/4.1.59": { + "dependencies": { + "ScottPlot": "4.1.59" + }, + "runtime": { + "lib/net6.0-windows7.0/ScottPlot.WinForms.dll": { + "assemblyVersion": "4.1.59.0", + "fileVersion": "4.1.59.0" + } + } + }, + "SkiaSharp/2.88.1-preview.108": { + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.1-preview.108", + "SkiaSharp.NativeAssets.macOS": "2.88.1-preview.108" + }, + "runtime": { + "lib/net6.0/SkiaSharp.dll": { + "assemblyVersion": "2.88.0.0", + "fileVersion": "2.88.1.0" + } + } + }, + "SkiaSharp.NativeAssets.Linux/2.88.1-preview.108": { + "dependencies": { + "SkiaSharp": "2.88.1-preview.108" + }, + "runtimeTargets": { + "runtimes/linux-arm/native/libSkiaSharp.so": { + "rid": "linux-arm", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-arm64/native/libSkiaSharp.so": { + "rid": "linux-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-musl-x64/native/libSkiaSharp.so": { + "rid": "linux-musl-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/linux-x64/native/libSkiaSharp.so": { + "rid": "linux-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "SkiaSharp.NativeAssets.macOS/2.88.1-preview.108": { + "runtimeTargets": { + "runtimes/osx/native/libSkiaSharp.dylib": { + "rid": "osx", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "SkiaSharp.NativeAssets.WebAssembly/2.88.1-preview.108": {}, + "SkiaSharp.NativeAssets.Win32/2.88.1-preview.108": { + "runtimeTargets": { + "runtimes/win-arm64/native/libSkiaSharp.dll": { + "rid": "win-arm64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x64/native/libSkiaSharp.dll": { + "rid": "win-x64", + "assetType": "native", + "fileVersion": "0.0.0.0" + }, + "runtimes/win-x86/native/libSkiaSharp.dll": { + "rid": "win-x86", + "assetType": "native", + "fileVersion": "0.0.0.0" + } + } + }, + "System.ComponentModel.Annotations/4.5.0": {}, + "System.Drawing.Common/4.6.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0", + "Microsoft.Win32.SystemEvents": "4.6.0" + } + }, + "System.Memory/4.5.3": {}, + "System.Numerics.Vectors/4.5.0": {}, + "System.Reactive/5.0.0": { + "runtime": { + "lib/net5.0/System.Reactive.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.0.1" + } + } + }, + "System.Reflection.Emit/4.7.0": {}, + "System.Runtime/4.1.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.Runtime.CompilerServices.Unsafe/4.6.0": {}, + "System.Security.Principal.Windows/4.7.0": {}, + "System.ValueTuple/4.5.0": {}, + "Tmds.DBus/0.9.0": { + "dependencies": { + "System.Reflection.Emit": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + }, + "runtime": { + "lib/netstandard2.0/Tmds.DBus.dll": { + "assemblyVersion": "0.9.0.0", + "fileVersion": "0.9.0.0" + } + } + } + } + }, + "libraries": { + "EF3/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Avalonia/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-hA7US1I75f+ztOyqFWXdzkyJDU9FxcMktfmnmey2uPb+9Cn2GSTU+/7t08CMAyMxuCBpWjlOwkdCZh1cPFWHpg==", + "path": "avalonia/0.10.18", + "hashPath": "avalonia.0.10.18.nupkg.sha512" + }, + "Avalonia.Angle.Windows.Natives/2.1.0.2020091801": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nGsCPI8FuUknU/e6hZIqlsKRDxClXHZyztmgM8vuwslFC/BIV3LqM2wKefWbr6SORX4Lct4nivhSMkdF/TrKgg==", + "path": "avalonia.angle.windows.natives/2.1.0.2020091801", + "hashPath": "avalonia.angle.windows.natives.2.1.0.2020091801.nupkg.sha512" + }, + "Avalonia.Desktop/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7NgFqsyN2hS3NRheou5M3chQzqe/A3pP98iDFFvlzRNEfMC1qyuOULWRdetmAIrs3L4xiQ248ICsJhIssuJxuw==", + "path": "avalonia.desktop/0.10.18", + "hashPath": "avalonia.desktop.0.10.18.nupkg.sha512" + }, + "Avalonia.FreeDesktop/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DVCBasTcXHwc271rt8NT0e5hRpKFZP69+wSOo+eVWxCSXic9fyPx2kTBXzJZ1lrXaxYT2Mf6DIXLP/wfh3nyVQ==", + "path": "avalonia.freedesktop/0.10.18", + "hashPath": "avalonia.freedesktop.0.10.18.nupkg.sha512" + }, + "Avalonia.Native/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-iBMV/mYK6vM+cwKFfuFwayF7cUHYqfUUsZKuHb64FmYQEL+lEGhDY1Z8YT2s9YiZO+r+KvMwzWpVPdWOjjonaQ==", + "path": "avalonia.native/0.10.18", + "hashPath": "avalonia.native.0.10.18.nupkg.sha512" + }, + "Avalonia.Remote.Protocol/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YRymqWJWBDTM+o1CRs5ymAXQpd26erystkyavPgk10bWR4o3D657yFp0oCdfJek2Eba+agazcbZEmB8rdO8eiA==", + "path": "avalonia.remote.protocol/0.10.18", + "hashPath": "avalonia.remote.protocol.0.10.18.nupkg.sha512" + }, + "Avalonia.Skia/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QY3W/Hb3PfOW6mM0E9y1TsUeOjuECGwoXoHhmPmiBmNismXxOkLeXJUYNcUkCxTgKYjj6ZNfFYc5wbHWVJ2Hsw==", + "path": "avalonia.skia/0.10.18", + "hashPath": "avalonia.skia.0.10.18.nupkg.sha512" + }, + "Avalonia.Win32/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NcfRy+gVQebKEOU9XNwbjJDrgV08sJMSQmFnJRdfKf0uniU0hzgfTrDi/5XEtaxJvfzVpd8xQWYh2E6ByJ28cQ==", + "path": "avalonia.win32/0.10.18", + "hashPath": "avalonia.win32.0.10.18.nupkg.sha512" + }, + "Avalonia.X11/0.10.18": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9w4X7y6vZ+0l4Vpj0/TM2s4vwjAcY9N72mX91c5KP0vaMo4Yol7XUb/Ygekkk3tRb9nlvEx+3oywXnZfPYQ2Og==", + "path": "avalonia.x11/0.10.18", + "hashPath": "avalonia.x11.0.10.18.nupkg.sha512" + }, + "HarfBuzzSharp/2.8.2.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vo2eE1jLvYWrfeghYAzkfHr7GNtWsay2ODfufavz8xReOZ648a2sBggSjTU02DQU5EPBSOhKxDnkqnUVWA8xkg==", + "path": "harfbuzzsharp/2.8.2.1-preview.108", + "hashPath": "harfbuzzsharp.2.8.2.1-preview.108.nupkg.sha512" + }, + "HarfBuzzSharp.NativeAssets.Linux/2.8.2.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kRjP0sub39GxY7/YUoWwMAvltH+i+0+HvG6ND1v1iWAeBbAwcBFnPfT6FQDBqdnEaeYQT6y8FxMn9phOND7Kyg==", + "path": "harfbuzzsharp.nativeassets.linux/2.8.2.1-preview.108", + "hashPath": "harfbuzzsharp.nativeassets.linux.2.8.2.1-preview.108.nupkg.sha512" + }, + "HarfBuzzSharp.NativeAssets.macOS/2.8.2.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pDw8R6ndu8usa9unSqEZrl3RbUNw2AzqAkcJTkocA15dxBpHvaaVKqgEozTLfye0/l5s0YgYAb4WpcY4qBg6Pw==", + "path": "harfbuzzsharp.nativeassets.macos/2.8.2.1-preview.108", + "hashPath": "harfbuzzsharp.nativeassets.macos.2.8.2.1-preview.108.nupkg.sha512" + }, + "HarfBuzzSharp.NativeAssets.WebAssembly/2.8.2.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BSgvS7jHt/UMoFRpVNxLcQhPFbNN/KRt/ntKH5Jo64gCpLwBzRF8Pv2mzKI2xQ3KKp+x/n1e6MAug3umls+wUA==", + "path": "harfbuzzsharp.nativeassets.webassembly/2.8.2.1-preview.108", + "hashPath": "harfbuzzsharp.nativeassets.webassembly.2.8.2.1-preview.108.nupkg.sha512" + }, + "HarfBuzzSharp.NativeAssets.Win32/2.8.2.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0ws24k21iRH2GRiOLEcG6ESl+VROOwaeHnC0vqKQChGmreGTJ//JBQJqIu189oY30G0NVdypDe1UwFA/scjBAw==", + "path": "harfbuzzsharp.nativeassets.win32/2.8.2.1-preview.108", + "hashPath": "harfbuzzsharp.nativeassets.win32.2.8.2.1-preview.108.nupkg.sha512" + }, + "JetBrains.Annotations/10.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-0GLU9lwGVXjUNlr9ZIdAgjqLI2Zm/XFGJFaqJ1T1sU+kwfeMLhm68+rblUrNUP9psRl4i8yM7Ghb4ia4oI2E5g==", + "path": "jetbrains.annotations/10.3.0", + "hashPath": "jetbrains.annotations.10.3.0.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/3.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==", + "path": "microsoft.netcore.platforms/3.0.0", + "hashPath": "microsoft.netcore.platforms.3.0.0.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==", + "path": "microsoft.netcore.targets/1.0.1", + "hashPath": "microsoft.netcore.targets.1.0.1.nupkg.sha512" + }, + "Microsoft.Win32.SystemEvents/4.6.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Edg+pFW5C8WJb680Za2kTV8TqUi6Ahl/WldRVoOVJ23UQLpDHFspa+umgFjkWZw24ETsU99Cg+ErZz683M4chg==", + "path": "microsoft.win32.systemevents/4.6.0", + "hashPath": "microsoft.win32.systemevents.4.6.0.nupkg.sha512" + }, + "ScottPlot/4.1.59": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zUEBIW6rN6T6SoG8JGK4EGiwc94wX4iz1PFEGyAqRjGlnwwvHCCNdVWcNoQ/3u0rm8SJQQMD+AgT/2aoJUHLGQ==", + "path": "scottplot/4.1.59", + "hashPath": "scottplot.4.1.59.nupkg.sha512" + }, + "ScottPlot.WinForms/4.1.59": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RkCbZT48aRspJSdsBbpMeorLqhx83njgHuY1iU/EQfoNLOatMhraPXV0F9maIbwfIXBSQaE0m2Dcn2OcZ2ngNg==", + "path": "scottplot.winforms/4.1.59", + "hashPath": "scottplot.winforms.4.1.59.nupkg.sha512" + }, + "SkiaSharp/2.88.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Zfs4qdQuvLsdSdBa42CnD8Dlcnkr46GaaFEwouzrjOLse8DmKkf/zBaCFCUkNIjGDZFkjFGe/ai5qHYkMcXIsg==", + "path": "skiasharp/2.88.1-preview.108", + "hashPath": "skiasharp.2.88.1-preview.108.nupkg.sha512" + }, + "SkiaSharp.NativeAssets.Linux/2.88.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1aOmUqcuzXJP0FaDL5JPRx7FbLFbiyl5R2lI1YwTTfXTpawnPxpPXlBClj+CuRrSS5Azfn8k3ZIHPHTd37vOWw==", + "path": "skiasharp.nativeassets.linux/2.88.1-preview.108", + "hashPath": "skiasharp.nativeassets.linux.2.88.1-preview.108.nupkg.sha512" + }, + "SkiaSharp.NativeAssets.macOS/2.88.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nz+Ege0i1aCicLnaHOBzuTBj5LnLxlZVxLv+wUEtOXaAHq6of7kxaE+/+4KC1OBnKs64L8WDGf88VC2fIC/zxw==", + "path": "skiasharp.nativeassets.macos/2.88.1-preview.108", + "hashPath": "skiasharp.nativeassets.macos.2.88.1-preview.108.nupkg.sha512" + }, + "SkiaSharp.NativeAssets.WebAssembly/2.88.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-mVXV6XulqCZ5eXzWhLAdhl1CWvaYnCJEusADuS0WZ3CdzgPZl8gqfyRzM3KMrMfkaJVh/L4n3VVDnbxQw5YSvA==", + "path": "skiasharp.nativeassets.webassembly/2.88.1-preview.108", + "hashPath": "skiasharp.nativeassets.webassembly.2.88.1-preview.108.nupkg.sha512" + }, + "SkiaSharp.NativeAssets.Win32/2.88.1-preview.108": { + "type": "package", + "serviceable": true, + "sha512": "sha512-98r2fGVjPNjIhH0ooHtvAcqsHUjWZPEkqrfpynZNWdo8gkUPZhENvOodDtvBNUW6we24Bo4aWCnGbJuhyn//ug==", + "path": "skiasharp.nativeassets.win32/2.88.1-preview.108", + "hashPath": "skiasharp.nativeassets.win32.2.88.1-preview.108.nupkg.sha512" + }, + "System.ComponentModel.Annotations/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", + "path": "system.componentmodel.annotations/4.5.0", + "hashPath": "system.componentmodel.annotations.4.5.0.nupkg.sha512" + }, + "System.Drawing.Common/4.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-TFAADvBEUhdDb2Lteq/BUeG0J1y7a0GyFdpB8yE/eAcbiN0R5MII1nXExXsrtRZiO8C/L9SozL2wGqkRlhiv6A==", + "path": "system.drawing.common/4.6.1", + "hashPath": "system.drawing.common.4.6.1.nupkg.sha512" + }, + "System.Memory/4.5.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==", + "path": "system.memory/4.5.3", + "hashPath": "system.memory.4.5.3.nupkg.sha512" + }, + "System.Numerics.Vectors/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", + "path": "system.numerics.vectors/4.5.0", + "hashPath": "system.numerics.vectors.4.5.0.nupkg.sha512" + }, + "System.Reactive/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==", + "path": "system.reactive/5.0.0", + "hashPath": "system.reactive.5.0.0.nupkg.sha512" + }, + "System.Reflection.Emit/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==", + "path": "system.reflection.emit/4.7.0", + "hashPath": "system.reflection.emit.4.7.0.nupkg.sha512" + }, + "System.Runtime/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==", + "path": "system.runtime/4.1.0", + "hashPath": "system.runtime.4.1.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/4.6.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HxozeSlipUK7dAroTYwIcGwKDeOVpQnJlpVaOkBz7CM4TsE5b/tKlQBZecTjh6FzcSbxndYaxxpsBMz+wMJeyw==", + "path": "system.runtime.compilerservices.unsafe/4.6.0", + "hashPath": "system.runtime.compilerservices.unsafe.4.6.0.nupkg.sha512" + }, + "System.Security.Principal.Windows/4.7.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==", + "path": "system.security.principal.windows/4.7.0", + "hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512" + }, + "System.ValueTuple/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==", + "path": "system.valuetuple/4.5.0", + "hashPath": "system.valuetuple.4.5.0.nupkg.sha512" + }, + "Tmds.DBus/0.9.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KcTWL9aKuob9Qo2sOTTKFePs1rKGTwZrcBvMFuGVIVR5RojX3oIFj5UBLYfSGjYgrcImC7LjQI3DdCFwUnhNXw==", + "path": "tmds.dbus/0.9.0", + "hashPath": "tmds.dbus.0.9.0.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/EF3/bin/Debug/net6.0-windows/EF3.runtimeconfig.json b/EF3/bin/Debug/net6.0-windows/EF3.runtimeconfig.json new file mode 100644 index 0000000..f9988b2 --- /dev/null +++ b/EF3/bin/Debug/net6.0-windows/EF3.runtimeconfig.json @@ -0,0 +1,15 @@ +{ + "runtimeOptions": { + "tfm": "net6.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "6.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "6.0.0" + } + ] + } +} \ No newline at end of file diff --git a/EF3/bin/Debug/net6.0-windows/plottable_arrow_quickstart.png b/EF3/bin/Debug/net6.0-windows/plottable_arrow_quickstart.png new file mode 100644 index 0000000..e348129 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/plottable_arrow_quickstart.png differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm/native/libHarfBuzzSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm/native/libHarfBuzzSharp.so new file mode 100644 index 0000000..1286d35 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm/native/libHarfBuzzSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm/native/libSkiaSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm/native/libSkiaSharp.so new file mode 100644 index 0000000..fe70078 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm/native/libSkiaSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm64/native/libHarfBuzzSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm64/native/libHarfBuzzSharp.so new file mode 100644 index 0000000..6b58905 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm64/native/libHarfBuzzSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm64/native/libSkiaSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm64/native/libSkiaSharp.so new file mode 100644 index 0000000..9b961f9 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-arm64/native/libSkiaSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-musl-x64/native/libHarfBuzzSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-musl-x64/native/libHarfBuzzSharp.so new file mode 100644 index 0000000..2d3b280 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-musl-x64/native/libHarfBuzzSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-musl-x64/native/libSkiaSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-musl-x64/native/libSkiaSharp.so new file mode 100644 index 0000000..c3d520d Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-musl-x64/native/libSkiaSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-x64/native/libHarfBuzzSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-x64/native/libHarfBuzzSharp.so new file mode 100644 index 0000000..0baece0 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-x64/native/libHarfBuzzSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/linux-x64/native/libSkiaSharp.so b/EF3/bin/Debug/net6.0-windows/runtimes/linux-x64/native/libSkiaSharp.so new file mode 100644 index 0000000..3508576 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/linux-x64/native/libSkiaSharp.so differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libAvaloniaNative.dylib b/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libAvaloniaNative.dylib new file mode 100644 index 0000000..b1361e1 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libAvaloniaNative.dylib differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libHarfBuzzSharp.dylib b/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libHarfBuzzSharp.dylib new file mode 100644 index 0000000..16a1ad7 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libHarfBuzzSharp.dylib differ diff --git a/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libSkiaSharp.dylib b/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libSkiaSharp.dylib new file mode 100644 index 0000000..b75bb53 Binary files /dev/null and b/EF3/bin/Debug/net6.0-windows/runtimes/osx/native/libSkiaSharp.dylib differ