This commit is contained in:
backuppc
2025-07-08 15:05:21 +09:00
parent af316e72d0
commit fb8c488890
57 changed files with 902 additions and 7161 deletions

View File

@@ -34,6 +34,9 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="arCommUtil">
<HintPath>..\..\DLL\arCommUtil.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
@@ -59,10 +62,6 @@
<Project>{14e8c9a5-013e-49ba-b435-efefc77dd623}</Project>
<Name>CommData</Name>
</ProjectReference>
<ProjectReference Include="..\CommUtil\arCommUtil.csproj">
<Project>{14e8c9a5-013e-49ba-b435-ffffff7dd623}</Project>
<Name>arCommUtil</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -1,23 +1,23 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace arFrame.Control
{
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class ColorListItem
{
public System.Drawing.Color BackColor1 { get; set; }
public System.Drawing.Color BackColor2 { get; set; }
public string Remark { get; set; }
public ColorListItem()
{
BackColor1 = System.Drawing.Color.Transparent;
BackColor2 = System.Drawing.Color.Transparent;
Remark = string.Empty;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace arFrame.Control
{
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class ColorListItem
{
public System.Drawing.Color BackColor1 { get; set; }
public System.Drawing.Color BackColor2 { get; set; }
public string Remark { get; set; }
public ColorListItem()
{
BackColor1 = System.Drawing.Color.Transparent;
BackColor2 = System.Drawing.Color.Transparent;
Remark = string.Empty;
}
}
}

View File

@@ -1,50 +1,50 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace arFrame.Control
{
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class GridViewItem
{
public int row { get; private set; }
public int col { get; private set; }
public int idx { get; private set; }
[Category("arFrame"), DisplayName("Tag")]
public string Tag { get; set; }
[Category("arFrame"), DisplayName("글자 정렬 방식")]
public System.Drawing.ContentAlignment TextAlign { get; set; }
[Category("arFrame"), DisplayName("글자 여백")]
public System.Windows.Forms.Padding Padding { get; set; }
[Category("arFrame"), DisplayName("메뉴 사용여부"), Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")]
public Boolean Enable { get; set; }
public System.Drawing.Color BackColor1 { get; set; }
public System.Drawing.Color BackColor2 { get; set; }
public Boolean Dirty { get; set; }
public System.Drawing.RectangleF rect { get; set; }
[Category("arFrame"), DisplayName("번호")]
public int No { get; set; }
public GridViewItem(int idx_,int _r,int _c)
{
this.row = _r;
this.col = _c;
BackColor1 = System.Drawing.Color.Transparent;
BackColor2 = System.Drawing.Color.Transparent;
rect = System.Drawing.RectangleF.Empty;
Enable = true;
this.idx = idx_;
TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
No = 0;
this.Dirty = true;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace arFrame.Control
{
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class GridViewItem
{
public int row { get; private set; }
public int col { get; private set; }
public int idx { get; private set; }
[Category("arFrame"), DisplayName("Tag")]
public string Tag { get; set; }
[Category("arFrame"), DisplayName("글자 정렬 방식")]
public System.Drawing.ContentAlignment TextAlign { get; set; }
[Category("arFrame"), DisplayName("글자 여백")]
public System.Windows.Forms.Padding Padding { get; set; }
[Category("arFrame"), DisplayName("메뉴 사용여부"), Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")]
public Boolean Enable { get; set; }
public System.Drawing.Color BackColor1 { get; set; }
public System.Drawing.Color BackColor2 { get; set; }
public Boolean Dirty { get; set; }
public System.Drawing.RectangleF rect { get; set; }
[Category("arFrame"), DisplayName("번호")]
public int No { get; set; }
public GridViewItem(int idx_,int _r,int _c)
{
this.row = _r;
this.col = _c;
BackColor1 = System.Drawing.Color.Transparent;
BackColor2 = System.Drawing.Color.Transparent;
rect = System.Drawing.RectangleF.Empty;
Enable = true;
this.idx = idx_;
TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
No = 0;
this.Dirty = true;
}
}
}

View File

@@ -1,36 +1,36 @@
namespace arFrame.Control
{
partial class GridView
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}
namespace arFrame.Control
{
partial class GridView
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -19,7 +19,7 @@ namespace AGVControl.Properties {
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여 ResGen을
// 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@@ -47,8 +47,8 @@ namespace AGVControl.Properties {
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대 현재 스레드의 CurrentUICulture
/// 속성을 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {

View File

@@ -34,6 +34,9 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="arCommUtil">
<HintPath>..\..\DLL\arCommUtil.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
@@ -57,6 +60,14 @@
<Compile Include="Dialog\fPropertyRFIDPoint.Designer.cs">
<DependentUpon>fPropertyRFIDPoint.cs</DependentUpon>
</Compile>
<Compile Include="GridView\ColorListItem.cs" />
<Compile Include="GridView\GridItem.cs" />
<Compile Include="GridView\GridView.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="GridView\GridView.Designer.cs">
<DependentUpon>GridView.cs</DependentUpon>
</Compile>
<Compile Include="MapControlManager.cs" />
<Compile Include="Models\AGVActionPrediction.cs" />
<Compile Include="BatteryLevelGauge.cs">
@@ -134,10 +145,6 @@
<Project>{14e8c9a5-013e-49ba-b435-efefc77dd623}</Project>
<Name>CommData</Name>
</ProjectReference>
<ProjectReference Include="..\CommUtil\arCommUtil.csproj">
<Project>{14e8c9a5-013e-49ba-b435-ffffff7dd623}</Project>
<Name>arCommUtil</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\ico_navi_40.png" />

View File

@@ -91,7 +91,10 @@ namespace arDev
}
bool Recv0 = false;
int Recv0Cnt = 0;
bool Recv1 = false;
int Recv1Cnt = 0;
public event EventHandler<ChargetDetectArgs> ChargeDetect;
public override bool ProcessRecvData(byte[] data)
{
@@ -110,6 +113,13 @@ namespace arDev
}
if (VerifyChecksum(data) == false)
{
RaiseMessage(MessageType.Error, "Checksum error");
return false;
}
if (data[1] == 0x03)
{
return ParseBMSInfo();
@@ -123,6 +133,8 @@ namespace arDev
}
bool ParseBMSCellVoltage()
{
if (UseCmdLogging == true)
RaiseMessage(MessageType.Recv, ByteListToHexString(LastReceiveBuffer.ToList()));
//var i = 0;
var BatteryCell_Checksum = 0xffff;// - (LastReceiveBuffer[i + 3] + LastReceiveBuffer[i + 4] + LastReceiveBuffer[i + 5] + LastReceiveBuffer[i + 6] + LastReceiveBuffer[i + 7] + LastReceiveBuffer[i + 8] + LastReceiveBuffer[i + 9] + LastReceiveBuffer[i + 10] + LastReceiveBuffer[i + 11] + LastReceiveBuffer[i + 12] + LastReceiveBuffer[i + 13] + LastReceiveBuffer[i + 14] + LastReceiveBuffer[i + 15] + LastReceiveBuffer[i + 16] + LastReceiveBuffer[i + 17] + LastReceiveBuffer[i + 18] + LastReceiveBuffer[i + 19])) + 1;
for (int i = 3; i < 20; i++)
@@ -170,8 +182,62 @@ namespace arDev
}
public static bool VerifyChecksum(byte[] dataBytes)
{
// 길이 바이트 (byte[3])
byte length = dataBytes[3];
if (dataBytes[1] == 0x03)
{
// 데이터 바이트 (byte[4] ~ byte[30])
byte[] data = dataBytes.Skip(4).Take(27).ToArray();
// 길이와 데이터의 합을 계산
ushort sum = (ushort)(length + data.Sum(b => b));
// 반전시키고 높은 위치부터 낮은 위치로 더한 후 1을 더함
ushort checksum = (ushort)((~sum + 1) & 0xFFFF);
// 받은 체크섬 (byte[31] ~ byte[32])
ushort receivedChecksum = (ushort)((dataBytes[31] << 8) | dataBytes[32]);
//252 1: 64514
// 계산된 체크섬과 받은 체크섬을 비교
return checksum == receivedChecksum;
}
else if (dataBytes[1] == 0x04)
{
// 데이터 바이트 (byte[4] ~ byte[30])
byte[] data = dataBytes.Skip(4).Take(16).ToArray();
// 길이와 데이터의 합을 계산
ushort sum = (ushort)(length + data.Sum(b => b));
// 반전시키고 높은 위치부터 낮은 위치로 더한 후 1을 더함
ushort checksum = (ushort)((~sum + 1) & 0xFFFF);
// 받은 체크섬 (byte[31] ~ byte[32])
ushort receivedChecksum = (ushort)((dataBytes[20] << 8) | dataBytes[21]);
//252 1: 64514
// 계산된 체크섬과 받은 체크섬을 비교
return checksum == receivedChecksum;
}
return false;
}
bool ParseBMSInfo()
{
if(UseCmdLogging == true)
RaiseMessage(MessageType.Recv, ByteListToHexString(LastReceiveBuffer.ToList()));
//전압확인
UInt16 batH = (UInt16)LastReceiveBuffer[4];
UInt16 batL = (UInt16)LastReceiveBuffer[5];
@@ -361,6 +427,10 @@ namespace arDev
public int QueryIndex { get; set; } = 0;
public int CMDOutCnt { get; set; } = 3;
public bool UseCmdLogging { get; set; } = false;
/// <summary>
/// 상태읽기와 전압읽기명령을 반복합니다
/// </summary>
@@ -375,8 +445,22 @@ namespace arDev
Recv1 = false;
return true;
}
else
{
if (Recv0Cnt > CMDOutCnt)
{
Recv0Cnt = 0;
RaiseMessage(MessageType.Error, "0 명령 Count Out");
QueryIndex = 1;
Recv1 = false;
return true;
}
else
{
return SendQuery_ReadStatue();
}
return SendQuery_ReadStatue();
}
}
else
{
@@ -386,29 +470,47 @@ namespace arDev
Recv0 = false;
return true;
}
return SendQuery_ReadCellvoltage();
else
{
if (Recv1Cnt > CMDOutCnt)
{
Recv1Cnt = 0;
RaiseMessage(MessageType.Error, "1 명령 Count Out");
QueryIndex = 0;
Recv0 = false;
return true;
}
else
{
return SendQuery_ReadCellvoltage();
}
}
}
}
public Boolean SendQuery_ReadStatue()
{
Recv0Cnt++;
Recv0 = false;
var cmd = new List<byte>();
cmd.Add(0xDD); //stx
cmd.Add(0xA5); //read
cmd.Add(0x03); //command
cmd.Add(0xDD);
cmd.Add(0xA5);
cmd.Add(0x03);
cmd.Add(0x00);
cmd.Add(0xFF);
cmd.Add(0xFD); //checksum1
cmd.Add(0x77); //checksum2
cmd.Add(0x0D); //etx
cmd.Add(0xFD);
cmd.Add(0x77);
cmd.Add(0x0D);
if (UseCmdLogging == true)
RaiseMessage(MessageType.Normal, ByteListToHexString(cmd));
return WriteData(cmd.ToArray());
}
public Boolean SendQuery_ReadCellvoltage()
{
Recv1Cnt++;
Recv1 = false;
var cmd = new List<byte>();
cmd.Add(0xDD);
@@ -419,8 +521,21 @@ namespace arDev
cmd.Add(0xFC);
cmd.Add(0x77);
cmd.Add(0x0D);
if (UseCmdLogging == true)
RaiseMessage(MessageType.Normal, ByteListToHexString(cmd));
return WriteData(cmd.ToArray());
}
public string ByteListToHexString(List<byte> byteList)
{
StringBuilder hex = new StringBuilder(byteList.Count * 2);
foreach (byte b in byteList)
{
hex.AppendFormat("{0:X2} ", b);
}
return hex.ToString();
}
}
}

View File

@@ -1,24 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace arDev.Arduino
{
public enum IODirection
{
Input = 0,
Output
}
public enum MessageType
{
Normal = 0,
SendData,
ReceiveData,
Message,
RxIOData,
RxSetData,
}
}

View File

@@ -1,82 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace arDev.Arduino
{
public partial class DIO
{
/// <summary>
/// Digital Input/Output Changed
/// </summary>
public event EventHandler<IOValueEventArgs> ValueChanged;
public event EventHandler<FlagValueEventArgs> FlagChanged;
/// <summary>
/// 마그넷 센서의 값이 변경되었을때 발생 함
/// </summary>
public event EventHandler PositionChanged;
///// <summary>
///// Digital Input/Output Message
///// </summary>
//public event EventHandler<MessageEventArgs> Message;
public class FlagValueEventArgs : EventArgs
{
private int _arridx;
private Boolean _oldvalue;
private Boolean _newvalue;
public int ArrIDX { get { return _arridx; } }
public Boolean OldValue { get { return _oldvalue; } }
public Boolean NewValue { get { return _newvalue; } }
public FlagValueEventArgs( int ArrIDX, Boolean oldvalue, Boolean newvalue)
{
_arridx = ArrIDX;
_oldvalue = oldvalue;
_newvalue = newvalue;
}
}
public class IOValueEventArgs : EventArgs
{
private int _arridx;
private Boolean _oldvalue;
private Boolean _newvalue;
private IODirection _dir;
public int ArrIDX { get { return _arridx; } }
public Boolean OldValue { get { return _oldvalue; } }
public Boolean NewValue { get { return _newvalue; } }
public IODirection Direction { get { return _dir; } }
public IOValueEventArgs(IODirection dir, int ArrIDX, Boolean oldvalue, Boolean newvalue)
{
_arridx = ArrIDX;
_oldvalue = oldvalue;
_newvalue = newvalue;
_dir = dir;
}
}
//public class MessageEventArgs : EventArgs
//{
// private Boolean _isError = false;
// public Boolean IsError { get { return _isError; } }
// private string _message = string.Empty;
// public string Message { get { return _message; } }
// private Arduino.MessageType _mtype;
// public Arduino.MessageType MessageType { get { return _mtype; } }
// public MessageEventArgs(Arduino.MessageType mType, string Message, Boolean isError)
// {
// _isError = isError;
// _message = Message;
// this._mtype = mType;
// }
//}
}
}

View File

@@ -1,556 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Reflection;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Collections.Concurrent;
namespace arDev.Arduino
{
public partial class DIO : arRS232
{
protected object lockobj = new object();
public struct SetupInfo
{
public byte ioInterval;
public byte ResetCount;
public byte SpeedH;
public byte SpeedL;
public byte SpeedZ;
public byte pindirRevDILow;
public byte pindirRevDIHigh;
public byte UpTime;
public byte BalanceThd;
public byte MarkThd;
public byte SpeedC;
public byte BalanceThdUp;
public Boolean IsValid;
public void Clear()
{
pindirRevDIHigh = 0;
pindirRevDILow = 0;
ioInterval = 0;
ResetCount = 0;
SpeedH = 0;
SpeedL = 0;
SpeedC = 0;
BalanceThd = 0;
BalanceThd = 0;
UpTime = 0;
MarkThd = 0;
SpeedZ = 0;
IsValid = false;
}
}
public SetupInfo setupInfo;
private Boolean STX11 = false;
private Boolean STX21 = false;
//private Boolean ETX11 = false;
// private byte[] buffer1;
// readonly List<byte> Tempbuffer1 = new List<byte>();
readonly ManualResetEvent mre = new ManualResetEvent(true);
// protected string errorMessage = string.Empty;
// readonly System.IO.Ports.SerialPort dev = null;
private byte LEN1 = 0;
//private byte CHK1 = 0;
//private int bufferCount1 = 0;
public DateTime ConnTryTime = DateTime.Now.AddDays(-1);
protected DateTime[] SetFlagTime = new DateTime[32];
readonly Boolean[] Flag = new bool[32];
readonly Boolean[] DIValue = new bool[16];
readonly Boolean[] DOValue = new bool[16];
public UInt16[] AIValue = new ushort[3];
public byte[] AOValue = new byte[3];
public string ioBinStr = string.Empty;
public string SetupStr = string.Empty;
public byte RunTime = 0;
public byte[] MAG_VALUE = new byte[2];
public byte[] SV_SPEED = new byte[2];
public Boolean isDisposed = false; //dispose가 호출되었는가?
public string LastMessage { get; set; }
public DateTime LastMessageTime { get; set; }
/// <summary>
/// 생성자
/// </summary>
public DIO()
{
//설정의 값
setupInfo = new SetupInfo();
setupInfo.Clear();
SV_SPEED[0] = 0;
SV_SPEED[1] = 0;
//마그넷 센서(0~100)
MAG_VALUE[0] = 50;
MAG_VALUE[1] = 50;
lastRecvTime = DateTime.Parse("1982-11-23");
for (int i = 0; i < Flag.Length; i++)
Flag[i] = false;
for (int i = 0; i < DIValue.Length; i++)
DIValue[i] = false;
for (int i = 0; i < DOValue.Length; i++)
DOValue[i] = false;
for (int i = 0; i < AIValue.Length; i++)
AIValue[i] = 0;
for (int i = 0; i < AOValue.Length; i++)
AOValue[i] = 0;
for (int i = 0; i < SetFlagTime.Length; i++)
SetFlagTime[i] = DateTime.Parse("1982-11-23");
}
protected override bool CustomParser(byte[] buf, out byte[] remainBuffer)
{
List<byte> remain = new List<byte>();
Boolean bComplete = false;
for (int i = 0; i < buf.Length; i++)
{
var incomByte = buf[i];
if (bComplete == true)
{
remain.Add(incomByte);
}
else
{
if (STX11 == false)
{
if (incomByte != '@')
{
STX21 = false;
// ETX11 = false;
continue;
}
else
{
STX11 = true;
tempBuffer.Clear();
tempBuffer.Add(incomByte);
}
}
else if (STX21 == false)
{
if (tempBuffer.Count != 1 || tempBuffer.Count < 1 || tempBuffer[0] != '@' || incomByte != '@')
{
STX11 = false;
//ETX11 = false;
continue;
}
else
{
STX21 = true;
tempBuffer.Add(incomByte);
}
}
else
{
tempBuffer.Add(incomByte);
//여기서부터는무조건 누적한다.
if (tempBuffer.Count == 3)
{
if (tempBuffer[0] != '@' || tempBuffer[1] != '@')
{
STX11 = false;
STX21 = false;
// ETX11 = false;
LEN1 = 0;
tempBuffer.Clear();
}
else LEN1 = incomByte; //데이터 길이가온다
}
//else if (Tempbuffer1.Count == LEN1 + 5) //ETX1
//{
// if (incomingByte != 0x0D)
// {
// //ETX가 와야하는데 다른데이터가 왔다
// STX11 = false;
// STX21 = false;
// // ETX11 = false;
// var str = System.Text.Encoding.Default.GetString(Tempbuffer1.ToArray());
// RaiseMessage(MessageType.ReceiveData, "에러 모두 파기 : " + str, true);
// Tempbuffer1.Clear();
// }
//}
else if (tempBuffer.Count == LEN1 + 6)
{
//전체길이를 만족햇다.
if (incomByte != 0x0A)
{
//ETX가 와야하는데 다른데이터가 왔다
STX11 = false;
STX21 = false;
// ETX11 = false;
//var str = System.Text.Encoding.Default.GetString(Tempbuffer1.ToArray());
RaiseMessage(MessageType.Error, "에러 모두 파기 : ETX 값 오류");
tempBuffer.Clear();
}
else if (tempBuffer[tempBuffer.Count - 2] != 0x0D)
{
//ETX가 와야하는데 다른데이터가 왔다
STX11 = false;
STX21 = false;
// ETX11 = false;
//var str = System.Text.Encoding.Default.GetString(Tempbuffer1.());
RaiseMessage(MessageType.Error, "에러 모두 파기 : ETX 값 오류");
tempBuffer.Clear();
}
else
{
STX11 = false;
STX21 = false;
// ETX11 = false;
//if (LastReceiveBuffer == null) LastReceiveBuffer = new byte[tempBuffer.Count];
//else if (LastReceiveBuffer.Length != tempBuffer.Count) Array.Resize(ref LastReceiveBuffer, Tempbuffer1.Count);
//tempBuffer.CopyTo(LastReceiveBuffer)tempBuffer
//tempBuffer.Clear();
bComplete = true;
}
}
}
}
}
remainBuffer = remain.ToArray();
return bComplete;
}
bool Checksum(byte[] buffer, int datalength)
{
//체크섬필요 221118
if (buffer[buffer.Length-3] == '*')
{
return true;
}
byte checksum = 0;
for (int i = 3; i < datalength + 3; i++)
{
checksum = (byte)(checksum ^ buffer[i]);
}
return checksum == buffer[buffer.Length - 3];
}
public override bool ProcessRecvData(byte[] data)
{
var hexString = GetHexString(data);//.gethe
var len = data[2];
if (len + 6 != data.Length)
{
RaiseMessage(MessageType.Error, string.Format("길이오류 예상:{0},수신:{1},{2}", len + 5, data.Length, hexString));
}
else if (data[0] != 0x40 || data[1] != 0x40 || data[data.Length - 2] != 0x0D || data[data.Length - 1] != 0x0A)
{
RaiseMessage(MessageType.Error, string.Format("헤더 오류 : {0}", hexString));
}
else if (Checksum(data, len) == false) //체크섬 221118
{
RaiseMessage(MessageType.Error, string.Format("체크섬 오류 : {0}", hexString));
}
else
{
//RaiseMessage(MessageType.ReceiveData, hexString);
lastRecvTime = DateTime.Now;
var cmd = data[3];
if (cmd == 'I') //IOData
{
if (len != 10)
RaiseMessage(MessageType.Error, "IO수신길이오류:" + DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString);
else Parse_IOData(data);
}
else if (cmd == 'T')
{
// Boolean errorMessage = buffer[4] == 1;
var message = System.Text.Encoding.Default.GetString(data, 5, len - 2);//데이터타입과 에러여부 제거
LastMessage = message;
LastMessageTime = DateTime.Now;
RaiseMessage(MessageType.Normal, message);
}
else if (cmd == 'S') //setup 정보 200310 (홈)
{
if (len != 13)
RaiseMessage(MessageType.Error, "SETUP수신길이오류:" + DateTime.Now.ToString("mm:ss.fff") + " 수신 : " + hexString);
else Parse_SetupData(data);
}
else
{
RaiseMessage(MessageType.Normal, "Unknown:" + hexString + "\n" + "Data=" + System.Text.Encoding.Default.GetString(data));
}
}
return true;
}
void Parse_IOData(byte[] buffer)
{
var IOData = BitConverter.ToUInt32(buffer, 4);
//var newMagF = BitConverter.ToUInt16(buffer, 8);
//va1r newMagB = BitConverter.ToUInt16(buffer, 10);
//var newAlign = BitConverter.ToUInt16(buffer, 12);
//if (newMagF != AIValue[0] || newMagB != AIValue[1])
//{
// AIValue[0] = newMagF;// BitConverter.ToUInt16(buffer, 8); //마그넷센서 F
// AIValue[1] = newMagB; //BitConverter.ToUInt16(buffer, 10); //마그넷센서 B
// PositionChanged?.Invoke(this, null);
//}
//AIValue[2] = newAlign;
//AOValue[0] = buffer[14]; //왼쪽바퀴 속도
//AOValue[1] = buffer[15]; //오른쪽바퀴 속도
//AOValue[2] = buffer[16]; //Z축 속도
//SV_SPEED[0] = buffer[21]; //왼쪽바퀴의 설정속도
//SV_SPEED[1] = buffer[22]; //오른쪽바퀴의 설정속도
//MAG_VALUE[0] = buffer[23]; //magnet front
//MAG_VALUE[1] = buffer[24]; //magnet rear
RunTime = buffer[12];
//플래그값 확인
byte[] buf_flag = new byte[4];
Array.Copy(buffer, 8, buf_flag, 0, 4);
var baF = new System.Collections.BitArray(buf_flag);
for (int i = 0; i < 32; i++)
{
Boolean val = baF[i];
//입력
if (this.Flag[i] != val)
{
Flag[i] = val;
//변경이벤트 생성
FlagChanged?.Invoke(this, new FlagValueEventArgs(i, !val, val));
}
}
//IO값 확인
byte[] buf_iodata = new byte[4];
Array.Copy(buffer, 4, buf_iodata, 0, 4);
var ba = new System.Collections.BitArray(buf_iodata);
for (int i = 0; i < 32; i++)
{
Boolean val = ba[i];
if (i >= 16)
{
//출력
if (DOValue[i - 16] != val)
{
DOValue[i - 16] = val;
//변경이벤트 생성
ValueChanged?.Invoke(this, new IOValueEventArgs(IODirection.Output, i - 16, !val, val));
}
}
else
{
//입력
if (DIValue[i] != val)
{
DIValue[i] = val;
//변경이벤트 생성
ValueChanged?.Invoke(this, new IOValueEventArgs(IODirection.Input, i, !val, val));
}
}
}
ioBinStr = Convert.ToString(IOData, 2).PadLeft(32, '0');
//string msg = string.Format(DateTime.Now.ToString("mm:ss.fff") + " IO:{0},AN={1:0000},{2:0000},FG={3},AO={4},{5}",
// binstr, An1, An2, FGData, Ao11, Ao12);
}
void Parse_SetupData(byte[] buffer)
{
setupInfo.ioInterval = buffer[4];
setupInfo.ResetCount = buffer[5];
setupInfo.SpeedH = buffer[6];
setupInfo.SpeedL = buffer[7];
setupInfo.SpeedZ = buffer[8];
setupInfo.pindirRevDIHigh = buffer[9];
setupInfo.pindirRevDILow = buffer[10];
setupInfo.UpTime = buffer[11];
setupInfo.BalanceThd = buffer[12];
setupInfo.MarkThd = buffer[13];
setupInfo.SpeedC = buffer[14];
setupInfo.BalanceThdUp = buffer[15];
SetupStr = string.Format("I:{0},R={1},H={2},L={3},Z={4},UP={5},BL={6},MK={7},SPD_C={8},BLUP={9}",
setupInfo.ioInterval,
setupInfo.ResetCount,
setupInfo.SpeedH,
setupInfo.SpeedL,
setupInfo.SpeedZ,
setupInfo.UpTime,
setupInfo.BalanceThd,
setupInfo.MarkThd,
setupInfo.SpeedC,
setupInfo.BalanceThdUp);
}
public byte MakeChecksum(byte[] buffer)
{
//return 0;
byte chk = 0;
foreach (var b in buffer)
chk = (byte)(chk ^ b);
return chk;
}
#region "Method"
protected Boolean Sendcommand(byte cmd, byte p1, byte p2)
{
//이번호의 상태를 on/off 해줘야함
List<byte> buffer = new List<byte>
{
cmd, //command
p1,
p2
};
byte dataLen = (byte)buffer.Count; //데이터길이
byte checksum = MakeChecksum(buffer.ToArray());
buffer.Insert(0, (byte)'@'); //stx
buffer.Insert(1, (byte)'@'); //stx
buffer.Insert(2, dataLen);
buffer.Add(checksum); //길이를 제외한 실제 데이터 영역만 체크섬
buffer.Add(0x0D); //etx
buffer.Add(0x0A); //etx
return WriteData(buffer.ToArray());
}
/// <summary>
/// 이벤트를 강제 생성합니다.(내부변수값도 변경됩니다)
/// </summary>
/// <param name="Direction"></param>
/// <param name="idx"></param>
/// <param name="value"></param>
public void RaiseEvent(IODirection dir, int idx, Boolean value)
{
if (ValueChanged != null)
{
if (!mre.WaitOne(100))
{
RaiseMessage( MessageType.Error, "RaiseEvent WaitOne Timeout");
return;
}
mre.Reset();
bool curValue;
if (dir == IODirection.Input)
{
curValue = DIValue[idx];
DIValue[idx] = value;
}
else
{
curValue = DOValue[idx];
DOValue[idx] = value;
}
try
{
//이벤트를 할당한곳에서 오류가 나면 이곳에서 에러가 잡힌다.
ValueChanged(this, new IOValueEventArgs(dir, idx, curValue, value));
}
catch (Exception ex)
{
RaiseMessage(MessageType.Error, ex.Message);
}
finally
{
mre.Set();
}
}
}
//public Boolean GetFlag(byte idx)
//{
// return Flag[idx];
//}
public Boolean GetValueI(byte idx)
{
if (idx < DIValue.Length) return DIValue[idx];
else return false;
}
public Boolean GetValueO(byte idx)
{
if (idx < DOValue.Length) return DOValue[idx];
else return false;
}
//public Boolean SetValueI(int idx,Boolean value)
//{
// if (idx < DIValue.Length)
// {
// DIValue[idx] = value;
// return true;
// }
// else return false;
//}
public Boolean SetValue(byte idx, Boolean value)
{
byte SET_PINMODE = 3;
if (value == true) return Sendcommand(SET_PINMODE, idx, 1);
else return Sendcommand(SET_PINMODE, idx, 0);
}
public Boolean SetToggle(byte idx)
{
var curbalue = GetValueO(idx);
return SetValue(idx, !curbalue);
}
public string GetErrorMessage()
{
return errorMessage;
}
#endregion
}
}

View File

@@ -1,389 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using arDev.Arduino;
using COMM;
using AR;
namespace arDev
{
public class FakePLC : arDev.Arduino.DIO
{
private System.Threading.Thread thPLC;
public bool Shutdown { get; set; } = false;
public FakePLC()
{
VAR.Init(128);
}
~FakePLC()
{
System.Threading.Tasks.Task.Run(() =>
{
//쓰레드가 살아잇다면 대기한다
if (thPLC != null && thPLC.IsAlive)
{
System.Threading.Thread.Sleep(100);
}
this.Close();
});
}
private object lockobjdata = new object();
public enum eEEPAddress
{
EEP_IOINTERVAL = 0,
EEP_RESETCOUNT,
EEP_DIREVH,
EEP_DIREVL,
EEP_OPTION,
EEP_UPTIME,
};
public enum eCommand : byte
{
LOAD = 0, //EEPROM 불러오기
SAVE, //EEPROM 저장
RESET, //초기화
PINGCHK,
SET_PINMODE, //PINMODE 설정
SET_DOUTPUT, //디지털출력설정(포트번호,값[1,0])
SET_AOUTPUT, //아날로그출력설정(포트GET_SETTING = 50, //셋팅값 요청
SET_FLAG,
SET_EEPROM,
SET_MANUALSPEED,
GET_SETTING = 50,
GUIDE_MOT = 90, //가이드커버(양쪽) 0=멈춤,1=UP,2=DN 아스키코드표 90=Z
SET_EEP_DIREV,
};
//public enum MotorType
//{
// Left = 0,
// Right
//}
//public enum Direction
//{
// CW = 0,
// CCW,
//}
//public enum RunType
//{
// Stop = 0,
// Up,
// Dn
//}
public enum DIName
{
PINI_EMG = 0,
PINI_BTN_1,
PINI_BTN_2,
PINI_BTN_3,
PINI_BTN_4,
PINI_OVERLOADL,
PINI_OVERLOADR,
PINI_EMPTY_07,
PINI_EMPTY_08,
PINI_BTN_ZUP,
PINI_BTN_ZDN,
PINI_LIMIT_LU,
PINI_LIMIT_LD,
PINI_LIMIT_RU,
PINI_LIMIT_RD,
PINI_STOP,
}
public enum DIPin
{
PINI_EMG = 30,
PINI_BTN_1,
PINI_BTN_2,
PINI_BTN_3,
PINI_BTN_4,
PINI_OVERLOADL,
PINI_OVERLOADR,
PINI_EMPTY_07,
PINI_EMPTY_08,
PINI_BTN_ZUP,
PINI_BTN_ZDN,
PINI_LIMIT_LU,
PINI_LIMIT_LD,
PINI_LIMIT_RU,
PINI_LIMIT_RD,
PINI_STOP,
}
public enum DOName
{
PINO_GUIDEMOTOR_LDIR,
PINO_GUIDEMOTOR_LRUN,
PINO_GUIDEMOTOR_RDIR,
PINO_GUIDEMOTOR_RRUN,
PINO_EMPTY_04,
PINO_EMPTY_05,
PINO_EMPTY_06,
PINO_EMPTY_07,
}
public enum DOPin
{
PINO_GUIDEMOTOR_LDIR = 22,
PINO_GUIDEMOTOR_LRUN,
PINO_GUIDEMOTOR_RDIR,
PINO_GUIDEMOTOR_RRUN,
PINO_EMPTY_04,
PINO_EMPTY_05,
PINO_EMPTY_06,
PINO_EMPTY_07,
}
public enum Rundirection : byte
{
Stop = 0,
Forward,
Backward,
Left,
Right,
EStop,
}
public enum ZMotDirection
{
Stop = 0,
Up,
Down
}
private bool Sendcommand(eCommand cmd, char p1, char p2)
{
return Sendcommand(cmd, (byte)p1, (byte)p2);
}
private bool Sendcommand(eCommand cmd, char p1, byte p2 = 0)
{
return Sendcommand(cmd, (byte)p1, p2);
}
private bool Sendcommand(eCommand cmd, byte p1 = 0, byte p2 = 0)
{
if (cmd != eCommand.PINGCHK)
{
if (cmd == eCommand.SET_FLAG)
{
//플래그값은 공용변수로 변경
var idx = (eVarBool)p1;
VAR.BOOL[idx] = p2 != 0;
RaiseMessage(MessageType.Send, string.Format("PLC CMD:{0} [{1}]=>{2}", cmd, (eVarBool)p1, p2));
}
else
RaiseMessage(MessageType.Send, string.Format("PLC CMD:{0}, P1:{1}, P2:{2}", cmd, p1, p2));
}
return Sendcommand((byte)cmd, p1, p2);
}
public Boolean GetValueI(DIName idx)
{
return GetValueI((byte)idx);
}
public Boolean GetValueO(DOName idx)
{
return GetValueO((byte)idx);
}
public Boolean GetFlag(int flag)
{
return VAR.BOOL[flag];
}
public Boolean GetFlag(COMM.eVarBool flag)
{
return VAR.BOOL[(int)flag];
}
public Boolean SetFlag(byte idx, Boolean value)
{
SetFlagTime[(int)idx] = DateTime.Now; //플래그기록을 시도한 시간
if (value == true)
return Sendcommand(eCommand.SET_FLAG, idx, 1);
else
return Sendcommand(eCommand.SET_FLAG, idx, 0);
}
//public Boolean SetOpt_AD4Invert(Boolean value)
//{
// var idx = (byte)PLCFlag.FLAG_ENABLE_AD4INVERT;
// SetFlagTime[idx] = DateTime.Now; //플래그기록을 시도한 시간
// if (value == true)
// return Sendcommand(eCommand.SET_FLAG, idx, 1);
// else
// return Sendcommand(eCommand.SET_FLAG, idx, 0);
//}
//public Boolean SetLog_SpeedControl(Boolean value)
//{
// var idx = (byte)PLCFlag.FLAG_ENABLE_LOG_SPEED;
// SetFlagTime[idx] = DateTime.Now; //플래그기록을 시도한 시간
// if (value == true)
// return Sendcommand(eCommand.SET_FLAG, idx, 1);
// else
// return Sendcommand(eCommand.SET_FLAG, idx, 0);
//}
public Boolean SetFlag(eVarBool flag, Boolean value)
{
VAR.BOOL[flag] = value;
return true;
}
public Boolean SetEEP(eEEPAddress address, byte value)
{
RaiseMessage(MessageType.Normal, string.Format("[M] Set EEP Rom Addr={0},Val={1}", address, value));
return Sendcommand(eCommand.SET_EEPROM, (byte)address, value);
}
public Boolean SetOutput(byte pinNO, Boolean Value)
{
if (Value == true) return Sendcommand(eCommand.SET_DOUTPUT, pinNO, 1);
else return Sendcommand(eCommand.SET_DOUTPUT, pinNO, 0);
}
public byte ApplySpeedH = 0;
public byte ApplySpeedL = 0;
public byte ApplySpeedC = 0;
public byte ApplySpeedZ = 0;
public DateTime SaveTime = DateTime.Parse("1982-11-23");
public Boolean SetPinReverse(byte High, byte Low)
{
RaiseMessage(MessageType.Normal,
string.Format("Pin Reverse H={0},L={1}", High, Low)
);
bool b1 = Sendcommand(eCommand.SET_EEPROM, (byte)eEEPAddress.EEP_DIREVH, High);
bool b2 = Sendcommand(eCommand.SET_EEPROM, (byte)eEEPAddress.EEP_DIREVL, Low);
return b1 && b2;
}
public Boolean SetMotorUpTime(byte value)
{
RaiseMessage(MessageType.Normal,
string.Format("Motor Up Time Value={0}", value)
);
bool b1 = Sendcommand(eCommand.SET_EEPROM, (byte)eEEPAddress.EEP_UPTIME, value);
return b1;
}
public Boolean SaveEEPROM()
{
RaiseMessage(MessageType.Normal,
string.Format("Save EEPROM")
);
bool b1 = Sendcommand(eCommand.SAVE, 0);
return b1;
}
public Boolean LoadEEPROM()
{
RaiseMessage(MessageType.Normal,
string.Format("Load EEPROM")
);
bool b1 = Sendcommand(eCommand.LOAD, 0);
return b1;
}
//public double ManualSpeed = 0.0;
//public bool SetManualSpeed(double Percvalue)
//{
// var Speed = (byte)((Percvalue / 100.0) * 255.0);
// ManualSpeed = Percvalue;
// // datamanager.COMCONTROLLER.Speak($"{Percvalue} 퍼센트 설정");
// RaiseMessage(MessageType.Normal,
// string.Format("Convert Speed Hold {0}%->{1}", Percvalue, Speed),
// false);
// return Sendcommand(eCommand.SET_MANUALSPEED, Speed);
//}
public DateTime LastPingTime = DateTime.Parse("1982-11-23");
public bool SendPing()
{
LastPingTime = DateTime.Now;
return Sendcommand(eCommand.PINGCHK, 0, 0);
}
public bool ZMot(ZMotDirection dir)
{
if (dir == ZMotDirection.Up)
return Sendcommand(eCommand.GUIDE_MOT, 'A', 'P'); //up
else if (dir == ZMotDirection.Down)
return Sendcommand(eCommand.GUIDE_MOT, 'A', 'N'); //down
else if (dir == ZMotDirection.Stop)
return Sendcommand(eCommand.GUIDE_MOT, 'A', 'S'); //stop
else return false;
}
public bool ZMot_Left(ZMotDirection dir)
{
if (dir == ZMotDirection.Up)
return Sendcommand(eCommand.GUIDE_MOT, 'L', 'P'); //up
else if (dir == ZMotDirection.Down)
return Sendcommand(eCommand.GUIDE_MOT, 'L', 'N'); //down
else if (dir == ZMotDirection.Stop)
return Sendcommand(eCommand.GUIDE_MOT, 'L', 'S'); //stop
else return false;
}
public bool ZMot_Right(ZMotDirection dir)
{
if (dir == ZMotDirection.Up)
return Sendcommand(eCommand.GUIDE_MOT, 'R', 'P'); //up
else if (dir == ZMotDirection.Down)
return Sendcommand(eCommand.GUIDE_MOT, 'R', 'N'); //down
else if (dir == ZMotDirection.Stop)
return Sendcommand(eCommand.GUIDE_MOT, 'R', 'S'); //stop
else return false;
}
/// <summary>
/// 오버로드 또는 L이 활성화되되면 True를 반환함
/// </summary>
/// <returns></returns>
public Boolean IsOverLoad()
{
if (GetValueI(DIName.PINI_OVERLOADL) || GetValueI(DIName.PINI_OVERLOADR)) return true;
else return false;
}
public Boolean IsLimitUp()
{
if (GetValueI(DIName.PINI_LIMIT_LU) || GetValueI(DIName.PINI_LIMIT_RU)) return true;
else return false;
}
public Boolean IsLimitDn()
{
if (GetValueI(DIName.PINI_LIMIT_LD) || GetValueI(DIName.PINI_LIMIT_RD)) return true;
else return false;
}
}
}

View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{476C8E64-7B6B-4554-ACA2-04302715750F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Device</RootNamespace>
<AssemblyName>Device_PLC</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Arduino\EnumStruct.cs" />
<Compile Include="Arduino\EventsIO.cs" />
<Compile Include="Arduino\MemoryAccess.cs" />
<Compile Include="FakePLC.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\CommData\CommData.csproj">
<Project>{14e8c9a5-013e-49ba-b435-efefc77dd623}</Project>
<Name>CommData</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("Device_PLC")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Device_PLC")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("476c8e64-7b6b-4554-aca2-04302715750f")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
// 기본값으로 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -1,36 +0,0 @@
namespace arFrame.Control
{
partial class MenuControl
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -1,676 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace arFrame.Control
{
public partial class MenuControl : System.Windows.Forms.Control
{
private int bordersize = 0;
private int menubordersize = 1;
private int menuwidth = 100;
private int menugap = 5;
private System.Windows.Forms.Padding padding = new Padding(3, 3, 3, 3);
private System.Drawing.Color backcolor = System.Drawing.Color.White;
private System.Drawing.Color backcolor2 = System.Drawing.Color.Gainsboro;
private System.Drawing.Color bordercolor = System.Drawing.Color.Black;
private Boolean enablemenubakcolor = false;
private Boolean enablemenuborder = false;
private Boolean textattachtoimage = true;
[Category("arFrame"), DisplayName("메뉴")]
public MenuItem[] menus { get; set; }
private Rectangle[] rects = null;
[Category("arFrame"), DisplayName("테두리 굵기")]
public int BorderSize { get { return bordersize; } set { this.bordersize = value; Invalidate(); } }
[Category("arFrame"), DisplayName("메뉴 테두리 굵기")]
public int MenuBorderSize { get { return menubordersize; } set { this.menubordersize = value; Invalidate(); } }
[Category("arFrame"), DisplayName("메뉴 너비")]
public int MenuWidth { get { return menuwidth; } set { this.menuwidth = value; RemakeChartRect(); Invalidate(); } }
[Category("arFrame"), DisplayName("메뉴 간격")]
public int MenuGap { get { return menugap; } set { this.menugap = value; RemakeChartRect(); Invalidate(); } }
[Category("arFrame"), DisplayName("기능-메뉴별 배경색")]
public Boolean EnableMenuBackColor { get { return enablemenubakcolor; } set { this.enablemenubakcolor = value; Invalidate(); } }
[Category("arFrame"), DisplayName("기능-메뉴별 테두리")]
public Boolean EnableMenuBorder { get { return enablemenuborder; } set { this.enablemenuborder = value; Invalidate(); } }
[Category("arFrame"), DisplayName("글자를 이미지 다음에 표시"), Description("이미지가 있는 경우 해당 이미지 옆에 글자를 붙입니다")]
public Boolean TextAttachToImage { get { return textattachtoimage; } set { this.textattachtoimage = value; Invalidate(); } }
[Category("arFrame"), DisplayName("이미지 표시 여백(좌,상)")]
public System.Drawing.Point ImagePadding { get; set; }
[Category("arFrame"), DisplayName("이미지 표시 크기(너비,높이)")]
public System.Drawing.Size ImageSize { get; set; }
[Category("arFrame"), DisplayName("색상-테두리")]
public System.Drawing.Color BorderColor { get { return bordercolor; } set { this.bordercolor = value; Invalidate(); } }
[Category("arFrame"), DisplayName("내부 여백")]
public new System.Windows.Forms.Padding Padding { get { return padding; } set { this.padding = value; RemakeChartRect(); Invalidate(); } }
[Category("arFrame"), DisplayName("색상-배경1")]
public override System.Drawing.Color BackColor { get { return backcolor; } set { this.backcolor = value; Invalidate(); } }
[Category("arFrame"), DisplayName("색상-배경2")]
public System.Drawing.Color BackColor2 { get { return backcolor2; } set { this.backcolor2 = value; Invalidate(); } }
[Category("arFrame"), DisplayName("색상-글자")]
public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } }
private int mouseOverItemIndex = -1;
public MenuControl()
{
InitializeComponent();
// Set Optimized Double Buffer to reduce flickering
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
// Redraw when resized
this.SetStyle(ControlStyles.ResizeRedraw, true);
ImagePadding = new System.Drawing.Point(0, 0);
ImageSize = new System.Drawing.Size(24, 24);
if (MinimumSize.Width == 0 || MinimumSize.Height == 0)
MinimumSize = new Size(100, 50);
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
RemakeChartRect();
}
public event EventHandler<MenuEventArgs> ItemClick;
public class MenuEventArgs : EventArgs
{
public string Command { get; set; }
public int idx { get; set; }
public MenuEventArgs(string cmd_, int idx_)
{
this.Command = cmd_;
this.idx = idx_;
}
}
protected override void OnMouseClick(MouseEventArgs e)
{
// if(DesignMode)
// {
// if(e.Button == System.Windows.Forms.MouseButtons.Right)
// {
// System.Windows.Forms.MessageBox.Show("Sdf");
// }
// }
// else
{
//마우스클릭시 해당 버튼을 찾아서 반환한다.
if (menus == null || menus.Length < 1) return;
for (int i = 0; i < menus.Length; i++)
{
var rect = rects[i];
if (rect.Contains(e.Location))
{
var menu = menus[i];
//미사용개체는 이벤트를 아에 발생하지 않는다
if (menu.Enable == true && ItemClick != null)
ItemClick(this, new MenuEventArgs(menu.Command, i));
break;
}
}
}
}
protected override void OnMouseLeave(EventArgs e)
{
this.mouseOverItemIndex = -1;
this.Invalidate();
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (menus == null || menus.Length < 1)
{
this.mouseOverItemIndex = -1;
return;
}
for (int i = 0; i < menus.Length; i++)
{
var rect = rects[i];
if (rect.Contains(e.Location))
{
if (i != mouseOverItemIndex)
{
mouseOverItemIndex = i;
this.Invalidate();
}
break;
}
}
}
protected override void OnPaint(PaintEventArgs pe)
{
// if(DesignMode)
// {
// pe.Graphics.FillRectangle(Brushes.Red, this.DisplayRectangle);
// }
//else
{
//배경그리기
using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(DisplayRectangle, BackColor, BackColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
pe.Graphics.FillRectangle(sb, DisplayRectangle);
}
//테두리 그리기
if (BorderSize > 0)
{
pe.Graphics.DrawRectangle(new Pen(this.BorderColor, BorderSize),
this.DisplayRectangle.Left,
this.DisplayRectangle.Top,
this.DisplayRectangle.Width - 1,
this.DisplayRectangle.Height - 1);
}
//커서모양
if (mouseOverItemIndex == -1) this.Cursor = Cursors.Arrow;
else this.Cursor = Cursors.Hand;
if (rects == null) RemakeChartRect();
if (rects != null && rects.Length > 0)
{
StringFormat sf = new StringFormat(StringFormatFlags.NoClip);
var items = menus.OrderBy(t => t.No);
int i = 0;
foreach (var menu in items)
{
var rect = rects[i];
//배경이 투명이 아니라면 그린다.
if (mouseOverItemIndex == i)
{
//마우스오버된놈이다.
using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, Color.FromArgb(100, Color.LightSkyBlue), Color.FromArgb(100, Color.DeepSkyBlue), System.Drawing.Drawing2D.LinearGradientMode.Vertical))
pe.Graphics.FillRectangle(sb, rect);
}
else
{
if (this.enablemenubakcolor == true && menu.BackColor != System.Drawing.Color.Transparent && menu.BackColor2 != System.Drawing.Color.Transparent)
{
using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, menu.BackColor, menu.BackColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
pe.Graphics.FillRectangle(sb, rect);
}
}
//이미지표시
int ix, iy, iw, ih;
ix = iy = iw = ih = 0;
if (menu.Image != null)
{
ix = rect.Left;
iy = rect.Top;
iw = ImageSize.Width;
ih = ImageSize.Height;
if (menu.ImageAlign == ContentAlignment.BottomCenter || menu.ImageAlign == ContentAlignment.BottomLeft ||
menu.ImageAlign == ContentAlignment.BottomRight) iy += DisplayRectangle.Bottom - ih;
else if (menu.ImageAlign == ContentAlignment.MiddleCenter || menu.ImageAlign == ContentAlignment.MiddleLeft ||
menu.ImageAlign == ContentAlignment.MiddleRight) iy += (int)(DisplayRectangle.Top + ((rect.Height - ih) / 2.0));
else if (menu.ImageAlign == ContentAlignment.TopCenter || menu.ImageAlign == ContentAlignment.TopLeft ||
menu.ImageAlign == ContentAlignment.TopRight) iy += DisplayRectangle.Top;
if (menu.ImageAlign == ContentAlignment.BottomCenter || menu.ImageAlign == ContentAlignment.MiddleCenter ||
menu.ImageAlign == ContentAlignment.TopCenter) ix += (int)(DisplayRectangle.Left + ((rect.Width - iw) / 2.0));
else if (menu.ImageAlign == ContentAlignment.BottomLeft || menu.ImageAlign == ContentAlignment.MiddleLeft ||
menu.ImageAlign == ContentAlignment.TopLeft) ix += DisplayRectangle.Left;
else if (menu.ImageAlign == ContentAlignment.BottomRight || menu.ImageAlign == ContentAlignment.MiddleRight ||
menu.ImageAlign == ContentAlignment.TopRight) ix += DisplayRectangle.Right - iw;
if (menu.ImagePadding.X != 0 || menu.ImagePadding.Y != 0)
{
ix += menu.ImagePadding.X;
iy += menu.ImagePadding.Y;
}
else
{
ix += ImagePadding.X;
iy += ImagePadding.Y;
}
if (menu.ImageSize.Width != 0 && menu.ImageSize.Height != 0)
{
iw = menu.ImageSize.Width;
ih = menu.ImageSize.Height;
}
pe.Graphics.DrawImage(menu.Image,
new Rectangle(ix, iy, iw, ih));
}
//테두리를 그리는 속성과 트기가 설정된 경우에만 표시
if (mouseOverItemIndex == i)
{
pe.Graphics.DrawRectangle(new Pen(Color.DeepSkyBlue), rect);
}
else
{
if (EnableMenuBorder && MenuBorderSize > 0)
{
using (var p = new Pen(menu.BorderColor, MenuBorderSize))
pe.Graphics.DrawRectangle(p, rect);
}
}
//글자를 텍스트 이후에 붙이는 거라면?
if (menu.Image != null && TextAttachToImage)
{
var fsize = pe.Graphics.MeasureString(menu.Text, this.Font);
pe.Graphics.DrawString(menu.Text, this.Font, new SolidBrush(menu.ForeColor),
(float)(ix + iw + 1),
(float)(iy + ((ih - fsize.Height) / 2.0)));
}
else
{
if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.BottomLeft ||
menu.TextAlign == ContentAlignment.BottomRight) sf.LineAlignment = StringAlignment.Far;
else if (menu.TextAlign == ContentAlignment.MiddleCenter || menu.TextAlign == ContentAlignment.MiddleLeft ||
menu.TextAlign == ContentAlignment.MiddleRight) sf.LineAlignment = StringAlignment.Center;
else if (menu.TextAlign == ContentAlignment.TopCenter || menu.TextAlign == ContentAlignment.TopLeft ||
menu.TextAlign == ContentAlignment.TopRight) sf.LineAlignment = StringAlignment.Near;
if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.MiddleCenter ||
menu.TextAlign == ContentAlignment.TopCenter) sf.Alignment = StringAlignment.Center;
else if (menu.TextAlign == ContentAlignment.BottomLeft || menu.TextAlign == ContentAlignment.MiddleLeft ||
menu.TextAlign == ContentAlignment.TopLeft) sf.Alignment = StringAlignment.Near;
else if (menu.TextAlign == ContentAlignment.BottomRight || menu.TextAlign == ContentAlignment.MiddleRight ||
menu.TextAlign == ContentAlignment.TopRight) sf.Alignment = StringAlignment.Far;
pe.Graphics.DrawString(menu.Text, this.Font, new SolidBrush(menu.ForeColor), rect, sf);
}
i += 1;
}
sf.Dispose();
}
//if(DesignMode)
//{
// pe.Graphics.DrawString("deisgn", this.Font, Brushes.Red, 1, 1);
//}
}
/// <summary>
/// arFrame 전용 속성값을 복사 합니다
/// </summary>
/// <param name="ctl"></param>
public void copyTo(MenuControl ctl)
{
ctl.backcolor = this.backcolor;
ctl.backcolor2 = this.BackColor2;
ctl.MenuWidth = this.menuwidth;
ctl.menugap = this.menugap;
ctl.menus = this.menus;
ctl.menubordersize = this.menubordersize;
ctl.padding = this.padding;
ctl.ForeColor = this.ForeColor;
ctl.Font = this.Font;
ctl.EnableMenuBackColor = this.EnableMenuBackColor;
ctl.EnableMenuBorder = this.EnableMenuBorder;
ctl.ImagePadding = this.ImagePadding;
ctl.ImageSize = this.ImageSize;
ctl.TextAttachToImage = this.TextAttachToImage;
ctl.bordercolor = this.bordercolor;
ctl.bordersize = this.bordersize;
}
public void Save(string File)
{
//xml로 데이터를 저장자
System.Text.StringBuilder NewXml = new System.Text.StringBuilder();
NewXml.AppendLine("<?xml version='1.0' encoding='UTF-8'?>");
NewXml.AppendLine("<tindevil create='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'> ");
NewXml.AppendLine("</tindevil>");
if (System.IO.File.Exists(File)) System.IO.File.Delete(File);
System.IO.File.WriteAllText(File, NewXml.ToString().Replace('\'', '\"'), System.Text.Encoding.UTF8);
var vDocu = new XmlDocument();
vDocu.Load(File);
//var nsmgr = new XmlNamespaceManager(new System.Xml.NameTable());
//nsmgr.AddNamespace("x", "http://tindevil.com");
var Root = vDocu.DocumentElement;
//저장하려는 속성목록을 먼저 생성한다
//미사용 목록이 너무 많아서 그렇게 함
foreach (var m in this.GetType().GetMethods())
{
var mName = m.Name.ToLower();
if (mName.StartsWith("get_") == false || mName == "get_menus") continue;
var pt = this.GetType().GetProperty(m.Name.Substring(4));
if (pt != null)
{
var categoryName = GetCategoryName(pt);
if (categoryName.ToLower() != "arframe") continue;
//자료형에따라서 그값을 변경한다
var value = m.Invoke(this, null);
var newNode = vDocu.CreateElement(pt.Name);// m.Name.Substring(4));
newNode.InnerText = getValueString(m, value);
Root.AppendChild(newNode);
}
}
foreach (var item in this.menus.OrderBy(t => t.No))
{
var node = vDocu.CreateElement("Item");
var attNo = vDocu.CreateAttribute("No");
attNo.Value = item.No.ToString();
node.Attributes.Append(attNo);
foreach (var m in item.GetType().GetMethods())
{
var mName = m.Name.ToLower();
if (mName.StartsWith("get_") == false || mName == "get_no") continue;
var value = m.Invoke(item, null);
var sNode = vDocu.CreateElement(m.Name.Substring(4));
sNode.InnerText = getValueString(m, value);
node.AppendChild(sNode);
}
Root.AppendChild(node);
}
vDocu.Save(File);
}
public void Load(string File)
{
if (System.IO.File.Exists(File) == false) return;
List<MenuItem> NewMenu = new List<MenuItem>();
var vDocu = new XmlDocument();
vDocu.Load(File);
var Root = vDocu.DocumentElement; //루트요소(Tindevil)
//저장하려는 속성목록을 먼저 생성한다
//미사용 목록이 너무 많아서 그렇게 함
foreach (var m in this.GetType().GetMethods())
{
var mName = m.Name.ToLower();
if (mName.StartsWith("get_") == false || mName == "get_menus") continue;
var methodName = m.Name.Substring(4);
var pt = this.GetType().GetProperty(methodName);
if (pt != null)
{
var categoryName = GetCategoryName(pt);
if (categoryName.ToLower() != "arframe") continue;
//SEt명령이 있어야 사용이 가능하다
var setMethod = this.GetType().GetMethod("set_" + methodName);
if (setMethod == null) continue;
//값을 읽어온다
var Node = Root.SelectSingleNode(methodName);
if (Node != null)
{
var strValue = Node.InnerText;
var value = getValueFromString(m.ReturnType, strValue); // setValueString(m.ReturnType, setMethod, strValue);
setMethod.Invoke(this, new object[] { value });
}
}
}
//foreach (var item in this.menus.OrderBy(t => t.No))
//{
// var node = vDocu.CreateElement("Item");
// var attNo = vDocu.CreateAttribute("No");
// attNo.Value = item.No.ToString();
// node.Attributes.Append(attNo);
// foreach (var m in item.GetType().GetMethods())
// {
// var mName = m.Name.ToLower();
// if (mName.StartsWith("get_") == false || mName == "get_no") continue;
// var value = m.Invoke(item, null);
// var sNode = vDocu.CreateElement(m.Name.Substring(4));
// sNode.InnerText = getValueString(m, value);
// node.AppendChild(sNode);
// }
// Root.AppendChild(node);
//}
}
private string getValueString(System.Reflection.MethodInfo m, object value)
{
var strValue = "";
string valuetype = m.ReturnType.Name.ToLower();
if (m.ReturnType == typeof(System.Drawing.Color))
strValue = ((System.Drawing.Color)value).ToArgb().ToString();
else if (m.ReturnType == typeof(System.Drawing.Rectangle))
{
var rect = (System.Drawing.Rectangle)value;
strValue = string.Format("{0};{1};{2};{3}", rect.Left, rect.Top, rect.Width, rect.Height);
}
else if (m.ReturnType == typeof(System.Drawing.RectangleF))
{
var rectf = (System.Drawing.RectangleF)value;
strValue = string.Format("{0};{1};{2};{3}", rectf.Left, rectf.Top, rectf.Width, rectf.Height);
}
else if (m.ReturnType == typeof(Boolean))
{
strValue = ((Boolean)value) ? "1" : "0";
}
else if (m.ReturnType == typeof(System.Drawing.Point))
{
var pt1 = (Point)value;
strValue = string.Format("{0};{1}", pt1.X, pt1.Y);
}
else if (m.ReturnType == typeof(System.Drawing.PointF))
{
var ptf = (PointF)value;
strValue = string.Format("{0};{1}", ptf.X, ptf.Y);
}
else if (m.ReturnType == typeof(System.Drawing.Size))
{
var sz = (Size)value;
strValue = string.Format("{0};{1}", sz.Width, sz.Height);
}
else if (m.ReturnType == typeof(System.Drawing.SizeF))
{
var szf = (SizeF)value;
strValue = string.Format("{0};{1}", szf.Width, szf.Height);
}
else if (m.ReturnType == typeof(System.Drawing.Bitmap))
{
var bitmap = (Bitmap)value;
// Convert the image to byte[]
System.IO.MemoryStream stream = new System.IO.MemoryStream();
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] imageBytes = stream.ToArray();
strValue = Convert.ToBase64String(imageBytes);
}
else if (m.ReturnType == typeof(System.Windows.Forms.Padding))
{
var pd = (System.Windows.Forms.Padding)value;
strValue = string.Format("{0};{1};{2};{3}", pd.Left, pd.Top, pd.Right, pd.Bottom);
}
else
strValue = value.ToString();
return strValue;
}
private object getValueFromString(Type ReturnType, string strValue)
{
if (ReturnType == typeof(System.Drawing.Color))
{
var cint = int.Parse(strValue);
return System.Drawing.Color.FromArgb(cint);
}
else if (ReturnType == typeof(System.Drawing.Rectangle))
{
var buf = strValue.Split(';');
var x = int.Parse(buf[0]);
var y = int.Parse(buf[1]);
var w = int.Parse(buf[2]);
var h = int.Parse(buf[3]);
return new Rectangle(x, y, w, h);
}
else if (ReturnType == typeof(System.Drawing.RectangleF))
{
var buf = strValue.Split(';');
var x = float.Parse(buf[0]);
var y = float.Parse(buf[1]);
var w = float.Parse(buf[2]);
var h = float.Parse(buf[3]);
return new RectangleF(x, y, w, h);
}
else if (ReturnType == typeof(Boolean))
{
return strValue == "1";
}
else if (ReturnType == typeof(System.Drawing.Point))
{
var buf = strValue.Split(';');
var x = int.Parse(buf[0]);
var y = int.Parse(buf[1]);
return new Point(x, y);
}
else if (ReturnType == typeof(System.Drawing.PointF))
{
var buf = strValue.Split(';');
var x = float.Parse(buf[0]);
var y = float.Parse(buf[1]);
return new PointF(x, y);
}
else if (ReturnType == typeof(System.Drawing.Size))
{
var buf = strValue.Split(';');
var x = int.Parse(buf[0]);
var y = int.Parse(buf[1]);
return new Size(x, y);
}
else if (ReturnType == typeof(System.Drawing.SizeF))
{
var buf = strValue.Split(';');
var x = float.Parse(buf[0]);
var y = float.Parse(buf[1]);
return new SizeF(x, y);
}
else if (ReturnType == typeof(System.Drawing.Bitmap))
{
//문자을을 바이트로 전환다
byte[] imageBytes = Convert.FromBase64String(strValue);
Bitmap retval = null;
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(imageBytes))
retval = new Bitmap(stream);
return retval;
}
else if (ReturnType == typeof(System.Windows.Forms.Padding))
{
var buf = strValue.Split(';');
var x = int.Parse(buf[0]);
var y = int.Parse(buf[1]);
var w = int.Parse(buf[2]);
var h = int.Parse(buf[3]);
return new Padding(x, y, w, h);
}
else if (ReturnType == typeof(Int16)) return Int16.Parse(strValue);
else if (ReturnType == typeof(Int32)) return Int32.Parse(strValue);
else if (ReturnType == typeof(Int64)) return Int64.Parse(strValue);
else if (ReturnType == typeof(UInt16)) return UInt16.Parse(strValue);
else if (ReturnType == typeof(UInt32)) return UInt32.Parse(strValue);
else
return strValue;
}
public string GetCategoryName(System.Reflection.PropertyInfo m)
{
var displayName = m
.GetCustomAttributes(typeof(CategoryAttribute), true)
.FirstOrDefault() as CategoryAttribute;
if (displayName != null)
return displayName.Category;
return "";
}
public string GetDisplayName(System.Reflection.MethodInfo m)
{
var displayName = m
.GetCustomAttributes(typeof(DisplayNameAttribute), true)
.FirstOrDefault() as DisplayNameAttribute;
if (displayName != null)
return displayName.DisplayName;
return "";
}
public void RemakeChartRect()
{
if (rects != null) rects = null;
if (menus == null || menus.Length < 1) return;
rects = new Rectangle[menus.Length];
int leftIdx = 0;
int rightIdx = 0;
int leftAcc = 0;
int rightAcc = 0;
int i = 0;
var menuList = this.menus.OrderBy(t => t.No).ToArray();
foreach (var menu in menuList)
{
int x, y, w, h;
// var menu = menus[i];
var mWidth = menuwidth;
if (menu.MenuWidth > 0) mWidth = menu.MenuWidth;
w = mWidth;
h = DisplayRectangle.Height - Padding.Top - Padding.Bottom;
if (menu.isRightMenu)
{
x = DisplayRectangle.Right - Padding.Right - (rightAcc) - (MenuGap * rightIdx);
y = DisplayRectangle.Top + Padding.Top;
rightAcc += 0;// = 0;// x;
rightIdx += 1;
}
else
{
x = DisplayRectangle.Left + Padding.Left + leftAcc + (MenuGap * leftIdx);
y = DisplayRectangle.Top + Padding.Top;
leftAcc += mWidth;
leftIdx += 1;
}
rects[i] = new Rectangle(x, y, w, h);
i += 1;
}
}
}
}

