해결된 질문
작성
·
112
2
안녕하세요 일코님
이번에 질문드릴 내용은
선택된 영역의 수식의 String을 변수에 저장하고 싶어서 질문드립니다.
일전에 질문드린 내용에서
hwp.get_selected_pos()를 사용하여 선택된 영역의 위치값을 알 수 있었는데요
이 위치값 안에 위치한 수식의 String을 가져오고 싶어서 문의드립니다.
123과 1/3은 수식으로 입력된 내용입니다.
만약 선택된 내용을 hwp.get_selected_pos()로 받고
math_string = '앞은 문자' + 123
(123은 수식에서 가져온 'String')
이런식으로 변수에 선언해주고 싶다면 어떻게 해야할까요..
(문자와 수식이 혼합된 경우 동일한 순서로 값을 받는 방법이 있을지 궁금합니다.)
selected_pos 안에 ctrl을 조회하는게
이전에 설명주신 내용에서는
전체 문서의 ctrl_list의 UserDesc를 조회를 하게되는 방식이였는데
선택된 내부의 ctrl만 조회하게 하는 방법은 없는지도 질문드립니다.
답변 1
2
용준님, 안녕하세요?
선택된 범위 내의 ctrl만 조회하는 명령어는 따로 만들어져 있지는 않습니다.
(별도의 함수로 만들 수 있을 것도 같은데, 그건 맨 아래에 써보겠습니다.)
대신 이런 방법을 써보시면 어떨까요?
이런 식으로 미리 일괄 치환을 해버리시면,
편하게 문자열 + 수식String 작업을 처리하실 수 있지 않을까 싶습니다.
수식String을 치환할 때 특정 문자열(백틱이라든지, -*-라든지..)을
앞뒤로 삽입하시면, 수식을 찾기도 쉬울 거고요.
수식을 String 문자열로 치환해버리는 코드는 아래와 같이 짤 수 있습니다.
for ctrl in hwp.ctrl_list:
if ctrl.UserDesc == "수식":
hwp.set_pos_by_set(ctrl.GetAnchorPos(1))
hwp.insert_text("`" + ctrl.Properties.Item("String") + "`")
hwp.delete_ctrl(ctrl) # 수식 없애는 라인
수식위치 리스트를 별도로 미리 만들어놓고,
hwp.get_selected_pos() 에 해당되는지 매번 조회해도 될 듯 합니다^^;
예를 들어 아래 math_pos는 수식과 수식의 pos를 담고 있습니다.
math_pos = []
for ctrl in hwp.ctrl_list:
if ctrl.UserDesc == "수식":
hwp.set_pos_by_set(ctrl.GetAnchorPos(1))
math_pos.append([hwp.get_pos(), ctrl])
print(math_pos)
[[(0, 0, 22), <win32com.gen_py.HwpObject 1.0 Type Library.IDHwpCtrlCode instance at 0x2154797250368>],
[(0, 1, 3), <win32com.gen_py.HwpObject 1.0 Type Library.IDHwpCtrlCode instance at 0x2154820951296>]]
만약 hwp.get_selected_pos() 안에 수식 컨트롤이 있을 때, 그 컨트롤을 리턴하고 싶다면?
아래와 같이 함수를 짜볼 수 있을 것 같아요. (단, 한 문단만 선택하는 경우에 한해서 사용가능합니다.)
def math_in_selection():
sel_pos = hwp.get_selected_pos()
math_pos = []
for ctrl in hwp.ctrl_list:
if ctrl.UserDesc == "수식":
hwp.set_pos_by_set(ctrl.GetAnchorPos(1))
math_pos.append([hwp.get_pos(), ctrl])
start = sel_pos[1:4]
end = [i + 1 for i in sel_pos[4:]]
lst, par, pos = [list(range(*i)) for i in list(zip(start, end))]
return_list = []
for i in math_pos:
if (i[0][0] in lst and
i[0][1] in par and
i[0][2] in pos):
return_list.append(i[1])
return return_list
ms = math_in_selection()
for m in ms:
print(m.Properties.Item("String"))
두 번째 함수가 용준님께서 말씀하신
"선택된 내부의 ctrl만 조회하게 하는 방법은 없는지"에 대한 답변이 된 것 같기도 합니다.
잘 이해가 안 되거나 추가로 궁금한 부분이 있으면 댓글 달아주세요^^
행복한 하루 되세요!!