본문으로 건너뛰기
cccskills
무료GitHub에 공개

pptx-construction

PowerPoint generation for construction: project updates, stakeholder presentations, progress reports, bid presentations. Automated slide creation with charts and data.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구ExcelPowerPoint
설치 방법 보기

포함된 파일(3)

  • SKILL.md14.4 KB
  • claw.json574 B
  • instructions.md1.2 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

PowerPoint Generation for Construction

Overview

Create professional PowerPoint presentations for construction projects using python-pptx. Generate stakeholder updates, progress reports, and bid presentations with automated data visualization.

Construction Use Cases

1. Project Progress Presentation

Generate monthly progress update slides.

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN

def create_progress_presentation(project_data: dict, output_path: str) -> str:
    """Create project progress presentation."""
    prs = Presentation()
    prs.slide_width = Inches(13.333)
    prs.slide_height = Inches(7.5)

    # Title slide
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = project_data['project_name']
    title_slide.placeholders[1].text = f"Progress Report - {project_data['report_date']}"

    # Executive Summary slide
    summary_slide = prs.slides.add_slide(prs.slide_layouts[1])
    summary_slide.shapes.title.text = "Executive Summary"

    summary_text = summary_slide.placeholders[1]
    tf = summary_text.text_frame
    tf.paragraphs[0].text = f"Overall Progress: {project_data['overall_progress']}%"

    p = tf.add_paragraph()
    p.text = f"Schedule Status: {project_data['schedule_status']}"
    p = tf.add_paragraph()
    p.text = f"Budget Status: {project_data['budget_status']}"
    p = tf.add_paragraph()
    p.text = f"Safety: {project_data['safety_status']}"

    # Schedule Progress Chart
    add_schedule_chart(prs, project_data['schedule_data'])

    # Budget Chart
    add_budget_chart(prs, project_data['budget_data'])

    # Key Milestones
    add_milestones_slide(prs, project_data['milestones'])

    # Issues & Risks
    add_issues_slide(prs, project_data.get('issues', []))

    # Photos
    if project_data.get('photos'):
        add_photos_slide(prs, project_data['photos'])

    prs.save(output_path)
    return output_path


def add_schedule_chart(prs: Presentation, schedule_data: dict):
    """Add schedule progress chart."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = "Schedule Progress"

    chart_data = CategoryChartData()
    chart_data.categories = schedule_data['phases']
    chart_data.add_series('Planned', schedule_data['planned'])
    chart_data.add_series('Actual', schedule_data['actual'])

    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.COLUMN_CLUSTERED,
        Inches(1), Inches(1.5),
        Inches(11), Inches(5),
        chart_data
    ).chart

    chart.has_legend = True
    chart.legend.include_in_layout = False


def add_budget_chart(prs: Presentation, budget_data: dict):
    """Add budget status chart."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = "Budget Status"

    chart_data = CategoryChartData()
    chart_data.categories = ['Budget', 'Committed', 'Spent', 'Forecast']
    chart_data.add_series('Amount ($M)', [
        budget_data['budget'] / 1_000_000,
        budget_data['committed'] / 1_000_000,
        budget_data['spent'] / 1_000_000,
        budget_data['forecast'] / 1_000_000
    ])

    chart = slide.shapes.add_chart(
        XL_CHART_TYPE.BAR_CLUSTERED,
        Inches(1), Inches(1.5),
        Inches(11), Inches(5),
        chart_data
    ).chart