View File

@@ -1,69 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace arFrame.Control
{
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class MenuItem
{
[Category("arFrame"),DisplayName("메뉴이름")]
public string Text { get; set; }
[Category("arFrame"), DisplayName("색상-테두리"), Description("메뉴속성의 테두리 기능이 켜져야 합니다")]
public System.Drawing.Color BorderColor { get; set; }
[Category("arFrame"),DisplayName("색상-배경1"),Description("메뉴속성의 배경 기능이 켜져야 합니다")]
public System.Drawing.Color BackColor { get; set; }
[Category("arFrame"), DisplayName("색상-배경2"), Description("메뉴속성의 배경 기능이 켜져야 합니다")]
public System.Drawing.Color BackColor2 { get; set; }
[Category("arFrame"),DisplayName("색상-글자")]
public System.Drawing.Color ForeColor { get; set; }
[Category("arFrame"),DisplayName("메뉴 구분자로 사용합니다")]
public Boolean isSeparate { get; set; }
[Category("arFrame"),DisplayName("오른쪽 붙임")]
public Boolean isRightMenu { get; set; }
[Category("arFrame"),DisplayName("실행 명령")]
public string Command { get; set; }
[Category("arFrame"),DisplayName("아이콘 이미지")]
public System.Drawing.Bitmap Image { get; set; }
[Category("arFrame"),DisplayName("글자 정렬 방식")]
public System.Drawing.ContentAlignment TextAlign { get; set; }
[Category("arFrame"),DisplayName("이미지 정렬 방식")]
public System.Drawing.ContentAlignment ImageAlign { get; set; }
[Category("arFrame"),DisplayName("글자 여백")]
public System.Windows.Forms.Padding Padding { get; set; }
[Category("arFrame"),DisplayName("메뉴 사용여부"),Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")]
public Boolean Enable { get; set; }
[Category("arFrame"),DisplayName("이미지 표시 여백(좌,상)")]
public System.Drawing.Point ImagePadding { get; set; }
[Category("arFrame"),DisplayName("이미지 표시 크기(너비,높이)")]
public System.Drawing.Size ImageSize { get; set; }
[Category("arFrame"),DisplayName("메뉴 간격")]
public int MenuWidth { get; set; }
[Category("arFrame"),DisplayName("번호")]
public int No { get; set; }
public MenuItem()
{
Enable = true;
BorderColor = System.Drawing.Color.FromArgb(20, 20, 20);
BackColor = System.Drawing.Color.DimGray;
BackColor2 = System.Drawing.Color.FromArgb(100, 100, 100);
ForeColor = System.Drawing.Color.Black;
Text = "Menu";
isRightMenu = false;
Command = string.Empty;
Image = null;
isSeparate = false;
TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
ImagePadding = new System.Drawing.Point(0, 0);
ImageSize = new System.Drawing.Size(0, 0);
MenuWidth = 0;
No = 0;
}
}
}

View File

@@ -1,36 +0,0 @@
namespace arFrame.Control
{
partial class MotCommandButton
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -1,33 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace arFrame.Control
{
public partial class MotCommandButton : Button
{
public enum eCommand
{
AbsoluteMove = 0,
RelativeMove ,
AcceptPosition
}
public MotCommandButton()
{
InitializeComponent();
motCommand = eCommand.AbsoluteMove;
motValueControl = null;
motAccControl = null;
motSpdControl = null;
}
public MotValueNumericUpDown motValueControl { get; set; }
public MotValueNumericUpDown motAccControl { get; set; }
public MotValueNumericUpDown motSpdControl { get; set; }
public eCommand motCommand { get; set; }
}
}

View File

@@ -1,36 +0,0 @@
namespace arFrame.Control
{
partial class MotLinkLabel
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace arFrame.Control
{
public partial class MotLinkLabel : System.Windows.Forms.LinkLabel
{
public MotLinkLabel()
{
InitializeComponent();
this.LinkColor = Color.Chartreuse;
}
public MotValueNumericUpDown motValueControl { get; set; }
}
}

View File

@@ -1,36 +0,0 @@
namespace arFrame.Control
{
partial class MotValueNumericUpDown
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace arFrame.Control
{
public partial class MotValueNumericUpDown : NumericUpDown
{
public MotValueNumericUpDown()
{
InitializeComponent();
MotionIndex = -1;
}
public int MotionIndex { get; set; }
}
}

View File

@@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace arFrame.Control
{
[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class MotITem
{
public int idx { get; private set; }
[Category("arFrame"), DisplayName("Tag")]
public string Tag { get; set; }
[Category("arFrame"), DisplayName("글자 정렬 방식")]
public System.Drawing.ContentAlignment TextAlign { get; set; }
[Category("arFrame"), DisplayName("글자 여백")]
public System.Windows.Forms.Padding Padding { get; set; }
[Category("arFrame"), DisplayName("메뉴 사용여부"), Description("활성화시 메뉴의 클릭이벤트가 발생하지 않습니다")]
public Boolean Enable { get; set; }
public string Text { get; set; }
public Boolean Dirty { get; set; }
public System.Drawing.Rectangle[] subRect = null;
//모션 상태값
public Boolean[] State;
public double Position { get; set; }
public double PositionCmd { get; set; }
public System.Drawing.Color PositionColor { get; set; }
public System.Drawing.RectangleF rect { get; set; }
[Category("arFrame"), DisplayName("번호")]
public int No { get; set; }
public MotITem(int idx_)
{
this.Dirty = true;
PositionColor = System.Drawing.Color.White;
subRect = new System.Drawing.Rectangle[6];
rect = System.Drawing.RectangleF.Empty;
Enable = true;
this.idx = idx_;
TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
No = 0;
this.Text = string.Empty;
this.Enable = true;
this.State = new bool[] { false,false,false,false,false,false};
Position = 0;
PositionCmd = 0;
}
}
}

View File

@@ -1,36 +0,0 @@
namespace arFrame.Control
{
partial class MotionDisplay
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@@ -1,306 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace arFrame.Control
{
public partial class MotionDisplay : System.Windows.Forms.Control
{
private Color[] colorB1 = new Color[] {
Color.MediumSeaGreen,
Color.DeepSkyBlue,
Color.Tomato,
Color.Purple,
Color.Tomato,
Color.FromArgb(40,40,40)
};
private Color[] colorB2 = new Color[] {
Color.SeaGreen,
Color.SteelBlue,
Color.Red,
Color.Indigo,
Color.Red,
Color.FromArgb(30,30,30)
};
private StringFormat sf = new StringFormat();
private string[] IndiName = new string[] { "INP","ORG","LIM","HST","ALM","" };
public MotITem[] Items;
private int _colcount = 3;
private int _rowcount = 2;
private Color _bordercolor = Color.Black;
private Color _gridcolor = Color.FromArgb(50, 50, 50);
private int _bordersize = 1;
private Padding _padding;
private string _postionformat = "";
private int _headerHeight = 16;
private Font _headerfont = new Font("Consolas",7f);
private int itemCount { get { return _colcount * _rowcount; } }
public new Font Font { get { return base.Font; } set { base.Font = value; this.Invalidate(); } }
public Font HeaderFont { get { return _headerfont; } set { _headerfont = value; this.Invalidate(); } }
public int HeaderHeight { get { return _headerHeight; } set { _headerHeight = value; RemakeChartRect(); this.Invalidate(); } }
public new Padding Padding { get { if (_padding == null) return Padding.Empty; else return _padding; } set { _padding = value; RemakeChartRect(); Invalidate(); } }
public int ColumnCount { get { return _colcount; } set { _colcount = value; ResetArray(); RemakeChartRect(); } }
public int RowCount { get { return _rowcount; } set { _rowcount = value; ResetArray(); RemakeChartRect(); } }
public int BorderSize { get { return _bordersize; } set { _bordersize = value; Invalidate(); } }
public Color BorderColor { get { return _bordercolor; } set { _bordercolor = value; Invalidate(); } }
public string PositionDisplayFormat { get { return _postionformat; } set { _postionformat = value; Invalidate(); } }
public Color GridColor { get { return _gridcolor; } set { _gridcolor = value; Invalidate(); } }
public new Boolean Enabled { get { return base.Enabled; } set { base.Enabled = value; Invalidate(); } }
public MotionDisplay()
{
InitializeComponent();
// Set Optimized Double Buffer to reduce flickering
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
// Redraw when resized
this.SetStyle(ControlStyles.ResizeRedraw, true);
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
//값과 이름은 외부의 값을 사용한다
ResetArray();
if (MinimumSize.Width == 0 || MinimumSize.Height == 0)
MinimumSize = new Size(100, 50);
}
void ResetArray()
{
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
RemakeChartRect();
}
public void RemakeChartRect()
{
if (DisplayRectangle == Rectangle.Empty) return;
var baseRect = new Rectangle(
DisplayRectangle.Left + _padding.Left,
DisplayRectangle.Top + _padding.Top,
DisplayRectangle.Width - _padding.Left - _padding.Right,
DisplayRectangle.Height - _padding.Top - _padding.Bottom);
double x = 0;
double y = 0;
double w = baseRect.Width / (_colcount * 1.0);
double h = baseRect.Height / (_rowcount * 1.0);
if (this.Items == null || itemCount != this.Items.Length)
{
//아이템갯수가 달라졌으므로 다시 갱신해야함
var item = new MotITem[RowCount * ColumnCount];
for (int r = 0; r < RowCount; r++)
{
for (int c = 0; c < ColumnCount; c++)
{
int idx = r * ColumnCount + c;
item[idx] = new MotITem(idx);
item[idx].Enable = false;
item[idx].Padding = new Padding(0, 0, 0, 0);
item[idx].TextAlign = ContentAlignment.MiddleCenter;
x = baseRect.Left + (c * w);
y = baseRect.Top + (r * h);
item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h);
item[idx].Dirty = true;
}
}
this.Items = item;
}
else
{
//아이템의 갯수는 같으므로 좌표값만 변경해준다.
for (int r = 0; r < RowCount; r++)
{
for (int c = 0; c < ColumnCount; c++)
{
int idx = r * ColumnCount + c;
var item = Items[idx];
x = (c * w);
y = (r * h);
item.rect = new RectangleF((float)x, (float)y, (float)w, (float)h);
item.Dirty = true;
}
}
}
this.Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
//배경그리기
//using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(DisplayRectangle, BackColor, BackColor2On, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
pe.Graphics.FillRectangle(new SolidBrush(this.BackColor), DisplayRectangle);
if (Items == null)
{
pe.Graphics.DrawString("no items", this.Font, Brushes.Red, 100, 100);
return;
}
var items = Items.OrderBy(t => t.No);
foreach (var menu in items)
{
drawItem(menu.idx, pe.Graphics);
}
//테두리 그리기
if (BorderSize > 0)
{
pe.Graphics.DrawRectangle(new Pen(this.BorderColor, BorderSize),
this.DisplayRectangle.Left,
this.DisplayRectangle.Top,
this.DisplayRectangle.Width - 1,
this.DisplayRectangle.Height - 1);
}
}
private void drawItem(int itemIndex, Graphics g = null)
{
if (g == null) g = this.CreateGraphics();
var item = this.Items[itemIndex];
// g.DrawString("rect null", this.Font, Brushes.White, 100, 100);
if (item.rect == RectangleF.Empty) return;
var rect = item.rect;// rects[i];
var diplayText = item.Text;
//byte Value = 0;
//배경이 투명이 아니라면 그린다.
//var bgColor1 = Color.DarkBlue; //BackColor1Off;
//var bgColor2 = Color.Blue;// BackColor2Off;
//if (Value != 0 && item.Enable != false)
//{
// //bgColor1 = Value == 1 ? BackColor1On : BackColor1Err;
// //bgColor2 = Value == 1 ? BackColor2On : BackColor2Err;
//}
//using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, bgColor1, bgColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
// g.FillRectangle(sb, rect);
// if (mouseOverItemIndex == menu.idx)
// this.Cursor = Cursors.Hand;
// else
// this.Cursor = Cursors.Arrow;
//테두리를 그리는 속성과 트기가 설정된 경우에만 표시
//if (mouseOverItemIndex == i)
// {
// pe.Graphics.DrawRectangle(new Pen(Color.DeepSkyBlue), rect.Left, rect.Top, rect.Width, rect.Height);
//}
//else
{
// using (var p = new Pen(BorderColor, 1))
// g.DrawRectangle(p, rect.Left, rect.Top, rect.Width, rect.Height);
}
//총 5개의 인디게이터와 하단에 위치값을 표시하는 영역이 있따.
//줄 영역은 50%비율로 처리함
if(item.Dirty)
{
//각 영역을 다시 그려줘야한다.
var indiWidth = rect.Width / 5.0;
// var indiHeight = rect.Height / 2.0;
for (int c = 0; c < 5; c++)
{
item.subRect[c] = new Rectangle((int)(c * indiWidth + item.rect.Left), (int)(item.rect.Top), (int)indiWidth, (int)HeaderHeight);
}
item.Dirty = false;
//위치값을 나타내는 영역
item.subRect[5] = new Rectangle((int)item.rect.Left, (int)(item.rect.Top + HeaderHeight), (int)rect.Width, (int)rect.Height - HeaderHeight );
}
for(int i = 0 ; i < item.subRect.Length;i++)
{
var B1 = colorB1[i];
var B2 = colorB2[i];
if (i < (item.subRect.Length - 1)) //상태표시칸은 현재 값에 따라서 색상을 달리한다
{
if ( this.Enabled == false || (item.State[i] == false && DesignMode == false))
{
B1 = Color.FromArgb(20,20,20);
B2 = Color.FromArgb(50,50,50);
}
}
var rt = item.subRect[i];
using (var br = new System.Drawing.Drawing2D.LinearGradientBrush(rt, B1, B2, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
g.FillRectangle(br, rt);
// g.DrawRectangle(Pens.Yellow, rt);
if (i < (item.subRect.Length-1))
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
g.DrawString(IndiName[i], HeaderFont, Brushes.White, rt, sf);
}
else
{
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Far;
g.DrawString(item.Position.ToString(PositionDisplayFormat) + " [" + item.PositionCmd.ToString(PositionDisplayFormat) + "] ",
this.Font,
new SolidBrush(item.PositionColor),
rt,
sf);
}
}
//테두리선은 우측만 처리한다
for (int i = 0; i < item.subRect.Length ; i++)
{
var rt = item.subRect[i];
var x1 = rt.Right;
var y1 = rt.Top;
var x2 = rt.Right;
var y2 = rt.Bottom;
g.DrawLine(new Pen(GridColor), x1, y1, x2, y2);
}
var posRect = item.subRect[item.subRect.Length - 1];
g.DrawLine(new Pen(Color.Black,1), posRect.Left, posRect.Top, posRect.Right, posRect.Top);
//인덱스번호 출력
if (diplayText != "")
{
g.DrawString(string.Format("[{0}] {1}", item.idx, diplayText),
this.Font, new SolidBrush(this.ForeColor),
item.rect.Left + 3, item.rect.Top + 3);
}
}
}
}

View File

@@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 어셈블리의 일반 정보는 다음 특성 집합을 통해 제어됩니다.
// 어셈블리와 관련된 정보를 수정하려면
// 이 특성 값을 변경하십시오.
[assembly: AssemblyTitle("arFrameControl")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("arFrameControl")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오.
[assembly: ComVisible(false)]
// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
[assembly: Guid("9fa3ef10-3c75-40a2-b3e6-a37900b26d0e")]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 버전이 자동으로
// 지정되도록 할 수 있습니다.
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -1,103 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{A16C9667-5241-4313-888E-548375F85D29}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>arFrame.Control</RootNamespace>
<AssemblyName>arFrameControl</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="GridView\ColorListItem.cs" />
<Compile Include="MotCommandButton.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="MotCommandButton.Designer.cs">
<DependentUpon>MotCommandButton.cs</DependentUpon>
</Compile>
<Compile Include="MotionView\MotITem.cs" />
<Compile Include="GridView\GridView.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="GridView\GridView.Designer.cs">
<DependentUpon>GridView.cs</DependentUpon>
</Compile>
<Compile Include="MenuBar\MenuControl.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="MenuBar\MenuControl.Designer.cs">
<DependentUpon>MenuControl.cs</DependentUpon>
</Compile>
<Compile Include="GridView\GridItem.cs" />
<Compile Include="MenuBar\MenuItem.cs" />
<Compile Include="MotionView\MotionDisplay.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="MotionView\MotionDisplay.Designer.cs">
<DependentUpon>MotionDisplay.cs</DependentUpon>
</Compile>
<Compile Include="MotLinkLabel.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="MotLinkLabel.Designer.cs">
<DependentUpon>MotLinkLabel.cs</DependentUpon>
</Compile>
<Compile Include="MotValueNumericUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="MotValueNumericUpDown.Designer.cs">
<DependentUpon>MotValueNumericUpDown.cs</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\arCtl\arControl.csproj">
<Project>{f31c242c-1b15-4518-9733-48558499fe4b}</Project>
<Name>arControl</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>