NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (매크로 개발 디버깅 정보를 확인할 수 있는 출력 액션)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 매크로 프로그램을 만들다보면, 이게 정상적으로 잘 동작하는지 테스트를 해봐야 하는데요. 대부분은 시각적으로 확인이 가능하기 때문에 크게 문제가 되지는 않습니다. 하지만, 내부적으로 뭔가 처리해야 하는 변수나 특정 속성 값들은 매크로가 실행중에 어떻게 처리되고 있는지 확인하기가 쉽지 않습니다. 물론, 엔지엠 6 버전의 경우에는 변수 모니터링 툴이 있어서 변수나 값 변화의 흐름을 파악할 수 있습니다. 업그레이드중인 새 버전의 인공지능 매크로 프로그램은 아직 이 기능을 추가하지 않았기 때문에 확인이 불가능합니다.

     

    그래서, 간단하게 변수의 값 또는 사용자가 아웃풋 출력창에 기록으로 남기고 싶은 값을 처리할 수 있는 액션이 필요해졌습니다. 이번에 만들 액션은 출력창에 내용을 표시하고, 출력창 속성에 따라서 로그 파일로 기록 할 수도 있습니다. 이 기능을 사용하면 매크로를 제작할 때 많은 도움을 받을 수 있을겁니다. 이미 로그 기록, 파일 기록등등... 관련 내용들은 이전 글에서 전부 개발이 완료 되었기 때문에 쉽게 기능 구현이 가능합니다.

     

    아래와 같이 함수 상자에 OutputModel 클래스를 하나 추가했습니다.

    oyp6lbF.jpeg

     

     

    각각의 기능들을 도구상자, 함수상자 그리고, 각각의 모음상자안에 카테고리를 어떻게 나눌지가 항상 고민입니다. 개발자분들이라면 항상 고민하는 변수, 메소드, 클래스등등... 작명이 가장 어렵죠? 이 부분은 저도 마찬가지인데요. 어떻게하면 이름으로 이 클래스나 메소드가 기능을 할지 쉽게 이해할 수 있을까를 고민합니다. 그리고, 어떤 라이브러리에서 이 기능을 만드는게 좋을지를 모르겠더라고요.

     

    그래서, 다양한 문제들이 발생합니다. 프로젝트 규모가 커질수록 필요에 의해서 도우미 클래스들을 만들게 되는데요. 협업 관계에서 다른 개발자가 이미 만들어 놓은 공통 기능의 이름이 명확하지 않아서, 유사한 기능을 다시 만드는 경우가 있습니다. 이런 경우에는 중복 코드가 발생하게 되고, 동일한 기능들로 인해서 인수인계 받거나 해당 프레임워크를 사용하는 개발자는 혼란이 올 수도 있습니다. 이런 문제를 방지하기 위해서 충분히 쉽게 찾을 수 있는 가이드 문서를 만들거나 주석을 잘 달아두어야 합니다. 그리고, 미리 Common 라이브러리쪽에서 찾아볼 수 있도록 가이드해주는게 좋습니다.

     

    아무튼, 이 글의 주 내용과 관련 없는 내용이라서 다시 돌아와서 아웃풋 모델의 코드는 아래와 같습니다.

    public class OutputModel : BaseModel
    {
        [LocalizedCategory("Action")]
        [LocalizedDisplayName("OutputText")]
        [LocalizedDescription("OutputText")]
        [Browsable(true)]
        [DefaultValue(null)]
        public string? OutputText { get; set; }
    
        [LocalizedCategory("Action")]
        [LocalizedDisplayName("OutputColor")]
        [LocalizedDescription("OutputColor")]
        [Browsable(true)]
        [DefaultValue(typeof(Color), "Black")]
        public Color OutputColor { get; set; } = Color.Black;
    
        [LocalizedCategory("Action")]
        [LocalizedDisplayName("IsBold")]
        [LocalizedDescription("IsBold")]
        [Browsable(true)]
        [DefaultValue(false)]
        public bool IsBold { get; set; }
    
        public override string? Execute(IPlayer player)
        {
            if (!Ai.Common.Helper.NullCheckAndWriteLine(player, nameof(OutputText), OutputText))
                return null;
    
            var text = Ai.Common.Helper.GetMatches(player, GetType().GetProperty(nameof(OutputText)), OutputText);
            player.Manager.Output.WriteLine(text, OutputColor, IsBold);
            return null;
        }
    }

     

    코드는 심플합니다. 특별한 기능을 가지고 있는건 아니거든요. 단순히 어떤 내용을 출력하기 위한 용도라서 복잡한 비즈니스 로직도 없습니다. 매크로를 실행하고, 테스트를 해볼까요?

    4qOwZYc.jpeg

     

     

    이 스크립트의 구조는 이전 시간에 만든 마우스 이벤트 스크립트를 약간 수정했습니다. 자세한 내용은 이전 글들을 다시 확인 해보시면 좋을거 같아요. 기억을 상기 시키기 위해서 간단하게 설명하면, 마우스 이벤트를 시스템에 등록하고 매크로가 실행중에 마우스 클릭하면 이벤트가 발동합니다. 그러면, 마지막 c 그룹으로 루틴이 이동되고 마지막 액션이기 때문에 매크로가 완료됩니다.

     

    출력 액션의 로그는 클라이언트 프로그램의 하단 출력창에 내용을 기록합니다. 이벤트 액션에는 이벤트가 발생하는 시점에 여러가지 정보들을 자동으로 갱신합니다. 그래서, 마우스 클릭시 해당 위치와 어떤 마우스 버튼인지 정보를 넣어줍니다. 이 내용을 변수 a로 추가하고 다른 액션이 재사용할 수 있습니다. 나중에는 내가 어디 위치에서 왔는지도 알 수 있으면 좋을듯 한데요. 이 기능은 아마도, 조건과 이벤트에만 적용될듯 합니다.

    1. 이벤트가 발생하면 정보를 기록합니다.
    2. 정보를 변수에 추가할 수 있습니다.
    3. 어떤 정보를 변수에 저장할지 선택하세요.
    4. 변수 a에 이벤트 정보가 저장됩니다.

    edvNbMD.jpeg

     

     

    출력 액션은 변수에 저장되어 있는 정보를 가져와서 출력창에 표시해줍니다.

    1. 변수 a로부터 값을 가져옵니다.
    2. 가져온 값을 어디에 넣을지 선택하세요.

    pxQP8Sv.jpeg

     

     

    이제 완성된 매크로를 실행 해볼까요? 단순 변수 변환뿐만 아니라 플레이스홀더 기능을 사용하면 좀 더 다양한 환경에서 테스트할 수 있습니다. 물론, 테스트뿐만 아니라 런타임에서도 플레이스홀더를 사용할 수 있기 때문에 로직을 만들 때 다양한 환경에 적응할 수 있을겁니다. 경우의 수가 많을수록 복잡해지겠지만, 유연하게 대응할 수 있는게 더 좋을거예요.

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.