def cGetMatchingSmartSet(checkSetData, glyph, contourNumber): """ 현재 속성을 부여하려고 시도한 그룹 딕셔너리가 바뀌는 경우 교체하기 위한 메소드(한자 버전) Return :: int 스마트 셋의 인덱스를 반환 """ sSets = getSmartSets() mode = getExtensionDefault(DefaultKey + ".mode") matrix_margin = getExtensionDefault(DefaultKey + ".matrix_margin") topology_margin = getExtensionDefault(DefaultKey + ".topology_margin") matrix_size = getExtensionDefault(DefaultKey + ".matrix_size") font = getExtensionDefault(DefaultKey + ".font") if mode is matrixMode: searchMode = "Matrix" elif mode is topologyMode: searchMode = "Topology" else: return None index = -1 for sSet in sSets: index += 1 checkSetName = str(sSet.name) checkSetNameList = checkSetName.split('_') if len(checkSetNameList) != 3: continue standardNameList = checkSetNameList[2].split('-') standardGlyphUnicode = standardNameList[0][1:] standardIdx = int(standardNameList[1][0:len(standardNameList) - 1]) for item in sSet.glyphNames: if item != glyph.name: continue if mode == 0: standardGlyph = font[standardGlyphUnicode] standardMatrix = Matrix(standardGlyph.contours[standardIdx], matrix_size) compareController = groupTestController( standardMatrix, matrix_margin) result = compareController.conCheckGroup(glyph[contourNumber]) if result is not None: return index elif mode == 1: standardGlyph = font[standardGlyphUnicode] result = topologyJudgementController( standardGlyph.contours[standardIdx], glyph[contourNumber], topology_margin).topologyJudgement() if result is not False: return index return None
def findContoursGroup(checkSetData, mode): """ json파일과 스마트 셋을 참고하여 이미 그룹화가 진행된 컨투어를 찾아냄 Args : checkSetData :: List 스마트셋 이름을 관리하기 위하여 필요한 checkSetData smartSetSearchModule 파일을 이용하여 구함 [setNumber, syllableNumber,그룹화의 진행 여부] mainWindow :: object editWindow object mode :: int 0 -> matrix , 1- > topology Returns :: Dictionary 각각의 키는 같은 그룸의 컨투어를 포함하는 글리프, 값은 해당 컨투어의 번호를 저장 :: Dictionary key :: RGlyph value :: list """ matrix_margin = getExtensionDefault(DefaultKey + ".matrix_margin") matrix_size = getExtensionDefault(DefaultKey + ".matrix_size") topology_margin = getExtensionDefault(DefaultKey + ".topology_margin") jsonFileName2 = getExtensionDefault(DefaultKey + ".jsonFileName2") #파라미터를 받아오는 작업 font = getExtensionDefault(DefaultKey + ".font") #RFont #초성, 중성, 종성 분리된 딕셔너리 정보를 가져옴 with open(jsonFileName2, 'r') as jsonFile2: configDict = json.load(jsonFile2) ssets = getSmartSets() glyphList = list() res = dict() positionName = None groupSet = None if mode == 0: modeName = "Matrix" else: modeName = "Topology" if checkSetData[1] == 0: positionName = "first" elif checkSetData[1] == 1: positionName = "middle" else: positionName = "final" for sset in ssets: nameList = str(sset.name).split('_') #한자셋은 고려하지 않음 if len(nameList) == 3: continue standardNameList = nameList[3].split('-') standardGlyphUnicode = int(standardNameList[0][1:]) standardIdx = int(standardNameList[1][0:len(standardNameList[1]) - 1]) if (nameList[0] == str(checkSetData[0])) and ( nameList[1] == positionName) and (nameList[2] == modeName): groupSet = sset break for item in groupSet.glyphNames: glyphList.append(font[str(item)]) for g in glyphList: searchContours = [] for i, comc in enumerate(g.contours): if i not in configDict[g.name][checkSetData[1]]: #초, 중, 종 분리 로직 continue if mode == 0: standardGlyph = font[ "uni" + str(hex(standardGlyphUnicode)[2:]).upper()] standardMatrix = Matrix(standardGlyph.contours[standardIdx], matrix_size) compareController = groupTestController( standardMatrix, matrix_margin) result = compareController.conCheckGroup(comc) if result is not None: searchContours.append(i) elif mode == 1: standardGlyph = font[ "uni" + str(hex(standardGlyphUnicode)[2:]).upper()] result = topologyJudgementController( standardGlyph.contours[standardIdx], comc, topology_margin).topologyJudgement() if result is not False: searchContours.append(i) res[g] = searchContours return res
def getMatchGroupByMatrix(standardGlyph, contourIndex, checkSetData): """ UI와 그룹 방법을 연결시켜주는 함수 (Matrix 방법) Args : standardGlyph :: RGlyph 기준 컨투어 contourIndex :: int 컨투어의 번호 margin :: int matrix로 반별시 오차 범위 허용 값(0 ~ 100) 숫자가 높을수록 허용 범위가 넓어짐 (20정도가 적당) width :: int 매트릭스의 가로 구획 수 height :: int 매트릭스의 세로 구획 수 checkSetData :: List 스마트셋 이름을 관리하기 위하여 필요한 checkSetData smartSetSearchModule 파일을 이용하여 구함 [setNumber, syllableNumber] jsonFileName1 :: String 시계방향, 반시계방향 정보를 담고 있는 json파일 이름(1차 필터링 결과) jsonFileName2 :: String 음절 분리가 되어 있는 json파일 이름을 반환 Returns: Dict 처음 그룹화 진행시 생성되는 groupDict을 반환 2020/03/23 스마트셋 이름 규칙을 정리함 set name format example : ##(number)_##(syllable)_####(mode) """ #파라미터를 받아오는 작업 font = getExtensionDefault(DefaultKey + ".font") #RFont mode = getExtensionDefault(DefaultKey + ".mode") jsonFileName1 = getExtensionDefault(DefaultKey + ".jsonFileName1") jsonFileName2 = getExtensionDefault(DefaultKey + ".jsonFileName2") matrix_margin = getExtensionDefault(DefaultKey + ".matrix_margin") matrix_size = getExtensionDefault(DefaultKey + ".matrix_size") contour = standardGlyph.contours[contourIndex] standardMatrix = Matrix(contour, matrix_size) #k에 대한 마진값 적용하는 부분 넣어 주워야 함 compareController = groupTestController(standardMatrix, matrix_margin) smartSetGlyphs = [] smartSet = SmartSet() #추가부분 with open(jsonFileName1, 'r') as jsonFile1: resultDict = json.load(jsonFile1) with open(jsonFileName2, 'r') as jsonFile2: configDict = json.load(jsonFile2) print("checkSetData: ", checkSetData) print("~~~~") standard = resultDict[standardGlyph.name][contourIndex] bar = ProgressBar('Matrix Process', len(resultDict), 'Grouping...') barProcess = 0 if checkSetData[1] == 0: smartSet.name = str(checkSetData[0]) + "_first_Matrix_" + "(" + str( standardGlyph.unicode) + "-" + str(contourIndex) + ")" elif checkSetData[1] == 1: smartSet.name = str(checkSetData[0]) + "_middle_Matrix_" + "(" + str( standardGlyph.unicode) + "-" + str(contourIndex) + ")" elif checkSetData[1] == 2: smartSet.name = str(checkSetData[0]) + "_final_Matrix_" + "(" + str( standardGlyph.unicode) + "-" + str(contourIndex) + ")" smartGroupDict = {} smartContourList = [] for key, value in resultDict.items(): barProcess += 1 smartCheck = 0 for i, compare in enumerate(value): if i not in configDict[key][checkSetData[1]]: #초, 중, 종 분리 로직 continue if (standard['reverse'] == compare['reverse']) and (standard['forword'] == compare['forword']): compareContour = font[key].contours[i] result = compareController.conCheckGroup(compareContour) if result is not None: smartContourList.append(i) smartCheck = 1 if smartCheck == 1: smartGroupDict[font[key]] = smartContourList smartSetGlyphs.append(font[key].name) smartContourList = [] if barProcess % 10 == 0: bar.tick(barProcess) bar.close() smartSet.glyphNames = smartSetGlyphs addSmartSet(smartSet) updateAllSmartSets() return smartGroupDict
def cSearchGroup(glyph,contourNumber,mode,message = False): """ 스마트셋에 그룹이 존재하는지 확인(한자버전) Args: glyph :: RGlyph 검사를 진행하고자 하는 RGlyph contourNumber :: int RGlyph의 검사를 진행하고자 하는 컨투어의 번호 mode :: int 0 -> matrix, 1 -> topology font :: RFont 작업하고 있는 RFont Return :: int 현재 그룹의 번호 """ matrix_margin = getExtensionDefault(DefaultKey+".matrix_margin") matrix_size = getExtensionDefault(DefaultKey+".matrix_size") topology_margin = getExtensionDefault(DefaultKey+".topology_margin") raster_margin = getExtensionDefault(DefaultKey+".raster_margin") font = getExtensionDefault(DefaultKey+".font") check = 0 positionNumber = None searchSmartSet = None if mode == 0: setStat = cGetSmartSetStatMatrix() searchMode = "Matrix" elif mode == 1: setStat = cGetSmartSetStatTopology() searchMode = "Topology" sSets = getSmartSets() glyphNames = list() check = 0 for sSet in sSets: checkSetName = str(sSet.name) checkSetNameList = checkSetName.split('_') if len(checkSetNameList) != 3: continue #검사를 진행을 해야함(기준 컨투어는 알고 있고 비교 글리프에 있는 컨투어는 순회를 하면서 조사하는 방식) #matrix 체크에서는 같은 그룹이 아니면 None이고 topology 에서는 같은 그룹이 아니면 flase반환 standardNameList = checkSetNameList[2].split('-') standardGlyphUnicode = int(standardNameList[0][4:]) standardIdx = int(standardNameList[1][:len(standardNameList[1]) -1]) for item in sSet.glyphNames: if item != glyph.name: continue if mode == 0: #해당 그룹을 조사 standardGlyph = font["cid" + str(standardNameList[0][4:]).upper()] standardMatrix=Matrix(standardGlyph.contours[standardIdx],matrix_size) compareController = groupTestController(standardMatrix,matrix_margin) #Matrix 필터링 result = compareController.conCheckGroup(glyph[contourNumber]) #rasterize 필터링 if result is not None: result2 = re.compareBitMap(standardGlyph[standardIdx], glyph[contourNumber],raster_margin) else: continue if result2 is True: searchSmartSet = sSet check = 1 message = True break elif mode == 1: standardGlyph = font["cid" + str(standardNameList[0][4:]).upper()] #Topology 필터링 result = topologyJudgementController(standardGlyph.contours[standardIdx],glyph[contourNumber],topology_margin).topologyJudgement() #rasterize 필터링 if result == None: result2 = re.compareBitMap(standardGlyph[standardIdx], glyph[contourNumber],raster_margin) else: continue if result2 is True: searchSmartSet = sSet check = 1 message = True break if check == 1: break if searchSmartSet is not None: if message == True: appendNumber = str(searchSmartSet.name).split('_')[0] #print(Message("이미 그룹 연산이 진행이 되어 있으므로 그룹화 작업을 생략합니다.")) return [int(checkSetNameList[0]),positionNumber,0] else: return [int(setStat[0]),positionNumber,1]
def searchGroup(glyph,contourNumber,mode,message = False): """ 스마트셋에 그룹이 존재하는지 확인 Args: glyph :: RGlyph 검사를 진행하고자 하는 RGlyph contourNumber :: int RGlyph의 검사를 진행하고자 하는 컨투어의 번호 mode :: int 0 - > matrix , 1-> topology font :: RFont 작업하고 있는 RFont Return :: List [스마트 셋의 번호,음절 번호(0 - 초성, 1- 중성, 2- 종성),그룹화 진행 여부에 대한 번호(0 -> grouped , 1 -> not grouped)] """ syllableJudgementController = getExtensionDefault(DefaultKey + ".syllableJudgementController") glyphConfigure = syllableJudgementController.GetSyllable(glyph) font = getExtensionDefault(DefaultKey+".font") matrix_margin = getExtensionDefault(DefaultKey+".matrix_margin") matrix_size = getExtensionDefault(DefaultKey+".matrix_size") topology_margin = getExtensionDefault(DefaultKey+".topology_margin") raster_margin = getExtensionDefault(DefaultKey+".raster_margin") check = 0 positionNumber = None searchSmartSet = None #해당 컨투어가 초성인지 중성인지 종성인지 확인 for i in range(0,len(glyphConfigure[str(glyph.unicode)])): for j in range(0,len(glyphConfigure[str(glyph.unicode)][i])): if contourNumber == glyphConfigure[str(glyph.unicode)][i][j]: check = 1 positionNumber = i break if check == 1: break if mode == 0: setStat = getSmartSetStatMatrix() searchMode = "Matrix" elif mode == 1: setStat = getSmartSetStatTopology() searchMode = "Topology" if positionNumber == 0: positionName = "first" elif positionNumber == 1: positionName = "middle" else: positionName = "final" sSets = getSmartSets() glyphNames = list() check = 0 for sSet in sSets: checkSetName = str(sSet.name) checkSetNameList = checkSetName.split('_') if checkSetNameList[1] != positionName or checkSetNameList[2] != searchMode: continue #검사를 진행을 해야함(기준 컨투어는 알고 있고 비교 글리프에 있는 컨투어는 순회를 하면서 조사하는 방식) #matrix 체크에서는 같은 그룹이 아니면 None이고 topology 에서는 같은 그룹이 아니면 flase반환 standardNameList = checkSetNameList[3].split('-') standardGlyphUnicode = int(standardNameList[0][1:]) standardIdx = int(standardNameList[1][0:len(standardNameList)-1]) for item in sSet.glyphNames: if item != glyph.name: continue if mode == 0: standardGlyph = font["uni" + str(hex(standardGlyphUnicode)[2:]).upper()] standardMatrix=Matrix(standardGlyph.contours[standardIdx],matrix_size) compareController = groupTestController(standardMatrix,matrix_margin) result = compareController.conCheckGroup(glyph[contourNumber]) if result is not None: searchSmartSet = sSet check = 1 message = True break elif mode == 1: standardGlyph = font["uni" + str(hex(standardGlyphUnicode)[2:]).upper()] result = topologyJudgementController(standardGlyph.contours[standardIdx],glyph[contourNumber],topology_margin).topologyJudgement() if result is not False: searchSmartSet = sSet check = 1 message = True break if check == 1: break if positionNumber == 0: appendNumber = setStat["first"] elif positionNumber == 1: appendNumber = setStat["middle"] elif positionNumber == 2: appendNumber = setStat["final"] if searchSmartSet is not None: if message == True: appendNumber = str(searchSmartSet.name).split('_')[0] #print(Message("이미 그룹 연산이 진행이 되어 있으므로 그룹화 작업을 생략합니다.")) return [int(appendNumber),positionNumber,0] else: return [appendNumber,positionNumber,1]
def getMatchingSmartSet(checkSetData, glyph, contourNumber): """ 현재 속성을 부여하려고 시도한 그룹 딕셔너리가 바뀌는 경우 교체하기 위한 메소드(한글 버전) """ sSets = getSmartSets() check = 0 mode = getExtensionDefault(DefaultKey + ".mode") glyphConfigure = getConfigure(glyph) positionNumber = None searchSmartSet = None matrix_margin = getExtensionDefault(DefaultKey + ".matrix_margin") topology_margin = getExtensionDefault(DefaultKey + ".topology_margin") matrix_size = getExtensionDefault(DefaultKey + ".matrix_size") font = getExtensionDefault(DefaultKey + ".font") if mode is matrixMode: searchMode = "Matrix" elif mode is topologyMode: searchMode = "Topology" else: return None for i in range(0, len(glyphConfigure[str(glyph.unicode)])): for j in range(0, len(glyphConfigure[str(glyph.unicode)][i])): if contourNumber == glyphConfigure[str(glyph.unicode)][i][j]: check = 1 positionNumber = i break if check == 1: break syllable = ["first", "middle", "final"] positionName = syllable[positionNumber] check = 0 index = -1 for sSet in sSets: index += 1 checkSetName = str(sSet.name) checkSetNameList = checkSetName.split('_') if checkSetNameList[1] != positionName or checkSetNameList[ 2] != searchMode: continue if len(checkSetNameList) == 3: continue standardNameList = checkSetNameList[3].split('-') standardGlyphUnicode = int(standardNameList[0][1:]) standardIdx = int(standardNameList[1][0:len(standardNameList) - 1]) for item in sSet.glyphNames: if item != glyph.name: continue if mode == 0: standardGlyph = font[ "uni" + str(hex(standardGlyphUnicode)[2:]).upper()] standardMatrix = Matrix(standardGlyph.contours[standardIdx], matrix_size) compareController = groupTestController( standardMatrix, matrix_margin) result = compareController.conCheckGroup(glyph[contourNumber]) if result is not None: return index elif mode == 1: standardGlyph = font[ "uni" + str(hex(standardGlyphUnicode)[2:]).upper()] result = topologyJudgementController( standardGlyph.contours[standardIdx], glyph[contourNumber], topology_margin).topologyJudgement() if result is not False: return index return None
def cFindContoursGroup(checkSetData, mode): """ json파일과 스마트 셋을 참고하여 이미 그룹화가 진행된 컨투어를 찾아냄 Args : checkSetData :: int 한자를 관리하기 위한 번호 mainWindow :: object editWindow object mode :: int 0 -> matrix , 1- > topology Returns :: Dictionary 각각의 키는 같은 그룸의 컨투어를 포함하는 글리프, 값은 해당 컨투어의 번호를 저장 :: Dictionary key :: RGlyph value :: list """ #파라미터를 받아오는 작업 font = getExtensionDefault(DefaultKey+".font")#RFont ssets = getSmartSets() glyphList = list() res = dict() positionName = None groupSet = None if mode == 0: modeName = "Matrix" else: modeName = "Topology" for sset in ssets: nameInfo = sset.name.split('_') #print("nameInfo : ",nameInfo) if len(nameInfo) != 3: continue ChineseIndex = int(nameInfo[0]) if checkSetData[0] == ChineseIndex: groupSet = sset break for item in groupSet.glyphNames: glyphList.append(font[str(item)]) #기준 컨투어를 뽑아내는 작업 checkSetName = str(groupSet.name) checkSetNameList = checkSetName.split('_') standardNameList = checkSetNameList[2].split('-') standardGlyphUnicode = int(standardNameList[0][4:]) standardIdx = int(standardNameList[1][:len(standardNameList[1]) -1]) matrix_margin = getExtensionDefault(DefaultKey+".matrix_margin") matrix_size = getExtensionDefault(DefaultKey+".matrix_size") topology_margin = getExtensionDefault(DefaultKey+".topology_margin") for g in glyphList: searchContours = [] for i,comc in enumerate(g.contours): if mode == 0: standardGlyph = font["cid" + str(standardNameList[0][4:]).upper()] standardMatrix=Matrix(standardGlyph.contours[standardIdx],matrix_size) compareController = groupTestController(standardMatrix,matrix_margin) result = compareController.conCheckGroup(comc) if result is not None: searchContours.append(i) elif mode == 1: standardGlyph = font["cid" + str(standardNameList[0][4:]).upper()] result = topologyJudgementController(standardGlyph.contours[standardIdx],comc,topology_margin).topologyJudgement() if result is not False: searchContours.append(i) res[g] = searchContours return res
def cGetMatchGroupByMatrix(standardGlyph, contourIndex, checkSetData): """ 한자버전 UI와 그룹 방법을 연결시켜주는 함수 (Matrix 방법) Args : standardGlyph :: RGlyph 기준 글리프 contourIndex :: int 컨투어의 번호 margin :: int matrix로 반별시 오차 범위 허용 값(0 ~ 100) 숫자가 높을수록 허용 범위가 넓어짐 (20정도가 적당) width :: int 매트릭스의 가로 구획 수 height :: int 매트릭스의 세로 구획 수 checkSetData :: int 한자를 관리하기 위한 번호 jsonFileName1 :: String 시계방향, 반시계방향 정보를 담고 있는 json파일 이름(1차 필터링 결과) jsonFileName2 :: String 음절 분리가 되어 있는 json파일 이름을 반환 2020/03/23 스마트셋 이름 규칙은 숫자 번호대로 """ #파라미터를 받아오는 작업 font = getExtensionDefault(DefaultKey+".font")#RFont mode = getExtensionDefault(DefaultKey+".mode") jsonFileName1 = getExtensionDefault(DefaultKey+".jsonFileName1") jsonFileName2 = getExtensionDefault(DefaultKey+".jsonFileName2") matrix_margin = getExtensionDefault(DefaultKey+".matrix_margin") matrix_size = getExtensionDefault(DefaultKey+".matrix_size") raster_margin = getExtensionDefault(DefaultKey+".raster_margin") contour = standardGlyph.contours[contourIndex] standardMatrix = Matrix(contour,matrix_size) #k에 대한 마진값 적용하는 부분 넣어 주워야 함 compareController = groupTestController(standardMatrix,matrix_margin) smartSetGlyphs = [] smartSet = SmartSet() #추가부분 with open(jsonFileName1, 'r') as jsonFile1: resultDict = json.load(jsonFile1) standard = resultDict[standardGlyph.name][contourIndex] bar = ProgressBar('Matrix Process',len(resultDict),'Grouping...') barProcess = 0 smartGroupDict = {} smartContourList = [] smartSet.name = str(checkSetData[0])+"_Matrix_" + "(" + str(standardGlyph.name) + "-" + str(contourIndex) + ")" for key, value in resultDict.items(): barProcess += 1 smartCheck = 0 for i,compare in enumerate(value): #비교 컨투어 설정 compareContour = font[key].contours[i] #clockWise 1차 필터링 if (standard['reverse'] == compare['reverse']) and (standard['forword'] == compare['forword']): #Matrix 2차 필터링 result = compareController.conCheckGroup(compareContour) #rasterize 3차 필터링 if result is not None: result2 = re.compareBitMap(standardGlyph[contourIndex], compareContour,raster_margin) else: continue if result2 is True: smartContourList.append(i) smartCheck = 1 #if result is not None: #smartContourList.append(i) #smartCheck = 1 #else: #continue if smartCheck == 1: glyphUniName = font[key].name smartGroupDict[glyphUniName] = smartContourList smartSetGlyphs.append(glyphUniName) smartContourList = [] if barProcess % 10 == 0: bar.tick(barProcess) bar.close() smartSet.glyphNames = smartSetGlyphs addSmartSet(smartSet) updateAllSmartSets()