본문 바로가기

Script/Python

UE4 에디터 유형별 에셋 및 기타 기능 WIP

#-*-coding:utf-8 -*-
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4 import *
import sys
import unreal
import glob

actor_list = []
actor_count=[]
classtype = [unreal.StaticMeshActor, unreal.SkeletalMeshActor, unreal.PostProcessVolume,
             unreal.SphereReflectionCapture, unreal.DirectionalLight, unreal.LightmassImportanceVolume
    , unreal.PlayerStart]

class Test2(QtGui.QMainWindow):


    def __init__(self): #Method #self는 객체의 인스턴스 그자체.

        #3.0이상 버전에서 super().__init__()
        # 다른 메소스에서 변수 사용할려면 self붙임.
        super(QtGui.QMainWindow, self).__init__()#3.0이상 버전에서 super().__init__()
        #self.setupUi()
        self.tableUi()
        self.resize(1000,500)
        self.move(150,150)

        btn1 = QtGui.QPushButton("getLevelActor", self)
        btn1.move(250, 0)
      #  btn1.clicked.connect(self.)

    def tableUi(self):

        self.boxLayout = QtGui.QVBoxLayout()
        self.boxLayout2 = QtGui.QVBoxLayout()

        self.treeWidget = QtGui.QTreeWidget(self)
        self.label = QtGui.QLabel("Label")
        self.boxLayout.addWidget(self.treeWidget)
        self.boxLayout.addWidget(self.label)
        self.treeWidget.resize(1000,500)
        self.treeWidget.setHeaderLabel("HeaderLabel")
        self.toplevelList = []
        self.toplevelitem =[]

        actor_count = self.get_actors_count_level()
        self.actors = unreal.EditorLevelLibrary.get_all_level_actors()

        childitem = []  #--- 액터를 담을 아이템
        childlevelList =[]  #-- 버튼으로 보여줄 각각의 액터.

        # 아래 넣어줄 toplevelList[] 의 값
        for z in range(len(classtype) - 1):
            self.toplevelList.append(QtGui.QLabel())  # --- 리스트에 라벨 추가할떄마다 아래 값을 대입.
            self.toplevelList[z] = QtGui.QLabel(str(classtype[z]) + str(actor_count[z].values()))

        for s in range(len(classtype)-1):
            actor_by_class = unreal.EditorFilterLibrary.by_class(self.actors, classtype[s])
            self.toplevelitem.append(QtGui.QTreeWidgetItem())  # -- QTreeWidgetItem 리스트에 추가.
            self.treeWidget.addTopLevelItem(self.toplevelitem[s])  # -- QTreeWidgetItem 비어있는 아이템을 Toplevel에 추가.
            self.treeWidget.setItemWidget(self.toplevelitem[s], 0, self.toplevelList[s]) # -- QTreeWidgetItem[]에 toplevelList[]의 값을 넣어줌.

            for i in range(len(actor_by_class)):
                childitem.append(QtGui.QTreeWidgetItem())  # -- childitem용 QTreeWidgetItem 리스트에 추가.
                self.toplevelitem[s].addChild(childitem[i]) # -- 각각의 Toplevel item에 비어있는 아이템을 액터수만큼 생성.

                childlevelList.append(QtGui.QPushButton()) # -- QPushButton 리스트에 추가.
                childlevelList[i] = QtGui.QPushButton(str(actor_by_class[i])) # -- 각각의 액터클래스이름을 받아서 버튼을 리스트로
                self.treeWidget.setItemWidget(childitem[i], 0, childlevelList[i]) # -- childitem에다가 위 버튼 값을 넣어줌

            # init list -- 이 코드 없어서 리스트 제대로 안나오는걸 하루넘게 못 잡음.ㅠㅠ
            del childitem[:]


    def chilsDes(self):
        print"clicked"

        #테이블 에디터 금지.
    #    self.table.setEditTriggers(QtGui.QTableWidget.NoEditTriggers)

      #  self.table.setHorizontalHeaderLabels([U"코드", U"설정"])
      #  self.table.cellDoubleClicked.connect(self.cell_was_clicked)

    def table2Ui(self):
        self.table1 = QtGui.QTableWidget(self)
        self.table1.move(0, 0)
        self.table1.resize(200, 200)
        print"xxxxxxxxxxxxxxxxxxxxxxxx"

    #  self.table.cellDoubleClicked.connect(self.cell_was_clicked)

    def setupUi(self):
        self.setWindowTitle( "title")
        self.resize(500, 880)
        self.move(400,0)

        btn1 = QtGui.QPushButton("getLevelActor", self)
        btn2 = QtGui.QPushButton(U"임포트", self)
        btn3 = QtGui.QPushButton(U"LOD갯수", self)
        btn4 = QtGui.QPushButton("ClickMe", self)
        btn5 = QtGui.QPushButton(U"레벨 정보 얻기", self)

        btn1.move(50,50)
        btn2.move(150, 50)
        btn3.move(150, 100)
        btn4.move(150, 150)
        btn5.move(250, 50)

        btn1.clicked.connect(self.table_set_item)



    # --- 클래스 이름과 클래스를 사용하고 있는 액터 갯수.
    def get_class_count(self, class_name):
        actors = unreal.EditorLevelLibrary.get_all_level_actors()

        # --- 클래스로 리스트안에서 선택.
        actor_by_class = unreal.EditorFilterLibrary.by_class(actors, class_name)
        # --- 이름과 수를 딕셔너리로 저장.
        class_count = {class_name:len(actor_by_class)}
        actor_count.append(class_count)
        return actor_by_class
    # --- 지정한 클래스 타입에 따라 실행하고 난뒤 최종 리스트값(actor_count)을 반환.
    def get_actors_count_level(self):
        for i in classtype:
            self.get_class_count(i)
        return actor_count



    def get_class(self, actor, class_name):
        if actor.static_class() == class_name.static_class():
            actor_array = {actor.get_actor_label(): str(actor.static_class())}
            actor_list.append(actor_array)

    def get_all_actors_Level(self):
        # --- 리스트안의 데이타만 삭제.(초기화)
        del actor_list [:]

        actors = unreal.EditorLevelLibrary.get_all_level_actors()
        classtypecount = len(classtype)

        for i in actors:
            for s in range(0, classtypecount):
                self.get_class(i, classtype[s] )
        return actor_list

    # --- 테이블 아이템 세팅.
    def table_set_item(self):
        # --- 레벨상 액터들 정보값을 리턴 받는다
        actor_list = self.get_all_actors_Level()
        actor_count = self.get_actors_count_level()
        print actor_count
       # actor_list.sort()
        actor_list_lens = len(actor_list)

        # --- 액터들 갯수에 따라 행렬 갯수 구분(데이타 정보에 따라 수정)
        self.table.setRowCount(len(classtype))
        #self.table.setRowCount(actor_list_lens)
        self.table.setColumnCount(len(actor_list[0]) + 2)


        # --- 정해진 액터 리스트별 값들을 테이블에 넣어준다.
        for i in range(0, len(classtype)):
       # for i in range(0, actor_list_lens):
            # --- actor_list[] #액터 리스트안 i번째 딕셔너리의 키값 가져오기
            actor_list_key = str(actor_list[i].keys())
            actor_list_count = str(actor_count[i].values())
            actor_list_name = str(actor_count[i].keys())

            # --- 액터리스트중 키값을 데이타로 받는 아이템 생성.
            items = QtGui.QTableWidgetItem(actor_list_key)
            items_count = QtGui.QTableWidgetItem(actor_list_count)
            items_list = QtGui.QTableWidgetItem(actor_list_name)
            # --- 생성된 아이템을 테이블에 set
            self.table.setItem(i, 0, items_list)
            self.table.setItem(i, 1, items_count)
        self.table.itemDoubleClicked.connect(self.cell_was_clicked)



    def cell_was_clicked(self):
        tree_item = QtGui.QTreeWidgetItem("aaaaaa")

        tree_widget = QtGui.QTreeWidget(self)
        tree_widget.addTopLevelItem(tree_item)

        layout = QtGui.QStringListModel()

        self.setLayout(layout)




        # actor_list_key = str(actor_list[i].keys())
        # items = QtGui.QTableWidgetItem(actor_list_key)
        row = self.table.currentRow()
        col = self.table.currentColumn()

        print("Row %d and Col %d was Clicked" %(row, col))




          #  self.table.setItem(i, 2, items)


    def testme(self):
        print"aaaaaaaaaaaaaaaaaa"
    # layout = QtGui.QGridLayout()
    # layout.addWidget(self.table,0,0)
    # self.setLayout(layout)


    def get_Num_Verts(Mesh, lod_index=0):
        if Mesh == unreal.SkeletalMesh:
            verts = unreal.EditorSkeletalMeshLibrary.get_num_verts(Mesh, lod_index)
        if Mesh == unreal.StaticMesh:
            verts = unreal.EditorStaticMeshLibrary.get_num_verts(Mesh, lod_index)



        print verts




    def success_Message(self):
        Qbox = QtGui.QMessageBox
       # Qbox.setGeometry(self, 30, 300, 2000, 10)

        Qbox.about(self, "message", U"완료하였습니다.")



app= None
if not QtGui.QApplication.instance():
    app=QtGui.QApplication(sys.argv)

dialog = Test2() # dialog = 객체를 생성할땐 생성자를 사용., 인스턴스(해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체)
dialog.show()

#app.exec_()  -- 이벤트 루프 생성.

'Script > Python' 카테고리의 다른 글

Python - 3Dsmax 스크립트관리 및 뷰어.  (0) 2020.05.07