SketchUp 플러그인 개발 (20) 완전한 플러그인 - 더 좋은 도구 관리
3714 단어 SketchUp 플러그인 개발
이러한 동작을 간단하게 분류하면 창설 도구 활성화 명령 대상을 추출하여 모든 도구에 넣을 수 있습니다. 예를 들어 창설 명령 대상, 설정 아이콘 등을 포함합니다.모든 도구는 자신이 어떤 단추로 표현해야 하는지 알아야 하기 때문에 이것은 개체의 내용에 속한다.도구 관리 대상은 이런 것들을 주목할 필요가 없다. 이것은 몇 개의 어떤 이름을 만드는 도구 모음만 처리하고, 도구는 어느 도구 모음의 위치에 추가해야 하는지 처리하면 된다. 이것은 '그룹' 내용에 속한다.따라서 우리는 도구류와 도구관리류를 개조하여 도구를 추가하는 것이 더욱 편리하고 유연하게 할 수 있다.
도구류
도구류의 개조는 주로 두 부분의 내용과 관련된다.
#
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에서 특정 도구막대의 특정 위치를 지정하면 됩니다.또한 같은 도구라도 다른 도구막대에 추가할 수 있으며, 모든 도구막대의 행동을 제어할 수 있습니다.
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
#
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)
}
...