def read_space_objects_data_from_file(input_filename): """Cчитывает данные о космических объектах из файла, создаёт сами объекты и вызывает создание их графических образов Параметры: **input_filename** — имя входного файла """ objects = [] with open(input_filename) as input_file: for line in input_file: if len(line.strip()) == 0 or line[0] == '#': continue # пустые строки и строки-комментарии пропускаем object_type = line.split()[0].lower() if object_type == "star": # FIXME: do the same for planet star = Star() star.type = "star" parse_star_parameters(line, star) objects.append(star) elif object_type == "planet": # FIXME: do the same for planet planet = Planet() planet.type = "planet" parse_planet_parameters(line, planet) objects.append(planet) else: print("Unknown space object") return objects
def parse_planet_parameters(line): """Считывает данные о планете из строки. Предполагается такая строка: Входная строка должна иметь слеюущий формат: Planet <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты планеты, (Vx, Vy) — скорость. Пример строки: Planet 10 red 1000 1 2 3 4 Параметры: **line** — строка с описание планеты. **planet** — объект планеты. """ planet = Planet() line_elems = line.split(' ') planet.size = float(line_elems[1]) planet.color = str(line_elems[2]) planet.m = float(line_elems[3]) planet.x = float(line_elems[4]) planet.y = float(line_elems[5]) planet.Vx = float(line_elems[6]) planet.Vy = float(line_elems[7]) return planet pass # FIXME: not done yet...
def parse_planet_parameters(line, planet): """Считывает данные о планете из строки. Предполагается такая строка: Входная строка должна иметь слеюущий формат: Planet <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты планеты, (Vx, Vy) — скорость. Пример строки: Planet 10 red 1000 1 2 3 4 Параметры: **line** — строка с описание планеты. **planet** — объект планеты. """ l = line.split() planet = Planet() planet.R = line(1) planet.color = line(2) planet.m = line(3) planet.x = line(4) planet.y = line(5) planet.Vx = line(6) planet.Vy = line(7) return planet
def read_space_objects_data_from_file(input_filename): """ Cчитывает данные о космических объектах из файла, создаёт сами объекты и вызывает создание их графических образов Параметры: **input_filename** — имя входного файла """ objects = [] with open(input_filename, 'r') as input_file: for line in input_file: if len(line.strip()) == 0 or line[0] == '#': continue object_type = line.split()[0].lower() if object_type == "star": star = Star() parse_star_parameters(line, star) objects.append(star) elif object_type == "planet": planet = Planet() parse_planet_parameters(line, planet) objects.append(planet) else: print("Unknown space object") return [DrawableObject(obj) for obj in objects]
def read_space_objects_data_from_file(input_filename): """Cчитывает данные о космических объектах из файла, создаёт сами объекты и вызывает создание их графических образов Параметры: **input_filename** — имя входного файла """ objects = [] print('ready to open file...') with open(input_filename, encoding='utf8') as input_file: for line in input_file: if len(line.strip()) == 0 or line[0] == '#': continue # пустые строки и строки-комментарии пропускаем object_type = line.split()[0].lower() if object_type == "star": star = Star() parse_star_parameters(line, star) objects.append(star) elif object_type == 'planet': pl = Planet() parse_star_parameters(line, pl) objects.append(pl) else: print("Unknown space object") return objects
def read_space_objects_data_from_file(input_filename): """Cчитывает данные о космических объектах из файла, создаёт сами объекты и вызывает создание их графических образов Параметры: **input_filename** — имя входного файла """ objects = [] with open(input_filename) as input_file: for line in input_file: if len(line.strip()) == 0 or line[0] == '#': continue # пустые строки и строки-комментарии пропускаем object_type = line.split()[0].lower() if object_type == "star": star = Star() parse_star_parameters(line, star) objects.append(star) if object_type == "planet": planet = Planet() parse_planet_parameters(line, planet) objects.append(planet) if object_type == "dt": time_step = float(line.split()[1].lower()) else: pass return objects, time_step
def parse_parameters(line, space_object): """Считывает данные о космическом объекте из строки. Входная строка должна иметь слеюущий формат: Type <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты объекта, (Vx, Vy) — скорость. Type это тип объекта -- Star или Planet. Пример строки: Star 10 red 1000 1 2 3 4 Параметры: **line** — строка с описание звезды. **star** — объект звезды. """ try: obj_type, r, color, m, x, y, Vx, Vy = line.split() except: raise TypeError("Non-valid line") obj_type = obj_type.lower() m = float(m) x = float(x) y = float(y) r = float(r) Vx = float(Vx) Vy = float(Vy) if obj_type == 'star': return Star(m, x, y, r, Vx, Vy, color) if obj_type == 'planet': return Planet(m, x, y, r, Vx, Vy, color)
def parse_object_parameters(line: str): """ Reads space object parameters from string line Входная строка должна иметь слеюущий формат: Star/Planet <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты зведы, (Vx, Vy) — скорость. Пример строки: Star 10 red 1000 1 2 3 4 @param line: a string that describes object @raise ValueError: raised is line format is incorrect """ pattern = r'(Star|Planet)\s+([0-9.,eE\-+]+)\s+(\w+)\s+([0-9.,eE\-+]+)\s+([0-9.,eE\-+]+)\s+([0-9.,eE\-+]+)\s+([0-9.,' \ r'eE\-+]+)\s+([0-9.,eE\-+]+)\s+\n?' match = re.match(pattern, line) if match is None: raise ValueError('Line format is not correct') obj = None obj_type = match.group(1) if obj_type == 'Star': obj = Star() elif obj_type == 'Planet': obj = Planet() else: # must never occur, but still raise ValueError('Line format is not correct') radius = float(match.group(2)) if radius < 0: raise ValueError('Line format is not correct') else: obj.R = radius color = match.group(3) obj.color = color mass = float(match.group(4)) if mass < 0: raise ValueError('Line format is not correct') else: obj.m = mass x = float(match.group(5)) obj.x = float(x) y = float(match.group(6)) obj.y = float(y) vx = float(match.group(7)) obj.Vx = float(vx) vy = float(match.group(8)) obj.Vy = float(vy) return obj
def destruction(body, space_objects): body.Vx *= 0.8 body.Vy *= 0.8 body.R *= 0.5 body.m *= 0.5 turn(body, 1) newbody = Planet() newbody.R = body.R newbody.m = body.m newbody.x = body.x newbody.y = body.y newbody.Vx = body.Vx newbody.Vy = body.Vy newbody.color = body.color turn(newbody, -2) space_objects.append(newbody)
def parse_planet_parameters(line): """Считывает данные о планете из строки. Предполагается такая строка: Входная строка должна иметь слеюущий формат: Planet <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты планеты, (Vx, Vy) — скорость. Пример строки: Planet 10 red 1000 1 2 3 4 Параметры: **line** — строка с описание планеты. **planet** — объект планеты. """ planet = Planet() s = line a = s.find(' ') #индекс первого пробела s = s[a + 1:] a = s.find(' ') planet.r = float(s[:a]) #радиус планеты s = s[a + 1:] a = s.find(' ') planet.color = s[:a] s = s[a + 1:] a = s.find(' ') planet.m = float(s[:a]) #масса планеты s = s[a + 1:] a = s.find(' ') planet.x = float(s[:a]) s = s[a + 1:] a = s.find(' ') planet.y = float(s[:a]) s = s[a + 1:] a = s.find(' ') planet.vx = float(s[:a]) s = s[a + 1:] a = s.find(' ') planet.vy = float(s[:a]) #pass # FIXME: not done yet... return planet
def parse_planet_parameters(line): """Считывает данные о планете из строки. Предполагается такая строка: Входная строка должна иметь слеюущий формат: Planet <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты планеты, (Vx, Vy) — скорость. Пример строки: Planet 10 red 1000 1 2 3 4 Параметры: **line** — строка с описание планеты. **planet** — объект планеты. """ line = line.split() line[0] = line[0].lower() return Planet(line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7])
def write_space_objects_data_to_file(output_filename, space_objects): """Сохраняет данные о космических объектах в файл. Строки должны иметь следующий формат: Star <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Planet <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Параметры: **output_filename** — имя входного файла **space_objects** — список объектов планет и звёзд """ with open(output_filename, 'w') as out_file: type_name = '' for obj in space_objects: if type(obj) == Star(): type_name = 'star' elif type(obj) == Planet(): type_name = 'planet' print( out_file, "%s %f %s %f %f %f %f %f" % (type_name, obj.R, obj.color, obj.m, obj.x, obj.y, obj.Vx, obj.Vy))
def parse_parameters(line): """Считывает данные о небесном теле из строки. Входная строка должна иметь слеюущий формат: Star <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy> Здесь (x, y) — координаты, (Vx, Vy) — скорость. Пример строки: Star 10 red 1000 1 2 3 4 Параметры: **line** — строка с описание небесного тела. **star** — объект. """ object_type = line.split()[0].lower() if object_type == "star": star = Star() star.type = line.split()[0] star.R = float(line.split()[1]) star.color = line.split()[2] star.m = float(line.split()[3]) star.x = float(line.split()[4]) star.y = float(line.split()[5]) star.Vx = float(line.split()[6]) star.Vy = float(line.split()[7]) return star elif object_type == "planet": planet = Planet() planet.type = line.split()[0] planet.R = float(line.split()[1]) planet.color = line.split()[2] planet.m = float(line.split()[3]) planet.x = float(line.split()[4]) planet.y = float(line.split()[5]) planet.Vx = float(line.split()[6]) planet.Vy = float(line.split()[7]) planet.name = line.split()[10] return planet else: print("Unknown space object")