핸들 함수

핸들 함수 (Handle Functions)

그래픽 객체는 핸들로 다뤄요. 어떤 변수가 그래픽 객체 인덱스인지, 축이나 그림의 인덱스인지 알아내려면 ishghandle, isgraphics, isaxes, isfigure 함수를 쓰면 돼요. 그리고 객체의 속성을 읽고 쓰는 데는 getset이 핵심이에요.

출처: Handle Functions

본문

ishghandle

tf = ishghandle (h)

h가 그래픽 핸들이면 참, 그렇지 않으면 거짓을 돌려줍니다. h는 핸들 행렬일 수도 있는데, 이 경우 h의 원소가 그래픽 핸들인 곳은 참, 아닌 곳은 거짓인 논리 배열이 돌아옵니다.

See also: isgraphics, isaxes, isfigure, ishandle.

isgraphics

tf = isgraphics (h)
tf = isgraphics (h, type)

h가 (타입 type의) 그래픽 핸들이면 참, 그렇지 않으면 거짓을 돌려줍니다. 타입을 지정하지 않으면 이 함수는 ishghandle과 동등해요.

See also: ishghandle, ishandle, isaxes, isfigure.

ishandle

tf = ishandle (h)

h가 그래픽 또는 Java 객체의 핸들이면 참, 그렇지 않으면 거짓을 돌려줍니다. h는 핸들 행렬일 수도 있으며, 원소가 그래픽 또는 Java 객체 핸들인 곳은 참인 논리 배열이 돌아옵니다.

Programming Note: 특정 객체 타입을 검사하는 게 더 유용할 때가 많아요. 핸들이 그래픽 객체에 속하는지 알아보려면 ishghandle이나 isgraphics를 쓰고, Java 객체에 속하는지 알아보려면 isjava를 쓰세요.

See also: ishghandle, isgraphics, isjava.

isaxes / isfigure

tf = isaxes (h)
tf = isfigure (h)

각각 h가 축(axes) 그래픽 핸들인지, 그림(figure) 그래픽 핸들인지 판별합니다. h가 행렬이면 원소가 각각 축·그림 그래픽 핸들인 곳은 참인 논리 배열을 돌려줘요.

See also: isfigure, ishghandle, isgraphics (isaxes 기준), isaxes, ishghandle, isgraphics (isfigure 기준).

gcf 함수는 현재 그림 객체의 인덱스를 돌려주고, 없으면 하나 만들어요. 마찬가지로 gca는 현재 축 객체(없으면 그것과 그 부모 그림 객체까지)를 돌려줍니다.

groot

h = groot ()

루트(root) 그래픽 객체의 핸들을 돌려줍니다. 루트 그래픽 객체는 모든 그래픽 객체의 최상위 부모예요. 게다가 루트 객체는 ScreenSize 같은 그래픽 시스템 전반의 정보도 담고 있어요. 어떤 정보가 있는지 보려면 get (groot)를 사용하세요.

그래픽 시스템 전체의 기본값은 루트 그래픽 객체의 "Default"로 시작하는 속성을 설정해서 지정합니다. 예를 들어 모든 텍스트 객체의 기본 글꼴을 FreeSans로 설정하려면:

set (groot, "DefaultTextFontName", "FreeSans")

기본 속성은 set에 특수 속성값 "remove"를 써서 삭제할 수 있어요. 위 기본 글꼴 지정을 되돌리려면:

set (groot, "DefaultTextFontName", "remove")

Programming Note: 루트 그래픽 객체는 특수 핸들 값 0으로 식별됩니다. 언젠가 이 고유 값이 바뀔 수도 있지만, 항상 루트 그래픽 객체를 돌려주는 것이 보장된 groot를 쓰면 미래 변경에도 견딜 수 있는 코드가 돼요.

See also: gcf, gca, get, set.

gcf / gca

h = gcf ()
h = gca ()

각각 현재 그림, 현재 축 객체의 핸들을 돌려줍니다. 현재 그림은 그래픽 출력의 기본 대상이에요. 여러 그림이 있으면 gcf는 마지막으로 만들어진 그림이나 마우스로 마지막에 클릭한 그림을 돌려주죠.

현재 그림이 없으면 하나 만들어 핸들을 돌려줍니다. 그 핸들로 그림의 속성을 조사하거나 설정할 수 있어요. 예를 들어:

fplot (@sin, [-10, 10]);
fig = gcf ();
set (fig, "numbertitle", "off", "name", "sin plot")

는 사인파를 그린 뒤 현재 그림의 핸들을 찾고, 그림 창 제목을 내용을 설명하는 이름으로 바꿔요.

Note: 현재 그림을 만들지 않고 찾고 싶다면 루트 그래픽 객체의 "CurrentFigure" 속성을 조회하세요.

get (groot, "currentfigure");

gca도 비슷해요. 축이 없으면 만들고 핸들을 돌려줍니다. 핸들로 축 속성을 조사·설정할 수 있어요. 예를 들어:

ax = gca ();
set (ax, "position", [0.5, 0.5, 0.5, 0.5]);

