Initial commit

This commit is contained in:
ChiKyun Kim
2025-07-17 16:11:46 +09:00
parent 4865711adc
commit 4a1b1924ba
743 changed files with 230954 additions and 0 deletions

Submodule Handler/Sub/AmkorRestfulService added at c2a5826f21

View File

@@ -0,0 +1,51 @@
<?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>{14E8C9A5-013E-49BA-B435-EFEFC77DD623}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>VarData</RootNamespace>
<AssemblyName>VarData</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="Enum.cs" />
<Compile Include="Enum_IO.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,457 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AR
{
public enum eswPLCAddr
{
Ready = 0,
Spare1,
Spare2,
/// <summary>
/// 1=Limit Down
/// 2=Detect
/// 3=Limit Up
/// </summary>
LPort,
CPort,
RPort,
/// <summary>
/// 1 = Down,
/// 2 = Up
/// 3 = stop
/// </summary>
LMotor,
CMotor,
RMotor,
/// <summary>
/// 시퀀스값 0~
/// 0 : nothing
/// 1 : ~ running
/// </summary>
LSts,
CSts,
RSts,
/// <summary>
/// 1=down,
/// 2=up,
/// 3=stop,
/// 4=refresh
/// </summary>
LCmd,
CCmd,
RCmd,
}
//public enum eVarUInt32
//{
//}
//public enum eVarByte
//{
// None = 0,
//}
public enum eVarBool
{
None = 0,
NeedUserTouchAfterHome,
BarcodeHook,
NeedTopJigUnloaderPosition,
Use_Conveyor,
LEFT_ITEM_PICKOFF,
RIGT_ITEM_PICKOFF,
//Option_vname,
Opt_UserConfim,
Opt_ServerQty,
Opt_UserQtyRQ,
Option_partUpdate,
Opt_NewReelID,
Option_AutoConf,
Opt_SIDConvert,
Opt_ApplySIDConv,
Opt_ApplySIDInfo,
Opt_ApplyJobInfo,
Opt_CheckSIDExist,
Opt_SID_Apply_PartNo,
Opt_SID_Apply_CustCode,
Opt_SID_Apply_SID,
Opt_SID_Apply_VenderName,
Opt_SID_Apply_PrintPos,
Opt_SID_Apply_batch,
Opt_SID_Apply_qty,
Opt_SID_Where_PartNo,
Opt_SID_Where_CustCode,
Opt_SID_Where_SID,
Opt_SID_Where_VLOT,
Opt_SID_Where_MC,
Opt_SID_WriteServer,
Opt_Job_Apply_PartNo,
Opt_Job_Apply_CustCode,
Opt_Job_Apply_SID,
Opt_Job_Apply_VenderName,
Opt_Job_Apply_PrintPos,
Opt_Job_Where_PartNo,
Opt_Job_Where_CustCode,
Opt_Job_Where_SID,
Opt_Job_Where_VLOT,
Opt_Conv_Apply_PartNo,
Opt_Conv_Apply_CustCode,
Opt_Conv_Apply_SID,
Opt_Conv_Apply_VenderName,
Opt_Conv_Apply_PrintPos,
Opt_Conv_Apply_Batch,
Opt_Conv_Apply_QtyMax,
Opt_Conv_Where_PartNo,
Opt_Conv_Where_CustCode,
Opt_Conv_Where_SID,
Opt_Conv_Where_VLOT,
Opt_Conv_WriteServer,
/// <summary>
/// 카메라 사용안함
/// </summary>
Opt_DisableCamera,
/// <summary>
/// 프린터사용안함
/// </summary>
Opt_DisablePrinter,
Enable_PickerMoveX,
VisionL_Retry,
VisionR_Retry,
Need_UserConfirm_Data,
/// <summary>
/// 키엔스바코드의 수신을 확인합니다
/// </summary>
wait_for_keyence,
wait_for_keyenceL,
wait_for_keyenceR,
/// <summary>
/// 피커 키엔스 인식 실패로 재시도를 하고 있습니다.
/// </summary>
JOB_PickON_Retry,
JOB_Empty_SIDConvertInfo,
// JOB_BYPASS_LEFT,
// JOB_BYPASS_RIGHT,
FG_RDY_CAMERA_L,
FG_RDY_CAMERA_R,
FG_INIT_MOTIO,
FG_DOORSAFTY,
FG_AREASAFTY,
FG_INIT_PRINTER,
FG_KEYENCE_READOK_L,
FG_KEYENCE_READOK_R,
FG_KEYENCE_TRIGGER,
FG_KEYENCE_OFFF,
FG_KEYENCE_OFFR,
FG_RUN_LEFT,
FG_RUN_RIGHT,
FG_BUSY_LEFT,
FG_BUSY_RIGHT,
FG_PORT0_ENDDOWN,
FG_PORT1_ENDDOWN,
FG_PORT2_ENDDOWN,
FG_WAIT_PAPERDETECTL,
FG_WAIT_PAPERDETECTR,
FG_RUN_PLZ_PICKON,
FG_RUN_PRZ_PICKON,
FG_RUN_PLZ_PICKOF,
FG_RUN_PRZ_PICKOF,
FG_RUN_PLM_PICKON,
FG_RUN_PLM_PICKOF,
FG_RUN_PRM_PICKON,
FG_RUN_PRM_PICKOF,
FG_WAT_MAGNET0,
FG_WAT_MAGNET1,
FG_WAT_MAGNET2,
FG_PRC_VISIONL,
FG_PRC_VISIONR,
FG_END_VISIONL,
FG_END_VISIONR,
FG_MOVE_PICKER,
FG_JOYSTICK,
/// <summary>
/// Y축이 Front로 가지러 가기로 함
/// </summary>
FG_CMD_YP_LPICKON,
FG_CMD_YP_LPICKOF,
FG_CMD_YP_RPICKON,
FG_CMD_YP_RPICKOF,
//피커의 X축이 일을 하러 갔는가?
FG_RDY_PX_PICKON,
FG_RDY_PX_PICKONWAITL,
FG_RDY_PX_PICKONWAITR,
FG_RDY_PX_LPICKOF,
FG_RDY_PX_RPICKOF,
//X축이 이동한후 해당 언로더에 자료를 셋팅했는가?
FG_SET_DATA_PORT0,
FG_SET_DATA_PORT2,
FG_RDY_PZ_PICKON,
FG_RDY_PZ_LPICKOF,
FG_RDY_PZ_RPICKOF,
FG_RUN_PRINTL,
FG_RUN_PRINTR,
FG_OK_PRINTL,
FG_OK_PRINTR,
/// <summary>
/// 해당 포트의 자재 준비여부
/// </summary>
FG_RDY_PORT_PL,
FG_RDY_PORT_PC,
FG_RDY_PORT_PR,
FG_ENABLE_LEFT,
FG_ENABLE_RIGHT,
/// <summary>
/// 자재를 PICK 했다
/// </summary>
FG_PK_ITEMON,
FG_PL_ITEMON,
FG_PR_ITEMON,
FG_KEYENCE_IMAGEPROGRESS,
/// <summary>
/// 포트에 아이템이 있는가?
/// 1번의 경우 Detect 센서가 들어오면 ItemON 설정을 한다.
/// 0,2번의 경우 피커가 아이템을 놓을때 설정한다
/// 실제로는 ITEMON 과 Align =1, 일때 촬영이가능하게한다
/// </summary>
FG_PORTL_ITEMON,
FG_PORTR_ITEMON,
FG_WAIT_LOADERINFO,
/// <summary>
/// 작업시작화면
/// </summary>
FG_SCR_JOBSELECT,
/// <summary>
/// 작업종료화면
/// </summary>
//SCR_JOBFINISH,
/// <summary>
/// 작업완료
/// </summary>
FG_JOB_END,
FG_USERSTEP,
FG_MINSPACE,
FG_DEBUG,
//RUN_INIT,
VS_DETECT_REEL_L,
VS_DETECT_REEL_R,
VS_DETECT_CONV_L,
VS_DETECT_CONV_R,
}
public enum eVarString
{
Vision_Select_command,
Vision_Trig_command,
PrePick_ReelIDNew,
PrePick_ReelIDOld,
PrePick_ReelIDTarget,
JOB_CUSTOMER_CODE,
//JOB_BYPASS_SID,
//JOB_TYPE,
}
public enum eVarTime
{
DET5ON,
DET4ON,
PORT0,
PORT1,
PORT2,
MAGNET2,
MAGNET1,
MAGNET0,
QRCHECK0,
QRCHECK2,
KEYENCEWAIT,
LIVEVIEW0,
LIVEVIEW1,
LIVEVIEW2,
CHK_POSRSTCONVTIME,
PRINTL,
PRINTR,
CMDTIME_MOTYP,
CMDTIME_MOTZL,
CMDTIME_MOTZR,
JOB_END,
SMRUNERROR,
LOG_NEWIDERROR,
StatusReporttime,
JOBEVENT,
REFRESHLIST,
LEFT_ITEM_PICKOFF,
RIGT_ITEM_PICKOFF,
lastRecvWSL,
lastRecvWSR,
CONVL_START,
CONVR_START,
}
public enum eVarInt32
{
PickOnCount = 0,
PickOfCount,
LPickOnCount,
RPickOnCount,
LPickOfCount,
RPickOfCount,
LEFT_ITEM_COUNT,
RIGT_ITEM_COUNT,
Front_Brush_Cleaning,
Rear_Brush_Cleaning,
Front_Laser_Cleaning,
Rear_Laser_Cleaning,
/// <summary>
/// 2번축, 3번축 각 축번호가 들어있다
/// </summary>
PreBrushTargetF,
PreBrushTargetR,
/// <summary>
/// 2번축, 3번축 각 축번호가 들어있다
/// </summary>
PostBrushTargetF,
PostBrushTargetR,
TopjigUnloadPort,
TopJigLoadPort,
DevConnectSeq,
BitmapCompatErr,
PickOnRetry,
}
public enum eVarDBL
{
ThetaPosition = 0,
ThetaPositionL,
ThetaPositionR,
LEFT_ITEM_PICKOFF,
RIGT_ITEM_PICKOFF,
CONVL_RUNTIME,
CONVR_RUNTIME,
}
public enum eECode : byte
{
NOERROR = 0,
EMERGENCY = 1,
NOMODELV = 2,//작업모델
NOMODELM = 3,//모션모델
//DOORSAFTY = 6,
//AREASAFTY = 7,
//VIS_LICENSE = 8,
HOME_TIMEOUT = 9,
//AIRNOOUT = 10,
NOFUNCTION = 11,
//AIRNOTDETECT = 12,
DOOFF = 27,//출력 off
DOON = 28,//출력 on
DIOFF = 29,//입력off
DION = 30,//입력 on
MESSAGE_INFO = 32,
MESSAGE_ERROR = 33,
//VISION_NOTREADY = 34,
//VISION_NOCONN = 35,
//VISION_TRIGERROR = 36,
//VISION_COMMERROR = 37,
//VISION_NORECV = 38,
AZJINIT = 39, //DIO 혹은 모션카드 초기화 X
//MOT_HSET = 41,
MOT_SVOFF = 42,
//MOT_HSEARCH = 43,
MOT_CMD = 71,
USER_STOP = 72,
USER_STEP = 73,
POSITION_ERROR = 86,
MOTIONMODEL_MISSMATCH = 96,
//여기서부터는 전용코드로한다(소켓은 조금 섞여 있음)
VISCONF = 100,
UNSUPPORT,
NOJOBMODE,
PRINT,
SELECTNEXTREEL,
BCD_LEFT,
BCD_LEFT_TEMP,
BCD_LEFT_NEW,
BCD_RIGHT,
BCD_RIGHT_TEMP,
BCD_RIGHT_NEW,
BARCODEVALIDERR,
PRINTER,
QRDATAMISSMATCHL,
QRDATAMISSMATCHR,
MOTX_SAFETY,
CHANGEALERTLEFT,
CHANGEALERTRIGHT,
SIDVALIDATION,
}
}

