레이블이 control인 게시물을 표시합니다. 모든 게시물 표시
레이블이 control인 게시물을 표시합니다. 모든 게시물 표시

2015년 8월 8일 토요일

C# windows Form 의 chart control 사용하기 (part 2)

 C#으로 chart 컨트롤을 사용하는 기본적인 방법에 대해서 이전 포스트에서 알아보았는데 여기에서는 여러 개의 그래프를 하나의 창에 도시하는 방법과 축의 분리에 대해서 알아보도록 하겠다.

 Chart 객체는 여러 개의 Series 그리고 한 개 이상의 ChartArea 객체를 콜렉션 멤버로 가지고 있으며 chart1.Series 와 chart1.ChartArea 같이 접근할 수 있다.

  • Series 객체는 도시할 그래프를 구성하는 점의 집합
  • ChartArea 객체는 그래프를 보여줄 영역

ChartArea는 초기에 한 개가 미리 생성되어 있고 chart1.ChartArea[0] 혹은 chart1.ChartArea[“ChartArea1”]와 같이 인덱스나 이름(문자열)로 접근할 수 있다. Series 객체도 초기에 하나가 생성되어 있으며 ChartArea[0]에 연결되어 있다. 그리고 사용자가 새로 생성되는 Series 객체는 이 default ChartArea와 자동으로 연결이 된다.

private void Form1_Load(object sender, EventArgs e)
{
   chart1.Series.Clear(); //default series를 삭제한다.
   Series series1 = chart1.Series.Add("graph1");
   series1.ChartType = SeriesChartType.Line;
   for (double k=0;k<2*Math.PI;k+=0.1)
   {
       series1.Points.AddXY(k, Math.Sin(k));
   }

   Series series2 = chart1.Series.Add("graph2");
   series2.ChartType = SeriesChartType.Line;
   for (double k = 0; k < 2 * Math.PI; k += 0.1)
   {
       series2.Points.AddXY(k, Math.Cos(k) - 2.0);
   }
}

위와 같이 생성된 Series객체 두 개 모두 ChartArea[0]로 (자동으로) 연결되며 이전 포스트에서 보여준 바와 같이 x축과 y축이 모두 공유된다.

 그런데 같은 영역의 두 그래프의 축을 분리할 수도 있다. 예를 들어 y축 스케일이 다른 두 개의 그래프를 하나의 영역에 겹쳐서 도시하고 싶다면 다음과 같이 하면 된다.

series2.YAxisType = AxisType.Secondary;

이렇게 하면 두 개의 그래프의 x축은 공통이고 분리된 y축의 스케일이 그래프 우측에 표시된다.


이 결과를 보면 그래프영역 우측의 y축에 secondary 축의 단위가 표시됨을 알 수 있다. Series.XAxisType 이나 Seires.YAxisType 프로퍼티는 별도로 지정하지 않으면 AxisType.Primary 로 자동 지정된다.

여기서 한 가지 알아두어야 할 것은 series1과 series2는 y축만 분리되었고 x축은 공통이기 때문에 다음과 같이 x축의 범위를 변경하면 둘 다 영향을 받는다는 점이다.

chart1.ChartAreas[0].AxisX.Minimum = 2.0;
chart1.ChartAreas[0].AxisX.Maximum = 4.0;


하지만 AxisY의 범위를 조절하면 series1만 영향을 받는다.

chart1.ChartAreas[0].AxisY.Minimum = -0.5;
chart1.ChartAreas[0].AxisY.Maximum = 0.5;


series2의 y축 범위를 조절하려면 다음과 같이 하면 된다.

chart1.ChartAreas[0].AxisY2.Minimum = -2.5;
chart1.ChartAreas[0].AxisY2.Maximum = -1.5;


이번에는 series2의 y축 범위만 조정되었음을 알 수 있다.

이와 같이 하나의 ChartArea에 여러 개의 Series 들을 도시할 수 있는데 각 Series의 축을 분리할 수 있으며 x축만 분리할 수도 있고 y축만 분리할 수도 있으며 둘 다 분리할 수도 있다.



C# windows Form 의 chart control 사용하기 (part 1)

 윈도우스 폼프로그래밍에서 그래프나 차트를 그리기 위한 콘트롤로 chart 라는 것이 있다. (.net 4.5부터인가 지원하기 시작함) 이것을 이용하면 간단한 그래프를 작성하는데 외부 라이브러리(예를 들어 oxyplot)를 사용할 필요가 없다.

 비주얼 스튜디오로 winForm 프로젝트를 하나 생성하여 도구상자에서 chart를 끌어다가 적당히 위치시킨 후 docking 시킨다.


그러면 chart1이라는 인스턴스가 생성되는데 이것를 이용하여 그래프를 제어할 수 있다.


using System.Windows.Forms.DataVisualization.Charting;
private void Form1_Load(object sender, EventArgs e)
{
 chart1.Series.Clear(); //default series를 삭제한다.
 Series sSin = chart1.Series.Add("sin"); //새로운 series 생성
 sSin.ChartType = SeriesChartType.Line; //그래프 모양을 '선'으로 지정
 //데이터 포인트 저장
 for (double k=0;k<2*Math.PI;k+=0.1)
 {
      sSin.Points.AddXY(k, Math.Sin(k));
 }
}

결과 화면은 다음과 같다.


