Source code for pymead.plugins.IGES.entity

import typing

from pymead.plugins.IGES.iges_param import IGESParam


[docs] class Entity: line_fonts = { "no_pattern": 0, "solid": 1, "dashed": 2, "phantom": 3, "centerline": 4, "dotted": 5, } color_numbers = { "no_color": 0, "black": 1, "red": 2, "green": 3, "blue": 4, "yellow": 5, "magenta": 6, "cyan": 7, "white": 8, }
[docs] def __init__(self, ID: int, parameter_data: typing.List[IGESParam]): self.entity_ID = IGESParam(ID, "int") self.pd_pointer = IGESParam(1, "int") # First parameter data line for this entity self.structure = IGESParam("", "none") self.line_font_pattern = IGESParam(self.line_fonts['solid'], "int") self.level = IGESParam(1, "int") self.view = IGESParam(0, "int") self.transformation_matrix_pointer = IGESParam(0, "int") self.label_display_associativity = IGESParam("", "none") self.status_number = IGESParam(0, "int") self.line_weight_number = IGESParam(105, "int") self.color_number = IGESParam(self.color_numbers['cyan'], "int") self.parameter_line_count = IGESParam(2, "int") self.form_number = IGESParam(0, "int") self.reserved = IGESParam("", "none") self.entity_label = IGESParam("", "none") self.subscript_number = IGESParam(0, "int") self.parameter_data = parameter_data self.param_delimiter = None self.record_delimiter = None
# TODO: make the color for each entity (or at least all entities) an option in the IGES export (QComboBox?) def write_entity_string(self, entity_starting_line: int, data_starting_line: int, data_string_lines: int): entity_string = "" def write_line_string(line: typing.List[IGESParam], string_to_write: str): for iges_param in line: if iges_param.dtype == "none": string_to_write += " " * 8 elif iges_param.dtype == "int": string_to_write += f"{iges_param.value:8d}" else: raise TypeError(f"For an entity, every parameter must have type 'int' or type 'none'. Found an" f"IGESParam with type {type(iges_param)}.") return string_to_write self.pd_pointer.value = data_starting_line self.parameter_line_count.value = data_string_lines line1 = [self.entity_ID, self.pd_pointer, self.structure, self.line_font_pattern, self.level, self.view, self.transformation_matrix_pointer, self.label_display_associativity, self.status_number] line2 = [self.entity_ID, self.line_weight_number, self.color_number, self.parameter_line_count, self.form_number, self.reserved, self.reserved, self.entity_label, self.subscript_number] entity_string = write_line_string(line1, entity_string) + f"D{entity_starting_line:7d}\n" entity_string = write_line_string(line2, entity_string) + f"D{entity_starting_line + 1:7d}\n" return entity_string def write_data_string(self, entity_entry_line: int, data_starting_line: int): data_string = "" current_line = self.entity_ID.write_value_to_python_str() + self.param_delimiter for p_idx, p in enumerate(self.parameter_data): p_str = p.write_value_to_python_str() if len(current_line) + len(p_str) < 64: current_line += p_str if p_idx < len(self.parameter_data) - 1: current_line += self.param_delimiter else: current_line += self.record_delimiter current_line += " " * (64 - len(current_line)) current_line += f"{entity_entry_line:8d}P{data_starting_line:7d}\n" data_string += current_line else: current_line += " " * (64 - len(current_line)) current_line += f"{entity_entry_line:8d}P{data_starting_line:7d}\n" data_starting_line += 1 data_string += current_line current_line = p_str + self.param_delimiter return data_string
[docs] class MultiEntityContainer:
[docs] def __init__(self, entities: typing.List[Entity]): self.entities = entities
def write_all_entity_and_data_strings(self): full_entity_string = "" full_data_string = "" data_starting_lines = [1] data_string_lengths = [] # First pass loop to generate the data strings and the data string line numbers for entity_idx, entity in enumerate(self.entities): entity_entry_line = 1 + 2 * entity_idx data_string = entity.write_data_string(entity_entry_line, data_starting_line=data_starting_lines[-1]) if entity_idx < len(self.entities) - 1: data_starting_lines.append(data_starting_lines[-1] + data_string.count('\n')) data_string_lengths.append(data_string.count('\n')) full_data_string += data_string # Second pass loop to use the data string line numbers to generate the entity strings for entity_idx, entity in enumerate(self.entities): entity_entry_line = 1 + 2 * entity_idx full_entity_string += entity.write_entity_string(entity_entry_line, data_starting_lines[entity_idx], data_string_lines=data_string_lengths[entity_idx]) return full_entity_string, full_data_string