는 빈 축 객체를 만들고 그림 창 안에서 그 위치와 크기를 바꿔요.

Note: 축 객체를 만들지 않고 현재 축을 찾으려면 그림의 "CurrentAxes" 속성을 조회하세요.

get (gcf, "currentaxes");

See also: gca, gco, gcbf, gcbo, get, set (gcf 기준), gcf, gco, gcbf, gcbo, get, set (gca 기준).

gco

h = gco ()
h = gco (hfig)

현재 그림의 현재 객체 핸들, 또는 핸들 hfig가 있는 그림의 현재 객체 핸들을 돌려줍니다. 그림의 현재 객체는 마지막으로 클릭된 객체예요. 대상 그림의 "CurrentObject" 속성에 저장되어 있죠.

마지막 마우스 클릭이 그림의 어떤 자식 객체에도 일어나지 않았다면 현재 객체는 그림 자신입니다. 대상 그림에서 마우스 클릭이 일어난 적이 없으면 이 함수는 빈 행렬을 돌려줍니다.

Programming Note: 이 함수가 돌려주는 값은 콜백 실행 중 gcbo가 돌려주는 값과 반드시 같지는 않아요. 실행 중인 콜백은 다른 콜백에 의해 중단될 수 있고, 그때 현재 객체가 바뀔 수 있기 때문이죠.

See also: gcbo, gca, gcf, gcbf, get, set.

get

getset 함수는 그래픽 객체의 속성을 조사·설정하는 데 사용해요. 예를 들어:

get (groot)
    ⇒  ans =
       {
         type = root
         currentfigure = [](0x0)
         children = [](0x0)
         visible = on
         ...
       }

는 루트 그래픽 객체의 모든 속성을 담은 구조체를 돌려줍니다. Octave의 모든 함수가 그렇듯 이 구조체는 값으로 돌아오기 때문에, 구조체를 수정해도 내부 루트 객체는 바뀌지 않아요. 그렇게 하려면 반드시 set 함수를 써야 합니다. 또 이 경우 currentfigure 속성이 비어 있는 건 현재 그림 창이 없다는 뜻이에요.

get은 단일 속성의 값만 찾는 데도 쓸 수 있어요. 예를 들어:

get (gca (), "xlim")
    ⇒  [ 0 1 ]

는 현재 그림의 현재 축 객체에 대한 x축 범위를 돌려줍니다.

val = get (h)
val = get (h, p)

이름이 p인 속성의 값을 그래픽 핸들 h에서 돌려줍니다. p를 생략하면 h의 전체 속성 목록을 돌려줘요. h가 벡터면 속성 값 또는 목록을 각각 담은 셀 배열을 돌려줍니다.

See also: set.

set

그래픽 객체 속성을 설정하려면 set 함수를 씁니다. 예를 들어:

set (gca (), "xlim", [-10, 10]);

는 현재 그림의 현재 축 객체에 대한 x축 범위를 [-10, 10]으로 설정해요.

set을 값 인자 없이 호출하면 기본 속성값도 조회할 수 있어요. 인자가 하나(그래픽 핸들)뿐이면 해당 객체 타입의 모든 속성 기본값을 가진 구조체가 돌아옵니다. 예를 들어:

set (gca ())

는 축 객체의 기본 속성값 구조체를 돌려줘요. set을 두 인자(그래픽 핸들과 속성 이름)로 호출하면 요청된 속성의 기본값만 돌려줍니다.

set (h, property, value, …)
set (h, {properties}, {values})
set (h, pv)
value_list = set (h, property)
all_value_list = set (h)

그래픽 핸들(또는 그래픽 핸들 벡터) h에 이름이 있는 속성 값을 설정합니다. 속성 이름과 값을 주는 방법은 세 가지가 있어요.

  1. property는 속성 이름을 담은 문자열, 각 value는 속성에 알맞은 타입의 값이에요. h에 여러 핸들이 있으면 각각 같은 value가 할당됩니다. 예를 들어:
h = plot ([0, 1]);
set (h, 'color', 'green');
  1. 이 경우 values의 열 수가 properties의 원소 수와 일치해야 해요. values의 첫 열이 properties의 첫 항목 값을 담고, 이렇게 이어집니다. values의 행 수는 1이거나 h의 원소 수와 같아야 해요. 첫 번째 경우 각 핸들 h에 같은 값들이 할당되고, 두 번째 경우 h의 첫 핸들에 values의 첫 행 값이, 이렇게 이어집니다. 예를 들어:
h = plot ([0, 1; 1, 0]);
set (h, {'color'}, {'green'; 'red'});
  1. 이는 첫 번째 경우와 같은데, pv의 필드 이름이 속성 이름, 필드 값이 속성 값을 나타내요. 첫 번째 경우와 마찬가지로, h의 모든 핸들에 적용될 속성 하나에 대해 값 하나만 설정할 수 있습니다. 예를 들어:
h = plot ([0, 1]);
props.color = 'green';
set (h, props);