def add_milestones_slide(prs: Presentation, milestones: list):
    """Add key milestones slide."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = "Key Milestones"

    # Create table
    rows = len(milestones) + 1
    cols = 4
    table = slide.shapes.add_table(rows, cols, Inches(0.5), Inches(1.5), Inches(12), Inches(0.5 * rows)).table

    # Headers
    headers = ['Milestone', 'Planned', 'Actual/Forecast', 'Status']
    for i, header in enumerate(headers):
        table.cell(0, i).text = header

    # Data
    for i, ms in enumerate(milestones, 1):
        table.cell(i, 0).text = ms['name']
        table.cell(i, 1).text = ms['planned_date']
        table.cell(i, 2).text = ms.get('actual_date', ms.get('forecast_date', 'TBD'))
        table.cell(i, 3).text = ms['status']


def add_issues_slide(prs: Presentation, issues: list):
    """Add issues and risks slide."""
    slide = prs.slides.add_slide(prs.slide_layouts[1])
    slide.shapes.title.text = "Issues & Risks"

    if not issues:
        slide.placeholders[1].text = "No critical issues at this time."
        return

    tf = slide.placeholders[1].text_frame
    for i, issue in enumerate(issues):
        if i == 0:
            tf.paragraphs[0].text = f"• {issue['description']} ({issue['status']})"
        else:
            p = tf.add_paragraph()
            p.text = f"• {issue['description']} ({issue['status']})"


def add_photos_slide(prs: Presentation, photos: list):
    """Add site photos slide."""
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    slide.shapes.title.text = "Site Progress Photos"

    # Arrange up to 4 photos in grid
    positions = [
        (Inches(0.5), Inches(1.5)),
        (Inches(6.5), Inches(1.5)),
        (Inches(0.5), Inches(4)),
        (Inches(6.5), Inches(4))
    ]

    for i, photo in enumerate(photos[:4]):
        left, top = positions[i]
        slide.shapes.add_picture(photo['path'], left, top, width=Inches(5.5))

2. Bid Presentation

Create bid/proposal presentations.

def create_bid_presentation(bid_data: dict, output_path: str) -> str:
    """Create bid presentation for client."""
    prs = Presentation()

    # Title
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = bid_data['project_name']
    title_slide.placeholders[1].text = f"Proposal by {bid_data['company_name']}"

    # Company Overview
    overview_slide = prs.slides.add_slide(prs.slide_layouts[1])
    overview_slide.shapes.title.text = "About Us"
    tf = overview_slide.placeholders[1].text_frame
    tf.paragraphs[0].text = f"Years in Business: {bid_data['company']['years']}"
    for qual in bid_data['company']['qualifications']:
        p = tf.add_paragraph()
        p.text = f"• {qual}"

    # Project Understanding
    understanding_slide = prs.slides.add_slide(prs.slide_layouts[1])
    understanding_slide.shapes.title.text = "Project Understanding"
    tf = understanding_slide.placeholders[1].text_frame
    for i, point in enumerate(bid_data['understanding']):
        if i == 0:
            tf.paragraphs[0].text = f"• {point}"
        else:
            p = tf.add_paragraph()
            p.text = f"• {point}"

    # Approach
    approach_slide = prs.slides.add_slide(prs.slide_layouts[1])
    approach_slide.shapes.title.text = "Our Approach"
    tf = approach_slide.placeholders[1].text_frame
    for i, step in enumerate(bid_data['approach']):
        if i == 0:
            tf.paragraphs[0].text = f"{i+1}. {step}"
        else:
            p = tf.add_paragraph()
            p.text = f"{i+1}. {step}"

    # Team
    team_slide = prs.slides.add_slide(prs.slide_layouts[1])
    team_slide.shapes.title.text = "Project Team"
    tf = team_slide.placeholders[1].text_frame
    for i, member in enumerate(bid_data['team']):
        if i == 0:
            tf.paragraphs[0].text = f"{member['role']}: {member['name']}"
        else:
            p = tf.add_paragraph()
            p.text = f"{member['role']}: {member['name']}"

    # Pricing Summary
    pricing_slide = prs.slides.add_slide(prs.slide_layouts[5])
    pricing_slide.shapes.title.text = "Investment Summary"

    # Add pricing table
    rows = len(bid_data['pricing']['items']) + 2
    table = pricing_slide.shapes.add_table(rows, 2, Inches(2), Inches(2), Inches(8), Inches(0.5 * rows)).table

    table.cell(0, 0).text = "Description"
    table.cell(0, 1).text = "Amount"

    for i, item in enumerate(bid_data['pricing']['items'], 1):
        table.cell(i, 0).text = item['description']
        table.cell(i, 1).text = f"${item['amount']:,.2f}"

    table.cell(rows-1, 0).text = "TOTAL"
    table.cell(rows-1, 1).text = f"${bid_data['pricing']['total']:,.2f}"

    # Schedule
    schedule_slide = prs.slides.add_slide(prs.slide_layouts[1])
    schedule_slide.shapes.title.text = "Proposed Schedule"
    tf = schedule_slide.placeholders[1].text_frame
    tf.paragraphs[0].text = f"Duration: {bid_data['schedule']['duration']}"
    p = tf.add_paragraph()
    p.text = f"Start: {bid_data['schedule']['start']}"
    p = tf.add_paragraph()
    p.text = f"Completion: {bid_data['schedule']['end']}"

    prs.save(output_path)
    return output_path

3. Safety Report Presentation

Generate safety meeting presentations.

def create_safety_presentation(safety_data: dict, output_path: str) -> str:
    """Create safety meeting presentation."""
    prs = Presentation()

    # Title
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = "Safety Report"
    title_slide.placeholders[1].text = f"{safety_data['project_name']} - {safety_data['period']}"

    # KPIs
    kpi_slide = prs.slides.add_slide(prs.slide_layouts[5])
    kpi_slide.shapes.title.text = "Safety KPIs"

    # Add KPI boxes
    kpis = [
        ('Days Without Incident', str(safety_data['days_without_incident'])),
        ('Total Recordable Rate', f"{safety_data['trir']:.2f}"),
        ('Near Misses Reported', str(safety_data['near_misses'])),
        ('Toolbox Talks', str(safety_data['toolbox_talks']))
    ]

    for i, (label, value) in enumerate(kpis):
        left = Inches(0.5 + (i % 2) * 6)
        top = Inches(1.5 + (i // 2) * 2.5)

        shape = kpi_slide.shapes.add_shape(1, left, top, Inches(5), Inches(2))
        shape.text = f"{value}\n{label}"

    # Incidents (if any)
    if safety_data.get('incidents'):
        incident_slide = prs.slides.add_slide(prs.slide_layouts[1])
        incident_slide.shapes.title.text = "Incidents This Period"
        tf = incident_slide.placeholders[1].text_frame
        for i, incident in enumerate(safety_data['incidents']):
            if i == 0:
                tf.paragraphs[0].text = f"• {incident['date']}: {incident['description']}"
            else:
                p = tf.add_paragraph()
                p.text = f"• {incident['date']}: {incident['description']}"

    # Focus Areas
    focus_slide = prs.slides.add_slide(prs.slide_layouts[1])
    focus_slide.shapes.title.text = "Focus Areas This Week"
    tf = focus_slide.placeholders[1].text_frame
    for i, focus in enumerate(safety_data['focus_areas']):
        if i == 0:
            tf.paragraphs[0].text = f"• {focus}"
        else:
            p = tf.add_paragraph()
            p.text = f"• {focus}"

    prs.save(output_path)
    return output_path

4. Lookahead Schedule Presentation

Generate 3-week lookahead slides.

def create_lookahead_presentation(lookahead_data: dict, output_path: str) -> str:
    """Create 3-week lookahead presentation."""
    prs = Presentation()

    # Title
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title_slide.shapes.title.text = "3-Week Lookahead"
    title_slide.placeholders[1].text = f"{lookahead_data['project_name']}"

    # Week by week slides
    for week_num, week_data in enumerate(lookahead_data['weeks'], 1):
        slide = prs.slides.add_slide(prs.slide_layouts[5])
        slide.shapes.title.text = f"Week {week_num}: {week_data['date_range']}"

        # Activities table
        rows = len(week_data['activities']) + 1
        table = slide.shapes.add_table(rows, 4, Inches(0.3), Inches(1.5), Inches(12.5), Inches(0.4 * rows)).table

        # Headers
        for i, header in enumerate(['Activity', 'Area', 'Crew', 'Status']):
            table.cell(0, i).text = header

        # Data
        for i, activity in enumerate(week_data['activities'], 1):
            table.cell(i, 0).text = activity['name']
            table.cell(i, 1).text = activity['area']
            table.cell(i, 2).text = activity['crew']
            table.cell(i, 3).text = activity['status']

    # Resource Needs
    resource_slide = prs.slides.add_slide(prs.slide_layouts[1])
    resource_slide.shapes.title.text = "Resource Needs"
    tf = resource_slide.placeholders[1].text_frame
    for i, need in enumerate(lookahead_data.get('resource_needs', [])):
        if i == 0:
            tf.paragraphs[0].text = f"• {need}"
        else:
            p = tf.add_paragraph()
            p.text = f"• {need}"

    prs.save(output_path)
    return output_path

Integration with DDC Pipeline

# Example: Generate monthly progress presentation from project data
import pandas as pd

# Load project data
schedule_df = pd.read_excel("schedule_data.xlsx")
budget_df = pd.read_excel("budget_data.xlsx")

# Prepare presentation data
project_data = {
    'project_name': 'Downtown Office Tower',
    'report_date': 'January 2026',
    'overall_progress': 67,
    'schedule_status': 'On Track',
    'budget_status': '2.3% Under Budget',
    'safety_status': '45 Days Without Incident',
    'schedule_data': {
        'phases': schedule_df['phase'].tolist(),
        'planned': schedule_df['planned_pct'].tolist(),
        'actual': schedule_df['actual_pct'].tolist()
    },
    'budget_data': {
        'budget': budget_df['budget'].sum(),
        'committed': budget_df['committed'].sum(),
        'spent': budget_df['spent'].sum(),
        'forecast': budget_df['forecast'].sum()
    },
    'milestones': [
        {'name': 'Foundation Complete', 'planned_date': '2025-06-01', 'actual_date': '2025-05-28', 'status': 'Complete'},
        {'name': 'Structure Complete', 'planned_date': '2025-12-15', 'actual_date': '2025-12-10', 'status': 'Complete'},
        {'name': 'Envelope Complete', 'planned_date': '2026-03-01', 'forecast_date': '2026-02-28', 'status': 'On Track'}
    ]
}

create_progress_presentation(project_data, 'reports/monthly_progress_jan2026.pptx')

Dependencies

pip install python-pptx

Resources

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Create 4D construction simulations by linking BIM elements to project schedules. Generate time-based visualizations, sequence analysis, and construction phasing with Gantt integration.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction3582026년 10월 20일 업데이트

Analyze 5000+ IFC and Revit projects at scale for patterns, benchmarks, and insights. Big data analysis for construction.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction3582026년 10월 20일 업데이트

Check construction AI systems against the EU AI Act (Regulation 2024/1689): classify risk of estimation, scheduling, CV and agent tools, document transparency, keep human oversight. Use when deploying or auditing AI in construction.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction3582026년 10월 20일 업데이트

Orchestrate multiple AI agents for construction workflows: estimator, scheduler, document, QA and safety agents coordinated by a supervisor agent, with human checkpoints. Use when automating end-to-end project processes with agentic AI.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction3582026년 10월 20일 업데이트

Create Apache Airflow DAGs for construction data pipelines. Orchestrate ETL, validation, and reporting workflows.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction3582026년 10월 20일 업데이트

Automate as-built documentation and digital handover for construction. Compile project records, generate O&M manuals, create asset databases, and ensure complete project closeout.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction3582026년 10월 20일 업데이트

datadrivenconstruction의 스킬 모두 보기

이 스킬의 문제 신고