Python library for programmatic Splice harness generation
Project description
splice-py
Python library for programmatic Splice harness generation. Create cable harness designs in Python and export them as JSON files for upload to Splice or save directly via the API.
Installation
pip install splice-py
Quick Start
from splice import Harness, ComponentType, Wire, WireColor, Stranding
# Create harness
harness = Harness(
name="My Cable Assembly",
description="Power and signal distribution"
)
# Add connectors (auto-generates X1, X2 designators)
x1 = harness.add_component(
kind=ComponentType.CONNECTOR,
mpn="43650-0300",
manufacturer="Molex",
positions=3,
position=(100, 100)
)
x2 = harness.add_component(
kind=ComponentType.CONNECTOR,
mpn="43650-0400",
manufacturer="Molex",
positions=4,
position=(500, 100)
)
# Add wire and create connection using enums for type safety
wire_red = Wire(
mpn="1234-RED-22",
manufacturer="Alpha Wire",
awg=22,
color=WireColor.RED, # Type-safe color enum
stranding=Stranding.AWG_22_7_30 # Type-safe stranding enum
)
# Connect X1 pin 1 to X2 pin 1
harness.connect(
x1.pin(1),
x2.pin(1),
wire=wire_red,
length_mm=300,
label="PWR_12V"
)
# Validate and export
harness.validate()
harness.save("my_harness.json")
# Option 1: Upload my_harness.json to Splice via the web interface
# Option 2: Upload directly via API (requires API key)
result = harness.upload(api_key="splice_abc123...")
print(f"Harness uploaded! View at: https://splice-cad.com/#/harness")
Features
- 🐍 Pythonic API with full type hints
- 🎯 Type-safe enums for colors, stranding, categories, and more
- 🔧 Supports all Splice component types (connectors, cables, wires, terminals)
- 🏷️ Auto-generates standard designators (X1, W1, F1, CB1, etc.)
- ✅ Built-in validation
- 📋 Multi-core cable support
- 🔌 Flying lead terminations
- 📝 Design notes
- 🏷️ Bundle labels for heat-shrink printing
- 🎨 Custom positioning
- 📦 Generates Splice-compatible JSON
- 🚀 Direct API upload to Splice account
Type-Safe Enums
The library provides enums for common properties to prevent typos and enable IDE autocomplete:
from splice import WireColor, Stranding, ConnectorCategory, FlyingLeadType
# Wire colors
WireColor.RED, WireColor.BLACK, WireColor.BLUE, etc.
# Wire stranding
Stranding.AWG_22_7_30 # 22 AWG: 7 strands of 30 AWG
Stranding.AWG_18_16_30 # 18 AWG: 16 strands of 30 AWG
Stranding.CLASS_5 # Flexible stranded
# Connector categories (for specialized components)
ConnectorCategory.FUSE # Auto-generates F1, F2...
ConnectorCategory.CIRCUIT_BREAKER # Auto-generates CB1, CB2...
ConnectorCategory.POWER_SUPPLY # Auto-generates PS1, PS2...
ConnectorCategory.RELAY # Auto-generates K1, K2...
# Flying lead terminations
FlyingLeadType.BARE
FlyingLeadType.TINNED
FlyingLeadType.HEAT_SHRINK
All enums also accept custom strings if you need values not in the enum.
Component Types
from splice import ComponentType
# Standard components
ComponentType.CONNECTOR # X1, X2, X3...
ComponentType.CABLE # W1, W2, W3...
ComponentType.WIRE # W1, W2, W3...
ComponentType.TERMINAL # Terminal crimps
# Category-specific (all use CONNECTOR kind with category field)
# Fuses → F1, F2...
# Circuit Breakers → CB1, CB2...
# Switches → S1, S2...
# Relays → K1, K2...
# Power Supplies → PS1, PS2...
# Motors → M1, M2...
Examples
Complete working examples are available in the examples/ directory. Reference JSON schemas are provided in the schemas/ directory.
Multi-core Cable
from splice import CableCore, WireColor
# Add cable with cores using enums for colors
w1 = harness.add_component(
kind=ComponentType.CABLE,
mpn="CABLE-4C-22",
manufacturer="Alpha Wire",
cores=[
CableCore(1, awg=22, color=WireColor.RED),
CableCore(2, awg=22, color=WireColor.BLACK),
CableCore(3, awg=22, color=WireColor.WHITE),
CableCore(4, awg=22, color=WireColor.GREEN)
]
)
# Connect cores
harness.connect(x1.pin(1), w1.core(1))
harness.connect(w1.core(1), x2.pin(1))
Flying Leads
from splice import FlyingLead, FlyingLeadType
# Use enum for termination type
harness.connect(
x1.pin(3),
FlyingLead(
termination_type=FlyingLeadType.TINNED, # Type-safe enum
strip_length_mm=10,
tin_length_mm=5
),
wire=wire_red,
length_mm=200
)
Category Components (Fuses, Relays, etc.)
from splice import ConnectorCategory
# Add fuse (auto-generates F1) using enum for type safety
f1 = harness.add_component(
kind=ComponentType.CONNECTOR,
mpn="0251005.NRT1L",
manufacturer="Littelfuse",
category=ConnectorCategory.FUSE, # Type-safe enum
current_rating=5,
positions=2
)
# Add circuit breaker (auto-generates CB1) using enum for type safety
cb1 = harness.add_component(
kind=ComponentType.CONNECTOR,
mpn="1492-CB1-G100",
manufacturer="Allen-Bradley",
category=ConnectorCategory.CIRCUIT_BREAKER, # Type-safe enum
current_rating=10,
positions=2
)
Custom Pin Naming
Components can have custom pin names using the pin_mapping parameter. Pin mappings are 0-indexed dictionaries:
# Add power supply with custom pin names
ps1 = harness.add_component(
kind=ComponentType.CONNECTOR,
mpn="CP10.241",
manufacturer="PULS, LP",
category=ConnectorCategory.POWER_SUPPLY,
positions=8,
position=(20, 40),
pin_mapping={
"0": "L", # Line
"1": "N", # Neutral
"2": "PE", # Protective Earth
"3": "+", # Positive output
"4": "-", # Negative output
"5": "-", # Negative output
"6": "NC", # Not connected
"7": "NC" # Not connected
}
)
# Add circuit breaker with custom pin names
cb1 = harness.add_component(
kind=ComponentType.CONNECTOR,
mpn="2907565",
manufacturer="Phoenix Contact",
category=ConnectorCategory.CIRCUIT_BREAKER,
positions=2,
pin_mapping={"0": "IN+", "1": "OUT+"}
)
Bundle Labels
Add labels to connectors and cables for identification and heat-shrink printing:
# Add a label to a connector
label = harness.add_label(
text="J1",
connector=x1,
width_mm=12,
background_color="#FFFF00" # Yellow background
)
# Add auto-generated label (uses component designator)
harness.add_label(
text="",
connector=x1,
auto_designator=True # Will use "X1" as label text
)
# Add cable label at both ends
harness.add_label(
text="POWER CABLE",
cable=c1,
cable_end="both" # "start", "end", or "both"
)
# Label specific wires only
harness.add_label(
text="V+",
connector=x1,
wire_keys=["W1", "W2"] # Only these wires
)
# Customize label appearance
harness.add_label(
text="CAUTION",
connector=x1,
width_mm=15,
font_size=8,
text_color="#FFFFFF",
background_color="#FF0000"
)
# Configure global label settings
harness.label_settings.show_labels_on_canvas = True
harness.label_settings.default_width_mm = 12
# Get labels for a specific component
labels = harness.get_labels(connector=x1)
# Remove a label
harness.remove_label(label)
API Upload
Upload harnesses directly to your Splice account using an API key:
from splice import Harness
harness = Harness("My Design")
# ... add components and connections ...
# Upload to Splice (requires API key from Account Settings)
result = harness.upload(
api_key="splice_abc123...",
is_public=False, # Optional: make harness publicly visible
api_url="https://splice-cad.com" # Optional: custom API URL
)
print(f"Created harness: {result['id']}")
print(f"Owner: {result['owner_id']}")
print(f"Created at: {result['created_at']}")
# View in Splice web interface at:
# https://splice-cad.com/#/harness
Getting an API Key:
- Log in to your Splice account at https://splice-cad.com
- Go to Account Settings
- Generate a new API key
- Store it securely (treat like a password)
Requirements: The requests library is required for API upload:
pip install requests
Batch Generation
# Generate and upload 100 harness variants
for i in range(1, 101):
harness = Harness(name=f"Assembly-{i:03d}")
# Add components...
# Make connections...
# Option 1: Save to file
harness.save(f"output/harness_{i:03d}.json")
# Option 2: Upload directly to Splice
# harness.upload(api_key="splice_abc123...")
API Reference
Harness
class Harness:
def __init__(self, name: str, description: str = "")
# Attributes
labels: List[BundleLabel] # All labels in the harness
label_settings: LabelSettings # Global label settings
def add_component(
kind: ComponentType,
mpn: str,
manufacturer: str,
designator: Optional[str] = None, # Auto-generated
position: Optional[Tuple[float, float]] = None,
**kwargs
) -> ComponentInstance
def connect(
end1: Union[PinRef, CoreRef, FlyingLead],
end2: Union[PinRef, CoreRef, FlyingLead],
wire: Wire,
length_mm: Optional[float] = None,
label: Optional[str] = None
) -> Connection
def add_label(
text: str,
connector: Optional[ComponentInstance] = None,
cable: Optional[ComponentInstance] = None,
cable_end: Optional[Literal["start", "end", "both"]] = None,
wire_keys: Optional[List[str]] = None,
auto_designator: bool = False,
width_mm: Optional[float] = None, # Uses label_settings.default_width_mm
font_size: float = 10.0,
text_color: str = "#000000",
background_color: str = "#FFFFFF"
) -> BundleLabel
def remove_label(label: BundleLabel) -> None
def get_labels(
connector: Optional[ComponentInstance] = None,
cable: Optional[ComponentInstance] = None
) -> List[BundleLabel]
def validate() -> ValidationResult
def save(filepath: str)
def to_json() -> str
def to_dict() -> dict
def upload(
api_key: str,
is_public: bool = False,
api_url: str = "https://splice-cad.com"
) -> Dict[str, Any]
BundleLabel
@dataclass
class BundleLabel:
label_text: str # Label text content
is_auto_generated: bool = False # True if using component designator
connector_instance_id: Optional[str] = None # "X1", "PS1", etc.
cable_instance_id: Optional[str] = None # "C1", etc.
cable_end: Optional[Literal["start", "end", "both"]] = None
wire_keys: List[str] = [] # Specific wires (empty = all)
width_mm: float = 9.0 # Label width for heat-shrink
font_size: float = 10.0
text_color: str = "#000000"
background_color: str = "#FFFFFF"
id: str # Auto-generated UUID
LabelSettings
@dataclass
class LabelSettings:
show_labels_on_canvas: bool = True # Display labels on canvas
default_width_mm: float = 9.0 # Default label width
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Type check
mypy splice
# Format code
black splice tests
isort splice tests
# Lint
flake8 splice tests
License
MIT © Splice CAD
Documentation
- JSON Schema Reference - Complete documentation of the export format
- API Reference - Full API documentation (coming soon)
Links
- Examples - Working example scripts
- Reference Schemas - Complete JSON schemas from example harnesses
- Splice Website
- GitHub Issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file splice_py-0.2.0.tar.gz.
File metadata
- Download URL: splice_py-0.2.0.tar.gz
- Upload date:
- Size: 35.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1377f9f671f181b560d9d12fe1d9f3566cab23f2bf5d7dd658fb4d296b107157
|
|
| MD5 |
fabfc3287204c63c343e3ee0436b4fc8
|
|
| BLAKE2b-256 |
6715ae4ab4bbc5e3be50b7bc3f6c191d56efe6eaa9213387f03f09a689dd0476
|
File details
Details for the file splice_py-0.2.0-py3-none-any.whl.
File metadata
- Download URL: splice_py-0.2.0-py3-none-any.whl
- Upload date:
- Size: 24.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7cfa3de4c4851463dc59cc28e3b11a1317104d710fa834ce2f11623e9d32a6e
|
|
| MD5 |
1f66ac3321b356142e09ad9e280df45b
|
|
| BLAKE2b-256 |
a92199e558db93ce1426149aa9f8ded03362612cde3896568d7cee32247220b2
|