MEP9: 글로벌 인터랙션 매니저 #
아티스트와의 모든 사용자 상호 작용을 위한 글로벌 관리자를 추가합니다. 모든 아티스트를 사용자가 원하는 대로 크기 조정, 이동, 강조 표시 및 선택 가능하게 만듭니다.
상태 번호
논의
브랜치 및 풀 리퀘스트 #
초록 #
목표는 그리기 프로그램과 매우 유사한 방식으로 matplotlib 아티스트와 상호 작용할 수 있도록 하는 것입니다. 적절한 경우 사용자는 이미 캔버스에 있는 아티스트를 이동, 크기 조정 또는 선택할 수 있어야 합니다. 물론 대본 작성자는 궁극적으로 아티스트가 상호 작용할 수 있는지 또는 정적인지 여부를 제어합니다.
이 작업을 수행하는 이 코드는 이미 개인적으로 구현 및 테스트되었으며 현재 "mixin" 구현에서 matplotlib의 진정한 부분으로 마이그레이션해야 합니다.
최종 결과는 matplotlib.artist.Artist에서 사용할 수 있는 4개의 새 키워드(_moveable_, _resizeable_, _selectable_ 및 _highlightable_)를 갖게 됩니다. 이러한 키워드 중 하나를 True로 설정하면 해당 아티스트에 대한 상호 작용이 활성화됩니다.
실제로 이 MEP는 matplotlib에서 이벤트 처리의 논리적 확장입니다. matplotlib는 이미 왼쪽 마우스 누르기, 키 누르기 등과 같은 "낮은 수준"의 상호 작용을 지원합니다. MEP는 사용자의 특정 대화형 제스처가 감지되면 아티스트에 대한 콜백이 수행되는 논리적 수준으로 지원을 확장합니다.
자세한 설명 #
이 새로운 기능은 최종 사용자가 그래프와 더 잘 상호 작용할 수 있도록 하는 데 사용됩니다. 대부분의 경우 그래프는 거의 사용자가 원하는 것이지만 구성 요소의 약간의 재배치 및/또는 크기 조정이 필요합니다. 사용자가 위치를 시행 착오하기 위해 스크립트로 돌아가도록 강요하는 대신 간단한 끌어서 놓기가 적절할 것입니다.
또한 이것은 matplotlib를 사용하는 응용 프로그램을 더 잘 지원합니다. 여기서 최종 사용자는 플롯을 미세 조정하기 위해 기본 소스를 편집할 합당한 액세스 권한이나 욕구가 없습니다. 여기에서 matplotlib이 기능을 제공하는 경우 필요에 맞게 캔버스에서 아티스트를 이동하거나 크기를 조정할 수 있습니다. 또한 사용자는 아티스트를 강조 표시(마우스 오버)하고 응용 프로그램에서 지원하는 경우 더블 클릭으로 아티스트를 선택할 수 있어야 합니다. 이 MEP에서는 기본적으로 강조 표시 및 선택을 지원하려고 합니다. 아티스트를 선택할 때 발생하는 작업을 처리하는 것은 애플리케이션에 달려 있습니다. 일반적인 처리는 아티스트의 속성을 편집하는 대화 상자를 표시하는 것입니다.
미래에도(이 MEP의 일부가 아님) matplotlib는 아티스트 선택 시 발생하는 각 아티스트에 대한 백엔드별 속성 대화 상자를 제공할 수 있습니다. 이 MEP는 그런 종류의 능력에 필요한 디딤돌이 될 것입니다.
현재 matplotlib에는 몇 가지 대화형 기능(예: legend.draggable())이 있지만 흩어져 있는 경향이 있으며 모든 아티스트가 사용할 수 있는 것은 아닙니다. 이 MEP는 인터랙티브 인터페이스를 통합하고 모든 아티스트를 위해 작동하도록 합니다.
현재 MEP에는 아티스트 크기 조정을 위한 잡기 핸들과 아티스트를 이동하거나 크기를 조정할 때 그려지는 적절한 상자도 포함되어 있습니다.
구현 #
상호작용 관리자가 상호작용 관리자가 처리할 일관된 인터페이스를 갖도록 아티스트의 "트리"에 적절한 메소드를 추가하십시오. 아티스트가 상호작용을 지원하는 경우 아티스트에 추가할 제안된 방법은 다음과 같습니다.
get_pixel_position_ll(self): 아티스트 경계 상자의 왼쪽 하단 모서리의 픽셀 위치를 가져옵니다.
get_pixel_size(self): 아티스트의 경계 상자 크기를 픽셀 단위로 가져옵니다.
set_pixel_position_and_size(self,x,y,dx,dy): 지정된 경계 상자 내에 맞도록 아티스트의 새 크기를 설정합니다.
1) 이동/크기 조정을 시각적으로 표시하는 데 필요하므로 커서를 제공하고 2) 현재 마우스 위치를 가져오는 기능을 제공하기 위해 백엔드에 기능을 추가합니다.
관리자를 구현합니다. 이것은 이미 믹스인으로 개인적으로(dhyams에 의해) 수행되었으며 꽤 많이 테스트되었습니다. 목표는 관리자의 기능을 아티스트로 이동하여 현재 코딩한 것처럼 "원숭이 패치"가 아니라 matplotlib에 제대로 있도록 하는 것입니다.
믹스인의 현재 요약 #
(이 믹스인은 현재 비공개 코드이지만 분명히 브랜치에 추가할 수 있습니다.)
InteractiveArtistMixin:
matplotlib 캔버스에 그려진 일반 개체를 이동 가능하고 크기 조정이 가능하도록 만드는 Mixin 클래스입니다. Powerpoint 모델은 가능한 한 가깝게 따릅니다. 내가 Powerpoint에 매혹되어서가 아니라 그것이 대부분의 사람들이 이해하는 것이기 때문입니다. 아티스트를 선택할 수도 있습니다. 즉, 더블 클릭 시 아티스트가 on_activated() 콜백을 수신합니다. 마지막으로 아티스트를 강조 표시할 수 있습니다. 즉, 마우스가 지나갈 때마다 아티스트에 하이라이트가 그려집니다. 일반적으로 하이라이트 가능한 아티스트도 선택할 수 있지만 이는 사용자에게 달려 있습니다. 따라서 기본적으로 아티스트별로 사용자가 설정할 수 있는 네 가지 속성이 있습니다.
하이라이트 가능
선택 가능
움직일 수 있는
크기 조정 가능
이동(드래그 가능)하거나 크기를 조정할 수 있으려면 믹스인의 대상인 객체가 다음 프로토콜을 지원해야 합니다.
get_pixel_position_ll(자신)
get_pixel_size(자신)
set_pixel_position_and_size(self,x,y,sx,sy)
크기를 조정할 수 없는 객체는 sx 및 sy 매개변수를 자유롭게 무시할 수 있습니다. 하이라이트 가능하려면 믹스인의 대상인 객체가 다음 프로토콜도 지원해야 합니다.
get_highlight(자신)
하이라이트를 그리는 데 사용될 아티스트 목록을 반환합니다.
mixin의 대상이 되는 객체가 matplotlib 아티스트가 아닌 경우 다음 프로토콜도 구현해야 합니다. 그려지고 있는 어딘가에 예술가가 있어야 하므로 그렇게 하는 것은 일반적으로 매우 사소한 일 입니다. 일반적으로 개체는 이러한 호출을 해당 아티스트에게 라우팅합니다.
get_figure(자신)
get_axes(자신)
포함(자신, 이벤트)
set_animated(자신,플래그)
그리기(자체, 렌더러)
get_visible(자신)
다음 알림은 아티스트에 대해 호출되며 아티스트는 선택적으로 이를 구현할 수 있습니다.
on_select_begin(자신)
on_select_end(자신)
on_drag_begin(자신)
on_drag_end(자신)
on_activated(자신)
on_highlight(자신)
on_right_click(자신,이벤트)
on_left_click(자신,이벤트)
on_middle_click(자신,이벤트)
on_context_click(자신,이벤트)
on_key_up(자신,이벤트)
on_key_down(자신,이벤트)
대화형 아티스트가 이벤트를 처리하지 않는 경우 캔버스에서 다음 알림이 호출됩니다.
on_press(자신,이벤트)
on_left_click(자신,이벤트)
on_middle_click(자신,이벤트)
on_right_click(자신,이벤트)
on_context_click(자신,이벤트)
on_key_up(자신,이벤트)
on_key_down(자신,이벤트)
다음 기능이 있는 경우 대화형 개체의 동작을 수정하는 데 사용할 수 있습니다.
press_filter(self,event) # 객체가 프레스 이벤트를 라우팅할지 결정합니다.
handle_unpicked_cursor() # 객체가 선택 해제될 때 커서가 객체 위로 지나갈 때 커서를 설정하기 위해 객체에서 사용할 수 있습니다.
여러 캔버스를 지원하고 드래그 잠금, 모션 알리미 및 캔버스당 전역 "활성화" 플래그를 유지합니다. 크기를 조정하는 동안 Shift 키를 눌러 고정 종횡비 크기 조정을 지원합니다.
알려진 문제:
선택/드래그 작업 중에는 Zorder를 따르지 않습니다. blit 기술이 사용되었기 때문에 이것이 고칠 수 있다고는 생각하지 않습니다. 내가 생각할 수 있는 유일한 방법은 zorder가 나보다 큰 모든 아티스트를 검색하고 모두 애니메이션으로 설정한 다음 각 드래그 새로 고침 동안 모두 맨 위에 다시 그리는 것입니다. 이것은 매우 느릴 수 있습니다. 시도해야합니다.
믹스인은 다음 두 가지 때문에 wx 백엔드에서만 작동합니다. 1) 커서가 하드코딩되어 있고 2) wx.GetMousePosition()에 대한 호출이 있습니다.
이전 버전과의 호환성 #
이전 버전과의 호환성에는 문제가 없습니다. 일단 이것이 자리를 잡으면 기존 대화식 함수(예: legend.draggable()) 중 일부를 폐기하는 것이 적절할 것입니다.
대안 #
내가 아는 것이 없습니다.