세 가지 설정 문법은 어떤 조합으로든 나타날 수 있어요.

set은 이름이 있는 속성이 취할 수 있는 값의 목록을 조회하는 데도 쓰입니다. clist = set (h, "property")"property"의 가능한 값 목록을 셀 목록 clist로 돌려줘요. 출력 변수를 쓰지 않으면 목록이 포맷되어 화면에 출력됩니다.

속성을 지정하지 않으면(slist = set (h)) 구조체 slist가 돌아오는데, 필드 이름은 객체 h의 속성, 필드는 각 속성의 가능한 값 목록이에요. 출력 변수를 쓰지 않으면 목록이 포맷되어 화면에 출력됩니다.

속성을 조회할 때는 단일 그래픽 핸들 h(단일 그래픽 객체)만 허용됩니다.

Example Query:

hf = figure ();
set (hf, "paperorientation")
⇒   [ landscape | {portrait} ]

paperorientation 속성이 두 값을 취할 수 있고 기본값이 "portrait"임을 보여줘요.

See also: get.

ancestor

parent = ancestor (h, type)
parent = ancestor (h, type, "toplevel")

핸들 객체 h의 조상 중 타입이 type(문자열)과 일치하는 첫 번째 조상을 돌려줍니다. type이 문자열 셀 배열이면, 주어진 타입 문자열 중 하나와 일치하는 첫 번째 부모를 돌려줘요. 핸들 객체 h 자체가 타입 type이면 h를 돌려줍니다.

세 번째 인자로 "toplevel"을 주면 조건에 일치하는 객체 계층의 최상위 부모를 돌려주고, 첫 번째(가장 가까운) 것으로 반환하지 않아요.

See also: findobj, findall, allchild.

allchild

h = allchild (handles)

숨겨진 자식을 포함해 그래픽 객체의 모든 자식을 찾습니다. 이 함수는 get (h, "children")과 비슷하지만 숨은 객체(HandleVisibility = "off")도 돌려줘요. handles가 스칼라면 h는 벡터, 그렇지 않으면 handles와 같은 크기의 셀 행렬이고 각 셀은 핸들 벡터를 담고 있어요.

See also: findall, findobj, get, set.

findfigs

findfigs ()

현재 화면 밖에 있는 보이는 그림을 모두 찾아 화면 안으로 옮깁니다.

See also: allchild, figure, get, set.

구조체로 저장·복원

그림은 printsaveas로 여러 그래픽 형식으로 인쇄하거나 저장할 수 있어요. 하지만 때로는 제목이나 범례를 수정하는 같은 추가 수정을 할 수 있도록 원래 Octave 핸들 그래픽을 직접 저장하는 게 유용할 때가 있어요. 이는 다음 함수들로 할 수 있습니다.

fig_struct = hdl2struct (gcf);
save myplot.fig -struct fig_struct;
...
fig_struct = load ("myplot.fig");
struct2hdl (fig_struct);

hdl2struct

s = hdl2struct (h)

핸들 h와 연관된 객체·그 자식들의 속성을 설명하는 필드를 가진 구조체 s를 돌려줍니다. 구조체 s의 필드는 "type", "handle", "properties", "children", "special"이에요.

See also: struct2hdl, hgsave, findobj.

struct2hdl

h = struct2hdl (s)
h = struct2hdl (s, p)
h = struct2hdl (s, p, hilev)

구조체 s에서 그래픽 핸들 객체 h를 만듭니다. 구조체는 "handle", "type", "children", "properties", "special" 필드를 반드시 가져야 해요.

기존 그림이나 축의 핸들 p를 지정하면 새 객체가 그 객체의 자식으로 만들어집니다. 부모 핸들을 주지 않으면 루트 객체의 기본값으로 새 그림과 필요한 자식들이 구성됩니다.

세 번째 부울 인자 hilev로 함수가 리스너/콜백(예: 범례나 hggroup용)을 보존할지 지정할 수 있어요. 기본값은 false입니다.

See also: hdl2struct, hgload, findobj.

copyobj

hnew = copyobj (horig)
hnew = copyobj (horig, hparent)

핸들 horig와 연관된 그래픽 객체의 복사본을 만들고 새 객체에 대한 새 핸들 hnew를 돌려줍니다. 부모 핸들 hparent(루트, 그림, 축, hggroup)를 지정하면 복사된 객체가 hparent의 자식으로 만들어집니다.

horig가 핸들 벡터이고 hparent가 스칼라면, 벡터 hnew의 각 핸들의 "Parent" 속성이 hparent로 설정됩니다. 반대로 horig가 스칼라이고 hparent가 벡터면 각 부모 객체가 horig의 복사본을 받아요. horighparent가 모두 요소 수가 같은 벡터면 hnew(i)는 부모 hparent(i)를 갖습니다.

See also: struct2hdl, hdl2struct, findobj.

더 알아보기

  • octave-graphics-objects — 그래픽 객체
  • octave-graphics-object-properties — 그래픽 객체 속성
  • octave-manipulation-of-plot-objects — 플롯 객체 조작