Страницы

Поиск по вопросам

вторник, 12 марта 2019 г.

Работа с DXF. Python (Сортировка координат от точки отсчета)

Есть файл 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
" - линия, "AcDbPoint
" - точка 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
")): try: point = getCoordinates("AcDbPoint
")[0] # Получает координаты точки для сравнения
except IndexError: # Если точка не найдена, прекратить дальнейшие действия print ("Точка отсчета не найдена") break
if point == el[:3] or point == el[4:]: #Если координаты точки совпадают с линией D[1] = [el, GetLength("AcDbLine
", 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
Точка как отдельный элемент и ставится вручную точно также как рисуется линия


Ответ

Попробуйте так:
def to_my_dict(): prev_point = getCoordinates("AcDbPoint
") if prev_point: point = prev_point[0] else: return "Точка отсчета не найдена" my_dict = {} all_lines = getCoordinates("AcDbLine
") 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())
Возможно я не совсем правильно Вас понял, если это не то, что нужно - оставьте коментарий и поясните вопрос более детально

Комментариев нет:

Отправить комментарий