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