Open Robotics
Windows 환경의 C++ 언어에서 gnuplot을 사용한 그래프 출력 view 발행 | Sample Code
방랑야옹이~ 2010.03.06 01:56
위와같이 사용했는데요. 그래프 위와 같은 출력화면은 나오지않고 gnuplot화면만 나옵니다.
또한 gnuplot화면의 글씨 크기가 너무 작아서 알수가 없는데 해결방법이 있을까요? 답변 부탁드립니다.
폰트를 바꿀 때는 gnuplot 화면에서 마우스 오른쪽 버튼을 누르면 팝업 메뉴가 뜨는데 거기서 "Choose Font"를 선택하시어 폰트를 바꾸면 됩니다. 그리고 화면에서 다시한번 마우스 오른쪽 버튼을 눌러 "Update ...ini" 를 선택하시면 됩니다.
안녕하세요 블러그 내용 잘 보고 있습니다 감사합니다.
질문이 하나 잇는데요... 1.dat 화일은 어떻게 만든화일이면 어떤 역활을 하는지요??
(개인적으로 1.txt 화일에 한줄당 (1111111, 2222222) 이렇게 입력했구요
dat 화일은 어떤 형식으로 저장되는지요??
초보 질문이라 귀찮으시겠지만 보시면 답변 부탁드릴께요~ 감사합니다.
.dat나 .txt나 확장자는 의미가 없습니다. 1.txt 파일을 만들고 다음과 같이 입력 후 그래프를 그리면 v자 모양의 그래프를 볼 수 있습니다.

1, 3
2, 2
3, 1
4, 2
5, 3

plot 명령은 2차원 x,y-좌표계에서 연속된 점을 그래프로 그려 주는 명령입니다. 그래서 파일은 연속된 점들의 집합을 가지고 있으면 됩니다. 즉 x, y 의 좌표가 매 줄마다 반복되어 저장되어 있다면 이를 그래프로 그려줍니다.
답변 감사합니다. 비공개로 가져갑니다. 좋은 정보 너무감사해요.. 나머지는 제가 도큐먼트 보면서 공부해나갈께요~
안녕하세요. 블로그 내용 보며 찾고 메뉴얼도 찾아보고 구글링도 해보며 많은 ㄴ도움이 되었고 원하던 MFC에서 출력도 잘해보았습니다 감사합니다.
다름이 아니고 욕심이 하나 나서 질문을 하나 해볼께요...

Multybyte 형식으로 하라고 적으셨는데요 Unicode로 하면 안되는지요??
(프로젝트에 그래프를 추가하는데 원래 unicode로 작성된건 multybyte로 다 바꾸긴햇는데... 잘되긴하지만요 ;;)

unicode에서 에러만 수정하면 에러는 없어도 gnuplot만 실행이 안되네요...

저번 답변감사합니다.. 나중에 시간되심 답변 부탁드릴께요~
예, 유니코드로 바꾸는 것도 어렵지 않을 것 같습니다.
프로젝트를 바꿔서 한 번 올려보겠습니다.

감사합니다.
답변 감사합니다. 혹시 유니코드가 아니라 멀티코드로 하신거 아닌지요?
링크해주신 화일 압축 풀어서 '유니코드'     로 실행해보면     pgnuplot.cpp화일의 아래부분에서 에러 납니다.

1. HWND hwndChild = FindWindowEx(hwnd, NULL, TEXTCLASS, NULL ); // 3번째변수 TEXTCALSS
('FindWindowExW' : 매개 변수 3을(를) 'const char [14]'에서 'LPCWSTR'(으)로 변환할 수 없습니다.)
2. BOOL bSuccess = CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); //2번째 path
('CreateProcessW' : 매개 변수 2을(를) 'char [261]'에서 'LPWSTR'(으)로 변환할 수 없습니다.)

힘들게 답변해주시고 링크까지해주셨는데 또 다시 질문드리게 되서 죄송합니다.
아, 예. 6월 7일 추가한 예제는 멀티코드로 되어있습니다. 이전 답글은 이걸 유니코드로 바꾼다는 예기였습니다. ^^
조만간 바꿔 보겠습니다. ^^
좋은 정보 감사드립니다!!!~
좋은정보로 test 해보고 있습니다. MFC(VC2010) 에서 pgnuplot.cpp/h 파일 로드해서 버튼달고 실행하게 했는데 gnu plot 이 실행되고 바로 종료가 되어 버리네요...wgnuplot 링크도 제대로 하고 위에 simple 예제로도 해봤는데 바로 종료되어 버리니 제대로 curve를 확인도 못했네요...굉장히 쉬운문제일것 ? 같은데요...제가 무슨 설정을 잘못했을까요? 질문드립니다~! script로 하면 plot이 금방 사라지는 것같은데.... 안사라지게 하려면 어떤 setting을 해야할까요...T.T
아마 그래프 출력 후 메인 프로그램이 종료되면서 exit 명령이 수행되어서 그런것같습니다.