View File

@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
namespace AR
{
public enum eDIPin : byte
{
X00, X01, X02, X03, X04, X05, X06, X07,
X08, X09, X0A, X0B, X0C, X0D, X0E, X0F,
X10, X11, X12, X13, X14, X15, X16, X17,
X18, X19, X1A, X1B, X1C, X1D, X1E, X1F,
X20, X21, X22, X23, X24, X25, X26, X27,
X28, X29, X2A, X2B, X2C, X2D, X2E, X2F,
X30, X31, X32, X33, X34, X35, X36, X37,
X38, X39, X3A, X3B, X3C, X3D, X3E, X3F
}
public enum eDIName : byte
{
BUT_STARTF = 0x00, BUT_STOPF, BUT_RESETF, BUT_EMGF, BUT_AIRF,
AIR_DETECT = 0x05, PICKER_SAFE = 0x08,
DOORF1 = 0x0A, DOORF2, DOORF3,
DOORR1 = 0x0D, DOORR2, DOORR3,
PORT0_SIZE_07 = 0x1A, PORT0_SIZE_13, PORTL_LIM_UP, PORTL_LIM_DN, PORTL_DET_UP,
PORT1_SIZE_07 = 0x10, PORT1_SIZE_13, PORTC_LIM_UP, PORTC_LIM_DN, PORTC_DET_UP,
PORT2_SIZE_07 = 0x15, PORT2_SIZE_13, PORTR_LIM_UP, PORTR_LIM_DN, PORTR_DET_UP,
R_PICK_BW = 0x20, R_PICK_FW, R_PICK_VAC,
L_PICK_BW = 0x24, L_PICK_FW, L_PICK_VAC,
L_CONV1 = 0x30, L_CONV3 = 0x32, L_CONV4 = 0x33,
R_CONV1 = 0x34, R_CONV3 = 0x36, R_CONV4 = 0x37,
R_CYLUP = 0x38, R_CYLDN,
L_CYLUP = 0x3A, L_CYLDN,
L_EXT_READY = 0x3E,
R_EXT_READY = 0x3F,
}
public enum eDOPin : byte
{
Y00, Y01, Y02, Y03, Y04, Y05, Y06, Y07,
Y08, Y09, Y0A, Y0B, Y0C, Y0D, Y0E, Y0F,
Y10, Y11, Y12, Y13, Y14, Y15, Y16, Y17,
Y18, Y19, Y1A, Y1B, Y1C, Y1D, Y1E, Y1F,
Y20, Y21, Y22, Y23, Y24, Y25, Y26, Y27,
Y28, Y29, Y2A, Y2B, Y2C, Y2D, Y2E, Y2F,
Y30, Y31, Y32, Y33, Y34, Y35, Y36, Y37,
Y38, Y39, Y3A, Y3B, Y3C, Y3D, Y3E, Y3F
}
public enum eDOName : byte
{
BUT_STARTF = 0x00, BUT_STOPF, BUT_RESETF, BUT_EMGF, BUT_AIRF,
SOL_AIR = 0x07, BUZZER,
ROOMLIGHT = 0x0A,
TWR_GRNF = 0x0D, TWR_YELF, TWR_REDF,
PORTL_MOT_RUN = 0x1A, PORTL_MOT_DIR, CART_MAG0,
PORTC_MOT_RUN = 0x10, PORTC_MOT_DIR, CART_MAG1,
PORTR_MOT_RUN = 0x14, PORTR_MOT_DIR, CART_MAG2,
PRINTL_FWD = 0x1D,
PRINTL_VACO = 0x1E, PRINTL_VACI,
PRINTR_FWD = 0x17,
PRINTR_VACO = 0x18, PRINTR_VACI,
PRINTL_AIRON = 0x20, PRINTR_AIRON,
PICK_VAC1 = 0x23, PICK_VAC2, PICK_VAC3, PICK_VAC4,
SVR_PWR_0 = 0x28, SVR_PWR_1, SVR_PWR_2, SVR_PWR_3, SVR_PWR_4, SVR_PWR_5, SVR_PWR_6,
RIGHT_CONV = 0x30, LEFT_CONV,
R_CYLDN = 0x38, L_CYLDN = 0x39,
//SVR_EMG_0 = 0x30, SVR_EMG_1, SVR_EMG_2, SVR_EMG_3, SVR_EMG_4, SVR_EMG_5, SVR_EMG_6,
}
}

View File

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

1
Handler/Sub/CommSM Submodule

Submodule Handler/Sub/CommSM added at 91c0476bd4

1
Handler/Sub/CommUtil Submodule

Submodule Handler/Sub/CommUtil added at 11d464e16a

View File

