create-2d-composition
Über
Diese Fähigkeit ermöglicht die programmatische Erstellung von 2D-Grafiken durch SVG-Generierung, Diagrammlayout-Algorithmen und Bildkomposition. Nutzen Sie sie zum Erzeugen von Diagrammen, Flussdiagrammen oder benutzerdefinierten visuellen Assets, insbesondere bei der Stapelverarbeitung mit Parameter-Variationen oder reproduzierbaren wissenschaftlichen Abbildungen. Sie ist ideal für die Entwicklung benutzerdefinierter Diagrammtypen, die in Standardbibliotheken nicht verfügbar sind.
Schnellinstallation
Claude Code
Empfohlennpx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/create-2d-compositionKopieren Sie diesen Befehl und fügen Sie ihn in Claude Code ein, um diese Fähigkeit zu installieren
Dokumentation
造二維構圖
以 SVG 建、圖排、像合、批作程生二維像。
用
- 程生圖、流、信息圖
- 可重科圖或刊像
- 自生徽、標、視資
- 合多像或數視
- 築自定圖型
- 批生含參變之像
- 為網或印建 SVG 模
入
| 入 | 型 | 述 | 例 |
|---|---|---|---|
| 排規 | 設 | 寸、邊、格排 | 畫 800x600px、20px 邊 |
| 視素 | 數/資 | 形、字、像、點 | 矩坐、標、標 |
| 風參 | CSS/屬 | 色、體、筆寬、透 | fill="#3366cc"、stroke-width="2" |
| 數源 | 檔/陣 | 所視或注之值 | CSV 數、JSON 設 |
| 出式 | 串 | SVG、PNG、PDF、合式 | output.svg、300 DPI PNG |
行
一、設 Python 境
裝二維構所需庫:
# Core libraries
pip install svgwrite pillow cairosvg
# Optional: advanced features
pip install drawsvg reportlab pycairo
# For data-driven graphics
pip install matplotlib numpy pandas
得: 庫裝成 敗: 察 Python 版(3.7+)、用虛境避衝
二、建基 SVG 像
以 svgwrite 生 SVG:
import svgwrite
from svgwrite import cm, mm
def create_basic_svg(output_path):
"""Create a simple SVG graphic."""
# Initialize drawing (use mm for precise dimensions)
dwg = svgwrite.Drawing(output_path, size=('180mm', '120mm'), profile='full')
# Add background rectangle
dwg.add(dwg.rect(
insert=(0, 0),
size=('100%', '100%'),
fill='white'
))
# Add shapes
dwg.add(dwg.circle(
center=(90*mm, 60*mm),
r=30*mm,
fill='lightblue',
stroke='navy',
stroke_width=2
))
dwg.add(dwg.rect(
insert=(30*mm, 30*mm),
size=(60*mm, 40*mm),
fill='lightgreen',
stroke='darkgreen',
stroke_width=2,
rx=5, # Rounded corners
ry=5
))
# Add text
dwg.add(dwg.text(
'Example Graphic',
insert=(90*mm, 20*mm),
text_anchor='middle',
font_size='18pt',
font_family='Arial',
fill='black'
))
dwg.save()
print(f"Saved: {output_path}")
得: SVG 檔生含形與字 敗: 察 svgwrite 版、驗出目可寫
三、以排輯築圖解
建算位之結構圖解:
def create_flowchart(steps, output_path):
"""Generate a flowchart from list of steps."""
dwg = svgwrite.Drawing(output_path, size=('800px', '600px'))
# Layout parameters
box_width = 120
box_height = 60
spacing_y = 100
start_x = 340
start_y = 50
for i, step in enumerate(steps):
y_pos = start_y + i * spacing_y
# Draw box
box = dwg.add(dwg.g(id=f'step_{i}'))
box.add(dwg.rect(
insert=(start_x, y_pos),
size=(box_width, box_height),
fill='lightblue',
stroke='navy',
stroke_width=2,
rx=5,
ry=5
))
# Add text (wrapped if needed)
text_lines = wrap_text(step, max_width=16)
text_y = y_pos + box_height/2 - (len(text_lines)-1) * 7
for j, line in enumerate(text_lines):
box.add(dwg.text(
line,
insert=(start_x + box_width/2, text_y + j*14),
text_anchor='middle',
font_size='12pt',
font_family='Arial',
fill='black'
))
# Draw arrow to next step
if i < len(steps) - 1:
arrow_start_y = y_pos + box_height
arrow_end_y = y_pos + spacing_y
dwg.add(dwg.line(
start=(start_x + box_width/2, arrow_start_y),
end=(start_x + box_width/2, arrow_end_y),
stroke='black',
stroke_width=2,
marker_end=dwg.marker(
id='arrow',
viewBox='0 0 10 10',
refX=5,
refY=5,
markerWidth=6,
markerHeight=6,
orient='auto'
)
))
dwg.save()
def wrap_text(text, max_width=20):
"""Simple text wrapping."""
words = text.split()
lines = []
current_line = []
for word in words:
test_line = ' '.join(current_line + [word])
if len(test_line) <= max_width:
current_line.append(word)
else:
if current_line:
lines.append(' '.join(current_line))
current_line = [word]
if current_line:
lines.append(' '.join(current_line))
return lines
得: 流圖含連匣與箭 敗: 調排算、驗箭標定
四、合柵像
以 Pillow 合多像:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import os
def composite_images(image_paths, output_path, layout='grid'):
"""Composite multiple images into single output."""
# Load images
images = [Image.open(path) for path in image_paths]
if layout == 'grid':
# Calculate grid dimensions
n = len(images)
cols = int(n ** 0.5)
rows = (n + cols - 1) // cols
# Get max dimensions
max_width = max(img.width for img in images)
max_height = max(img.height for img in images)
# Create composite canvas
canvas_width = cols * max_width
canvas_height = rows * max_height
composite = Image.new('RGB', (canvas_width, canvas_height), 'white')
# Paste images
for i, img in enumerate(images):
row = i // cols
col = i % cols
x = col * max_width
y = row * max_height
composite.paste(img, (x, y))
elif layout == 'horizontal':
# Horizontal concatenation
total_width = sum(img.width for img in images)
max_height = max(img.height for img in images)
composite = Image.new('RGB', (total_width, max_height), 'white')
x_offset = 0
for img in images:
composite.paste(img, (x_offset, 0))
x_offset += img.width
elif layout == 'vertical':
# Vertical concatenation
max_width = max(img.width for img in images)
total_height = sum(img.height for img in images)
composite = Image.new('RGB', (max_width, total_height), 'white')
y_offset = 0
for img in images:
composite.paste(img, (0, y_offset))
y_offset += img.height
composite.save(output_path)
print(f"Saved composite: {output_path}")
def add_annotations(image_path, annotations, output_path):
"""Add text annotations to image."""
img = Image.open(image_path)
draw = ImageDraw.Draw(img)
# Load font
try:
font = ImageFont.truetype("Arial.ttf", 24)
except:
font = ImageFont.load_default()
for annotation in annotations:
text = annotation['text']
position = annotation['position']
color = annotation.get('color', 'black')
# Add text shadow for readability
shadow_offset = 2
draw.text(
(position[0] + shadow_offset, position[1] + shadow_offset),
text,
font=font,
fill='white'
)
draw.text(position, text, font=font, fill=color)
img.save(output_path)
得: 合像成含正排 敗: 察諸入像存、驗像模相容
五、生數驅像
依數建視:
import numpy as np
def create_bar_chart_svg(data, labels, output_path):
"""Generate SVG bar chart from data."""
dwg = svgwrite.Drawing(output_path, size=('600px', '400px'))
# Chart area
margin = 50
chart_width = 500
chart_height = 300
bar_spacing = 10
# Calculate bar dimensions
n_bars = len(data)
bar_width = (chart_width - (n_bars - 1) * bar_spacing) / n_bars
# Scale data to fit chart
max_value = max(data)
scale = chart_height / max_value
# Draw axes
dwg.add(dwg.line(
start=(margin, margin),
end=(margin, margin + chart_height),
stroke='black',
stroke_width=2
))
dwg.add(dwg.line(
start=(margin, margin + chart_height),
end=(margin + chart_width, margin + chart_height),
stroke='black',
stroke_width=2
))
# Draw bars
for i, (value, label) in enumerate(zip(data, labels)):
x = margin + i * (bar_width + bar_spacing)
bar_height = value * scale
y = margin + chart_height - bar_height
# Bar
dwg.add(dwg.rect(
insert=(x, y),
size=(bar_width, bar_height),
fill='steelblue',
stroke='navy',
stroke_width=1
))
# Value label
dwg.add(dwg.text(
f'{value:.1f}',
insert=(x + bar_width/2, y - 5),
text_anchor='middle',
font_size='10pt',
fill='black'
))
# X-axis label
dwg.add(dwg.text(
label,
insert=(x + bar_width/2, margin + chart_height + 20),
text_anchor='middle',
font_size='10pt',
fill='black'
))
dwg.save()
得: SVG 柱圖含按比之數 敗: 理邊例(空數、負值)、加驗
六、批生像
自多像建:
def batch_generate_badges(users, template_path, output_dir):
"""Generate badge for each user."""
os.makedirs(output_dir, exist_ok=True)
for user in users:
output_path = os.path.join(output_dir, f"{user['id']}_badge.svg")
dwg = svgwrite.Drawing(output_path, size=('300px', '100px'))
# Background
dwg.add(dwg.rect(
insert=(0, 0),
size=('100%', '100%'),
fill='#3366cc',
rx=10,
ry=10
))
# User name
dwg.add(dwg.text(
user['name'],
insert=(150, 40),
text_anchor='middle',
font_size='20pt',
font_weight='bold',
fill='white'
))
# User role
dwg.add(dwg.text(
user['role'],
insert=(150, 70),
text_anchor='middle',
font_size='14pt',
fill='lightblue'
))
dwg.save()
print(f"Generated badge: {output_path}")
得: 各數項生一像 敗: 察數構、以默處缺欄
七、SVG 轉柵
為諸用出 SVG 至 PNG/PDF:
import cairosvg
def svg_to_png(svg_path, png_path, dpi=300):
"""Convert SVG to PNG with specified DPI."""
# Calculate pixel dimensions from DPI
# Assuming A4 size as example
width_inches = 8.27
height_inches = 11.69
width_px = int(width_inches * dpi)
height_px = int(height_inches * dpi)
cairosvg.svg2png(
url=svg_path,
write_to=png_path,
output_width=width_px,
output_height=height_px
)
print(f"Converted to PNG: {png_path}")
def svg_to_pdf(svg_path, pdf_path):
"""Convert SVG to PDF."""
cairosvg.svg2pdf(url=svg_path, write_to=pdf_path)
print(f"Converted to PDF: {pdf_path}")
得: 柵出於定解 敗: 缺則裝 cairo 系庫、察 SVG 有效
驗
- 像於標應中正渲
- 字可讀位正
- 色合規、寸合用
- SVG 合準、柵出 DPI 正
- 排適數變、批畢無誤
- 出檔理組、碼含誤理
忌
- 單位惑:SVG 單與屏素印 DPI
- 字溢:過界→換行
- 體可用:系異→嵌或網安
- 坐算:格差一誤
- 色式:hex 串、非元
- SVG 有效:XML 構、閉諸標
- 檔路:特符、檔名空格
- 存用:大批需塊、比例保、PNG 支 alpha 而 JPEG 否
參
- render-publication-graphic:刊特出需
- create-3d-scene:三維之類程法
- generate-quarto-report:像融於報
GitHub Repository
Verwandte Skills
content-collections
MetaDiese Skill bietet eine produktionsgetestete Einrichtung für Content Collections – ein TypeScript-first-Tool, das Markdown/MDX-Dateien in typsichere Datensammlungen mit Zod-Validierung umwandelt. Verwenden Sie ihn beim Erstellen von Blogs, Dokumentationsseiten oder inhaltsstarken Vite + React-Anwendungen, um Typsicherheit und automatische Inhaltsvalidierung zu gewährleisten. Er behandelt alles von der Vite-Plugin-Konfiguration und MDX-Kompilierung bis hin zur Deployment-Optimierung und Schema-Validierung.
polymarket
MetaDiese Fähigkeit ermöglicht es Entwicklern, Anwendungen mit der Polymarket-Prognosemärkte-Plattform zu erstellen, einschließlich API-Integration für Handel und Marktdaten. Sie bietet außerdem Echtzeit-Datenstreaming über WebSocket, um Live-Trades und Marktaktivitäten zu überwachen. Nutzen Sie sie zur Implementierung von Handelsstrategien oder zur Erstellung von Tools, die Live-Marktaktualisierungen verarbeiten.
creating-opencode-plugins
MetaDiese Fähigkeit unterstützt Entwickler dabei, OpenCode-Plugins zu erstellen, die in über 25 Ereignistypen wie Befehle, Dateien und LSP-Operationen eingreifen. Sie bietet die Plugin-Struktur, Event-API-Spezifikationen und Implementierungsmuster für JavaScript/TypeScript-Module. Nutzen Sie sie, wenn Sie den Lebenszyklus des OpenCode KI-Assistenten mit benutzerdefinierter ereignisgesteuerter Logik abfangen, überwachen oder erweitern müssen.
sglang
MetaSGLang ist ein hochperformantes LLM-Serving-Framework, das sich auf schnelle, strukturierte Generierung für JSON, Regex und agentenbasierte Workflows unter Verwendung seines RadixAttention-Prefix-Cachings spezialisiert. Es bietet deutlich schnellere Inferenz, insbesondere für Aufgaben mit wiederholten Präfixen, was es ideal für komplexe, strukturierte Ausgaben und Mehrfachdialoge macht. Wählen Sie SGLang gegenüber Alternativen wie vLLM, wenn Sie constrained decoding benötigen oder Anwendungen mit umfangreicher Präfix-Weitergabe entwickeln.
