pythonocc-core icon indicating copy to clipboard operation
pythonocc-core copied to clipboard

extract data from Assembly_STEP & Parts_STP

Open EgonScofield opened this issue 4 years ago • 1 comments

Hi, i want to optimize an existing programm, which is used fore feature-recognition. The actual programm gets its data from a part_list ( .csv), Assembly.STEP, the CAD parts ( also STEP. and STP) and a assembly_sequence list (.csv). In my example, i need 6 files. I want to get rid of the csv. files and want to use the full potenital of the .STEP/ .STP format and extract the assembly sequences and the parts out of my STEP-files. My "AssemblyImport" -module looks like this. Maybe someone could help me with my approach, where i should start, what i should change etc. I have been using python for a week and am still a beginner. I don't want an expedited solution, because I want to solve the problem myself. But since I have some starting difficulties, I am very grateful for every hint. If some extra information is needed, i m gonna add it asap. Greetings Egon

import csv

class assembly_plan():
    def __init__(self, ass_cad='', parts_cads=[], parts_file='', sequences_file=''):
        self._cads = cad_paths(ass_cad, parts_cads)
        self._partslist = parts_list(parts_file)
        self._sequenceslist = sequences_list(sequences_file)
    
    def plan_status(self):
        if self._cads.get_status() and self._partslist.get_status() and self._sequenceslist.get_status():
        # if self._partslist.get_status() and self._sequenceslist.get_status():
            return True
        else:
            return False

    def plan_part_status(self):
        if self._cads.get_parts_status() and self._partslist.get_status and self._sequenceslist.get_status():
            return True
        else:
            return False

    def set_ass_path(self, ass_path):
        self._cads.set_ass_path(ass_path)

    def set_parts_path(self, parts_cads):
        print('adding')
        if isinstance(parts_cads, list):
            for part_cad in parts_cads:
                print(part_cad)
                self._cads.add_parts_path_list(part_cad)
        else:
            self._cads.add_parts_path_list(parts_cads)

    def set_parts_file(self, parts_file):
        self._partslist = parts_list(parts_file)

    def set_sequences_file(self, sequences_file):
        self._sequenceslist = sequences_list(sequences_file)

    def generate_cad_paths(self):
        if self.plan_status:
            ass_path = self._cads.get_ass_path()
            # comp_paths = self._cads.get_parts_paths()
            comp_paths = self._cads.get_parts_paths()
            return [ass_path, comp_paths]
        else:
            return None

    def generate_parts_thread(self):
        if self.plan_status():
            return self._partslist.generate_parts_thread()

    def generate_sequences_thread(self):
        if self.plan_status():
            return self._sequenceslist.generate_sequences_thread()

    def generate_parts_list(self):
        if self.plan_status():
            return self._partslist.generate_parts_list()
        else:
            return None

    def generate_sequences_list(self):
        if self.plan_status():
            return self._sequenceslist.generate_sequences_list()
        else:
            return None

    def associate(self):
        '''
        THe function is to find the associations between parts CAD files
        and parts list as well as sequences.
        Filename builds the ass. between CADs and parts list.
        Part_number - StartComp/EndComp build the ass. between list and seq.
        '''
        print('associate')
        ass_list = []
        name_idx = -1
        if self.plan_part_status():
            parts_cads = self.generate_cad_paths()[1]
            parts_list = self.generate_parts_list()
            sequences = self.generate_sequences_list()
            parts_thread = self.generate_parts_thread()
            sequences_thread = self.generate_sequences_thread()
            name_idx = parts_thread.index('Filename')
            part_num_idx = parts_thread.index('Part_number')
            start_idx = sequences_thread.index('StartComp')
            end_idx = sequences_thread.index('EndComp')
            type_idx = sequences_thread.index('Type')

            for part_cad in parts_cads:
                mid_list = []
                part_cad_name = part_cad.split('/')[-1]
                for part in parts_list:
                    if part_cad_name == part[name_idx]:
                        related_seq_list = []
                        part_numbers = part[part_num_idx].split(';')
                        for pn in part_numbers:
                            seq_handling_list = []
                            seq_joining_list = []
                            seq_other_list = []
                            for sequence in sequences:
                                if pn in sequence[start_idx] or pn in sequence[end_idx]:
                                    if sequence[type_idx] == 'joining':
                                        seq_joining_list.append(sequence[0])
                                    elif sequence[type_idx] == 'handling':
                                        seq_handling_list.append(sequence[0])
                                    else:
                                        seq_other_list.append(sequence[0])

                            mid_list = [pn, part_cad, seq_joining_list, seq_handling_list, seq_other_list]
                            ass_list.append(mid_list)
        return ass_list


