составь строго такую же схему как на примере, в до...
Erstellt am: 24. Dezember 2025
Beantwortet mit GPT-5.2 Thinking von Chat01
Erstellt am: 24. Dezember 2025
Beantwortet mit GPT-5.2 Thinking von Chat01
pythonimport os, glob, pathlib, sys, PIL font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" os.path.exists(font_path), font_path (True, '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf')
pythonfrom PIL import Image, ImageDraw, ImageFont W,H=3508,2480 img=Image.new("RGB",(W,H),"white") draw=ImageDraw.Draw(img) font_title=ImageFont.truetype(font_path, 44) font_box=ImageFont.truetype(font_path, 30) font_small=ImageFont.truetype(font_path, 26) def wrap_text(text, font, max_width): # returns list of lines lines=[] for para in text.split("\n"): if not para.strip(): lines.append("") continue words=para.split() cur="" for w in words: test=(cur+" "+w).strip() bbox=draw.textbbox((0,0), test, font=font) if bbox[2]-bbox[0] <= max_width: '/mnt/data/scheme_variant20.png'
pythonfrom PIL import Image, ImageDraw, ImageFont import math W,H=3508,2480 img=Image.new("RGB",(W,H),"white") draw=ImageDraw.Draw(img) font_title=ImageFont.truetype(font_path, 44) font_box=ImageFont.truetype(font_path, 30) font_small=ImageFont.truetype(font_path, 26) font_sector=ImageFont.truetype(font_path, 20) cat_font=ImageFont.truetype(font_path, 24) note_font=ImageFont.truetype(font_path, 24) def wrap_text(text, font, max_width): lines=[] for para in text.split("\n"): words=para.split() if not words: lines.append("") continue cur="" for w in words: test=(cur+" "+w).strip() bbox=draw.textbbox((0,0), test, font=font) if bbox[2]-bbox[0] <= max_width: cur=test else: if cur: lines.append(cur) cur=w if cur: lines.append(cur) return lines def draw_box(x,y,w,h,text,font, padding=10): draw.rectangle([x,y,x+w,y+h], outline="black", width=3) max_w = w-2*padding lines = wrap_text(text,font,max_w) # height line_h = draw.textbbox((0,0), "Ag", font=font)[3] total_h = line_h*len(lines) + 4*(len(lines)-1) ty = y + (h-total_h)/2 for i,line in enumerate(lines): bbox = draw.textbbox((0,0), line, font=font) tw = bbox[2]-bbox[0] tx = x + (w-tw)/2 draw.text((tx, ty + i*(line_h+4)), line, fill="black", font=font) return (x,y,w,h) def draw_arrow(x1,y1,x2,y2, head_len=18, head_w=10, width=3): draw.line([x1,y1,x2,y2], fill="black", width=width) ang=math.atan2(y2-y1, x2-x1) p1=(x2,y2) p2=(x2-head_len*math.cos(ang)+head_w*math.sin(ang), y2-head_len*math.sin(ang)-head_w*math.cos(ang)) p3=(x2-head_len*math.cos(ang)-head_w*math.sin(ang), y2-head_len*math.sin(ang)+head_w*math.cos(ang)) draw.polygon([p1,p2,p3], fill="black") # Title title=("ПРИМЕРНЫЙ МАКЕТ ГРАФИЧЕСКОЙ МОДЕЛИ СТРУКТУРЫ И ФОНДА ОБЛАСТНОЙ БИБЛИОТЕКИ\n" "(ВАРИАНТ №20)") bbox=draw.textbbox((0,0), title, font=font_title) draw.text(((W-(bbox[2]-bbox[0]))/2, 20), title, font=font_title, fill="black") root=draw_box(1404, 170, 700, 120, "Единый фонд\nобластной библиотеки", font_box) org=draw_box(450, 360, 780, 120, "Организация фонда\nпо подразделениям", font_box) comp=draw_box(2278, 360, 780, 120, "Состав фонда\n(научные документы)", font_box) draw_arrow(root[0]+root[2]/2, root[1]+root[3], org[0]+org[2]/2, org[1], head_len=20, head_w=12) draw_arrow(root[0]+root[2]/2, root[1]+root[3], comp[0]+comp[2]/2, comp[1], head_len=20, head_w=12) dept_w=620; dept_h=120; gap=80 start_x=130; dept_y=560 dept1=draw_box(start_x, dept_y, dept_w, dept_h, "Фонд отдела\nкомплектования и\nобработки фонда", font_small) dept2=draw_box(start_x+dept_w+gap, dept_y, dept_w, dept_h, "Фонд отдела\nхранения\nосновного фонда", font_small) dept3=draw_box(start_x+2*(dept_w+gap), dept_y, dept_w, dept_h, "Фонд отдела\nобслуживания", font_small) org_center=(org[0]+org[2]/2, org[1]+org[3]) for d in [dept1,dept2,dept3]: draw_arrow(org_center[0], org_center[1], d[0]+d[2]/2, d[1], head_len=18, head_w=10) sector_w=320; sector_h=120; sect_gap=40; sect_row_gap=30 sect_y=735 # Dept1 3 sectors d1_x=dept1[0] + (dept_w - (3*sector_w + 2*sect_gap))/2 s11=draw_box(d1_x, sect_y, sector_w, sector_h, "Сектор текущего и\nретроспективного\nкомплектования фонда", font_sector) s12=draw_box(d1_x+sector_w+sect_gap, sect_y, sector_w, sector_h, "Сектор\nразмещения", font_sector) s13=draw_box(d1_x+2*(sector_w+sect_gap), sect_y, sector_w, sector_h, "Сектор научной и\nтехнической\nобработки\nдокументов", font_sector) for s in [s11,s12,s13]: draw_arrow(dept1[0]+dept1[2]/2, dept1[1]+dept1[3], s[0]+s[2]/2, s[1], head_len=14, head_w=9) # Dept2 4 sectors 2x2 d2_x=dept2[0] + (dept_w - (2*sector_w + sect_gap))/2 s21=draw_box(d2_x, sect_y, sector_w, sector_h, "Сектор хранения\nпрыязіруемага фонда", font_sector) s22=draw_box(d2_x+sector_w+sect_gap, sect_y, sector_w, sector_h, "Сектор хранения\nвыданных\nдокументов", font_sector) s23=draw_box(d2_x, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Сектор хранения\nслужебного фонда", font_sector) s24=draw_box(d2_x+sector_w+sect_gap, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Сектор гигиены и\nреставрации\nдокументов", font_sector) for s in [s21,s22,s23,s24]: draw_arrow(dept2[0]+dept2[2]/2, dept2[1]+dept2[3], s[0]+s[2]/2, s[1], head_len=14, head_w=9) # Dept3 6 units 2 rows 3 each d3_x=dept3[0] + (dept_w - (3*sector_w + 2*sect_gap))/2 s31=draw_box(d3_x, sect_y, sector_w, sector_h, "Сектор\nкраеведческой\nлитературы", font_sector) s32=draw_box(d3_x+sector_w+sect_gap, sect_y, sector_w, sector_h, "Сектор\nрукописных\nдокументов", font_sector) s33=draw_box(d3_x+2*(sector_w+sect_gap), sect_y, sector_w, sector_h, "Сектор микрофильмов\nи электронных\nдокументов", font_sector) s34=draw_box(d3_x, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Абонемент\nдля научных\nсотрудников", font_sector) s35=draw_box(d3_x+sector_w+sect_gap, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Абонемент\nдля детей\nшкольного\nвозраста", font_sector) s36=draw_box(d3_x+2*(sector_w+sect_gap), sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Читальный зал\nгуманитарной\nлитературы", font_sector) for s in [s31,s32,s33,s34,s35,s36]: draw_arrow(dept3[0]+dept3[2]/2, dept3[1]+dept3[3], s[0]+s[2]/2, s[1], head_len=14, head_w=9) # Composition list cat_w=780; cat_h=92; cat_x=comp[0]; cat_y=540; cat_gap=18 categories=[ "Документы общественно-\nполитического содержания", "Документы по\nпсихологии и педагогике", "Документы по\nправу", "Документы по\nэкономике", "Произведения\nхудожественной литературы", "Учебные документы", "Научно-популярные\nдокументы" ] cat_boxes=[] for i,cat in enumerate(categories): b=draw_box(cat_x, cat_y+i*(cat_h+cat_gap), cat_w, cat_h, cat, cat_font) cat_boxes.append(b) draw_arrow(comp[0]+comp[2]/2, comp[1]+comp[3], cat_boxes[0][0]+cat_boxes[0][2]/2, cat_boxes[0][1], head_len=14, head_w=9) for i in range(len(cat_boxes)-1): b1=cat_boxes[i]; b2=cat_boxes[i+1] draw_arrow(b1[0]+b1[2]/2, b1[1]+b1[3], b2[0]+b2[2]/2, b2[1], head_len=14, head_w=9) # Note box note=("Примечание: Особое внимание уделяется\n" "приобретению учебных и\n" "научно-популярных документов.") note_x=2278; note_y=2210; note_w=780; note_h=190 draw.rectangle([note_x,note_y,note_x+note_w,note_y+note_h], outline="black", width=3) draw.text((note_x+15,note_y+18), note, font=note_font, fill="black") out_img2="/mnt/data/scheme_variant20_v2.png" img.save(out_img2, dpi=(300,300)) out_img2 '/mnt/data/scheme_variant20_v2.png'
pythonfrom PIL import Image, ImageDraw, ImageFont import math W,H=3508,2480 img=Image.new("RGB",(W,H),"white") draw=ImageDraw.Draw(img) font_title=ImageFont.truetype(font_path, 44) font_box=ImageFont.truetype(font_path, 30) font_small=ImageFont.truetype(font_path, 26) font_sector=ImageFont.truetype(font_path, 20) cat_font=ImageFont.truetype(font_path, 24) note_font=ImageFont.truetype(font_path, 24) def wrap_text(text, font, max_width): lines=[] for para in text.split("\n"): words=para.split() if not words: lines.append("") continue cur="" for w in words: test=(cur+" "+w).strip() bbox=draw.textbbox((0,0), test, font=font) if bbox[2]-bbox[0] <= max_width: cur=test else: if cur: lines.append(cur) cur=w if cur: lines.append(cur) return lines def draw_box(x,y,w,h,text,font, padding=10): draw.rectangle([x,y,x+w,y+h], outline="black", width=3) max_w = w-2*padding lines = wrap_text(text,font,max_w) # height line_h = draw.textbbox((0,0), "Ag", font=font)[3] total_h = line_h*len(lines) + 4*(len(lines)-1) ty = y + (h-total_h)/2 for i,line in enumerate(lines): bbox = draw.textbbox((0,0), line, font=font) tw = bbox[2]-bbox[0] tx = x + (w-tw)/2 draw.text((tx, ty + i*(line_h+4)), line, fill="black", font=font) return (x,y,w,h) def draw_arrow(x1,y1,x2,y2, head_len=18, head_w=10, width=3): draw.line([x1,y1,x2,y2], fill="black", width=width) ang=math.atan2(y2-y1, x2-x1) p1=(x2,y2) p2=(x2-head_len*math.cos(ang)+head_w*math.sin(ang), y2-head_len*math.sin(ang)-head_w*math.cos(ang)) p3=(x2-head_len*math.cos(ang)-head_w*math.sin(ang), y2-head_len*math.sin(ang)+head_w*math.cos(ang)) draw.polygon([p1,p2,p3], fill="black") # Title title=("ПРИМЕРНЫЙ МАКЕТ ГРАФИЧЕСКОЙ МОДЕЛИ СТРУКТУРЫ И ФОНДА ОБЛАСТНОЙ БИБЛИОТЕКИ\n" "(ВАРИАНТ №20)") bbox=draw.textbbox((0,0), title, font=font_title) draw.text(((W-(bbox[2]-bbox[0]))/2, 20), title, font=font_title, fill="black") root=draw_box(1404, 170, 700, 120, "Единый фонд\nобластной библиотеки", font_box) org=draw_box(450, 360, 780, 120, "Организация фонда\nпо подразделениям", font_box) comp=draw_box(2278, 360, 780, 120, "Состав фонда\n(научные документы)", font_box) draw_arrow(root[0]+root[2]/2, root[1]+root[3], org[0]+org[2]/2, org[1], head_len=20, head_w=12) draw_arrow(root[0]+root[2]/2, root[1]+root[3], comp[0]+comp[2]/2, comp[1], head_len=20, head_w=12) dept_w=620; dept_h=120; gap=80 start_x=130; dept_y=560 dept1=draw_box(start_x, dept_y, dept_w, dept_h, "Фонд отдела\nкомплектования и\nобработки фонда", font_small) dept2=draw_box(start_x+dept_w+gap, dept_y, dept_w, dept_h, "Фонд отдела\nхранения\nосновного фонда", font_small) dept3=draw_box(start_x+2*(dept_w+gap), dept_y, dept_w, dept_h, "Фонд отдела\nобслуживания", font_small) org_center=(org[0]+org[2]/2, org[1]+org[3]) for d in [dept1,dept2,dept3]: draw_arrow(org_center[0], org_center[1], d[0]+d[2]/2, d[1], head_len=18, head_w=10) sector_w=320; sector_h=120; sect_gap=40; sect_row_gap=30 sect_y=735 # Dept1 3 sectors d1_x=dept1[0] + (dept_w - (3*sector_w + 2*sect_gap))/2 s11=draw_box(d1_x, sect_y, sector_w, sector_h, "Сектор текущего и\nретроспективного\nкомплектования фонда", font_sector) s12=draw_box(d1_x+sector_w+sect_gap, sect_y, sector_w, sector_h, "Сектор\nразмещения", font_sector) s13=draw_box(d1_x+2*(sector_w+sect_gap), sect_y, sector_w, sector_h, "Сектор научной и\nтехнической\nобработки\nдокументов", font_sector) for s in [s11,s12,s13]: draw_arrow(dept1[0]+dept1[2]/2, dept1[1]+dept1[3], s[0]+s[2]/2, s[1], head_len=14, head_w=9) # Dept2 4 sectors 2x2 d2_x=dept2[0] + (dept_w - (2*sector_w + sect_gap))/2 s21=draw_box(d2_x, sect_y, sector_w, sector_h, "Сектор хранения\nпрыязіруемага фонда", font_sector) s22=draw_box(d2_x+sector_w+sect_gap, sect_y, sector_w, sector_h, "Сектор хранения\nвыданных\nдокументов", font_sector) s23=draw_box(d2_x, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Сектор хранения\nслужебного фонда", font_sector) s24=draw_box(d2_x+sector_w+sect_gap, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Сектор гигиены и\nреставрации\nдокументов", font_sector) for s in [s21,s22,s23,s24]: draw_arrow(dept2[0]+dept2[2]/2, dept2[1]+dept2[3], s[0]+s[2]/2, s[1], head_len=14, head_w=9) # Dept3 6 units 2 rows 3 each d3_x=dept3[0] + (dept_w - (3*sector_w + 2*sect_gap))/2 s31=draw_box(d3_x, sect_y, sector_w, sector_h, "Сектор\nкраеведческой\nлитературы", font_sector) s32=draw_box(d3_x+sector_w+sect_gap, sect_y, sector_w, sector_h, "Сектор\nрукописных\nдокументов", font_sector) s33=draw_box(d3_x+2*(sector_w+sect_gap), sect_y, sector_w, sector_h, "Сектор микрофильмов\nи электронных\nдокументов", font_sector) s34=draw_box(d3_x, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Абонемент\nдля научных\nсотрудников", font_sector) s35=draw_box(d3_x+sector_w+sect_gap, sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Абонемент\nдля детей\nшкольного\nвозраста", font_sector) s36=draw_box(d3_x+2*(sector_w+sect_gap), sect_y+sector_h+sect_row_gap, sector_w, sector_h, "Читальный зал\nгуманитарной\nлитературы", font_sector) for s in [s31,s32,s33,s34,s35,s36]: draw_arrow(dept3[0]+dept3[2]/2, dept3[1]+dept3[3], s[0]+s[2]/2, s[1], head_len=14, head_w=9) # Composition list cat_w=780; cat_h=92; cat_x=comp[0]; cat_y=540; cat_gap=18 categories=[ "Документы общественно-\nполитического содержания", "Документы по\nпсихологии и педагогике", "Документы по\nправу", "Документы по\nэкономике", "Произведения\nхудожественной литературы", "Учебные документы", "Научно-популярные\nдокументы" ] cat_boxes=[] for i,cat in enumerate(categories): b=draw_box(cat_x, cat_y+i*(cat_h+cat_gap), cat_w, cat_h, cat, cat_font) cat_boxes.append(b) draw_arrow(comp[0]+comp[2]/2, comp[1]+comp[3], cat_boxes[0][0]+cat_boxes[0][2]/2, cat_boxes[0][1], head_len=14, head_w=9) for i in range(len(cat_boxes)-1): b1=cat_boxes[i]; b2=cat_boxes[i+1] draw_arrow(b1[0]+b1[2]/2, b1[1]+b1[3], b2[0]+b2[2]/2, b2[1], head_len=14, head_w=9) # Note box note=("Примечание: Особое внимание уделяется\n" "приобретению учебных и\n" "научно-популярных документов.") note_x=2278; note_y=2210; note_w=780; note_h=190 draw.rectangle([note_x,note_y,note_x+note_w,note_y+note_h], outline="black", width=3) draw.text((note_x+15,note_y+18), note, font=note_font, fill="black") out_img2="/mnt/data/scheme_variant20_v2.png" img.save(out_img2, dpi=(300,300)) out_img2 '/mnt/data/scheme_variant20_v2.png' <<ImageDisplayed>>
pythonfrom PIL import Image, ImageDraw, ImageFont import math W,H=3508,2480 img=Image.new("RGB",(W,H),"white") draw=ImageDraw.Draw(img) font_title=ImageFont.truetype(font_path, 44) font_box=ImageFont.truetype(font_path, 30) font_dept=ImageFont.truetype(font_path, 26) font_sector=ImageFont.truetype(font_path, 18) cat_font=ImageFont.truetype(font_path, 24) note_font=ImageFont.truetype(font_path, 24) def wrap_text(text, font, max_width): lines=[] for para in text.split("\n"): words=para.split() if not words: lines.append("") continue cur="" for w in words: test=(cur+" "+w).strip() bbox=draw.textbbox((0,0), test, font=font) if bbox[2]-bbox[0] <= max_width: cur=test else: if cur: lines.append(cur) cur=w if cur: lines.append(cur) return lines def draw_box(x,y,w,h,text,font,padding=10): draw.rectangle([x,y,x+w,y+h], outline="black", width=3) max_w=w-2*padding lines=wrap_text(text,font,max_w) line_h=draw.textbbox((0,0),"Ag",font=font)[3] total_h=line_h*len(lines)+4*(len(lines)-1) ty=y+(h-total_h)/2 for i,line in enumerate(lines): bbox=draw.textbbox((0,0),line,font=font) tw=bbox[2]-bbox[0] tx=x+(w-tw)/2 draw.text((tx,ty+i*(line_h+4)),line,fill="black",font=font) return (x,y,w,h) def draw_arrow(x1,y1,x2,y2, head_len=18, head_w=10, width=3): draw.line([x1,y1,x2,y2], fill="black", width=width) ang=math.atan2(y2-y1, x2-x1) p1=(x2,y2) p2=(x2-head_len*math.cos(ang)+head_w*math.sin(ang), y2-head_len*math.sin(ang)-head_w*math.cos(ang)) p3=(x2-head_len*math.cos(ang)-head_w*math.sin(ang), y2-head_len*math.sin(ang)+head_w*math.cos(ang)) draw.polygon([p1,p2,p3], fill="black") title=("ПРИМЕРНЫЙ МАКЕТ ГРАФИЧЕСКОЙ МОДЕЛИ СТРУКТУРЫ И ФОНДА ОБЛАСТНОЙ БИБЛИОТЕКИ\n" "(ВАРИАНТ №20)") bbox=draw.textbbox((0,0),title,font=font_title) draw.text(((W-(bbox[2]-bbox[0]))/2,20),title,font=font_title,fill="black") root=draw_box(1404,170,700,120,"Единый фонд\nобластной библиотеки",font_box) org=draw_box(390,360,820,120,"Организация фонда\nпо подразделениям",font_box) comp=draw_box(2328,360,780,120,"Состав фонда\n(научные документы)",font_box) draw_arrow(root[0]+root[2]/2,root[1]+root[3],org[0]+org[2]/2,org[1],head_len=20,head_w=12) draw_arrow(root[0]+root[2]/2,root[1]+root[3],comp[0]+comp[2]/2,comp[1],head_len=20,head_w=12) dept_w=620; dept_h=120; gap=80; start_x=130; dept_y=560 dept1=draw_box(start_x,dept_y,dept_w,dept_h,"Фонд отдела\nкомплектования и\nобработки фонда",font_dept) dept2=draw_box(start_x+dept_w+gap,dept_y,dept_w,dept_h,"Фонд отдела\nхранения\nосновного фонда",font_dept) dept3=draw_box(start_x+2*(dept_w+gap),dept_y,dept_w,dept_h,"Фонд отдела\nобслуживания",font_dept) org_bottom_y=org[1]+org[3] # Use different start points along org bottom org_points=[org[0]+org[2]*0.2, org[0]+org[2]*0.5, org[0]+org[2]*0.8] for p,d in zip(org_points,[dept1,dept2,dept3]): draw_arrow(p, org_bottom_y, d[0]+d[2]/2, d[1], head_len=18, head_w=10) sector_w=210; sector_h=130; sect_gap=25; sect_row_gap=28 sect_y=735 # Dept1 sectors d1_x=dept1[0]+(dept_w-(3*sector_w+2*sect_gap))/2 s11=draw_box(d1_x,sect_y,sector_w,sector_h,"Сектор текущего и\nретроспективного\nкомплектования\nфонда",font_sector) s12=draw_box(d1_x+sector_w+sect_gap,sect_y,sector_w,sector_h,"Сектор\nразмещения",font_sector) s13=draw_box(d1_x+2*(sector_w+sect_gap),sect_y,sector_w,sector_h,"Сектор научной и\nтехнической\nобработки\nдокументов",font_sector) for s in [s11,s12,s13]: draw_arrow(dept1[0]+dept1[2]/2,dept1[1]+dept1[3],s[0]+s[2]/2,s[1],head_len=14,head_w=9) # Dept2 sectors 2x2 d2_x=dept2[0]+(dept_w-(2*sector_w+sect_gap))/2 s21=draw_box(d2_x,sect_y,sector_w,sector_h,"Сектор хранения\nпрыязіруемага\nфонда",font_sector) s22=draw_box(d2_x+sector_w+sect_gap,sect_y,sector_w,sector_h,"Сектор хранения\nвыданных\nдокументов",font_sector) s23=draw_box(d2_x,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Сектор хранения\nслужебного\nфонда",font_sector) s24=draw_box(d2_x+sector_w+sect_gap,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Сектор гигиены и\nреставрации\nдокументов",font_sector) for s in [s21,s22,s23,s24]: draw_arrow(dept2[0]+dept2[2]/2,dept2[1]+dept2[3],s[0]+s[2]/2,s[1],head_len=14,head_w=9) # Dept3 units 2 rows 3 each d3_x=dept3[0]+(dept_w-(3*sector_w+2*sect_gap))/2 s31=draw_box(d3_x,sect_y,sector_w,sector_h,"Сектор\nкраеведческой\nлитературы",font_sector) s32=draw_box(d3_x+sector_w+sect_gap,sect_y,sector_w,sector_h,"Сектор\nрукописных\nдокументов",font_sector) s33=draw_box(d3_x+2*(sector_w+sect_gap),sect_y,sector_w,sector_h,"Сектор микрофильмов\nи электронных\nдокументов",font_sector) s34=draw_box(d3_x,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Абонемент\nдля научных\nсотрудников",font_sector) s35=draw_box(d3_x+sector_w+sect_gap,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Абонемент\nдля детей\nшкольного\nвозраста",font_sector) s36=draw_box(d3_x+2*(sector_w+sect_gap),sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Читальный зал\nгуманитарной\nлитературы",font_sector) for s in [s31,s32,s33,s34,s35,s36]: draw_arrow(dept3[0]+dept3[2]/2,dept3[1]+dept3[3],s[0]+s[2]/2,s[1],head_len=14,head_w=9) # Composition boxes cat_w=780; cat_h=92; cat_x=comp[0]; cat_y=540; cat_gap=18 categories=[ "Документы общественно-\nполитического содержания", "Документы по\nпсихологии и педагогике", "Документы по\nправу", "Документы по\nэкономике", "Произведения\nхудожественной литературы", "Учебные документы", "Научно-популярные\nдокументы" ] cat_boxes=[] for i,cat in enumerate(categories): b=draw_box(cat_x,cat_y+i*(cat_h+cat_gap),cat_w,cat_h,cat,cat_font) cat_boxes.append(b) draw_arrow(comp[0]+comp[2]/2, comp[1]+comp[3], cat_boxes[0][0]+cat_boxes[0][2]/2, cat_boxes[0][1], head_len=14, head_w=9) for i in range(len(cat_boxes)-1): b1,b2=cat_boxes[i],cat_boxes[i+1] draw_arrow(b1[0]+b1[2]/2, b1[1]+b1[3], b2[0]+b2[2]/2, b2[1], head_len=14, head_w=9) note=("Примечание: Особое внимание уделяется\n" "приобретению учебных и\n" "научно-популярных документов.") note_x=2328; note_y=2210; note_w=780; note_h=190 draw.rectangle([note_x,note_y,note_x+note_w,note_y+note_h],outline="black",width=3) draw.text((note_x+15,note_y+18),note,font=note_font,fill="black") out_img3="/mnt/data/scheme_variant20_final.png" img.save(out_img3,dpi=(300,300)) out_img3 '/mnt/data/scheme_variant20_final.png'
pythonfrom PIL import Image, ImageDraw, ImageFont import math W,H=3508,2480 img=Image.new("RGB",(W,H),"white") draw=ImageDraw.Draw(img) font_title=ImageFont.truetype(font_path, 44) font_box=ImageFont.truetype(font_path, 30) font_dept=ImageFont.truetype(font_path, 26) font_sector=ImageFont.truetype(font_path, 18) cat_font=ImageFont.truetype(font_path, 24) note_font=ImageFont.truetype(font_path, 24) def wrap_text(text, font, max_width): lines=[] for para in text.split("\n"): words=para.split() if not words: lines.append("") continue cur="" for w in words: test=(cur+" "+w).strip() bbox=draw.textbbox((0,0), test, font=font) if bbox[2]-bbox[0] <= max_width: cur=test else: if cur: lines.append(cur) cur=w if cur: lines.append(cur) return lines def draw_box(x,y,w,h,text,font,padding=10): draw.rectangle([x,y,x+w,y+h], outline="black", width=3) max_w=w-2*padding lines=wrap_text(text,font,max_w) line_h=draw.textbbox((0,0),"Ag",font=font)[3] total_h=line_h*len(lines)+4*(len(lines)-1) ty=y+(h-total_h)/2 for i,line in enumerate(lines): bbox=draw.textbbox((0,0),line,font=font) tw=bbox[2]-bbox[0] tx=x+(w-tw)/2 draw.text((tx,ty+i*(line_h+4)),line,fill="black",font=font) return (x,y,w,h) def draw_arrow(x1,y1,x2,y2, head_len=18, head_w=10, width=3): draw.line([x1,y1,x2,y2], fill="black", width=width) ang=math.atan2(y2-y1, x2-x1) p1=(x2,y2) p2=(x2-head_len*math.cos(ang)+head_w*math.sin(ang), y2-head_len*math.sin(ang)-head_w*math.cos(ang)) p3=(x2-head_len*math.cos(ang)-head_w*math.sin(ang), y2-head_len*math.sin(ang)+head_w*math.cos(ang)) draw.polygon([p1,p2,p3], fill="black") title=("ПРИМЕРНЫЙ МАКЕТ ГРАФИЧЕСКОЙ МОДЕЛИ СТРУКТУРЫ И ФОНДА ОБЛАСТНОЙ БИБЛИОТЕКИ\n" "(ВАРИАНТ №20)") bbox=draw.textbbox((0,0),title,font=font_title) draw.text(((W-(bbox[2]-bbox[0]))/2,20),title,font=font_title,fill="black") root=draw_box(1404,170,700,120,"Единый фонд\nобластной библиотеки",font_box) org=draw_box(390,360,820,120,"Организация фонда\nпо подразделениям",font_box) comp=draw_box(2328,360,780,120,"Состав фонда\n(научные документы)",font_box) draw_arrow(root[0]+root[2]/2,root[1]+root[3],org[0]+org[2]/2,org[1],head_len=20,head_w=12) draw_arrow(root[0]+root[2]/2,root[1]+root[3],comp[0]+comp[2]/2,comp[1],head_len=20,head_w=12) dept_w=620; dept_h=120; gap=80; start_x=130; dept_y=560 dept1=draw_box(start_x,dept_y,dept_w,dept_h,"Фонд отдела\nкомплектования и\nобработки фонда",font_dept) dept2=draw_box(start_x+dept_w+gap,dept_y,dept_w,dept_h,"Фонд отдела\nхранения\nосновного фонда",font_dept) dept3=draw_box(start_x+2*(dept_w+gap),dept_y,dept_w,dept_h,"Фонд отдела\nобслуживания",font_dept) org_bottom_y=org[1]+org[3] # Use different start points along org bottom org_points=[org[0]+org[2]*0.2, org[0]+org[2]*0.5, org[0]+org[2]*0.8] for p,d in zip(org_points,[dept1,dept2,dept3]): draw_arrow(p, org_bottom_y, d[0]+d[2]/2, d[1], head_len=18, head_w=10) sector_w=210; sector_h=130; sect_gap=25; sect_row_gap=28 sect_y=735 # Dept1 sectors d1_x=dept1[0]+(dept_w-(3*sector_w+2*sect_gap))/2 s11=draw_box(d1_x,sect_y,sector_w,sector_h,"Сектор текущего и\nретроспективного\nкомплектования\nфонда",font_sector) s12=draw_box(d1_x+sector_w+sect_gap,sect_y,sector_w,sector_h,"Сектор\nразмещения",font_sector) s13=draw_box(d1_x+2*(sector_w+sect_gap),sect_y,sector_w,sector_h,"Сектор научной и\nтехнической\nобработки\nдокументов",font_sector) for s in [s11,s12,s13]: draw_arrow(dept1[0]+dept1[2]/2,dept1[1]+dept1[3],s[0]+s[2]/2,s[1],head_len=14,head_w=9) # Dept2 sectors 2x2 d2_x=dept2[0]+(dept_w-(2*sector_w+sect_gap))/2 s21=draw_box(d2_x,sect_y,sector_w,sector_h,"Сектор хранения\nпрыязіруемага\nфонда",font_sector) s22=draw_box(d2_x+sector_w+sect_gap,sect_y,sector_w,sector_h,"Сектор хранения\nвыданных\nдокументов",font_sector) s23=draw_box(d2_x,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Сектор хранения\nслужебного\nфонда",font_sector) s24=draw_box(d2_x+sector_w+sect_gap,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Сектор гигиены и\nреставрации\nдокументов",font_sector) for s in [s21,s22,s23,s24]: draw_arrow(dept2[0]+dept2[2]/2,dept2[1]+dept2[3],s[0]+s[2]/2,s[1],head_len=14,head_w=9) # Dept3 units 2 rows 3 each d3_x=dept3[0]+(dept_w-(3*sector_w+2*sect_gap))/2 s31=draw_box(d3_x,sect_y,sector_w,sector_h,"Сектор\nкраеведческой\nлитературы",font_sector) s32=draw_box(d3_x+sector_w+sect_gap,sect_y,sector_w,sector_h,"Сектор\nрукописных\nдокументов",font_sector) s33=draw_box(d3_x+2*(sector_w+sect_gap),sect_y,sector_w,sector_h,"Сектор микрофильмов\nи электронных\nдокументов",font_sector) s34=draw_box(d3_x,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Абонемент\nдля научных\nсотрудников",font_sector) s35=draw_box(d3_x+sector_w+sect_gap,sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Абонемент\nдля детей\nшкольного\nвозраста",font_sector) s36=draw_box(d3_x+2*(sector_w+sect_gap),sect_y+sector_h+sect_row_gap,sector_w,sector_h,"Читальный зал\nгуманитарной\nлитературы",font_sector) for s in [s31,s32,s33,s34,s35,s36]: draw_arrow(dept3[0]+dept3[2]/2,dept3[1]+dept3[3],s[0]+s[2]/2,s[1],head_len=14,head_w=9) # Composition boxes cat_w=780; cat_h=92; cat_x=comp[0]; cat_y=540; cat_gap=18 categories=[ "Документы общественно-\nполитического содержания", "Документы по\nпсихологии и педагогике", "Документы по\nправу", "Документы по\nэкономике", "Произведения\nхудожественной литературы", "Учебные документы", "Научно-популярные\nдокументы" ] cat_boxes=[] for i,cat in enumerate(categories): b=draw_box(cat_x,cat_y+i*(cat_h+cat_gap),cat_w,cat_h,cat,cat_font) cat_boxes.append(b) draw_arrow(comp[0]+comp[2]/2, comp[1]+comp[3], cat_boxes[0][0]+cat_boxes[0][2]/2, cat_boxes[0][1], head_len=14, head_w=9) for i in range(len(cat_boxes)-1): b1,b2=cat_boxes[i],cat_boxes[i+1] draw_arrow(b1[0]+b1[2]/2, b1[1]+b1[3], b2[0]+b2[2]/2, b2[1], head_len=14, head_w=9) note=("Примечание: Особое внимание уделяется\n" "приобретению учебных и\n" "научно-популярных документов.") note_x=2328; note_y=2210; note_w=780; note_h=190 draw.rectangle([note_x,note_y,note_x+note_w,note_y+note_h],outline="black",width=3) draw.text((note_x+15,note_y+18),note,font=note_font,fill="black") out_img3="/mnt/data/scheme_variant20_final.png" img.save(out_img3,dpi=(300,300)) out_img3 '/mnt/data/scheme_variant20_final.png' <<ImageDisplayed>>
pythonfrom docx import Document from docx.shared import Inches, Cm, Pt from docx.enum.section import WD_ORIENT from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.shared import OxmlElement, qn img_path="/mnt/data/scheme_variant20_final.png" doc=Document() section=doc.sections[0] section.orientation = WD_ORIENT.LANDSCAPE # swap width/height new_width, new_height = section.page_height, section.page_width section.page_width = new_width section.page_height = new_height # margins for side in ["left_margin","right_margin","top_margin","bottom_margin"]: setattr(section, side, Cm(1.2)) # Add title paragraph maybe not necessary because image already includes title, but keep minimal. p=doc.add_paragraph() p.alignment=WD_ALIGN_PARAGRAPH.CENTER run=p.add_run("Схема (вариант №20)") run.bold=True run.font.size=Pt(14) doc.add_paragraph() # spacing # Insert image fitted available_width = section.page_width - section.left_margin - section.right_margin doc.add_picture(img_path, width=available_width) # Remove extra spacing after picture paragraph last_par = doc.paragraphs[-1] last_par.alignment = WD_ALIGN_PARAGRAPH.CENTER out_docx="/mnt/data/Схема_вариант_20.docx" doc.save(out_docx) out_docx '/mnt/data/Схема_вариант_20.docx'
pythonfrom docx import Document from docx.shared import Cm from docx.enum.section import WD_ORIENT from docx.enum.text import WD_ALIGN_PARAGRAPH img_path="/mnt/data/scheme_variant20_final.png" doc=Document() section=doc.sections[0] section.orientation = WD_ORIENT.LANDSCAPE section.page_width, section.page_height = section.page_height, section.page_width for side in ["left_margin","right_margin","top_margin","bottom_margin"]: setattr(section, side, Cm(0.8)) available_width = section.page_width - section.left_margin - section.right_margin p=doc.add_paragraph() p.paragraph_format.space_before = Cm(0) p.paragraph_format.space_after = Cm(0) p.alignment = WD_ALIGN_PARAGRAPH.CENTER run = p.add_run() run.add_picture(img_path, width=available_width) out_docx="/mnt/data/Схема_вариант_20.docx" doc.save(out_docx) out_docx '/mnt/data/Схема_вариант_20.docx'
Готово — собрал схему (вариант №20) в Word по образцу и с учетом всех пунктов.