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