class cad_paths():

    def __init__(self, ass_cad='', comp_cads=[]):
        self._assembly_path = ass_cad
        self._parts_path_list = comp_cads

    def set_ass_path(self, ass_path):
        self._assembly_path = ass_path

    def get_ass_path(self):
        return self._assembly_path

    def add_parts_path_list(self, part_path):
        self._parts_path_list.append(part_path)

    def del_parts_path(self, part_path):
        if part_path in self._parts_path_list:
            del self._parts_path_list[self._parts_path_list.index(part_path)]

    def get_parts_paths(self):
        return self._parts_path_list

    def get_status(self):
        if self._assembly_path is not None and self._parts_path_list:
            return True
        else:
            return False

    def get_parts_status(self):
        if self._parts_path_list:
            return True

class parts_list():
    def __init__(self, parts_file):
        self._reader = None
        self._parts_data = None
        self._status = False
        try:
            self.csv_st = open(parts_file, newline='')
            self._status = True
        except FileNotFoundError:
            print('Warning: No parts file found.')

    @property
    def reader(self):
        if self._reader is None and self._status:
            self._reader = csv.reader(self.csv_st, delimiter=',')
        return self._reader

    @property
    def parts_data(self):
        if self._parts_data is None and self._status:
            self._parts_data = [row for row in self.reader]
        return self._parts_data

    
    def get_status(self):
        if self._status:
            return True
        else:
            return False

    def generate_parts_thread(self):
        if self._status and self.parts_data:
            self.thread = self.parts_data[0]
            return self.thread
        else:
            return []

    def generate_parts_list(self):
        if self._status and self.parts_data:
            parts_list = self.parts_data[1:]
            return parts_list
        return None

class sequences_list():
    def __init__(self, sequences_file):
        self._reader = None
        self._sequences_data = None
        self._status = False
        try:
            self.csv_mp = open(sequences_file, newline='')
            self._status = True
        except FileNotFoundError:
            print('Warning: No assembly sequences file found')

    @property
    def reader(self):
        if self._reader is None and self._status:
            self._reader = csv.reader(self.csv_mp, delimiter=',')
        return self._reader

    @property
    def sequences_data(self):
        if self._sequences_data is None and self._status:
            self._sequences_data = [row for row in self.reader]
        return self._sequences_data

    def get_status(self):
        if self._status:
            return True
        else:
            return False

    def generate_sequences_thread(self):
        if self._status:
            return self.sequences_data[0]

    def generate_sequences_list(self):
        if self._status:
            sequences_list = self.sequences_data[1:]
            return sequences_list
        else:
            return None

def str_to_list(in_str):
    result_list = []
    if in_str[0] == '[':
        for i in range(len(in_str)):
            if in_str[i] == '[':
                start_idx = i + 1
                b_vec = False
            elif in_str[i] == ';' or in_str[i] == ']':
                end_idx = i
                b_vec = True
            else:
                b_vec = False

            if b_vec:
                mid_str = in_str[start_idx:end_idx]
                result_list.append(mid_str)
                start_idx = end_idx + 1
    return result_list

EgonScofield avatar Dec 01 '20 22:12 EgonScofield