NGMsoftware

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

    학습


    C# C# .NET Core 매크로 프로그램 만들기. (스크립트 저장 및 불러오기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 앞서 매크로 프로그램의 기본적인 내용들을 만들었는데요. 이번에는 만든 스크립트를 저장하고, 다시 불러올 수 있는 기능들을 만들어 보도록 하겠습니다. 스크립트 뷰에서 Save 메소드를 먼저 구현해줄께요. 스크립트 인터페이스에 Save 메소드를 하나 추가 해줍니다. 스크립트가 기본적으로 수행해야 할 동작들을 인터페이스로 미리 정의 해두었습니다. 구현은 이제 하나씩 해야겠죠?

    namespace Ai.Interface
    {
        public interface IScriptView
        {
            void Play();
    
            void Pause();
    
            void Stop();
    
            void Save();
    
            void Close();
        }
    }

     

    Script에서 Save 메소드를 아래와 같이 구현해줍니다.

            public void Save()
            {
                SaveFileDialog dialog = new SaveFileDialog();
    
                if (dialog.ShowDialog() == DialogResult.OK)
                    new Ai.Common.File(dialog.FileName).Serialize(treeView.Nodes.Cast<TreeNode>().ToArray());
            }

     

    Ai.Common 라이브러리에 Serialize 메소드를 만들고, TreeNode를 넘겨줍니다.

    ※ NGM 7 프로덕션 제품으로 출시할 때는 TreeNode를 사용하지 않고, WPF를 이용해서 스크립트 뷰를 구성합니다. 현재는 테스트를 위한 임시 코드입니다.

            public void Serialize<T>(T file, string fileName)
            {
                using (var output = System.IO.File.Create(fileName))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(output, file);
                }
            }

     

    이제 새로운 스크립트를 만들고, 마우스 클릭 액션을 하나 추가해보세요. 그리고, 메뉴에서 저장을 클릭합니다.

    mGjPKgc.jpeg

     

     

    바탕화면에 저장한 스크립트가 잘 생성되었습니다.

    6yANLTC.jpeg

     

     

    이제 바탕화면에 만들어진 스크립트를 불러올께요. 파일 메뉴의 OpenScript 이벤트 핸들러에 아래와 같이 코드를 작성합니다.

            private void MenuFileOpenScript(object? sender, EventArgs e)
            {
                OpenFileDialog dialog = new OpenFileDialog();
    
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    var nodes = new Ai.Common.File(dialog.FileName).Deserialize<TreeNode[]>();
    
                    if (_client is Ai.Interface.IEditor)
                    {
                        var editor = (Ai.Interface.IEditor)_client;
                        var dockHelper = new DockHelper(_client);
    
                        string scriptName = Path.GetFileName(dialog.FileName);
    
                        dockHelper.AttachViews(editor.DockingManager, new Model.Client.DockModel[]
                        {
                            new Model.Client.DockModel()
                            {
                                Name = scriptName,
                                Text = scriptName,
                                TextTitle = scriptName,
                                Description = dialog.FileName,
                                Control = new Ai.Common.Client.View.Script(_client, nodes)
                            }
                        });
                    }
                }
            }

     

    스크립트를 열기 위해서 OpenFileDialog를 하나 생성 해줍니다. OpenFileDialog는 윈도우에서 파일을 열 때 탐색기를 열어주는 컨트롤입니다. 여러가지 속성들이 있지만, 간단하게 테스트 용도로 파일만 선택할 수 있도록 했습니다. 추가적으로 파일 위치와 파일 형식도 넣어주면 좋겠는데요. 엔지엠 6에서는 엔지엠 매크로 스크립트 확장자인 ngs와 ngi를 자동으로 인식하고, 스크립트와 이미지 폴더를 기본 폴더로 설정해두었습니다.

     

    Ai.Common 네임스페이스에 파일을 직렬화하고, 역직렬화 할 수 있는 File 클래스를 하나 만들었습니다. 클래스 이름은 나중에 변경될수도 있을거 같은데요. 지금은 이대로 사용하도록 하겠습니다. 엔지엠 매크로에서 파일을 핸들링하는 다양한 기능들을 여기에 추가할 예정입니다.

     

    File 클래스에 스크립트를 역직렬화하는 메소드를 추가했습니다. 다양한 형식을 사용할 수 있게 제네릭 타입으로 만들었습니다. 이렇게 만들지 않으면 형식에 따라서 수많은 메소드를 오버로딩해야 합니다. 비효율적이기 때문에 제네릭 타입을 사용하는게 좋습니다.

            public T Deserialize<T>(string fileName)
            {
                using (var output = System.IO.File.Open(fileName, FileMode.Open))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    return (T)bf.Deserialize(output);
                }
            }

     

    메뉴에서 열기 > 스크립트를 선택 후 바탕화면에 저장했던 스크립트를 열어보세요.

    aEQWgxy.png

     

     

    스크립트뷰에서 정상적으로 트리뷰가 만들어집니다. 이전 스크립트뷰를 아래와 같이 리팩토링 했습니다. 새 스크립트를 만들때와 스크립트를 열 때 모두 대응해야 해서 아래와 같은 구조가 되었는데요. 생성자 오버라이딩을 통해서 다양한 형식을 가져올 수 있도록 했습니다. 추후에 스크립트뷰를 WPF로 변경할 때 한번 더 리팩토링해야 할듯 합니다. 다음 버전에서는 기존과 같은 방식의 TreeView와 WPF로 만든 Workflow 2가지를 모두 제공할 예정입니다.

            public Script(Ai.Interface.IClient client) : this(client, new List<TreeNode>())
            {
    
            }
    
            public Script(Ai.Interface.IClient client, TreeNode[] nodes) : this(client, nodes.ToList())
            {
    
            }
    
            public Script(Ai.Interface.IClient client, TreeNodeCollection nodes) : this(client, nodes.Cast<TreeNode>().ToList())
            {
    
            }
    
            public Script(Ai.Interface.IClient client, List<TreeNode> nodes)
            {
                _client = client;
    
                InitializeComponent();
    
                treeView.AllowDrop = true;
                treeView.ItemDrag += TreeView_ItemDrag;
                treeView.DragDrop += TreeView_DragDrop;
                treeView.DragOver += TreeView_DragOver;
                treeView.DragEnter += TreeView_DragEnter;
    
                if (nodes != null && nodes.Count > 0)
                {
                    treeView.Nodes.AddRange(nodes.Cast<TreeNode>().ToArray());
    
                    if (_client is Ai.Interface.IEditor)
                    {
                        var editor = (Ai.Interface.IEditor)_client;
                        ((Dock.Property)editor.Property).DataBind(nodes.First().Tag);
                    }
                }
            }

     

    이렇게해서 얼추 매크로 에디터의 모든 기능을 만들었습니다. 세부적인 기능과 액션을 추가해야 하지만요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    등록된 댓글이 없습니다.