SketchUp 플러그인 개발 (20) 완전한 플러그인 - 더 좋은 도구 관리

도구 모음을 만드는 코드는 도구 관리 클래스 Tool Manager에서 중복되는 경우가 많습니다.모든 도구막대의 단추를 만드는 데는 다음과 같은 몇 가지 절차를 거쳤다
  • 로드 도구 클래스
  • 작성 도구 객체
  • 창설 도구 활성화 명령 대상
  • 도구 모음에 도구 활성화 명령 추가
  • 이 창설 도구는 명령 대상을 활성화합니다. 예를 들어 설정 아이콘, 알림 텍스트, 상태 표시줄 텍스트 등입니다.
    이러한 동작을 간단하게 분류하면 창설 도구 활성화 명령 대상을 추출하여 모든 도구에 넣을 수 있습니다. 예를 들어 창설 명령 대상, 설정 아이콘 등을 포함합니다.모든 도구는 자신이 어떤 단추로 표현해야 하는지 알아야 하기 때문에 이것은 개체의 내용에 속한다.도구 관리 대상은 이런 것들을 주목할 필요가 없다. 이것은 몇 개의 어떤 이름을 만드는 도구 모음만 처리하고, 도구는 어느 도구 모음의 위치에 추가해야 하는지 처리하면 된다. 이것은 '그룹' 내용에 속한다.따라서 우리는 도구류와 도구관리류를 개조하여 도구를 추가하는 것이 더욱 편리하고 유연하게 할 수 있다.

    도구류


    도구류의 개조는 주로 두 부분의 내용과 관련된다.
  • 창설 도구 활성화 명령 대상
  • 맞춤형 아이콘 및 프롬프트 텍스트
  • 도구 관리 클래스에서는 도구가 만든 명령 대상만 주목해야 한다. 통일된 처리를 위해 우리는 도구에 공통된 인터페이스를 추가하여 도구의 명령 대상을 얻어야 한다. 이것은 루비의 혼입 모듈이나 클래스 계승을 통해 실현할 수 있다. 유연성을 위해 우리는 혼입 모듈을 사용한다.우선 도구 명령의 모듈을 정의해야 합니다. 모듈에서 도구 활성화 명령 대상을 만드는 방법을 실현해야 합니다.
    #  
    module ToolCommand
      #  SketchUp 
      def command
        cmd = UI::Command.new(' ') do
          Sketchup.active_model.select_tool(self)
        end
      end
    end
    

    그리고 도구마다 이 모듈을 섞어서 도구마다command 방법으로 자신을 활성화하는 명령을 만듭니다
    require 'free_wall/tool/tool_command'
    class DrawWallTool
      include ToolCommand
    ...
    

    완전한 플러그인에 대해 말하자면 도구는 모두 자신의 아이콘, 힌트 텍스트 등 개성화된 정보를 가져야 하기 때문에 우리는 명령을 만들 때 이 정보를 모두 설정해야 하고 이 정보는 모든 도구에서 정의해야 한다.
    class DrawWallTool
      include ToolCommand
    
      def initialize
        @menu_text = ' '
        @large_icon = File.join(File.dirname(__dir__), 'resource/img/draw_wall_tool.jpg')
        @small_icon = File.join(File.dirname(__dir__), 'resource/img/draw_wall_tool.jpg')
        @status_bar_text = ' '
        @tooltip = ' '
      end
    ...
    

    그리고 명령을 만들 때 이 정보를 통일적으로 적용합니다
    def command
      menu_text = @menu_text ? @menu_text : ' '
      cmd = UI::Command.new(menu_text) do
        Sketchup.active_model.select_tool(self)
      end
      cmd.large_icon = @large_icon if @large_icon
      cmd.small_icon = @small_icon if @small_icon
      cmd.status_bar_text = @status_bar_text if @status_bar_text
      cmd.tooltip = @tooltip if @tooltip
      cmd
    end
    

    이렇게 하면 우리는 도구에 대한 개성화된 명령을 만들 수 있고 도구 모음에 추가할 때 서로 다른 도구가 서로 다른 디스플레이 효과를 볼 수 있다.

    도구 관리 클래스


    정의 로드


    도구 관리 클래스에서 먼저 도구 클래스의 정의를 불러옵니다. 도구는tool 디렉터리에 정의되어 있기 때문에 실제적으로 이 디렉터리를 옮겨다니며 모든 루비 파일을 불러올 수 있습니다.
    tool_dir = File.join(__dir__, 'tool')
    Dir.entries(tool_dir).each { |file|
      file_path = File.join(tool_dir, file)
      next unless File.file?(file_path)
      require(file_path)
    }
    

    다음에, 우리는 창설된 도구막대의 이름과 도구막대에 구체적인 도구를 어떻게 배치해야 하는지를 정의해야 한다. 이것은 실제적으로 하나의 해시표를 통해 정의할 수 있다
    TOOLBAR_LIST = { ' ' => [DrawWallTool, CreateHoleTool] }.freeze
    

    키는 도구 모음의 이름이고value는 도구 목록입니다.이렇게 하면 한 번에 훑어보면서 모든 도구를 만들 수 있다.그 중의 도구 목록에는 구분자로 표시할 특수 요소를 추가할 수 있습니다. 예를 들어 상기 두 도구 사이에 nil 요소를 추가하고, 도구 단추를 만들 때 nil 요소를 만나면 구분자를 만들 수 있습니다.
    #  
    def create_toolbar
      TOOLBAR_LIST.each { |name, tools_klass|
        tool_bar = UI::Toolbar.new(name)
        tools_klass.each { |tool_klass|
          if tool_klass
            tool = tool_klass.new
            tool_bar.add_item(tool.command)
          else
            tool_bar.add_separator
          end
        }
      }
    end
    

    도구막대를 만들 때 단추를 누르는 행동을 제어하려면 도구를 만들 때 도구를 활성화하는 명령을 블록에 대한 실행으로 바꾸고 도구막대를 만들 때 구체적인 행동을 추가할 수 있습니다
    ...
    cmd = UI::Command.new(menu_text) do
      yield
    end
    ...
    
    ...
    cmd = tool.command {
      Sketchup.active_model.select_tool(tool)
    }
    ...
    

    이러한 개조를 통해 새로운 도구를 추가할 때, 새로운 도구의 클래스 정의를 TOOLBAR 에 추가하기만 하면 된다.LIST에서 특정 도구막대의 특정 위치를 지정하면 됩니다.또한 같은 도구라도 다른 도구막대에 추가할 수 있으며, 모든 도구막대의 행동을 제어할 수 있습니다.

    좋은 웹페이지 즐겨찾기