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