본문 바로가기
아래아한글 자동화/python+hwp 중급

SetPos 대신 SetPosBySet을 쓰면 훨씬 유용한 경우 : GetAnchorPos와 연계할 때

by 일코 2022. 9. 15.

컨트롤코드를 써서 아래아한글 보고서 자동화를 할 때

십중팔구 사용하는 메서드가 있습니다.

해당 컨트롤의 위치를 찾아내는 GetAnchorPos,

그리고 찾아낸 위치로 찾아가는 SetPos가 대표적이죠.

 

이전 예제에서 사용한 GetAnchorPos 메서드 예제 일부를 먼저 살펴보겠습니다.

def 문자열삽입(문자열):
    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = 문자열
    hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)


caption_list = [
    "구름 낀 하늘", 
    "푸른 하늘", 
    "사막의 잔디", 
    "강 주변", 
    "아프리카 강", 
    "해저 모래", 
    "해저 바닥", 
    "삼엽충"]
    

ctrl = hwp.HeadCtrl
image_loc = []
while True:
    if ctrl.UserDesc == "그림":
        image_loc.append(ctrl.GetAnchorPos(0))  # <<<<<----- 이 부분과,
        ctrl = ctrl.Next
    else:
        ctrl = ctrl.Next

for idx, loc in enumerate(image_loc[::-1]):
    hwp.SetPos(*[loc.Item(i) for i in ["List", "Para", "Pos"]])  # <<<<<----- 이 부분
    hwp.Run("MoveLineEnd")
    hwp.Run("BreakPara")
    문자열삽입(f"<{caption_list[::-1][idx]}>")

두 라인을 보시면 대략 GetAnchorPos로 찾은 아이템세트를 어떻게 SetPos 안에 넣어야 하는지

짐작하실 수 있을 겁니다.

결론만 이야기하면

SetPos는 단순히 세 개의 정수만 인자로 받습니다.

GetAnchorPos가 리턴하는 자료형은 단순한 파이썬 자료형인 리스트나 튜플이 아니라

한/글에서 제공하는 독특한 자료형인 "파라미터셋"이라서

"loc.Item(i)" 방식으로 다시 한 번 각각의 값을 리턴받아야 합니다.

한 마디로 번거롭습니다.

그런데, 이 때 SetPosBySet 메서드는 이 과정을 확 줄여줍니다.

아래 방식으로 사용할 수 있거든요.

hwp.SetPosBySet(ctrlcode.GetAnchorPos(0))

다시말해

SetPosBySet은 한 개의 파라미터셋을 인자로 받습니다.

그러면 위의 예제는 다음과 같이 단순하게 바꿀 수 있겠네요.

def 문자열삽입(문자열):
    hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
    hwp.HParameterSet.HInsertText.Text = 문자열
    hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)


caption_list = [
    "구름 낀 하늘", 
    "푸른 하늘", 
    "사막의 잔디", 
    "강 주변", 
    "아프리카 강", 
    "해저 모래", 
    "해저 바닥", 
    "삼엽충"]
    

ctrl = hwp.HeadCtrl
image_loc = []
while True:
    if ctrl.UserDesc == "그림":
        image_loc.append(ctrl.GetAnchorPos(0))
        ctrl = ctrl.Next
    else:
        ctrl = ctrl.Next

for idx, loc in enumerate(image_loc[::-1]):
    # hwp.SetPos(*[loc.Item(i) for i in ["List", "Para", "Pos"]])  # <- 이렇게 복잡한 기존 코드 대신
    hwp.SetPosBySet(loc)  # <- 이렇게 단순하게 바꿀 수 있음
    hwp.Run("MoveLineEnd")
    hwp.Run("BreakPara")
    문자열삽입(f"<{caption_list[::-1][idx]}>")

어떤 경우에 SetPosBySet을 사용하면 좋은지 감을 잡으셨을 거예요.

파라미터셋의 값을 그대로 SetPos 인자로 전달할 때는 거의 무조건 BySet메서드가 유용합니다.

다만, 값을 알아낸 이후 특정 작업을 거쳐야 하거나, 추가로 이동위치에 오프셋을 줘야 하는 경우는

위치 파라미터셋을 리스트로 추출한 후에 수정을 하고, SetPos 인자로 넣으면 되겠네요.

또, 리스트 컴프리헨션이나 튜플 언패킹 같은 파이썬 문법 대신 직관적인 코드가 만들어진다는 장점도 있으니

SetPosBySet 메서드도 많이 활용해주세요.

 

이번 포스팅은 여기서 마칩니다.

행복한 하루 되세요!

댓글