def add_drag(part: ET.Element): """Adds drag to the part""" raw_drag = part.get('drag') drag = parse_numstr(raw_drag) area = [1.5*x for x in drag] raw_area = create_numstr(area) ET.SubElement(part, 'Drag', {'drag': raw_drag, 'area': raw_area})
def scale_part(self, part: ET.Element, scale): """Scale the part""" part_scale = parse_numstr(part.get('scale', '1,1,1')) part_scale = [scale * x for x in part_scale] if self.inverse_matrix is not None: part_scale = [abs(x) for x in self.rotate_list(part_scale)] if part_scale != [1, 1, 1]: part.find('Config').set('partScale', create_numstr(part_scale))
def prerotate(self, part: ET.Element): """Prerotate the part to match the orientation""" angles = parse_numstr(part.get('rotation')) angles = [n * np.pi/180 for n in angles] M = euler2mat(*[angles[n] for n in (2, 0, 1)], 'szxy') angles = mat2euler(np.matmul(M, self.prerotation_matrix), 'szxy') angles = [angles[n] * 180/np.pi for n in (1, 2, 0)] part.set('rotation', create_numstr(angles))
def convert_specific(self, part: ET.Element): super().convert_specific(part) fuselage = part.find('Fuselage') top_scale = fuselage.get('topScale') fuselage.set('topScale', '0,0') fuselage.set('bottomScale', top_scale) corner_radiuses = parse_numstr(fuselage.get('cornerRadiuses')) corner_radiuses[0], corner_radiuses[1] = corner_radiuses[1], corner_radiuses[0] corner_radiuses[2], corner_radiuses[3] = corner_radiuses[3], corner_radiuses[2] corner_radiuses = corner_radiuses[4:]+corner_radiuses[:4] fuselage.set('cornerRadiuses', create_numstr(corner_radiuses)) offset = parse_numstr(fuselage.get('offset')) offset = [-x for x in offset] fuselage.set('offset', create_numstr(offset))
def convert_craft(craft: ET.Element): craft.tag = 'Craft' craft.attrib.pop('url') craft.attrib.pop('theme') craft.set('xmlVersion', '5') craft.set('parent', '') craft.set('price', '314159') raw_boundsmin = craft.get('boundsMin') raw_size = craft.get('size') craft.set('initialBoundsMin', raw_boundsmin) craft.attrib.pop('boundsMin') craft.attrib.pop('size') boundsmin = parse_numstr(raw_boundsmin) size = parse_numstr(raw_size) boundsmax = [a+b for a, b in zip(boundsmin, size)] raw_boundsmax = create_numstr(boundsmax) craft.set('initialBoundsMax', raw_boundsmax) ET.SubElement(craft, 'Symmetry')
def convert_specific(self, part: ET.Element): part.set('texture', 'Default') tank = part.find('FuelTank.State') if tank is not None: tank.tag = 'FuelTank' tank.attrib.pop('fuel') fuselage = part.find('Fuselage.State') fuselage.tag = 'Fuselage' raw_bottom_scale = fuselage.get('rearScale') bottom_scale = parse_numstr(raw_bottom_scale) bottom_scale = [x/4 for x in bottom_scale] fuselage.set('bottomScale', create_numstr(bottom_scale)) raw_top_scale = fuselage.get('frontScale') top_scale = parse_numstr(raw_top_scale) top_scale = [x/4 for x in top_scale] fuselage.set('topScale', create_numstr(top_scale)) corner_tr = [0.0, 0.4, 1.0, 1.0] raw_corner_types = fuselage.get('cornerTypes') corner_types = parse_numstr(raw_corner_types) corner_types = [corner_tr[int(n)] for n in corner_types] corner_types[0], corner_types[2] = corner_types[2], corner_types[0] corner_types[4], corner_types[6] = corner_types[6], corner_types[4] fuselage.set('cornerRadiuses', create_numstr(corner_types)) offset = parse_numstr(fuselage.get('offset')) offset = [x/4 for x in offset] offset[0] *= -1 # offsets in SP are backwards for some reason offset[1] *= -1 offset = self.rotate_list(offset) fuselage.set('offset', create_numstr(offset)) for x in ['version', 'rearScale', 'frontScale', 'buoyancy', 'deadWeight', 'fuelPercentage', 'cornerTypes', 'scale', 'autoSizeOnConnected']: fuselage.attrib.pop(x, None)
def convert_common(self, part: ET.Element, scale): """Converts parameters relevant to all parts""" part.set('commandPodId', '0') part.set('partType', self.part_type) if scale != 1: position = parse_numstr(part.get('position')) position = [scale * x for x in position] raw_position = create_numstr(position) part.set('position', raw_position) if self.prerotation_matrix is not None: self.prerotate(part) materials = part.get('materials') part.set('materials', ','.join(materials.split(',')[0:1] * 5)) ET.SubElement(part, 'Config') self.scale_part(part, scale) self.add_drag(part)