그래프 출력 후 메인 프로그램이 종료되어도 안닫히게 하는 방법은 pgnuplot.cpp 소스에서 다음과 같이 고치면 됩니다.

CpGnuplot::~CpGnuplot()
{
//cmd ("\nexit\n");
}

한가지만 더 문의드릴께요..!! 말씀해주신 방법대로 하니 실행창이 남아 있습니다. 그런데 제가 생각하는것은 Dlg로 창을하나 만들어서 특정 data를 버튼을 누르면 gnuplot 그래프창만 실행되게 하는것이었는데요...말씀해주신 방법대로 하면 그래프창도 뜨지만 본래 gnuplot 실행창이 실행되고 그래프 창이 나오게 되는거네요....그냥 그래프 창만 실행되게 할수는 없을까요? 왜냐하면 버튼을 누를때마다 gnuplot 실행창도 실행되게 되서요....그래프 창만 볼수는 없는건가요?
예, 그래프 창만 볼 수는 없습니다. C++ 프로그램은 gnuplot 응용 프로그램을 실행하고 데이터와 명령어만 gnuplot으로 넘겨주기때문에 gnuplot이 항상 실행되어야 합니다. ^^
그래프 실행시 한개만 띄우게 되있는데요,, 중복으로는 띄우지 못하는 건가요?
저도 잘 모르겠습니다. ^^
좋은 소스 감사합니다. 제가 좀 수정해서 블러그에 올려봤어요

http://blog.naver.com/mllmaster/130094568022
훌륭합니다. 저도 최성화님 소스좀 참고하도록 하겠습니다.
안녕하세요~검색하다가 들어왓는데요~
리눅스에서 gnuplot을 사용하고 있는데요 여러가지 그래프를 같이그릴때 , 그래프의 최고값을을 찍어서 연결할 수는 없나요??
안녕하세요. 답글이 늦었습니다. ^^; gnuplot의 사용법은 제가 익숙하지 않아서 잘 모르겠습니다만. 그래프의 최고값은 그래프의 미분이 0이 되면서 x축을 통과하는 지점을 의미하기 때문에, 원본 데이터를 스캔해 나가면서 부호가 바뀌는 부분을 찾으면 될것같습니다.
안녕하세요. 자료 감사합니다.
혹시 색깔을 달리하면서 한 plot에 여러게 그래프를 그릴 수 있는 방법도 있나요?
아래 예제를 참고하여 사용해 보시기 바랍니다:

    double i = 0;            // 코일에 흐르는 전류
    double dt = 0.0001;        // 시간의 변화량(delta t)
    double L = 0.001;        // 코일의 인덕턴스
    double R = 5;            // 코일의 저항
    double E = 10;            // 코일의 양단에 가해지는 전압
    double w = 0;            // 회전 속도
    double e = 0;            // 역기전력
    double Kt = 0.5;        // 토크 상수 [Nm/A]
    double I = 0.01;        // 모터의 회전자 및 부하의 관성모멘트
    double cf = 0.1;            // Coulomb friction (쿨롱 마찰)
    double vf = 0.1;            // Viscous friction (점성 마찰)

    _unlink ("r.txt");

    FILE *fp = fopen ("r.txt", "wt");

    for (double t=0; t<10; t+=dt) {
        double v = 5*sin(t*5);
        if (v>0) v = 5;
        else         v = -5;

        i += (v - e - i*R)/L*dt;
        w += (Kt*i - cf*sign(w) - vf*w)/I*dt;
        e = Kt*w;

        fprintf (fp, "%g, %g, %g, %g\n", t, v, i, w);
    }
    fclose (fp);

    FILE *pipe = _popen ("pgnuplot.exe -persist", "w");
    fprintf (pipe, "set grid\n");
    fprintf (pipe, "plot "
        "'r.txt' using 1:2 title 'E' with lines, "
        "'r.txt' using 1:3 title 'i' with lines, "
        "'r.txt' using 1:4 title 'w' with lines   "
        "\n");
    _pclose (pipe);
유니코드 예제로 되어 있는 MFC 혹시 만드셨나요? ㅠㅠ
유니코드 버젼은 "2010.6.17 추가: "에 보시면 있습니다. MFC는 어떤 의미로 말씀하시는지 제가 파악을 못했습니다. 감사합니다. ^^
감사합니다. 큰 도움이 되었습니다.
위의 파일 중 "TestGNUPlot.zip"을 살행해 보았습니다. 그런데 cmd.exe에서 커서만 깜박이고 넘어가지 않는데 이러한 현상은 왜 그런가요?
프로그램을 실행하는 PC에 gnuplot이 설치되어있지 안아서 그렇습니다.