@@ -0,0 +1,651 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Design;
using System.Linq;
using System.Management;
using System.Security.Policy;
using System.Text;
using System.Windows.Forms;
namespace AR
{
public class UserSetting : arUtil.Setting
{
public string customerlist { get; set; }
public UserSetting()
{
}
public override void AfterLoad()
{
//throw new NotImplementedException();
}
public override void AfterSave()
{
//throw new NotImplementedException();
}
}
public class CommonSetting : arUtil.Setting
{
public string WebAPI_R1 { get; set; }
public string WebAPI_R2 { get; set; }
public string WebAPI_R3 { get; set; }
#region "log"
[Category("System Log - Main")]
public Boolean Log_CameraConn { get; set; }
[Category("System Log - Main"), DisplayName("Digital Input"),
Description("입/출력 장치의 상태 변화를 기록 합니다.")]
public Boolean Log_DI { get; set; }
[Category("System Log - Main"), DisplayName("Digital Output"),
Description("입/출력 장치의 상태 변화를 기록 합니다.")]
public Boolean Log_DO { get; set; }
[Category("System Log - Main"), DisplayName("Network Alive Check(Ping)"),
Description("디버그 메세지 사용")]
public Boolean Log_Debug { get; set; }
[Category("System Log - Main"), DisplayName("S/M Step Change"),
Description("상태머신의 변화 상태를 기록 합니다.")]
public Boolean Log_StepChange { get; set; }
[Category("System Log - Main"), DisplayName("Motion State Change"),
Description("모션 상태 변화를 기록 합니다.")]
public Boolean Log_motState { get; set; }
[Category("System Log - Main")]
public Boolean Log_flag { get; set; }
[Category("System Log - Main")]
public Boolean Log_ILock { get; set; }
[Category("System Log - Function"), DisplayName("Inter Lock")]
public Boolean Enable_Log_ILock { get; set; }
[Category("System Log - Function"), DisplayName("Flag")]
public Boolean Enable_Log_Flag { get; set; }
[Category("System Log - Function"), DisplayName("Motor Stop Message")]
public Boolean Enable_Log_MotStopReason { get; set; }
#endregion
#region "Communication"
[Category("Communication"), DisplayName("키엔스바코드IP(LEFT)"), Description("키엔스 바코드 프로그램의 접속 IP Address")]
public string Keyence_IPF { get; set; }
[Category("Communication"), DisplayName("키엔스바코드IP(RIGHT)"), Description("키엔스 바코드 프로그램의 접속 IP Address")]
public string Keyence_IPR { get; set; }
[Category("Communication"), DisplayName("키엔스통신포트"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Keyence_Port { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string PrintL_Port { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int PrintL_Baud { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string PrintR_Port { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int PrintR_Baud { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public bool PrintL_RS232 { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public bool PrintR_RS232 { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string PrintL_AddSend { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string PrintR_AddSend { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Barcode_Port { get; set; }
[Category("Communication"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Barcode_Baud { get; set; }
#endregion
#region "Time Out"
[Category("Timeout Setting"), DisplayName(), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_AutoConfirm { get; set; }
[Category("Timeout Setting"), DisplayName("작업 완료 대기시간(단위:초)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_JOBEnd { get; set; }
[Category("Timeout Setting"), DisplayName("최대비젼분석시간(로더)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_VisionProcessL { get; set; }
[Category("Timeout Setting"), DisplayName("최대비젼분석시간(언로더)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_VisionProcessU { get; set; }
[Category("Timeout Setting"), DisplayName("장비 초기화 대기시간(단위:초)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_HomeSearch { get; set; }
[Category("Timeout Setting"), DisplayName("개별 동작의 대기시간(단위:초)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public double Timeout_StepMaxTime { get; set; }
[Category("Timeout Setting"), DisplayName("모션의 최대 동작시간(단위:초)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_MotionCommand { get; set; }
[Category("Timeout Setting"), DisplayName("DIO의 최대 동작시간(단위:초)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Timeout_DIOCommand { get; set; }
#endregion
#region "Advanced Parameter"
[Category("Advanced Parameter"), DisplayName("ECS 자료조회 비활성"), Description("ECS 자료조회를 비활성화 합니다.\n기존 장비정보에 해당하는 자료를 사용합니다")]
public bool ECSSkip { get; set; }
[Category("Advanced Parameter")]
public bool InboundWebService_RID_DupSKIP { get; set; }
[Category("Advanced Parameter"), DisplayName("Remote Contoller Port"), Description("디버그 포트 정보(시리얼통신), 입력 예) COM1:9600"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Serial_Remocon { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int RetryPickOnMaxCount { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int RetryPickOnAngle { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float JOG_Speed { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float JOG_Acc { get; set; }
[Category("Advanced Parameter")]
public Boolean Disable_HomePortDown { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PrinterL { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PrinterR { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PLVac { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PRVac { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PKVac { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PLAir { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PRAir { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PortL { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PortC { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_PortR { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_SIDReferenceCheck { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_BottomAirBlow { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Enable_ButtonStart { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_RequestJobSeqNo { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean DisableSensor_AIRCheck { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_TowerLamp { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_RoomLight { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public bool Disable_vacum { get; set; }
[Category("Advanced Parameter"), DisplayName("*.속도제한")]
public Boolean Enable_SpeedLimit { get; set; }
[Category("Advanced Parameter"), DisplayName("*.최대속도"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int LimitSpeed { get; set; }
[Category("Advanced Parameter"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_SidQtyCheck { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis0 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis1 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis2 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis3 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis4 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis5 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Axis6 { get; set; }
[Category("Advanced Parameter"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean EnableDebugMode { get; set; }
#endregion
#region "function"
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Force_JobEndBuzzer { get; set; }
//[Browsable(false)]
//public Boolean Enable_ConveryorMode { get; set; }
[Browsable(false)]
public Boolean Disable_safty_F0 { get; set; }
[Browsable(false)]
public Boolean Disable_safty_F1 { get; set; }
[Browsable(false)]
public Boolean Disable_safty_F2 { get; set; }
[Browsable(false)]
public Boolean Disable_safty_R0 { get; set; }
[Browsable(false)]
public Boolean Disable_safty_R1 { get; set; }
[Browsable(false)]
public Boolean Disable_safty_R2 { get; set; }
[Browsable(false)]
public Boolean Disable_Buzzer { get; set; }
[Browsable(false)]
public Boolean Enable_Magnet0 { get; set; }
[Browsable(false)]
public Boolean Enable_Magnet1 { get; set; }
[Browsable(false)]
public Boolean Enable_Magnet2 { get; set; }
[Browsable(false)]
public Boolean Enable_PickerCylinder { get; set; }
public string GetPathData()
{
var path = AppDomain.CurrentDomain.BaseDirectory;
if (String.IsNullOrWhiteSpace(Path_Data)) return System.IO.Path.Combine(path, "SaveData");
else return Path_Data;
}
[Category("Function"), DisplayName("라벨QR코드검증"), Description("부착된 라벨의 QR코드를 인쇄데이터와 검증 합니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Enable_Unloader_QRValidation { get; set; }
[Category("Function"), DisplayName("촬영이미지저장"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Save_Image { get; set; }
[Category("Function"), DisplayName("피커자동이동(전면도어)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean PickerAutoMoveForDoor { get; set; }
[Category("Function"), DisplayName("Data Save Path"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Path_Data { get; set; }
[Category("Function"), Browsable(false), DisplayName("실내등 자동 제어"),
Description("도어 상태에 따라서 내부 조명을 자동 ON/OFF 합니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Enable_AutoLight { get; set; }
//[Category("Function"), DisplayName("AIR OFF Timer(ms)"),
//Description("공압 OFF시 유지 시간(ms), 지정 시간 동안 스위치를 ON 시켜야 공압이 OFF 됩니다.")]
//public int AirOFFTimer { get; set; }
[Category("Function"), DisplayName("부저 동작시간(ms)"),
Description("부저 발생시 지정된 시간(ms) 동안 부저가 울립니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int buzz_run_ms { get; set; }
#endregion
#region "Vision"
[Category("Vision"), DisplayName("13' 이미지 중앙 위치"), Description("키엔스 이미지의 회전축 좌표")]
public System.Drawing.Point CenterPosition13 { get; set; }
[Category("Vision"), DisplayName("7' 이미지 중앙 위치"), Description("키엔트 이미지의 회전축 좌표")]
public System.Drawing.Point CenterPosition7 { get; set; }
[Category("Vision"), DisplayName("Disable Left Camera"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Left { get; set; }
[Category("Vision"), DisplayName("Disable Right Camera"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Disable_Right { get; set; }
[Category("Vision"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string HostIPL { get; set; }
[Category("Vision"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string HostIPR { get; set; }
[Category("Vision"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int HostPortL { get; set; }
[Category("Vision"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int HostPortR { get; set; }
[Category("Vision"), DisplayName("Camera Left Filename"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string CameraLFile { get; set; }
//[Category("Vision"), DisplayName("Camera Right Filename"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
//public string CameraRFile { get; set; }
[Category("Vision"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float AngleOffsetL { get; set; }
[Category("Vision"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float AngleOffsetR { get; set; }
#endregion
#region "Count Reset Setting"
[Category("Count Reset Setting"), Browsable(false), DisplayName("A/M Clear Enable"),
Description("오전 초기화 여부\n작업수량을 초기화 하려면 True 로 설정하세요"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean datetime_Check_1 { get; set; }
[Category("Count Reset Setting"), Browsable(false), DisplayName("P/M Clear Enable"),
Description("오후 초기화 여부\n작업수량을 초기화 하려면 True 로 설정하세요"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean datetime_Check_2 { get; set; }
[Category("Count Reset Setting"), Browsable(false), DisplayName("A/M Clear Time(HH:mm)"),
Description("오전 초기화 시간(시:분)\n예) 09:00"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string datetime_Reset_1 { get; set; }
[Category("Count Reset Setting"), Browsable(false), DisplayName("P/M Clear Time(HH:mm)"),
Description("오후 초기화 시간(시:분)\n예) 19:00"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string datetime_Reset_2 { get; set; }
#endregion
#region "Sensitive"
[Category("Sensitive"), DisplayName("언/로더포트 감지(fall)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort PortDetectFall { get; set; }
[Category("Sensitive"), DisplayName("언/로더포트 감지(rise)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort PortDetectRise { get; set; }
[Category("Sensitive"), DisplayName("도어 감지센서(rise)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort SaftyDetectRise { get; set; }
[Category("Sensitive"), DisplayName("도어 감지센서(rise)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort SaftyDetectFall { get; set; }
[Category("Sensitive"), DisplayName("AIR 버튼(rise/fall)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort AirChange { get; set; }
#endregion
#region "Operation Delay"
[Category("Operation Delay(ms)"), DisplayName("라벨 붙인 후 대기 시간"), Description("라벨 부착 후 PURGE 대기 시간"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int PrintVacOffPurgeMS { get; set; }
[Category("Operation Delay(sec)"), DisplayName("카트감지대기시간(좌)"), Description("지정된 시간 이후에 카트가 HOLD 됩니다- ms"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort WaitTime_Magnet0 { get; set; }
[Category("Operation Delay(sec)"), DisplayName("카트감지대기시간(중앙)"), Description("지정된 시간 이후에 카트가 HOLD 됩니다- ms"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort WaitTime_Magnet1 { get; set; }
[Category("Operation Delay(sec)"), DisplayName("카트감지대기시간(우)"), Description("지정된 시간 이후에 카트가 HOLD 됩니다 - ms"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort WaitTime_Magnet2 { get; set; }
[Category("Operation Delay(sec)"), DisplayName("프린트후대기시간(좌s)"), Description("프린터 라벨 출력 후 대기 시간(좌)- ms"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int PrintLWaitMS { get; set; }
[Category("Operation Delay(sec)"), DisplayName("프린트후대기시간(우)"), Description("프린터 라벨 출력 후 대기 시간(우)- ms"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int PrintRWaitMS { get; set; }
[Category("Operation Delay(sec)"), DisplayName("포트 하강 시간(Unloader)"), Description("포트 정렬시 지정된 시간동안 하강 합니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float PortAlignDownTimeU { get; set; }
[Category("Operation Delay(sec)"), DisplayName("포트 하강 시간(Loader)"), Description("포트 정렬시 지정된 시간동안 하강 합니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float PortAlignDownTimeL { get; set; }
[Category("Operation Delay(sec)"), DisplayName("Loder포트 하강 시간(Finish)"), Description("작업 완료 후 지정된 시간(ms) 만큼 하강 합니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public ushort Port1FisnishDownTime { get; set; }
#endregion
#region "GENERAL
[Category("General Setting"), DisplayName("내부조명자동OFF시간(분)")]
public int AutoOffRoomLightMin { get; set; }
[Category("General Setting"), DisplayName("장비 자산 번호"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Asset { get; set; }
[Category("General Setting"), DisplayName("장비식별이름"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string McName { get; set; }
[Category("General Setting"), DisplayName("무시바코드"), Description("입려된 값으로 시작하는 바코드를 무시합니다. 여러개 입력하려면 콤마(,) 로 구분 하세요"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string IgnoreBarcode { get; set; }
[Category("General Setting"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string ReelIdDeviceID { get; set; }
[Category("General Setting"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string ReelIdDeviceLoc { get; set; }
[Category("General Setting"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public bool Enable_AutoChangeModelbyHandBarcode { get; set; }
#endregion
//public Boolean MoveYForPaperVaccume { get; set; }
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public float MoveYForPaperVaccumeValue { get; set; }
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public uint MoveYForPaperVaccumeVel { get; set; }
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public uint MoveYForPaperVaccumeAcc { get; set; }
[Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean OnlineMode { get; set; }
//public Boolean STDLabelFormat7 { get; set; }
#region "Printer"
[Category("Printer"), DisplayName("바코드 외곽 박스 그리기"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean DrawOutbox { get; set; }
[Category("Printer"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string baseZPLFile { get; set; }
#endregion
[Category("Joystick"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Jostick_vid { get; set; }
[Category("Joystick"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int Jostick_pid { get; set; }
[DisplayName("바코드위치별회전(뒤)")]
public float RearBarcodeRotate { get; set; }
[DisplayName("바코드위치별회전(앞)")]
public float FrontBarcodeRotate { get; set; }
[Browsable(false)]
public bool SystemBypass { get; set; }
#region "general"
[Category("General Setting"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Sidinfofilename { get; set; }
[Category("General Setting"), DisplayName("버그리포트수신자"), Description("버그리포트 수신자 목록, 다중 목록의 각 대상은 세미콜론으로 구분 합니다"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string BugreportToList { get; set; }
[Category("General Setting"), Browsable(false),
Description("데이터 자동 소거 기간(일) 비활성=0"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int AutoDeleteDay { get; set; }
[Category("General Setting"), Browsable(false),
Description("데이터 자동 소거 조건(남은용량 %)"), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public int AutoDeleteThreshold { get; set; }
[Category("General Setting"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Password_Setup { get; set; }
[Category("General Setting"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public string Language { get; set; }
[Category("General Setting"), DisplayName("Full Screen Window State"),
Description("화면을 전체화면으로 사용 합니다."), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean FullScreen { get; set; }
#region "표시안함"
[Category("Sensor Detect"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Detect_CartL { get; set; }
[Category("Sensor Detect"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Detect_CartC { get; set; }
[Category("Sensor Detect"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Detect_CartR { get; set; }
[Category("Sensor Detect"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Detect_PrintL { get; set; }
[Category("Sensor Detect"), Browsable(false), Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
public Boolean Detect_PrintR { get; set; }
//[Category("Sensor Detect"), Browsable(false)]
//public Boolean Detect_CenterSafty { get; set; }
#endregion
#endregion
#region "Report"
[Category("Report"),
Description("상태기록시 장비 식별코드(4자리)"),
DisplayName("M/C ID")]
public string MCID { get; set; }
[Category("Report"),
Description("작업 기록을 장비기술(EE) Database 에 기록 합니다. 원격으로 장비 현황을 모니터링 할 수 있습니다"),
DisplayName("SAVE EE-DB")]
public Boolean Save_EEDatabase { get; set; }
[Category("Report"), Description("상태값을 전송하는 간격(초)")]
public int StatusInterval { get; set; }
#endregion
#region "swplc"
public string swplc_name { get; set; }
public int swplc_size { get; set; }
#endregion
[Category("Develop")]
public string Bugreport_mail { get; set; }
public override void AfterLoad()
{
if (WebAPI_R1.isEmpty()) WebAPI_R1 = "http://10.131.32.31:9001";
if (WebAPI_R2.isEmpty()) WebAPI_R2 = "http://10.131.32.24:9001";
if (WebAPI_R3.isEmpty()) WebAPI_R3 = "http://10.131.32.22:9001";
if (swplc_size < 1) swplc_size = 100;
if (swplc_name.isEmpty()) swplc_name = "swplc";
if (StatusInterval < 10) StatusInterval = 300; //5분간격
var currentpath = AppDomain.CurrentDomain.BaseDirectory;
if (AutoOffRoomLightMin == 0) AutoOffRoomLightMin = 5;
if (baseZPLFile.isEmpty())
baseZPLFile = "zpl7.txt";
if (RetryPickOnAngle == 0) RetryPickOnAngle = 79;
if (Barcode_Baud == 0) Barcode_Baud = 9600;
if (JOG_Speed < 1) JOG_Speed = 200;
if (JOG_Acc < 1) JOG_Acc = 500;
if (PrintL_Baud == 0) PrintL_Baud = 115200;
if (PrintR_Baud == 0) PrintR_Baud = 115200;
if (BugreportToList.isEmpty()) BugreportToList = "chikyun.kim@amkor.co.kr";
if (HostIPL.isEmpty() && HostPortL < 1)
{
HostIPL = "127.0.0.1";
HostPortL = 7979;
}
if (HostIPR.isEmpty() && HostPortR < 1)
{
HostIPR = "127.0.0.1";
HostPortR = 7980;
}
if (ReelIdDeviceLoc.isEmpty()) ReelIdDeviceLoc = "4";
if (ReelIdDeviceID.isEmpty()) ReelIdDeviceID = "A";
if (IgnoreBarcode.isEmpty()) IgnoreBarcode = "{{{";
if (Timeout_AutoConfirm == 0) Timeout_AutoConfirm = 5;
//if (PrintVacOffPurgesec <= 0.0) PrintVacOffPurgesec = 1.1f;
if (PrintVacOffPurgeMS == 0) PrintVacOffPurgeMS = 500;
if (MoveYForPaperVaccumeVel == 0) MoveYForPaperVaccumeVel = 10;
if (MoveYForPaperVaccumeAcc == 0) MoveYForPaperVaccumeAcc = 1000;
//포트얼라인시간 210401
if (PortAlignDownTimeU == 0f &&
PortAlignDownTimeL == 0f)
{
PortAlignDownTimeL = 1.5f;
PortAlignDownTimeU = 1.0f;
}
if (Jostick_vid == 0) Jostick_vid = 121;
if (Jostick_pid == 0) Jostick_pid = 17;
if (PrintLWaitMS == 0) PrintLWaitMS = 1500;
if (PrintRWaitMS == 0) PrintRWaitMS = 1500;
if (WaitTime_Magnet0 == 0) WaitTime_Magnet0 = 3000;
if (WaitTime_Magnet1 == 0) WaitTime_Magnet1 = 3000;
if (WaitTime_Magnet2 == 0) WaitTime_Magnet2 = 3000;
//if (PrintLeftName.isEmpty()) PrintLeftName = "PrinterL";
//if (PrintRightName.isEmpty()) PrintRightName = "PrinterR";
if (SaftyDetectRise == 0) SaftyDetectRise = 20;
if (SaftyDetectFall == 0) SaftyDetectFall = 1000; //안전센서는 느리게 해제 한다
if (Timeout_JOBEnd == 0) Timeout_JOBEnd = 10;
if (Timeout_VisionProcessL == 0) Timeout_VisionProcessL = 10000;
if (Timeout_VisionProcessU == 0) Timeout_VisionProcessU = 10000;
if (PortDetectFall == 0) PortDetectFall = 50;
if (PortDetectRise == 0) PortDetectRise = 10;
if (AirChange == 0) AirChange = 3000;
if (Keyence_IPF.isEmpty()) Keyence_IPF = "192.168.100.100";
//if (Keyence_IPR.isEmpty()) Keyence_IPR = "192.168.100.101";
if (Keyence_Port == 0) Keyence_Port = 9004;
//데이터베이스
//if (Keyence_IPL.isEmpty() == true) Keyence_IPL = "net.pipe://127.0.0.1/barcode";
//if (Keyence_IPR.isEmpty() == true) Keyence_IPR = "net.pipe://127.0.0.1/barcode";
if (Timeout_MotionCommand == 0) Timeout_MotionCommand = 10;
if (Timeout_DIOCommand == 0) Timeout_DIOCommand = 10;
if (AutoDeleteThreshold == 0) AutoDeleteThreshold = 20;
if (Timeout_HomeSearch == 0) Timeout_HomeSearch = 50;
//if (AirOFFTimer == 0) AirOFFTimer = 3000; //181226
if (Asset == "") Asset = "DEV_SPLIT";
if (Language.isEmpty()) Language = "Kor";
//if (Password_Setup.isEmpty()) Password_Setup = "0000";
if (Path_Data == "")
Path_Data = System.IO.Path.Combine(currentpath, "SaveData");
try
{
if (System.IO.Directory.Exists(Path_Data) == false)
System.IO.Directory.CreateDirectory(Path_Data);
}
catch
{
}
//if (Password_User.isEmpty()) Password_User = "9999";
}
public override void AfterSave()
{
//throw new NotImplementedException();
}
public void CopyTo(CommonSetting dest)
{
//이곳의 모든 쓰기가능한 속성값을 대상에 써준다.
Type thClass = this.GetType();
foreach (var method in thClass.GetMethods())
{
var parameters = method.GetParameters();
if (!method.Name.StartsWith("get_")) continue;
string keyname = method.Name.Substring(4);
string methodName = method.Name;
object odata = GetType().GetMethod(methodName).Invoke(this, null);
var wMethod = dest.GetType().GetMethod(Convert.ToString("set_") + keyname);
if (wMethod != null) wMethod.Invoke(dest, new object[] { odata });
}
}
}
}

View File

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

View File

@@ -0,0 +1,35 @@
using System;
using System.Data;
namespace AR
{
public static class SETTING
{
public static CommonSetting Data;
public static UserSetting User;
public static Boolean isInit { get; private set; } = false;
public static void Load()
{
if (Data == null) Data = new CommonSetting();
Data.Load();
if (User == null) User = new UserSetting();
User.Load();
isInit = true;
}
public static void Save()
{
Data.Save();
User.Save();
}
public static bool isEmpty(this string data)
{
return string.IsNullOrEmpty(data);
}
}
}

View File

@@ -0,0 +1,67 @@
<?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>{48654765-548D-42ED-9238-D65EB3BC99AD}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Setting</RootNamespace>
<AssemblyName>Setting</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="ArSetting.Net4">
<HintPath>..\..\DLL\ArSetting.Net4.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<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="Common.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SETTING.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\arCtl\arControl.csproj">
<Project>{f31c242c-1b15-4518-9733-48558499fe4b}</Project>
<Name>arControl</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

@@ -0,0 +1,196 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StdLabelPrint
{
public class CAmkorSTDBarcode
{
public string Message { get; private set; }
public Boolean isValid = false;
public string SID { get; set; }
public string VLOT { get; set; }
public string RID { get; set; }
public string MFGDate { get; set; }
//public string MFGDateRaw { get; set; }
public string VENDERNAME { get; set; }
public string PARTNO { get; set; }
public int QTY { get; set; }
public string RAW { get; set; }
public Boolean DateError { get; private set; }
public Boolean DisposalCode { get; set; }
public Boolean NewLen15Barcode { get; set; }
public void CopyTo(CAmkorSTDBarcode obj)
{
if (obj == null) obj = new CAmkorSTDBarcode();
else obj.Clear();
obj.Message = this.Message;
obj.isValid = this.isValid;
obj.SID = this.SID;
obj.VLOT = this.VLOT;
obj.RID = this.RID;
obj.MFGDate = this.MFGDate;
obj.VENDERNAME = this.VENDERNAME;
obj.PARTNO = this.PARTNO;
obj.QTY = this.QTY;
obj.RAW = this.RAW;
obj.DateError = this.DateError;
obj.DisposalCode = this.DisposalCode;
obj.NewLen15Barcode = this.NewLen15Barcode;
}
public CAmkorSTDBarcode()
{
Clear();
}
public void Clear()
{
this.DisposalCode = false;
this.NewLen15Barcode = false;
this.Message = string.Empty;
this.isValid = false;
this.SID = string.Empty;
this.VLOT = string.Empty;
this.RID = string.Empty;
//this.MFGDateRaw = string.Empty;
this.MFGDate = string.Empty;// new DateTime(1982, 11, 23);
this.VENDERNAME = string.Empty;
this.PARTNO = string.Empty;
this.QTY = 0;
this.RAW = string.Empty;
DateError = false;
}
public CAmkorSTDBarcode(string raw)
{
SetBarcode(raw);
}
public void SetBarcodeDemo()
{
//SetBarcode("101410653;AG64B3W;SAMSUNG;20000;AG64B3W0031;19000101;");
SetBarcode("101410653;AG64B3W;SAMSUNG;20000;AG64B3W0031;19000101;");
}
/// <summary>
/// 현재 속성의 값을 가지고 바코드값을 반환합니다.
/// 원본 바코드 값을 확인하려면 RAW 속성을 확인하세요
/// </summary>
/// <returns></returns>
public string GetBarcode()
{
if (string.IsNullOrWhiteSpace(PARTNO))
return string.Format("{0};{1};{2};{3};{4};{5}",
SID, VLOT, VENDERNAME, QTY, RID, MFGDate);
else
return string.Format("{0};{1};{2};{3};{4};{5};{6}",
SID, VLOT, VENDERNAME, QTY, RID, MFGDate, PARTNO);
}
public void SetBarcode(string raw)
{
//101416868;01A3KX;KYOCERA;20000;RC00014A225001I;20220511;N/A
isValid = false;
this.RAW = raw;
var buf = raw.Split(';');
if (buf.Length < 5)
{
isValid = false;
Message = "buffer len error : " + raw;
return;
}
decimal vSID = 0;
double vQty = 0;
if (decimal.TryParse(buf[0], out vSID) == false) return;
this.SID = buf[0];
this.VLOT = buf[1];
//101인경우에는 3번 항목이 벤더네임이다.
//103은 partno 값이 들어간다
if (this.SID.StartsWith("103"))
{
if (buf.Length == 7) //구형바코드
{
this.VENDERNAME = buf[2];
this.PARTNO = string.Empty;
Message = "폐기된 103코드 입니다";
DisposalCode = true;
}
else
{
//05월 신형은 파트번호가 들어있다
this.PARTNO = buf[2];
this.VENDERNAME = string.Empty;
DisposalCode = false;
}
}
else
{
this.VENDERNAME = buf[2];
this.PARTNO = string.Empty;
DisposalCode = false;
}
//일부 데이터를 변조한다 210709
if (this.VENDERNAME == "K118165") this.VENDERNAME = "DELTA";
else if (this.VENDERNAME == "K113986") this.VENDERNAME = "DREAM CHIP";
if (double.TryParse(buf[3], out vQty) == false) return;
this.QTY = (int)vQty;
this.RID = buf[4];
//DateTime vMFGDate;
DateError = false;
this.MFGDate = buf[5].Trim();
//신형바코드는 angle 에서 제외하려고 판정한다
if (this.RID.Length == 15 && this.RID.StartsWith("RC")) //210703
this.NewLen15Barcode = true;
else
this.NewLen15Barcode = false;
//if (buf[5].Length == 4 && this.SUPPLY == "SAMSUNG")
//{
// //삼성은 주차로 한다
// DateError = true;
// Message = "Date Error(samsung)";
// MFGDate = new DateTime(2000+ int.Parse( buf[5].Substring(0,2) ), 1, 1);
// //DateTime.Now.
//}
//else if (buf[5].Length != 8)
//{
// Message = "Date value Length Error : " + buf[5];
// MFGDate = new DateTime(1900, 1, 1);
// return;
//}
//else
//{
// buf[5] = buf[5].Substring(0, 4) + "-" + buf[5].Substring(4, 2) + "-" + buf[5].Substring(6, 2);
// if (DateTime.TryParse(buf[5], out vMFGDate) == false) return;
// MFGDate = vMFGDate;
//}
//마지막 요소가 PartNo 이다. (아직 이코드는 본적 없음)
if (this.SID.StartsWith("103") && buf.Length == 7) //구형번호이다
{
this.PARTNO = buf[6];
}
if (buf.Length == 7 && string.IsNullOrEmpty(this.PARTNO))
{
this.PARTNO = buf[6];
}
//else this.PARTNO = string.Empty;
isValid = true;
}
}
}

View File

@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace StdLabelPrint
{
public partial class LabelPrint
{
private const int ERROR_INSUFFICIENT_BUFFER = 122;
[FlagsAttribute]
public enum PrinterEnumFlags
{
PRINTER_ENUM_DEFAULT = 0x00000001,
PRINTER_ENUM_LOCAL = 0x00000002,
PRINTER_ENUM_CONNECTIONS = 0x00000004,
PRINTER_ENUM_FAVORITE = 0x00000004,
PRINTER_ENUM_NAME = 0x00000008,
PRINTER_ENUM_REMOTE = 0x00000010,
PRINTER_ENUM_SHARED = 0x00000020,
PRINTER_ENUM_NETWORK = 0x00000040,
PRINTER_ENUM_EXPAND = 0x00004000,
PRINTER_ENUM_CONTAINER = 0x00008000,
PRINTER_ENUM_ICONMASK = 0x00ff0000,
PRINTER_ENUM_ICON1 = 0x00010000,
PRINTER_ENUM_ICON2 = 0x00020000,
PRINTER_ENUM_ICON3 = 0x00040000,
PRINTER_ENUM_ICON4 = 0x00080000,
PRINTER_ENUM_ICON5 = 0x00100000,
PRINTER_ENUM_ICON6 = 0x00200000,
PRINTER_ENUM_ICON7 = 0x00400000,
PRINTER_ENUM_ICON8 = 0x00800000,
PRINTER_ENUM_HIDE = 0x01000000,
PRINTER_ENUM_CATEGORY_ALL = 0x02000000,
PRINTER_ENUM_CATEGORY_3D = 0x04000000
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct PRINTER_INFO_2
{
[MarshalAs(UnmanagedType.LPTStr)]
public string pServerName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pPrinterName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pShareName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pPortName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pDriverName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pComment;
[MarshalAs(UnmanagedType.LPTStr)]
public string pLocation;
public IntPtr pDevMode;
[MarshalAs(UnmanagedType.LPTStr)]
public string pSepFile;
[MarshalAs(UnmanagedType.LPTStr)]
public string pPrintProcessor;
[MarshalAs(UnmanagedType.LPTStr)]
public string pDatatype;
[MarshalAs(UnmanagedType.LPTStr)]
public string pParameters;
public IntPtr pSecurityDescriptor;
public uint Attributes; // See note below!
public uint Priority;
public uint DefaultPriority;
public uint StartTime;
public uint UntilTime;
public uint Status;
public uint cJobs;
public uint AveragePPM;
}
[StructLayout(LayoutKind.Sequential)]
public struct DOCINFO
{
[MarshalAs(UnmanagedType.LPWStr)] public string pDocName;
[MarshalAs(UnmanagedType.LPWStr)] public string pOutputFile;
[MarshalAs(UnmanagedType.LPWStr)] public string pDataType;
}
public class PrintDirect
{
[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
public static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);
[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
public static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO
pDocInfo);
[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern long StartPagePrinter(IntPtr hPrinter);
[DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern long WritePrinter(IntPtr hPrinter, string data, int buf, ref int pcWritten);
[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern long EndPagePrinter(IntPtr hPrinter);
[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern long EndDocPrinter(IntPtr hPrinter);
[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern long ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool EnumPrinters(PrinterEnumFlags Flags, string Name, uint Level, IntPtr pPrinterEnum, uint cbBuf, ref uint pcbNeeded, ref uint pcReturned);
}
}
}

View File

@@ -0,0 +1,308 @@
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace StdLabelPrint
{
public partial class LabelPrint
{
public string printerName { get; set; } = string.Empty;
public List<string> connectedPrinter = new List<string>();
public string LastPrintZPL = string.Empty;
public string qrData = string.Empty;
public string baseZPL { get; set; }
public LabelPrint(string _prtName)
{
//GetPrinterList();
//if (connectedPrinter.Contains(_prtName) == false)
// throw new Exception("연결된 프린터가 아닙니다.");
printerName = _prtName;
baseZPL = Properties.Settings.Default.zpl;
}
public List<string> GetPrinterList()
{
connectedPrinter = new List<string>();
var list_local = FindPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL);
var list_connected = FindPrinters(PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS);
try
{
connectedPrinter.AddRange(list_local);
}
catch { }
try
{
connectedPrinter.AddRange(list_connected);
}
catch { }
return connectedPrinter;
}
public string makeZPL_210101(Reel reel, Boolean D1RID, Boolean drawbox, out string qrData)
{
string prtData = string.Empty;
qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum);
prtData = "^XA\r\n";
prtData += "^MMT\r\n";
prtData += "^PW519\r\n";
prtData += "^LL0200\r\n";
prtData += "^LS0\r\n";
prtData += "^FO128,96^GFA,01536,01536,00048,:Z64:\r\n";
prtData += "eJxjYBgFo2AUkADs/xMN/g1G9aNgFMABAIF9rE0=:1194\r\n";
if (drawbox)
prtData += "^FO1,7^GB505,185,4^FS\r\n";
prtData += "^BY2,3,41^FT280,82^BCN,,N,N,N,A\r\n";
prtData += "^FD" + reel.sid + "^FS\r\n";
prtData += "^FT12,160^BQN,2,4\r\n";
prtData += string.Format("^FH\\^FDLA,{0}^FS\r\n", qrData);
prtData += "^BY2,3,32^FT86,185^BCN,,N,N,N,A\r\n";
prtData += string.Format("^FD{0};{1}^FS\r\n", reel.sid, reel.lot);
prtData += "^FO278,7^GB0,26,4^FS\r\n";
prtData += "^FT160,29^A0N,20,19^FH\\^FDSID^FS\r\n";
prtData += "^FT159,111^A0N,20,19^FH\\^FDPN^FS\r\n";
prtData += "^FT159,137^A0N,20,19^FH\\^FDRID^FS\r\n";
prtData += "^FT194,29^A0N,20,19^FH\\^FD" + reel.sid + "^FS\r\n";
prtData += "^FT324,29^A0N,20,19^FH\\^FD" + reel.lot + "^FS\r\n";
prtData += "^FT195,111^A0N,20,19^FH\\^FD" + reel.partnum + "^FS\r\n";
prtData += "^FT195,137^A0N,20,19^FH\\^FD" + (D1RID ? reel.id : string.Empty) + "^FS\r\n"; //210302
prtData += "^FT441,137^A0N,20,19^FH\\^FD" + reel.qty.ToString() + "^FS\r\n";
prtData += "^FT285,29^A0N,20,19^FH\\^FDLOT^FS\r\n";
prtData += "^FT396,137^A0N,20,19^FH\\^FDQTY^FS\r\n";
prtData += "^FO154,7^GB352,28,4^FS\r\n";
prtData += "^FO154,89^GB352,54,4^FS\r\n";
prtData += "^FO190,90^GB0,51,4^FS\r\n";
prtData += "^FO188,9^GB0,24,4^FS\r\n";
prtData += "^FO388,117^GB0,26,4^FS\r\n";
prtData += "^FO430,116^GB0,26,4^FS\r\n";
prtData += "^FO316,7^GB0,26,4^FS\r\n";
prtData += "^PQ1,0,1,Y^XZ\r\n";
return prtData;
}
public string makeZPL_210510(Reel reel, Boolean drawbox, out string qrData)
{
string m_strSend = string.Empty;
qrData = string.Format("{0};{1};{2};{3};{4};{5}", reel.sid, reel.lot, reel.partnum, reel.qty, reel.id, reel.mfg);
m_strSend = this.baseZPL;
m_strSend = m_strSend.Replace("{qrData}", qrData);
m_strSend = m_strSend.Replace("{sid}", reel.sid);
m_strSend = m_strSend.Replace("{lot}", reel.lot);
m_strSend = m_strSend.Replace("{partnum}", reel.partnum);
m_strSend = m_strSend.Replace("{rid}", reel.id);
m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString());
m_strSend = m_strSend.Replace("{mfg}", reel.mfg);
m_strSend = m_strSend.Replace("{supply}", reel.manu);
//줄바꿈제거
m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
return m_strSend;
}
public string makeZPL_210908(Reel reel, Boolean drawbox, out string qrData)
{
string m_strSend = string.Empty;
qrData = string.Format("{0};{1};{2};{3};{4};{5};{6}", reel.sid, reel.lot, reel.manu, reel.qty, reel.id, reel.mfg, reel.partnum);
m_strSend = this.baseZPL;
m_strSend = m_strSend.Replace("{qrData}", qrData);
m_strSend = m_strSend.Replace("{sid}", reel.sid);
m_strSend = m_strSend.Replace("{lot}", reel.lot);
m_strSend = m_strSend.Replace("{partnum}", reel.partnum);
m_strSend = m_strSend.Replace("{rid}", reel.id);
m_strSend = m_strSend.Replace("{qty}", reel.qty.ToString());
m_strSend = m_strSend.Replace("{mfg}", reel.mfg);
m_strSend = m_strSend.Replace("{supply}", reel.manu);
//줄바꿈제거
m_strSend = m_strSend.Replace("\r", "").Replace("\n", "");
return m_strSend;
}
public Boolean TestPrint(Boolean drawbox, string manu = "", string mfgdate = "", Boolean Array7 = false)
{
var dtstr = DateTime.Now.ToShortDateString();
var printcode = "103077807;Z577603504;105-35282-1105;15000;RC00004A219001W;20210612";
var reel = new StdLabelPrint.Reel(printcode);
//reel.id = "RLID" + DateTime.Now.ToString("MMHHmmssfff");
reel.sid = "103000000";
reel.partnum = "PARTNO".PadRight(20, '0'); //20자리
if (mfgdate == "") reel.mfg = dtstr;
else reel.mfg = mfgdate;
reel.lot = "LOT000000000";
if (manu == "") reel.manu = "ATK4EET1";
else reel.manu = manu;
reel.qty = 15000;
var rlt = Print(reel, true, drawbox, Array7);
var fi = new System.IO.FileInfo(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "temp_zpl.txt"));
System.IO.File.WriteAllText(fi.FullName, LastPrintZPL, System.Text.Encoding.Default);
return rlt;
}
public Boolean Print(Reel reel, Boolean display1drid, Boolean drawOUtBox, Boolean Array7 = false)
{
string prtData;
if (Array7)
prtData = makeZPL_210908(reel, drawOUtBox, out qrData);
else
prtData = makeZPL_210510(reel, drawOUtBox, out qrData);
return Print(prtData);
}
public bool Print(string _zpl)
{
this.LastPrintZPL = _zpl;
bool retval = false;
System.IntPtr lhPrinter = new System.IntPtr();
DOCINFO di = new DOCINFO();
int pcWritten = 0;
//string st1;
// text to print with a form feed character
//st1 = "This is std label by using zpl\f";
di.pDocName = "Component Std Label";
di.pDataType = "RAW";
// the \x1b means an ascii escape character
//lhPrinter contains the handle for the printer opened
//If lhPrinter is 0 then an error has occured
//GetPrinterList();
//if (connectedPrinter.Contains(printerName) == false)
// throw new Exception("연결된 프린터가 아닙니다.");
PrintDirect.OpenPrinter(printerName, ref lhPrinter, 0);
PrintDirect.StartDocPrinter(lhPrinter, 1, ref di);
PrintDirect.StartPagePrinter(lhPrinter);
try
{
PrintDirect.WritePrinter(lhPrinter, _zpl, _zpl.Length, ref pcWritten);
retval = true;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
PrintDirect.EndPagePrinter(lhPrinter);
PrintDirect.EndDocPrinter(lhPrinter);
PrintDirect.ClosePrinter(lhPrinter);
return retval;
}
private List<string> FindPrinters(PrinterEnumFlags Flags)
{
List<string> prtList = new List<string>();
uint cbNeeded = 0;
uint cReturned = 0;
if (PrintDirect.EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned))
{
return null;
}
int lastWin32Error = Marshal.GetLastWin32Error();
if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER)
{
IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
if (PrintDirect.EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned))
{
PRINTER_INFO_2[] printerInfo2 = new PRINTER_INFO_2[cReturned];
int offset = pAddr.ToInt32();
Type type = typeof(PRINTER_INFO_2);
int increment = Marshal.SizeOf(type);
for (int i = 0; i < cReturned; i++)
{
printerInfo2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), type);
prtList.Add(printerInfo2[i].pPrinterName);
offset += increment;
}
Marshal.FreeHGlobal(pAddr);
return prtList;
}
lastWin32Error = Marshal.GetLastWin32Error();
}
throw new Win32Exception(lastWin32Error);
}
}
public class Reel
{
public string sid { get; set; }
public string lot { get; set; }
public string mfg { get; set; }
public int qty { get; set; }
public string id { get; set; }
//public string date { get; set; }
public string partnum { get; set; }
public string manu { get; set; }
public Reel()
{
Clear();
}
public void Clear()
{
sid = string.Empty;
lot = string.Empty;
mfg = string.Empty;
lot = string.Empty;
id = string.Empty;
//date = string.Empty;
partnum = string.Empty;
manu = string.Empty;
qty = 0;
}
public Reel(string _sid, string _lot, string _manu, int _qty, string _id, string _mfgdate, string _partnum)
{
int sidNum = 0;
if (int.TryParse(_sid, out sidNum) && sidNum.ToString().Length == 9)
sid = sidNum.ToString();
else
throw new Exception("SID가 숫자가 아니거나 9자리 숫자가 아닙니다.");
lot = _lot;
mfg = _mfgdate;
qty = _qty;
id = _id;
partnum = _partnum;
manu = _manu;
}
public Reel(string qrbarcodestr)
{
var spData = qrbarcodestr.Split(';');
if (spData.Length < 6)
throw new Exception("Barcode Length가 적습니다.");
sid = spData[0];
lot = spData[1];
manu = spData[2];
int _qty = 0;
if (int.TryParse(spData[3], out _qty))
qty = _qty;
else
throw new Exception("수량란에 숫자 정보가 아닙니다.");
id = spData[4];
mfg = spData[5];
if (spData.Length > 6) partnum = spData[6];
else partnum = string.Empty;
}
}
}

View File

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

View File

@@ -0,0 +1,80 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace StdLabelPrint.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute(@"^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR6,6~SD15^JUS^LRN^CI0^XZ
^XA
^MMT
^PW519
^LL0200
^LS25
^FO205,5^GB305,186,4^FS
^FT25,170^BQN,2,4
^FDLA,
{qrData}
^FS
^FO205,9^GB0,183,4^FS
^FO250,9^GB0,183,4^FS
^FO209,34^GB299,0,4^FS
^FO209,65^GB299,0,4^FS
^FO207,95^GB300,0,4^FS
^FO207,126^GB303,0,4^FS
^FT211,30^A0N,23,24^FDSID^FS
^FT210,59^A0N,23,24^FDLOT^FS
^FT215,91^A0N,23,24^FDPN^FS
^FT212,153^A0N,23,24^FDRID^FS
^FT210,120^A0N,23,24^FDQ'ty^FS
^FT260,31^A0N,23,24^FD
{sid}
^FS
^FT260,60^A0N,23,24^FD
{lot}
^FS
^FT258,93^A0N,27,16^FD
{partnum}
^FS
^FT256,150^A0N,21,19^FD
{rid}
^FS
^FT259,121^A0N,23,24^FD
{qty}
^FS
^FO207,157^GB303,0,4^FS
^FT212,182^A0N,20,19^FDDate^FS
^FT260,183^A0N,23,24^FD
{mfg}
^FS
^PQ1,0,1,Y^XZ")]
public string zpl {
get {
return ((string)(this["zpl"]));
}
set {
this["zpl"] = value;
}
}
}
}

View File

@@ -0,0 +1,51 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="StdLabelPrint.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="zpl" Type="System.String" Scope="User">
<Value Profile="(Default)">^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR6,6~SD15^JUS^LRN^CI0^XZ
^XA
^MMT
^PW519
^LL0200
^LS25
^FO205,5^GB305,186,4^FS
^FT25,170^BQN,2,4
^FDLA,
{qrData}
^FS
^FO205,9^GB0,183,4^FS
^FO250,9^GB0,183,4^FS
^FO209,34^GB299,0,4^FS
^FO209,65^GB299,0,4^FS
^FO207,95^GB300,0,4^FS
^FO207,126^GB303,0,4^FS
^FT211,30^A0N,23,24^FDSID^FS
^FT210,59^A0N,23,24^FDLOT^FS
^FT215,91^A0N,23,24^FDPN^FS
^FT212,153^A0N,23,24^FDRID^FS
^FT210,120^A0N,23,24^FDQ'ty^FS
^FT260,31^A0N,23,24^FD
{sid}
^FS
^FT260,60^A0N,23,24^FD
{lot}
^FS
^FT258,93^A0N,27,16^FD
{partnum}
^FS
^FT256,150^A0N,21,19^FD
{rid}
^FS
^FT259,121^A0N,23,24^FD
{qty}
^FS
^FO207,157^GB303,0,4^FS
^FT212,182^A0N,20,19^FDDate^FS
^FT260,183^A0N,23,24^FD
{mfg}
^FS
^PQ1,0,1,Y^XZ</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -0,0 +1,63 @@
<?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>{B18D3B96-2FDF-4ED9-9A49-D9B8CEE4ED6D}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StdLabelPrint</RootNamespace>
<AssemblyName>StdLabelPrint</AssemblyName>
<TargetFrameworkVersion>v4.7</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>
</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>
</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.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CAmkorSTDBarcode.cs" />
<Compile Include="Def.cs" />
<Compile Include="LabelPrint.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="StdLabelPrint.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<StdLabelPrint.Properties.Settings>
<setting name="zpl" serializeAs="String">
<value>^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR6,6~SD15^JUS^LRN^CI0^XZ
^XA
^MMT
^PW519
^LL0200
^LS25
^FO205,5^GB305,186,4^FS
^FT25,170^BQN,2,4
^FDLA,
{qrData}
^FS
^FO205,9^GB0,183,4^FS
^FO250,9^GB0,183,4^FS
^FO209,34^GB299,0,4^FS
^FO209,65^GB299,0,4^FS
^FO207,95^GB300,0,4^FS
^FO207,126^GB303,0,4^FS
^FT211,30^A0N,23,24^FDSID^FS
^FT210,59^A0N,23,24^FDLOT^FS
^FT215,91^A0N,23,24^FDPN^FS
^FT212,153^A0N,23,24^FDRID^FS
^FT210,120^A0N,23,24^FDQ'ty^FS
^FT260,31^A0N,23,24^FD
{sid}
^FS
^FT260,60^A0N,23,24^FD
{lot}
^FS
^FT258,93^A0N,27,16^FD
{partnum}
^FS
^FT256,150^A0N,21,19^FD
{rid}
^FS
^FT259,121^A0N,23,24^FD
{qty}
^FS
^FO207,157^GB303,0,4^FS
^FT212,182^A0N,20,19^FDDate^FS
^FT260,183^A0N,23,24^FD
{mfg}
^FS
^PQ1,0,1,Y^XZ</value>
</setting>
</StdLabelPrint.Properties.Settings>
</userSettings>
</configuration>

1
Handler/Sub/arAzinAxt Submodule

Submodule Handler/Sub/arAzinAxt added at e14c9dd159

1
Handler/Sub/arCtl Submodule

Submodule Handler/Sub/arCtl added at 249154147d

View File

@@ -0,0 +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;
}
}
}

View File

@@ -0,0 +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;
}
}
}

View File

@@ -0,0 +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
}
}

View File

@@ -0,0 +1,632 @@
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 GridView : System.Windows.Forms.Control
{
private int bordersize = 0;
private int menubordersize = 1;
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 bordercolor = System.Drawing.Color.Black;
private Boolean textattachtoimage = true;
private Boolean _showIndexString = true;
private System.Drawing.Color _shadowColor = System.Drawing.Color.Transparent;
private System.Drawing.Color foreColorPin = System.Drawing.Color.WhiteSmoke;
private System.Drawing.Font fontPin = new Font("Consolas", 8, FontStyle.Bold);
private Point _matrixsize = new Point(8, 2);
public Point MatrixSize { get { return _matrixsize; } set { _matrixsize = value; ResetArray(); RemakeChartRect(); } }
public Boolean arVeriticalDraw { get; set; }
[Browsable(false)]
public int ColumnCount { get { return _matrixsize.X; } }
[Browsable(false)]
public int RowCount { get { return _matrixsize.Y; } }
public int ItemCount { get { return ColumnCount * RowCount; } }
private GridViewItem[] Items;
private UInt16[] _values;
private string[] _titles;
private string[] _tags;
private string[] _names;
private ColorListItem[] _colorlist;
public ColorListItem[] ColorList { get { return _colorlist; } set { _colorlist = value; this.Invalidate(); } }
public string[] Names { get { return _names; } set { _names = value; Invalidate(); } }
public string[] Titles { get { return _titles; } set { _titles = value; Invalidate(); } }
public UInt16[] Values { get { return _values; } set { _values = value; Invalidate(); } }
public string[] Tags { get { return _tags; } set { _tags = value; } }
private bool _showdebuginfo = false;
public Boolean showDebugInfo { get { return _showdebuginfo; } set { _showdebuginfo = value; Invalidate(); } }
public void setNames(string[] value)
{
_names = value;
}
public void setTitle(string[] value)
{
List<string> titlerows = new List<string>();
List<string> tagrows = new List<string>();
for (int i = 0; i < value.Length; i++)
{
var r = (int)(Math.Floor((double)(i / ColumnCount)));
var c = i % ColumnCount;
//세로 그리기 였을때에는 다르게 처리해야함 201215
if(arVeriticalDraw)
{
c = (int)(Math.Floor((double)(i / ColumnCount)));
r = i % ColumnCount;
}
if (titlerows.Count < r + 1) titlerows.Add(string.Empty);
if (tagrows.Count < r + 1) tagrows.Add(string.Empty);
var prestr = titlerows[r];
if (c > 0 ) prestr += "|";
titlerows[r] = prestr + value[i];
var prestr_t = tagrows[r];
if (prestr_t != "") prestr_t += "|";
tagrows[r] = prestr_t + "";
if (i < itemCount) this.Items[i].Enable = true;
}
this._titles = titlerows.ToArray();
this._tags = tagrows.ToArray();
}
public void setTags(string[] value)
{
List<string> titlerows = new List<string>();
for (int i = 0; i < value.Length; i++)
{
var r = (int)(Math.Floor((double)(i / ColumnCount)));
var c = i % ColumnCount;
if (titlerows.Count < r + 1) titlerows.Add(string.Empty);
var prestr = titlerows[r];
if (c > 0 ) prestr += "|";
titlerows[r] = prestr + value[i];
if (i < itemCount) this.Items[i].Enable = true;
}
this._tags = titlerows.ToArray();
}
public Boolean setTitle(int row, int col, string value, string itemtag = "")
{
if (_titles == null) _titles = new string[0];
if (_tags == null) _tags = new string[0];
if (row >= _titles.Length) Array.Resize(ref _titles, row + 1);
if (row >= _tags.Length) Array.Resize(ref _tags, row + 1);
if (_titles[row] == null) _titles[row] = string.Empty;
if (_tags[row] == null) _tags[row] = string.Empty;
var linebuf = _titles[row].Split('|');
var linebuf_t = _tags[row].Split('|');
if (col >= linebuf.Length) Array.Resize(ref linebuf, col + 1);
if (col >= linebuf_t.Length) Array.Resize(ref linebuf_t, col + 1);
linebuf[col] = value;
linebuf_t[col] = itemtag;
_titles[row] = string.Join("|", linebuf);
_tags[row] = string.Join("|", linebuf_t);
return true;
//var idx = row * this.ColumnCount + col;
//return setTitle(idx, value);
}
public Boolean setTitle(int idx, string value)
{
if (idx < ColumnCount) return setTitle(0, idx, value);
else
{
//줄값이 필요하다
var row = (int)(Math.Floor((double)(idx / ColumnCount)));
var col = idx % ColumnCount;
return setTitle(row, col, value);
}
}
public void setValue(bool[] value)
{
var v = new UInt16[value.Length];
for (int i = 0; i < value.Length; i++)
v[i] = (UInt16)(value[i] ? 1 : 0);
_values = v;
//값이 잇으니 enable 한다
for (int i = 0; i < value.Length; i++)
{
if (i < Items.Length)
this.Items[i].Enable = true;
}
}
public void setValue(UInt16[] value)
{
_values = value;
for (int i = 0; i < value.Length; i++)
{
if (i < Items.Length)
this.Items[i].Enable = true;
}
}
public Boolean setValue(int idx, ushort value)
{
if (idx >= _values.Length || idx >= this.Items.Length) return false;
this._values[idx] = value;
this.Items[idx].Enable = true;
return true;
}
public void ClearValue(ushort defaultValue = 0)
{
if (_values != null)
for (int i = 0; i < _values.Length; i++)
_values[i] = defaultValue;
}
public void ClearTitle(string defaultValue = "")
{
if (_values != null)
for (int i = 0; i < _titles.Length; i++)
_titles[i] = defaultValue;
}
public void setValue(ushort value)
{
for (int i = 0; i < _values.Length; i++)
this._values[i] = value;
}
public void setItemEnable(int idx, bool value)
{
if (idx >= _values.Length || idx >= this.Items.Length) return;
this.Items[idx].Enable = value;
}
/// <summary>
/// 지정된 컬러태그값을 입력한다.
/// </summary>
/// <param name="idx"></param>
/// <param name="tagString"></param>
/// <returns></returns>
public Boolean setValue(int idx, string tagString)
{
//동일태그값을 찾는다
if (idx >= _values.Length) return false;
int value = -1;
for (int i = 0; i < ColorList.Length; i++)
if (ColorList[i].Remark.ToLower() == tagString.ToLower())
{
value = i;
break;
}
if (value != -1)
{
this._values[idx] = (ushort)value;
this.Items[idx].Enable = true;
return true;
}
else return false;
}
public Boolean setValue(int idx, bool value)
{
return setValue(idx, (ushort)(value ? 1 : 0));
}
public Boolean setValue(int row, int col, ushort value)
{
var idx = row * this.ColumnCount + col;
return setValue(idx, value);
}
public Boolean setValueToggle(int row, int col, ushort value1, ushort value2)
{
var idx = row * this.ColumnCount + col;
if (getValue(idx) == value1) return setValue(idx, value2);
else return setValue(idx, value1);
}
public Boolean setValue(int row, int col, bool value)
{
var idx = row * this.ColumnCount + col;
return setValue(idx, (ushort)(value ? 1 : 0));
}
public Boolean setValue(int row, int col, string value)
{
var idx = row * this.ColumnCount + col;
return setValue(idx, value);
}
public ushort getValue(int idx)
{
if (idx >= _values.Length) return 0;
return _values[idx];
}
public ushort getValue(int row, int col)
{
var idx = row * this.ColumnCount + col;
return getValue(idx);
}
[Category("arFrame")]
public bool ShowIndexString { get { return _showIndexString; } set { _showIndexString = value; Invalidate(); } }
[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 MenuGap { get { return menugap; } set { this.menugap = value; RemakeChartRect(); Invalidate(); } }
[Category("arFrame"), DisplayName("글자를 이미지 다음에 표시"), Description("이미지가 있는 경우 해당 이미지 옆에 글자를 붙입니다")]
public Boolean TextAttachToImage { get { return textattachtoimage; } set { this.textattachtoimage = value; Invalidate(); } }
[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("색상-전체배경색")]
public override System.Drawing.Color BackColor { get { return backcolor; } set { this.backcolor = value; Invalidate(); } }
[Category("arFrame"), DisplayName("색상-글자(그림자)")]
public System.Drawing.Color ShadowColor { get { return _shadowColor; } set { _shadowColor = value; this.Invalidate(); } }
[Category("arFrame"), DisplayName("색상-글자")]
public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } }
[Category("arFrame"), DisplayName("색상-글자(번호)")]
public Color ForeColorPin { get { return foreColorPin; } set { foreColorPin = value; } }
[Category("arFrame"), DisplayName("글꼴-번호")]
public Font FontPin { get { return fontPin; } set { fontPin = value; Invalidate(); } }
[Category("arFrame"), DisplayName("글꼴-항목")]
public override Font Font { get { return base.Font; } set { base.Font = value; Invalidate(); } }
private int mouseOverItemIndex = -1;
public GridView()
{
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);
//값과 이름은 외부의 값을 사용한다
ResetArray();
if (MinimumSize.Width == 0 || MinimumSize.Height == 0)
MinimumSize = new Size(100, 50);
}
void ResetArray()
{
if (this._values != null) Array.Resize(ref this._values, itemCount);// = new UInt16[itemCount];
// if (this._titles != null) Array.Resize(ref this._titles, itemCount);//
// if (this._names != null) Array.Resize(ref this._names, itemCount);//
}
int itemCount { get { return ColumnCount * RowCount; } }
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
RemakeChartRect();
}
public event EventHandler<ItemClickEventArgs> ItemClick;
public class ItemClickEventArgs : EventArgs
{
public int idx { get; set; }
public GridViewItem Item { get; set; }
public ItemClickEventArgs(int idx_, GridViewItem item)
{
this.Item = item;
this.idx = idx_;
}
}
protected override void OnMouseClick(MouseEventArgs e)
{
//마우스클릭시 해당 버튼을 찾아서 반환한다.
if (Items == null || Items.Length < 1) return;
for (int i = 0; i < Items.Length; i++)
{
var rect = Items[i].rect;//[i];
if (rect.Contains(e.Location))
{
var menu = Items[i];
//미사용개체는 이벤트를 아에 발생하지 않는다
if (menu.Enable == true && ItemClick != null)
ItemClick(this, new ItemClickEventArgs(i, menu));
break;
}
}
}
protected override void OnMouseLeave(EventArgs e)
{
this.mouseOverItemIndex = -1;
this.Invalidate();
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (Items == null || Items.Length < 1)
{
this.mouseOverItemIndex = -1;
return;
}
for (int i = 0; i < Items.Length; i++)
{
var rect = Items[i].rect;// rects[i];
if (rect.Contains(e.Location))
{
if (i != mouseOverItemIndex)
{
mouseOverItemIndex = i;
this.Invalidate();
}
break;
}
}
}
public void setItemTextAlign(int row, int col, System.Drawing.ContentAlignment TextAlign)
{
var item = this.Items.Where(t => t.row == row && t.col == col).FirstOrDefault();
if (item != null) item.TextAlign = TextAlign;
}
public void setItemTextAlign(System.Drawing.ContentAlignment TextAlign)
{
foreach (var item in this.Items)
item.TextAlign = TextAlign;
}
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(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);
}
}
public void drawItem(int itemIndex, Graphics g = null)
{
if (g == null) g = this.CreateGraphics();
var menu = this.Items[itemIndex];
if (menu.rect == RectangleF.Empty) return;
var rect = menu.rect;// rects[i];
var diplayText = string.Empty;
// if(_titles[1].Trim() != "")
// Console.WriteLine("sdf");
//타이틀이 줄번호별로 처리됨
if (_titles != null && menu.row < _titles.Length)
{
if (_titles[menu.row] == null) _titles[menu.row] = string.Empty;
var linebif = _titles[menu.row].Split('|');
if (menu.col < linebif.Length)
diplayText = linebif[menu.col];
}
UInt16 Value = 0;
if (_values != null && menu.idx < _values.Length) Value = _values[menu.idx];
//배경이 투명이 아니라면 그린다.
var bgColor1 = Color.FromArgb(30, 30, 30);// BackColor1Off;
var bgColor2 = Color.FromArgb(30, 30, 30);// BackColor2Off;
//해당 값에 따른 컬러값을 읽는다.
if (ColorList != null && Value < ColorList.Length)
{
bgColor1 = this.ColorList[Value].BackColor1;
bgColor2 = this.ColorList[Value].BackColor2;
}
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
{
if (MenuBorderSize > 0)
{
using (var p = new Pen(BorderColor, MenuBorderSize))
g.DrawRectangle(p, rect.Left, rect.Top, rect.Width, rect.Height);
}
}
//인덱스번호 출력
if (ShowIndexString && _names != null && menu.idx < _names.Length)
{
//표시글자
var idxstr = string.Format("[{0}] {1}", menu.idx, _names[menu.idx]);
//그림자 추가
if (ShadowColor != System.Drawing.Color.Transparent)
g.DrawString(idxstr, FontPin, new SolidBrush(ShadowColor), menu.rect.Left + 4, menu.rect.Top + 4);
//일반글자표시
g.DrawString(idxstr, FontPin, new SolidBrush(this.ForeColorPin), menu.rect.Left + 3, menu.rect.Top + 3);
}
if (diplayText != "")
{
using (StringFormat sf = new StringFormat(StringFormatFlags.NoClip))
{
//글자를 텍스트 이후에 붙이는 거라면?
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;
//그림자 추가
if (ShadowColor != System.Drawing.Color.Transparent)
g.DrawString(diplayText, this.Font, new SolidBrush(ShadowColor),
new RectangleF((float)(rect.Left + 1f), (float)(rect.Top + 1f), (float)rect.Width, (float)rect.Height), sf);
g.DrawString($"{diplayText}", this.Font, new SolidBrush(ForeColor), rect, sf);
}
}
if (showDebugInfo)
{
g.DrawString(Value.ToString(), this.fontPin, Brushes.SkyBlue, rect.Left, rect.Top);
}
}
/// <summary>
/// arFrame 전용 속성값을 복사 합니다
/// </summary>
/// <param name="ctl"></param>
public void copyTo(GridView ctl)
{
ctl.backcolor = this.backcolor;
ctl.menugap = this.menugap;
ctl.Items = this.Items;
ctl.menubordersize = this.menubordersize;
ctl.padding = this.padding;
ctl.ForeColor = this.ForeColor;
ctl.Font = this.Font;
ctl.TextAttachToImage = this.TextAttachToImage;
ctl.bordercolor = this.bordercolor;
ctl.bordersize = this.bordersize;
}
public void RemakeChartRect()
{
if (DisplayRectangle == Rectangle.Empty) return;
double x = 0;
double y = 0;
double w = DisplayRectangle.Width / (ColumnCount * 1.0);
double h = DisplayRectangle.Height / (RowCount * 1.0);
//아이템갯수가 달라졌으므로 다시 갱신해야함
GridViewItem[] item = new GridViewItem[RowCount * ColumnCount];
if(arVeriticalDraw)
{
for (int c = 0; c < ColumnCount; c++)
{
for (int r = 0; r < RowCount; r++)
{
int idx = c * ColumnCount + r;
item[idx] = new GridViewItem(idx, r, c);
if (this.Items != null && idx < this.Items.Length)
item[idx].Enable = this.Items[idx].Enable; // false;
else
item[idx].Enable = false;
item[idx].Padding = new Padding(0, 0, 0, 0);
item[idx].TextAlign = ContentAlignment.MiddleCenter;
x = (c * w);
y = (r * h);
item[idx].Dirty = true;
item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h);
}
}
}
else
{
for (int r = 0; r < RowCount; r++)
{
for (int c = 0; c < ColumnCount; c++)
{
int idx = r * ColumnCount + c;
item[idx] = new GridViewItem(idx, r, c);
if (this.Items != null && idx < this.Items.Length)
item[idx].Enable = this.Items[idx].Enable; // false;
else
item[idx].Enable = false;
item[idx].Padding = new Padding(0, 0, 0, 0);
item[idx].TextAlign = ContentAlignment.MiddleCenter;
x = (c * w);
y = (r * h);
item[idx].Dirty = true;
item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h);
}
}
}
this.Items = item;
this.Invalidate();
}
}
}

View File

@@ -0,0 +1,36 @@
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

@@ -0,0 +1,676 @@
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

@@ -0,0 +1,69 @@
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

@@ -0,0 +1,36 @@
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

@@ -0,0 +1,33 @@
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

@@ -0,0 +1,36 @@
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

@@ -0,0 +1,21 @@
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

@@ -0,0 +1,36 @@
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

@@ -0,0 +1,21 @@
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

@@ -0,0 +1,56 @@
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

@@ -0,0 +1,36 @@
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

@@ -0,0 +1,306 @@
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

@@ -0,0 +1,36 @@
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

@@ -0,0 +1,104 @@
<?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.7</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>
<PlatformTarget>AnyCPU</PlatformTarget>
<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>

Submodule Handler/Sub/arImageViewer_Emgu added at b597e86611

1
Handler/Sub/arMCFrame Submodule

Submodule Handler/Sub/arMCFrame added at a398dc0ae4

1
Handler/Sub/arRS232 Submodule

Submodule Handler/Sub/arRS232 added at e9b6a0a0d1

Submodule Handler/Sub/tcpservice added at d7fe2baa0e