#python #сортировка #координаты #autocad
Есть файл DXF, написал функцию, которая получает координаты каждой точки в таком формате: [ [0.0, 0.0, 0.0, 0.0, 10.0, 0.0], [0.0, 10.0, 0.0, 15.0, 10.0, 0.0], [15.0, 10.0, 0.0, 15.0, 10.0, 5.0], [15.0, 10.0, 5.0, 15.0, 13.0, 5.0] ] Код: def getCoordinates(key): # Функция получает координаты XYZ, по ключу # "AcDbLine\n" - линия, "AcDbPoint\n" - точка ind = [] CoordList = [] for n, e in enumerate(ll): if key in e: ind.append(n) for sp in ind: a = ll[sp + 2:sp + 13] try: # Если это линия, то взять координаты начальной и конечно точек CoordList.append([float(a[0]), float(a[2]), float(a[4]), float(a[6]), float(a[8]), float(a[10])]) except: # Если это точка, то взять координаты точки CoordList.append([float(a[0]), float(a[2]), float(a[4])]) return CoordList Также в этом файле указана точка, это точка, с которой необходимо начинать отсчет. Координаты точки тоже получил [15.0, 13.0, 5.0] Попытался создать словарь типа 1:[координаты линии] но удалось только получить линию, на которой стоит точка и то не корректно работает. Вот код: for num, el in enumerate(getCoordinates("AcDbLine\n")): try: point = getCoordinates("AcDbPoint\n")[0] # Получает координаты точки для сравнения except IndexError: # Если точка не найдена, прекратить дальнейшие действия print ("Точка отсчета не найдена") break if point == el[:3] or point == el[4:]: #Если координаты точки совпадают с линией D[1] = [el, GetLength("AcDbLine\n", num)] # Первая линия, которая совпадает с точкой имеет индекс 1 Суть проблемы это записать эти координаты таким образом, чтобы они шли друг за другом начиная от точки отсчета. Точка отсчета может стоять в любом месте, но на узлах соприкосновения двух отрезков. Для большей наглядности нарисовал рисунок. Красными цифрами указан порядок, который необходимо получить. Может я все не правильно делаю и кто предложит решение более лучшее? Так в DXF выглядит точка AcDbPoint 10 15.0 20 13.0 30 5.0 0 а так линия AcDbLine 10 15.0 20 10.0 30 5.0 11 15.0 21 13.0 31 5.0 0 Точка как отдельный элемент и ставится вручную точно также как рисуется линия
Ответы
Ответ 1
Попробуйте так: def to_my_dict(): prev_point = getCoordinates("AcDbPoint\n") if prev_point: point = prev_point[0] else: return "Точка отсчета не найдена" my_dict = {} all_lines = getCoordinates("AcDbLine\n") count = 1 line_count = len(all_lines) while line_count: for el in all_lines: if point == el[:3] or point == el[3:]: my_dict[count] = el # линия, в которой есть точка count += 1 line_count -= 1 if point == el[:3]: point = el[3:] else: point = el[:3] return my_dict print(to_my_dict()) Возможно я не совсем правильно Вас понял, если это не то, что нужно - оставьте коментарий и поясните вопрос более детально
Комментариев нет:
Отправить комментарий