Project
The Project class provides access to project-level settings that apply across both schematic and PCB.
from kipy import KiCad
from kipy.proto.common.types import DocumentType
kicad = KiCad()
# Get project from a document
docs = kicad.get_open_documents(DocumentType.DOCTYPE_PCB)
project = kicad.get_project(docs[0])
Properties
name
Gets the project name.
print(f"Project: {project.name}")
path
Gets the project file path.
print(f"Path: {project.path}")
Net Classes
Net classes define routing constraints for groups of nets.
get_net_classes()
Gets all net classes.
net_classes = project.get_net_classes()
for nc in net_classes:
print(f"{nc.name}:")
print(f" Track width: {nc.wire_width_mm}mm")
print(f" Clearance: {nc.clearance_mm}mm")
print(f" Via size: {nc.via_diameter_mm}mm")
create_net_class(net_class)
Creates a new net class.
from kipy.project_types import NetClass
# Create high-speed net class
nc = NetClass()
nc.name = "HighSpeed"
nc.wire_width_mm = 0.2
nc.clearance_mm = 0.2
nc.via_diameter_mm = 0.6
nc.via_drill_mm = 0.3
project.create_net_class(nc)
update_net_class(net_class)
Updates an existing net class.
# Get and modify
classes = project.get_net_classes()
power_class = next(nc for nc in classes if nc.name == "Power")
power_class.wire_width_mm = 0.5
power_class.clearance_mm = 0.3
project.update_net_class(power_class)
delete_net_class(name)
Deletes a net class.
project.delete_net_class("HighSpeed")
Net Class Assignments
get_net_class_assignments()
Gets all net-to-class assignments.
assignments = project.get_net_class_assignments()
for a in assignments:
print(f"{a['pattern']} -> {a['netclass']}")
set_net_class_assignments(assignments)
Sets net class assignments using patterns.
project.set_net_class_assignments([
{"pattern": "VCC*", "netclass": "Power"},
{"pattern": "GND*", "netclass": "Power"},
{"pattern": "CLK*", "netclass": "HighSpeed"},
{"pattern": "*_P", "netclass": "DiffPair"},
{"pattern": "*_N", "netclass": "DiffPair"},
])
Text Variables
Text variables allow dynamic text in schematics and PCBs.
get_text_variables()
Gets all text variables.
variables = project.get_text_variables()
for name, value in variables.items():
print(f"${{{name}}} = {value}")
set_text_variables(variables)
Sets text variables.
from kipy.project_types import TextVariables
variables = TextVariables()
variables.set("PROJECT", "Smart Home Controller")
variables.set("VERSION", "1.0")
variables.set("AUTHOR", "John Doe")
variables.set("DATE", "2024-01-15")
project.set_text_variables(variables)
expand_text_variables(text)
Expands variables in a text string.
expanded = project.expand_text_variables("${PROJECT} Rev ${VERSION}")
print(expanded) # "Smart Home Controller Rev 1.0"
Example: Setup Project Net Classes
from kipy import KiCad
from kipy.project_types import NetClass
from kipy.proto.common.types import DocumentType
kicad = KiCad()
docs = kicad.get_open_documents(DocumentType.DOCTYPE_PCB)
project = kicad.get_project(docs[0])
# Create standard net classes
net_classes = [
{"name": "Signal", "width": 0.2, "clearance": 0.15, "via": 0.6},
{"name": "Power", "width": 0.5, "clearance": 0.3, "via": 0.8},
{"name": "HighSpeed", "width": 0.15, "clearance": 0.15, "via": 0.5},
{"name": "DiffPair", "width": 0.12, "clearance": 0.12, "via": 0.5},
]
for nc_def in net_classes:
nc = NetClass()
nc.name = nc_def["name"]
nc.wire_width_mm = nc_def["width"]
nc.clearance_mm = nc_def["clearance"]
nc.via_diameter_mm = nc_def["via"]
nc.via_drill_mm = nc_def["via"] / 2
try:
project.create_net_class(nc)
print(f"Created net class: {nc.name}")
except Exception:
project.update_net_class(nc)
print(f"Updated net class: {nc.name}")
# Assign nets to classes
project.set_net_class_assignments([
{"pattern": "VCC*", "netclass": "Power"},
{"pattern": "VDD*", "netclass": "Power"},
{"pattern": "+*V*", "netclass": "Power"},
{"pattern": "GND*", "netclass": "Power"},
{"pattern": "CLK*", "netclass": "HighSpeed"},
{"pattern": "*_P", "netclass": "DiffPair"},
{"pattern": "*_N", "netclass": "DiffPair"},
])
print("Net classes configured")
Example: Project Information
# Set project variables
from kipy.project_types import TextVariables
variables = TextVariables()
variables.set("PROJECT", project.name)
variables.set("COMPANY", "Acme Electronics")
variables.set("ENGINEER", "Jane Smith")
variables.set("REVISION", "A")
import datetime
variables.set("DATE", datetime.date.today().isoformat())
project.set_text_variables(variables)
# These can now be used in title blocks and text
# ${PROJECT}, ${COMPANY}, ${REVISION}, ${DATE}
NetClass Properties
class NetClass:
name: str # Class name
description: str # Description
wire_width_mm: float # Wire/track width
clearance_mm: float # Clearance to other nets
via_diameter_mm: float # Via pad diameter
via_drill_mm: float # Via drill diameter
uvia_diameter_mm: float # Micro-via diameter
uvia_drill_mm: float # Micro-via drill
diff_pair_width_mm: float # Differential pair width
diff_pair_gap_mm: float # Differential pair gap