한 화면에 다수의 그래프를 그릴 수도 있는데 Series 객체만 추가시켜주면 된다.

private void Form1_Load(object sender, EventArgs e)
{
   chart1.Series.Clear(); //default series를 삭제한다.
   Series sSin = chart1.Series.Add("sin"); //새로운 series 생성
   sSin.ChartType = SeriesChartType.Line; //그래프를 '선'으로 지정
   //데이터 포인트 저장
   for (double k=0;k<2*Math.PI;k+=0.1)
   {
       sSin.Points.AddXY(k, Math.Sin(k));
   }
           
   // 같은 화면에 그래프 추가
   Series sCos = chart1.Series.Add("cos"); //새로운 series 생성
   sCos.ChartType = SeriesChartType.Line;
   for (double k = 0; k < 2 * Math.PI; k += 0.1)
   {
       sCos.Points.AddXY(k, Math.Cos(k));
   }
}

그러면 다음과 같이 두개의 그래프가 그려진다.


chart콘트롤은 Series객체가 갱신될 때마다(즉, 데이터 포인트가 추가될때마다) 자동으로 그래프 영역을 갱신시켜 준다.


2015년 8월 1일 토요일

키움 openAPI 의 C# 윈도폼 콘트롤로 로그인창 띄우기

 이전 포스트에서 만든 windows Form control을 테스트하기 위해서 다음과 같이 로그인 메뉴를 하나 생성해서 간단한 코드를 작성해 보자.

 먼저 [도구 상자]에서 menu strip을 윈폼에 드래그 앤 드랍해서 메뉴줄을 만든 다음 File 메뉴와 그 밑에 로그인 메뉴를 만든다. 그리고 로그인 메뉴를 더블클릭하면 로그인이 선택되었을 때 호출되는 함수를 자동으로 만들어 준다.


그 함수 본체에 다음과 같은 프로그램을 입력한다.


여기서 axKHOpenAPI 객체는 이전 포스트에서 만든 콘트롤의 객체이다. 이 객체의 CommConnect() 함수는 로그인창을 띄워서 로그인을 진행할 수 있게 해준다. 아래는 개발자 매뉴얼의 ConnConnect()함수 설명이다.


만약 성공적으로 로그인 창이 생성되었다면 0 값을 반환한다. 로그인이 되면 폼의 타이틀에 “로그인창 활성화”라고 표시해 주는 간단한 프로그램이다.


실제로 로그인이 성공적으로 되었는지를 체크하려면 이벤트를 수신하여 그 결과값을 보아야 한다.


키움 openAPI 의 C# 윈도폼 콘트롤 생성하기

 여기에서는 visual studio를 이용하여 C# windows Form 프로젝트에 키움 openAPI 의 activaX 모듈에 접근할 수 있는 콘트롤을 생성하는 방법을 설명하도록 하겠다. 사용하는 도구는 visual studio 2015 community 버전인데 이것은 사용에 제약이 없는 무료 프로그램이므로 쉽게 다운로드 받아서 바로 설치할 수 있다. ( 이전 포스트의 모든 단계는 완료 되었다고 가정한다.)

 visual studio를 실행시켜서 새로운 프로젝트를 생성한다.


그 다음 <windows Forms 응용 프로그램(visual c#)>을 선택하여 이름을 적당히 입력하고 프로젝트를 생성한다.


그러면 다음과 같이 빈 프로젝트가 생성된다.


그 다음 다음과 같이 도구>도구상자 항목 선택(X) 을 실행한다.


그 다음 [COM 구성 요소]에서 [KHOpenAPI Control] 항목을 찾아 체크한 후 [확인] 버튼을 클릭한다. 키움 openAPI 모듈이 설치되면서 이 모듈은 자동으로 윈도우에 등록이 되므로 여기에서 보여야 한다. (만약 보이지 않는다면 키움 openAPI 모듈을 다시 설치한다.)


이제 도구상자 (보기(V)>도구상자(X)메뉴를 선택한다) 에 다음과 같이 컨트롤이 생성되었으며 이것을 드래그 앤 드랍으로 폼위에 배치시킨다.


속성창에서 이름(name)을 적당히 변경한다. 프로그램에서는 이 이름으로 openAPI모듈의 함수들을 호출할 수 있다.

 만약 이러한 과정이 번거롭다면 키움 자료실에 C#예제가 등록되어 있으니 그것을 다운로드 받아서 수정하여 사용하여도 된다.


2015년 4월 24일 금요일

[00084] 파이썬의 control system library

  파이썬의 numpy, scipy, 심지어 sympy 까지 있는데 MATLAB의 control system toolbox 같은 것은 없나.. 하고 생각했었는데 있었다. 사용자 매뉴얼을 아래에 링크하였다.

python control system library User's manual


이 모듈은 winPython 에서 기본적으로 설치되어 있지 않다. 하지만 윈파이썬의 콘솔창(Tools > Open command prompt) 에서 다음과 같이 명령을 내리면 자동으로 인스톨된다.

------------------------------------------------------------------------
> pip install control
------------------------------------------------------------------------


이 라이브러리는 기본적인 선형제어 시스템에 관련된 함수들과 클래스가 정의되어 있고 MATLAB control toolbox 와 이름체계가 비슷한 것 같다.

이제 simulink 같은 툴만 나오면 되는 건가.. 갈수록 파이썬에 놀라는 중이다.
[#00084]