NGMsoftware

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

    학습


    C# C# .NET Core 매크로 프로그램 만들기. (스크립트 만들기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이제~ 대망의 스크립트 만들기를 진행하게 되었군요. 지금까지는 매크로 프로그램을 만들기 위한 디자인과 설계에 중점을 두었다면 오늘 알아볼 스크립트 만들기는 도구상자에서 액션을 스크립트에 추가한 후 실행할 수 있도록 할겁니다. 여기까지 만들면 앞으로는 액션을 하나씩 추가하면서 기능을 확장하기만 하면 됩니다. 물론, 각각의 액션마다 기능을 만드는것도 쉬운건 아닙니다. 하지만, 사용자에게 제공할 에디터의 기본 기능은 모두 만들었다고 볼 수 있습니다. 아직 추가해야 할 기능들이 더 많이 남아있기는 하지만요^^

     

    기존의 엔지엠 6의 스크립트는 많은 기능을 담고 있습니다. 그리고, TreeView가 베이스인데요. 엔지엠 7에서는 스크립트 편집기의 디자인을 어떻게 만들어야 할지를 결정하지 못했습니다. 기존과 동일하게 트리뷰를 사용할지... 아니면 전혀 다른 방식의 디자인을 적용한 에디터를 만들지를 결정해야 합니다. 워크플로우 방식을 도입하고 싶지만, 지금은 간단한 테스트라서 일단은 트리뷰를 이용하도록 하겠습니다. 디자인은 아래와 같이 간단합니다.

    img.png

     

     

    스크립트 에디터에 간단하게 실행 버튼만 하나 추가 했습니다. 이제 매인뷰에서 새로 만들기 메뉴의 스크립트를 선택하면 스크립트 에디터를 매인뷰에 추가하는 코드를 작성 해볼께요. MenuHelper 인스턴스를 만들고, 스크립트 뷰를 추가해볼께요.

    FVcytef.png

     

     

    스크립트 새로 만들기 이벤트 핸들러를 아래와 같이 추가 해줍니다. 플레이어는 스크립트를 만들 필요가 없기 때문에 에디터만 IEditor 인터페이스를 구현하도록 했습니다. 그렇기 때문에 아래 이벤트 핸들러에서 클라이언트가 에디터라면 새로운 스크립트를 추가하도록 구현했습니다.

     

    스크립트의 전체 이름은 물리적인 스크립트 파일의 전체 경로여야 하지만, 새로 만든 스크립트는 아직 물리적인 파일로 만들기 전이므로 기본 이름을 설정해야 합니다.

            private void MenuFileNewScript(object? sender, EventArgs e)
            {
                if (_client is Ai.Interface.IEditor)
                {
                    var editor = (Ai.Interface.IEditor)_client;
                    var dockHelper = new DockHelper();
    
                    string scriptFullName = $"{Ai.Definition.NewScriptName} {editor.NewScriptCount}";
    
                    dockHelper.AttachViews(editor.DockingManager, new Model.Client.DockModel[]
                    {
                        new Model.Client.DockModel()
                        {
                            Name = scriptFullName,
                            Text = scriptFullName,
                            TextTitle = scriptFullName,
                            Control = new Ai.Common.Client.View.Script()
                        }
                    });
                }
            }

     

    새 스크립트의 기본 이름과 인덱스를 뒤에 붙여줍니다. 새로운 스크립트를 저장하지 않고, 계속 추가할 수 있기 때문에 인덱스가 필요합니다. 엔지엠 매크로 에디터 6에서도 이와 동일한 방식으로 스크립트를 추가하고 있습니다.

     

    이제 스크립트에서 도구 상자의 액션을 드래그 앤 드롭으로 추가할 수 있도록 처리해야 합니다. 트리뷰에서 드래그 앤 드롭을 구현하라면 아래 1개 속성과 4개의 이벤트 핸들러가 필수입니다. TreeView의 AllowDrop 속성을 True로 설정하고, 각각의 이벤트 핸들러를 구현합시다.

            public Script()
            {
                InitializeComponent();
    
                treeView.AllowDrop = true;
                treeView.ItemDrag += TreeView_ItemDrag;
                treeView.DragDrop += TreeView_DragDrop;
                treeView.DragOver += TreeView_DragOver;
                treeView.DragEnter += TreeView_DragEnter;
            }

     

    DragOver 이벤트는 아직 구현하지 않았습니다.

            private void TreeView_DragOver(object? sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(typeof(TreeNode)))
                {
    
                }
            }

     

    DragEnter는 아래와 같이 간단하게 구현합니다. 딱히 다른 내용은 없습니다.

            private void TreeView_DragEnter(object? sender, DragEventArgs e)
            {
                e.Effect = e.AllowedEffect;
            }

     

    ItemDrag도 동일합니다. 기본 내용만 구현하면 됩니다.

            private void TreeView_ItemDrag(object? sender, ItemDragEventArgs e)
            {
                DoDragDrop(e.Item, DragDropEffects.Move);
            }

     

    DragDrop 이벤트 핸들러가 핵심 내용입니다. 도구상자에서 액션을 드래그해서 스크립트에 놓으면 이 이벤트에서 처리해줘야 합니다. 기본적으로 트리뷰에서 드래그하면 액션이 이동됩니다. 도구 상자에서 마우스 클릭 액션이 스크립트로 이동하면 도구 상자에서는 사라지니 TreeNode를 Clone으로 복사해야 합니다.

            private void TreeView_DragDrop(object? sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(typeof(TreeNode)))
                {
                    TreeNode extNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
                    TreeNode node = (TreeNode)extNode.Clone();
                    treeView.Nodes.Add(node);
                }
            }

     

    마지막으로 스크립트 에디터에서 실행 버튼을 클릭했을 때 수행해야 할 내용을 코딩해줍니다. 스크립트에서 엔진을 생성하고, 실행 메소드에 트리뷰의 모든 노드를 넘겨줍니다. 엔진에서는 노드를 하나씩 실행하도록 구성되어 있습니다. 이전에 처리해야 할 전처리나 후처리가 필요하지만, 차차 하나씩 구현하기로 하고 간단하게만 동작을 테스트 해보도록 하겠습니다.

            private void btnPlay_Click(object sender, EventArgs e)
            {
                var engine = new Ai.Engine.Player();
                engine.Play(treeView.Nodes);
            }

     

    엔진의 플레이어 클래스는 아래와 같이 코딩되어 있습니다. 아직 별다른건 없고, 실행만 가능하게 만들었습니다.

        public class Player
        {
            public void Play(TreeNodeCollection nodes)
            {
                foreach (TreeNode node in nodes)
                {
                    (node.Tag as Ai.Model.Action.ActionModel).Excute();
                }
            }
        }

     

    완성된 매크로 프로그램을 실행 해볼까요? 아래 동영상과 같이 마우스가 클릭하는걸 확인할 수 있습니다.

     

     

    여기까지 스크립트에 추가된 액션을 어떻게 실행하는지 알아봤습니다. 속성을 설정할 수 있는 기능을 개발하지 않았기 때문에 기본 값인 마우스 0, 0 좌표와 왼쪽 클릭이 되었습니다. 사실, 마우스를 클릭하려면 좌표를 사용자가 설정하고 어떤 버튼을 누를지도 알려줘야 합니다. 이 부분은 다음 시간에 알아보도록 하겠습니다. 이제 사용자가 처리해야 할 속성창을 만드는데까지 왔네요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.