감사합니다. ^^
감사합니다. ^^ 잘 작동 되네요...
혹시요 MFC로 실행파일(exe)을 gnuplot이 설치되지 않는 pc에서도 plot이 될 수 있나요?
.
gnuplot 실행 파일 없이는 불가능합니다. gnuplot의 좀 오래된 버젼은 실행파일 하나만 있어도 실행이 됩니다. 그러니 좀 낮은 버젼의 gnuplot을 다운받아 실행파일만 추출하여 MFC로 작성한 프로그램과 함께 배포하면 될것입니다.

4.2.6 버전의 경우, wgnuplot.exe 파일 하나만으로도 실행이 됩니다.
좋은자료 너무 감사합니다!!!!!!!!!!!!!!!!!!!!!!!!! ㅎㅎㅎ
아 저는 이제 막 MFC를 접한 학부생으로 얼른 데이터를 받아 그래프를 출력하는 프로그램을 만들어야 하는데
제가 처음에 글 읽으면서 차례대로 두개의 소스코드를 넣어서 경로도 바꿔주고 실행을 시켰는데 오류가 뜨면서 실행이 되지 않네요 ㅠㅠㅠ 어떻게 해야할까요? ㅠㅠ
그리구 밑에 예제파일 다운받아서 실행시켰는데도 오류는 안뜨지만 검은색창이 뜨고 아무것도 나타나지않고 종료가 됩니다 ㅠㅠㅠ 어떻게 해야할까요 ㅠㅠ 아 교수님이 얼른 그래프 그리는 프로그램을 만들으라고 하시는데 어디서부터 어떻게 해야할지를 모르겠습니다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
  • 레온다콘다
  • 2014.12.03 21:33
  • 답글 | 신고
안녕하세요. 좋은 자료 잘 봤습니다.
실행 도중 어려운 점이 있어 문의 드리려고 합니다.

설명해 주신대로, 원하는 소스코드가 포함된 프로젝트의 '소스 파일'과 '헤더 파일' 항목에 각각 'pGNUPlot.cpp'와 'pGNUPlot.h'를 포함시킨 후, main 부분을 본문의 그림에서 설명해주신대로 했습니다만 에러가 생겼습니다.

(1) pGNUPlot.cpp의 51번째 줄, 59번째 줄에서 각각 에러가 생깁니다만., 왜 이러는지 알 수 있을까요..?

각각의 에러들은 컴파일러에서 다음과 같이 설명하고 있습니다.
------------------------------------------------------------------------------------
51 :       BOOL bSuccess = CreateProcess(NULL, path, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
------------------------------------------------------------------------------------
1>d:\project\visionprogramming\base exc\ch_01\pgnuplot.cpp(51): error C2664: 'CreateProcessW' : 매개 변수 2을(를) 'char [261]'에서 'LPWSTR'(으)로 변환할 수 없습니다.
1>                                     가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.
------------------------------------------------------------------------------------

------------------------------------------------------------------------------------
59 :       cmd(_T("clear"));
------------------------------------------------------------------------------------
d:\project\visionprogramming\base exc\ch_01\pgnuplot.cpp(59): error C2664: 'CpGnuplot::cmd' : 매개 변수 1을(를) 'const wchar_t [6]'에서 'const char *'(으)로 변환할 수 없습니다.
                                     가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.
------------------------------------------------------------------------------------

(2) 작성하신 API 연동 소소가 GNUPlot 4.2.6 버전일 때 만드신 것이라, 현재 4.6.6 버전에서 달라진 점 때문에 생긴 에러라고 생각했는데.. pGNUPlot.cpp 파일 내에서만 에러가 발생한다면 GNUPlot 버전 차이에 의한 문제는 아닌것 같은데 맞나요..?

염치불구하고 긴 질문 남깁니다.. 감사합니다.
C/C++ 개발할때 디버깅이나 자료 정리할때마다 printf 나 fprintf와 엑셀로 했었는데 정말 딱 저에게 유용한 정보네요.
감사합니다.
TCHAR 로 살짝 수정이 있었지만 잘 동작하는 것 확인했습니다. 님 덕분입니다. 감사합니다. _(__)_
Visual Studio 2005에서 컴파일 오류 2개 발생하는데 해결 방법 궁금합니다. Visual Studio 2019에서는 오류가 없는데. 2005에서 쓸수가 없는 건가요
등록
텍스티콘 텍스티콘
TestGNUPlot.zip (7 KB) 다운로드
TestGNUPlotU.zip (7 KB) 다운로드
pGNUPlot.cpp (2 KB) 다운로드
pGNUPlot.h (0 KB) 다운로드
top