Exemple #1
0
 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})
Exemple #2
0
 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))
Exemple #3
0
 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))
Exemple #4
0
    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))
Exemple #5
0
    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)
Exemple #6
0
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')
Exemple #7
0
    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)