Страницы

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

среда, 22 января 2020 г.

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

#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()) Возможно я не совсем правильно Вас понял, если это не то, что нужно - оставьте коментарий и поясните вопрос более детально

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

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