File size: 4,683 Bytes
ceea884 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | """์นด๋ฉ๋ผ ๋ชจ๋ ์ฅ ('์นด๋ฉ๋ผ ์ผ์ ์ข
๋ฅ โ RGB ยท ๊น์ด ยท โฆ') ๋ฐ๋ก ๋ค์ ๋ผ์ด๋ค ยท ๋ ์ด๋ ์ผ์ ๋ฐ์ดํฐ ์ฅ์ ๋ฃ๋๋ค.
๊ฐ์ ํ ยท ๊ฐ์ ๋ฐฐ์น (์ผ์ชฝ 2ร2 ๊ทธ๋ฆผ + ์ค๋ฅธ์ชฝ ์ค๋ช
์์ 4๊ฐ) โ ์์๋ ์นด๋ฉ๋ผ ๋ชจ๋ ์ฅ์ ๊ฒ์ ๋ณต์ฌํด ๊ธ๋ง ๋ฐ๊พผ๋ค.
๊ทธ๋ฆผ: figures/out/sensors_data.jpg (figures/sensors/ ์ sdump ยท run.py ยท viz.py).
์คํ: python docs/presentation/add_sensor_data_slide.py [์
๋ ฅ.pptx] [์ถ๋ ฅ.pptx] (๊ธฐ๋ณธ: vkgs_sim_merged.pptx ๋ฅผ ์ ์๋ฆฌ์์)
"""
import copy
import sys
from pathlib import Path
from PIL import Image
from pptx import Presentation
from pptx.oxml.ns import qn
HERE = Path(__file__).resolve().parent
SRC = Path(sys.argv[1]) if len(sys.argv) > 1 else HERE / "vkgs_sim_merged.pptx"
OUT = Path(sys.argv[2]) if len(sys.argv) > 2 else SRC
FIG = HERE / "figures/out/sensors_data.jpg"
ANCHOR = "์นด๋ฉ๋ผ ์ผ์ ์ข
๋ฅ"
HEADING = "๋ผ์ด๋ค ยท ๋ ์ด๋ ์ผ์ ๋ฐ์ดํฐ โ ๊ฐ์ ์๊ฐ์ 4๊ฐ์ง ๋ณด๊ธฐ"
BULLET = "scene-0402 ๊ธฐ๋ก ์ฃผํ์ ํ ์๊ฐ (11.9 m/s) โ ๋ผ์ด๋ค ํ ๋ฐํด 3.4๋ง ์ ยท ๋ ์ด๋ 5๋ ๊ฒ์ถ 605๊ฐ, ๋ค๋ฅธ ์ฐจ๋์ nuScenes ๋ฐ์ค"
BOXES = [("๋ผ์ด๋ค โ ์นด๋ฉ๋ผ ํฌ์", "๊ฐ์ ์๊ฐ์ ์ค์ nuScenes ์ ๋ฉด ์ฌ์ง์ ์๋ฎฌ ๋ผ์ด๋ค ์ ์ ํฌ์ โ ๋
ธ๋ฉด ๋ง ยท ๊ธธ๊ฐ ๋๋ฌด ยท ์ ์ฐจ๋ ์๋ฆฌ๊ฐ ์ฌ์ง๊ณผ ๊ฒน์นจ"),
("๊ฑฐ๋ฆฌ ์์ ยท BEV", "HDL-32E ๊ทผ์ฌ: 32๋น (+10.7ยฐ ~ โ30.7ยฐ) ร 0.33ยฐ ๋ฐฉ์, 70 m, 20 Hz โ ๋ณต์
์๋ (0.2 m) ์ ๊ด์ ์ ์จ"),
("๋ ์ด๋ 5๋", "ARS 408 ๊ทผ์ฌ: ์์ผ 120ยฐ ยท 120 m ยท 13 Hz ยท ๋๋น ์ต๋ 125์ , ๋
ธ๋ฉด ๋ฐ์ฌ ์ ๊ฑฐ โ ์ ์ง๋ฌผ ๋ํ๋ฌ vr = โvยทcosฮธ"),
("์ถ๋ ฅ ํ์", "O ํค ยท closed-loop (--serve) ๊ด์ธก์ ํจ๊ป ์ ์ฅ โ LIDAR_TOP.bin (nuScenes .pcd.bin) ยท RADAR_*.txt (vr ยท ๋ณด์ ์๋ ยท RCS)")]
NOTE = ("๊ทธ๋ฆผ 1: ์ค์ ์ฌ์ง ์ ํฌ์ โ ์๋ฎฌ ๋ผ์ด๋ค ๊ธฐํ๊ฐ ์ค์ ์ฅ๋ฉด๊ณผ ๋ง๋์ง ๋ณด๋ ๊ทธ๋ฆผ. ๊ทธ๋ฆผ 2: ๋ผ์ด๋ค ์์ ๋ฐ์ดํฐ ํ์ (๋น ร ๋ฐฉ์ ๊ฑฐ๋ฆฌ ์์). "
"๊ทธ๋ฆผ 3: ์์์ ๋ณธ ํ ๋ฐํด, ์์ ์ง๋ฉด ์ ๋์ด. ๊ทธ๋ฆผ 4: ๋ ์ด๋ 5๋ ์์ผ์ ๊ฒ์ถ, ์์ ๋ํ๋ฌ โ ์์ฐจ๊ฐ ์์ง์ด๋ฏ๋ก ์ ์ง๋ฌผ๋ ์์ ๋ค๊ฐ์ด, ๋ค๋ ๋ฉ์ด์ง. "
"๋ค๋ฅธ ์ฐจ๋์ nuScenes ์ด๋
ธํ
์ด์
๋ฐ์ค๋ก ๋ฃ์๊ณ ์ ์ง๋ก ๋ณธ๋ค (์๋ ยท ๋ํ๋ฌ๋ ๊ตํต ์ฐธ๊ฐ์ ์์
๋ค). ๋ง๋๋ ๋ฒ: figures/sensors/README.txt.")
def heading(s):
"""์์ ๋ชฉ ๋ง๋ (๊ทธ๋ฃน ๋ํ) ์ ๊ธ."""
return "".join(c.text_frame.text for sh in s.shapes if sh.shape_type == 6 for c in sh.shapes if c.has_text_frame)
prs = Presentation(SRC)
slides = list(prs.slides)
if any(HEADING in heading(s) for s in slides):
sys.exit(f"์ด๋ฏธ ๋ค์ด ์๋ค: {SRC}")
src = next(s for s in slides if ANCHOR in heading(s))
sl = prs.slides.add_slide(src.slide_layout)
tree = sl.shapes._spTree
for sh in list(sl.shapes):
tree.remove(sh._element)
pic_box = None
for sh in src.shapes:
if sh.shape_type == 13: # ๊ทธ๋ฆผ ์๋ฆฌ๋ง ๊ธฐ์ตํ๊ณ ๊ทธ๋ฆผ์ ์๋ก ๋ฃ๋๋ค
pic_box = (sh.left, sh.top, sh.width, sh.height)
continue
el = copy.deepcopy(sh._element)
for node in el.iter():
for attr in (qn("r:embed"), qn("r:link"), qn("r:id")):
rid = node.get(attr)
if rid:
node.set(attr, sl.part.relate_to(src.part.related_part(rid), src.part.rels[rid].reltype))
tree.append(el)
def set_text(p, text):
rs = p.runs
rs[0].text = text
for r in rs[1:]:
r._r.getparent().remove(r._r)
boxes = [sh for sh in sl.shapes if sh.name.startswith("Rounded Rectangle")]
assert len(boxes) == len(BOXES), len(boxes)
for sh, (t, d) in zip(sorted(boxes, key=lambda s: s.top), BOXES):
ps = sh.text_frame.paragraphs
set_text(ps[0], t)
set_text(ps[1], d)
for sh in sl.shapes:
if sh.shape_type == 6:
for c in sh.shapes:
if c.has_text_frame and c.text_frame.text.strip():
set_text(c.text_frame.paragraphs[0], HEADING)
elif sh.name == "TextBox 9":
tf = sh.text_frame
for p in tf.paragraphs[1:]:
p._p.getparent().remove(p._p)
set_text(tf.paragraphs[0], BULLET)
x, y, w, h = pic_box
im = Image.open(FIG)
s_ = min(w / im.width, h / im.height)
sl.shapes.add_picture(str(FIG), x + int((w - im.width * s_) / 2), y, int(im.width * s_), int(im.height * s_))
sl.notes_slide.notes_text_frame.text = NOTE
lst = prs.slides._sldIdLst
new = list(lst)[-1]
lst.remove(new)
list(lst)[slides.index(src)].addnext(new)
prs.save(OUT)
print("saved", OUT, len(prs.slides), "slides โ ์ ์ฅ", slides.index(src) + 2, "์ชฝ")
|