fix image
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -23,4 +23,5 @@ __pycache__/
|
|||||||
dist_32bit/
|
dist_32bit/
|
||||||
*.zip
|
*.zip
|
||||||
./build_32bit/
|
./build_32bit/
|
||||||
build_32bit/
|
build_32bit/
|
||||||
|
зу/
|
||||||
28
main.py
28
main.py
@@ -69,6 +69,24 @@ def run_processing(table1_path: str, table2_path: str, mif_dir: str,
|
|||||||
log_callback(f" [{len(generated)+len(errors)+1}/{total}] {filename} ...", end="")
|
log_callback(f" [{len(generated)+len(errors)+1}/{total}] {filename} ...", end="")
|
||||||
try:
|
try:
|
||||||
scheme_png = t3_images.get(str(zu_file).strip())
|
scheme_png = t3_images.get(str(zu_file).strip())
|
||||||
|
# fallback: если в таблице 3 нет изображения, попробуем найти файл в папке с MIF (mif_dir)
|
||||||
|
if scheme_png is None:
|
||||||
|
found = None
|
||||||
|
mif_root = Path(mif_dir)
|
||||||
|
if mif_root.exists():
|
||||||
|
for ext in ('.png', '.jpg', '.jpeg'):
|
||||||
|
for p in mif_root.rglob(f'*{str(zu_file).strip()}*'):
|
||||||
|
if p.suffix.lower() == ext:
|
||||||
|
found = p
|
||||||
|
break
|
||||||
|
if found:
|
||||||
|
break
|
||||||
|
if found:
|
||||||
|
try:
|
||||||
|
scheme_png = found.read_bytes()
|
||||||
|
log_callback(f" image loaded from {found}")
|
||||||
|
except Exception:
|
||||||
|
scheme_png = None
|
||||||
oks_file_name = str(t2_row[10]).strip() if len(t2_row) > 10 and t2_row[10] else ""
|
oks_file_name = str(t2_row[10]).strip() if len(t2_row) > 10 and t2_row[10] else ""
|
||||||
oks_scheme_png = t3_images.get(oks_file_name) if oks_file_name else None
|
oks_scheme_png = t3_images.get(oks_file_name) if oks_file_name else None
|
||||||
zu_scale = t3_scales.get(str(zu_file).strip())
|
zu_scale = t3_scales.get(str(zu_file).strip())
|
||||||
@@ -142,12 +160,12 @@ class App(tk.Tk):
|
|||||||
|
|
||||||
# Дефолты
|
# Дефолты
|
||||||
base = Path(__file__).parent
|
base = Path(__file__).parent
|
||||||
data = base / "data" / "Исх.данные"
|
data = base / "data"
|
||||||
self.var_t1.set(str(data / "Таблица1 КИ-Неустроева.xlsx"))
|
self.var_t1.set(str(data / "Таблица1 КИ-Неустроева.xlsx"))
|
||||||
self.var_t2.set(str(data / "Таблица 2 Перечень выявленных исх.данные.xlsx"))
|
self.var_t2.set(str(data / "Таблица 2.xlsx"))
|
||||||
self.var_t3.set(str(data / "Таблица 3 ( для схем).xlsx"))
|
self.var_t3.set("")
|
||||||
self.var_mif.set(str(data / "1. 74 34 0400007 ГК вымпел-73"))
|
self.var_mif.set(str(data))
|
||||||
self.var_template.set(str(base / "data" / "ШАБЛОН ВЫЯВЛЕННЫЕ-1.xlsx"))
|
self.var_template.set(str(data / "ШАБЛОН ВЫЯВЛЕННЫЕ-2.xlsx"))
|
||||||
self.var_output.set(str(base / "output"))
|
self.var_output.set(str(base / "output"))
|
||||||
|
|
||||||
# Прогресс-бар
|
# Прогресс-бар
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ def load_table3(path: str):
|
|||||||
scales = {} # zu_name → масштаб (строка из c1 третьей строки блока)
|
scales = {} # zu_name → масштаб (строка из c1 третьей строки блока)
|
||||||
for i, row in enumerate(ws.iter_rows(values_only=True), start=1):
|
for i, row in enumerate(ws.iter_rows(values_only=True), start=1):
|
||||||
zu_name = row[5] if len(row) > 5 else None
|
zu_name = row[5] if len(row) > 5 else None
|
||||||
if zu_name and str(zu_name).strip().startswith("выявл"):
|
if zu_name and str(zu_name).strip():
|
||||||
zu_name = str(zu_name).strip()
|
zu_name = str(zu_name).strip()
|
||||||
zu_by_row[i] = zu_name
|
zu_by_row[i] = zu_name
|
||||||
# масштаб — третья строка блока (header+2)
|
# масштаб — третья строка блока (header+2)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import copy
|
import copy
|
||||||
import datetime
|
import datetime
|
||||||
import io
|
import io
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from openpyxl import load_workbook
|
from openpyxl import load_workbook
|
||||||
from openpyxl.drawing.image import Image as XlImage
|
from openpyxl.drawing.image import Image as XlImage
|
||||||
@@ -225,12 +226,26 @@ def _embed_image(ws, png_bytes: bytes, anchor_row: int, pre_rows: int) -> int:
|
|||||||
# В отличие от TwoCellAnchor, LibreOffice не пересчитывает позицию
|
# В отличие от TwoCellAnchor, LibreOffice не пересчитывает позицию
|
||||||
# через сумму высот строк → картинка не уплывает вверх при склейке форм.
|
# через сумму высот строк → картинка не уплывает вверх при склейке форм.
|
||||||
img = XlImage(io.BytesIO(png_bytes))
|
img = XlImage(io.BytesIO(png_bytes))
|
||||||
cell_anchor = OneCellAnchor()
|
# Установим размер картинки в пикселях с учётом масштабирования
|
||||||
cell_anchor._from = AnchorMarker(col=0, colOff=0, row=anchor_row - 1, rowOff=0)
|
scale = 1.0
|
||||||
cell_anchor.ext.cx = int(pt_w * 12700) # pt → EMU
|
if pt_w > MAX_PT_W:
|
||||||
cell_anchor.ext.cy = int(pt_h * 12700)
|
scale = MAX_PT_W / pt_w
|
||||||
img.anchor = cell_anchor
|
img.width = int(px_w * scale)
|
||||||
ws.add_image(img)
|
img.height = int(px_h * scale)
|
||||||
|
|
||||||
|
# Добавляем изображение привязкой к ячейке A{anchor_row}
|
||||||
|
try:
|
||||||
|
ws.add_image(img, f"A{anchor_row}")
|
||||||
|
except Exception:
|
||||||
|
try:
|
||||||
|
cell_anchor = OneCellAnchor()
|
||||||
|
cell_anchor._from = AnchorMarker(col=0, colOff=0, row=anchor_row - 1, rowOff=0)
|
||||||
|
cell_anchor.ext.cx = int(pt_w * 12700) # pt → EMU
|
||||||
|
cell_anchor.ext.cy = int(pt_h * 12700)
|
||||||
|
img.anchor = cell_anchor
|
||||||
|
ws.add_image(img)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
return -rows_to_delete # отрицательное смещение: строки были удалены
|
return -rows_to_delete # отрицательное смещение: строки были удалены
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ def build_coord_rows(contours: list, method: str, mt) -> list:
|
|||||||
или None — пустой разделитель между контурами.
|
или None — пустой разделитель между контурами.
|
||||||
|
|
||||||
Правила:
|
Правила:
|
||||||
- Первая координата MIF → X (колонка C), вторая → Y (D).
|
- Первая координата MIF → Y (колонка D), вторая → X (C).
|
||||||
- Все точки нумеруются подряд по всем контурам.
|
- Все точки нумеруются подряд по всем контурам.
|
||||||
- Последняя (замыкающая) точка контура получает номер первой точки этого контура.
|
- Последняя (замыкающая) точка контура получает номер первой точки этого контура.
|
||||||
"""
|
"""
|
||||||
@@ -49,11 +49,24 @@ def build_coord_rows(contours: list, method: str, mt) -> list:
|
|||||||
rows.append(None)
|
rows.append(None)
|
||||||
if not contour:
|
if not contour:
|
||||||
continue
|
continue
|
||||||
first_num = global_num
|
|
||||||
for mx, my in contour[:-1]:
|
# Single-point contour — добавляем одну строку
|
||||||
|
if len(contour) == 1:
|
||||||
|
my, mx = contour[0] # MIF: первая=Y(восток), вторая=X(север)
|
||||||
rows.append((global_num, f"{mx:.2f}", f"{my:.2f}", method, mt))
|
rows.append((global_num, f"{mx:.2f}", f"{my:.2f}", method, mt))
|
||||||
global_num += 1
|
global_num += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Для многоточечных контуров: нумеруем все точки, кроме последней,
|
||||||
|
# затем добавляем завершающую точку, которой присваивается номер
|
||||||
|
# первой точки контура (замыкание).
|
||||||
|
first_num = global_num
|
||||||
|
for my, mx in contour[:-1]: # MIF: первая=Y(восток), вторая=X(север)
|
||||||
|
rows.append((global_num, f"{mx:.2f}", f"{my:.2f}", method, mt))
|
||||||
|
global_num += 1
|
||||||
|
|
||||||
if len(contour) >= 2:
|
if len(contour) >= 2:
|
||||||
mx, my = contour[-1]
|
my, mx = contour[-1] # MIF: первая=Y(восток), вторая=X(север)
|
||||||
rows.append((first_num, f"{mx:.2f}", f"{my:.2f}", method, mt))
|
rows.append((first_num, f"{mx:.2f}", f"{my:.2f}", method, mt))
|
||||||
|
|
||||||
return rows
|
return rows
|
||||||
|
|||||||
Reference in New Issue
Block a user