Additional Features

Procurement and Manufacturing

PartCAD currently supports two types of providers (entities that can provide parts and assemblies): store and manufacturer. store can be used to quote and order parts from existing lists: by vendor and SKU. manufacturer can be used to quote and order parts by using their 3D model (for example, by 3D printing them).

# partcad.yaml

parts:
  existing_part:
    vendor: homedepot # for example
    sku: ...
    ...
  new_part:
    manufacturing:
      method: additive
    parameters:
      color: black
      material: //pub/std/manufacturing/material/plastic:pla
    ...

See Providers for more information about the providers and how PartCAD selects them.

In the future, PartCAD will support assembler, which is supposed to produce an assembly given assembly instructions and using parts ordered from store-s and manufacturer-s.

Currently, the provider has to be explicitly specified in the quote or order request, or explicitly specified as one of the suppliers in the package where the parts are declared. In the future PartCAD will be able to select providers based on the location and preferences of the requestor, while leaving the possibility to enforce the use of a specific provider for corresponding parts (for example, for parts that are using a patented design).

Generative AI

PartCAD aims to provide powerful generative AI capabilities to the CAD community. Such capabilities serve two purposes.

First of all, they can be used to script more features using LLMs. Write your own AI agents that iterate through existing packages to find the part you are looking for, or automatically generate part designs. Or anything else you can think of.

Last but not least, they are powering accessibility features, allowing blind users to navigate the catalog of parts or to interactively create their own designs.

Google Gemini, OpenAI and Ollama APIs are supported. The following configuration is required:

# ~/.partcad/config.yaml
googleApiKey: <...>
openaiApiKey: <...>

The following configuration is optional:

# ~/.partcad/config.yaml
# ollamaNumThread is the number of CPU threads Ollama should utilize
ollamaNumThread: <integer>

PartCAD AI agents are designed to query AI multiple times, so that a range of options is considered and the best result is found. The following configuration options can be used to influence that behavior:

# ~/.partcad/config.yaml
# maxGeometricModeling is the number of attempts for geometric modelling
maxGeometricModeling: 4
# maxModelGeneration is the number of attempts for CAD script generation
maxModelGeneration: 3
# maxScriptCorrection is the number of attempts to incrementally fix the script if it's not working
maxScriptCorrection: 2

Design

PartCAD is capable of using generative AI to create parts. The generated part definitions are persisted as Python or CAD scripts.

# Initialize the package
pc init
# Define the part but do not generate it yet
pc add part ai-openscad --ai google --desc "Pixel phone case of a surprising shape" "generated-case.scad"
# Inspect the part. It triggers part generating on demand.
pc inspect "generated-case"

To use ChatGPT instead of Gemini, pass “openai” instead of “google” as the “–ai” parameter. To use Ollama, pass “ollama”.

If needed, the part can be regenerated by truncating the generated files.

true > "generated-case.scad"
pc inspect "generated-case"

Please, be ready to retry a few times to get an acceptable outcome.

Summarization

Summarize the part or assembly using following commands:

pc init
pc inspect -V //pub/robotics/parts/gobilda:structure/u_channel_2
pc inspect -V -a //pub/robotics/parts/gobilda:examples/wormgear

Or their more script-friendly variants:

pc init
pc -q --no-ansi inspect -V //pub/robotics/parts/gobilda:structure/u_channel_2
pc -q --no-ansi inspect -V -a //pub/robotics/parts/gobilda:examples/wormgear

Caching

PartCAD is capable of caching intermediate and final results of all model compilations. This can be particularly useful when working with large models or when scripting languages (like OpenSCAD, CadQuery or build123d) are used.

At the moment code-CAD caching is experimental and can be enabled by using the following configuration:

# ~/.partcad/config.yaml
cacheDependenciesIgnore: True

Security

As code-CAD is gaining popularity in the community, the topic of supply chain security and the risk of running arbitrary third-party code is not sufficiently addressed. PartCAD aims to close that gap for open-source software in a way that exceeds anything commercial software has to offer at the moment.

PartCAD is capable of rendering scripted parts (CadQuery and build123d use Python) in sandboxed environments.

At the moment it is only useful from a dependency management perspective (it allows third-party packages to bring their Python dependencies without polluting your own Python environment), in the future, PartCAD aims to achieve security isolation of the sandboxed environments. That will fundamentally change the security implications of using scripted models shared online.

Telemetry

Public Repositories

By default PartCAD collects telemetry data to improve the user experience and to help understand how the tool is being used. The data collected includes the following:

  • What commands are being run?

  • How much time is consumed by each step?

  • What errors and exceptions are being raised?

PartCAD uses OpenTelemetry to collect telemetry data. You can disable telemetry by setting the following configuration:

# ~/.partcad/config.yaml
telemetry:
  type: none

Alternatively, you can disable telemetry by setting the following environment variable:

PC_TELEMETRY_TYPE="none"

You can also change telemetry settings using CLI:

pc system set telemetry type none
# or, if you want to collect data about PartCAD performance in your organization:
pc system set telemetry type sentry
pc system set telemetry env <you-org-name>
pc system set telemetry sentryDsn <your-sentry-dsn>

Private Repositories

If you are systemically using PartCAD in your organization then it makes sense to collect your own telemetry data to understand how the tool is being used in your organization, and to learn how to improve your organization performance.

The only OpenTelemetry backend provider currently supported is Sentry. Create an organization account on Sentry and obtain a DSN key.

# ~/.partcad/config.yaml
telemetry:
  type: sentry
  sentryDsn: "<your-sentry-dsn>"

Other OpenTelemetry backend providers can be supported on request.

Automation Support

PartCAD allows you to set CLI options and override user configurations specified in ~/.partcad/config.yaml using environment variables. This can be particularly useful for setting configurations dynamically or in environments where modifying configuration files is not feasible.

Generally, all of PartCAD’s environment variables are prefixed with PC.

For CLI options, the environment variable prefix depends on the command being used. You can use the –help option to determine the corresponding environment variable for each CLI option.

Here are some examples:

# Equivalent to: pc add part --desc "testing" scad test.scad
PC_ADD_PART_DESC="testing" pc add part scad test.scad

Note that, these environment variables will be overridden if the CLI option is specified.

For user configurations, the environment variables are of the format PC followed by the configuration option name(in uppercase). For example, to override the googleApiKey configuration, you would set the environment variable PC_GOOGLEAPIKEY.

Note that environment variable names are case-sensitive. Always use uppercase letters for the PC prefix and the rest of the variable name, as shown in the examples above.

In this case, these environment variables will take precedence over the values specified in ~/.partcad/config.yaml.

Flexible Git Configuration

By default, PartCAD uses the system’s Git configuration when importing packages using git. If you want to override these configurations, you can add your overrides in ~/.partcad/config.yaml as shown below:

# ~/.partcad/config.yaml
git:
  config:
    "user.name": "John Doe"
    "user.email": "johndoe@example.com"
    ...

Cloning over SSH is faster and more reliable because it uses an efficient protocol with lower overhead, supports compression, and maintains stable connections via key-based authentication. SSH avoids HTTPS rate limits, handles firewalls better, and eliminates credential prompts, making it ideal for large repositories or frequent interactions.

If you have SSH keys configured then you can add the following to the ~/.partcad/config.yaml:

# ~/.partcad/config.yaml
dependencies:
  overrides:
    url:
      "git@github.com:": "https://github.com/"

Personally Identifiable Information

The user section in ~/.partcad/config.yaml defines the default personal and contact details used throughout the system. These details include the user’s name, email, phone number, company, and address information.

# ~/.partcad/config.yaml
user:
    firstName: <...>
    lastName: <...>
    email: <...>
    phone: <...>
    company: <...>
    line1: <...>
    line2: <(optional)>
    countryCode: US
    stateCode: <...>
    zipCode: <...>
    city: <...>

Address Configuration

Users can override any details from the user section by specifying shippingAddress and billingAddress separately.

# ~/.partcad/config.yaml
user: # Default user details (includes firstName, lastName, email, phone, company, address, etc.)

shippingAddress:  # Optional, overrides user details for shipping
    firstName: <(optional)>
    lastName: <(optional)>
    phone: <(optional)>
    company: <(optional)>
    line1: <(optional)>
    line2: <(optional)>
    countryCode: <(optional)>
    stateCode: <(optional)>
    zipCode: <(optional)>
    city: <(optional)>

billingAddress:  # Optional, overrides user details for billing
    firstName: <(optional)>
    lastName: <(optional)>
    phone: <(optional)>
    company: <(optional)>
    line1: <(optional)>
    line2: <(optional)>
    countryCode: <(optional)>
    stateCode: <(optional)>
    zipCode: <(optional)>
    city: <(optional)>

Override Behavior

  • If shippingAddress is not specified, the system will use the user details for shipping.

  • If billingAddress is not specified, the system will use the user details for billing.

  • If shippingAddress or billingAddress is provided, it completely replaces the corresponding fields from user.

This setup allows full customization of shipping and billing details, supporting scenarios where items need to be sent to different recipients or addresses.

Parameter Configuration

The configuration file (~/.partcad/config.yaml) allows users to define reusable parameters, which can be accessed dynamically within the provider configurations.

In ~/.partcad/config.yaml, parameters are stored under a parameters section.

Example:

# ~/.partcad/config.yaml
parameters:
  object_id:
    <parameter name>: <parameter value>

Object IDs are used to reference different types of objects within a package, such as sketches, parts, assemblies, scenes, interfaces, and providers.

Accessing Parameters in Providers

In the providers section, parameters can be referenced dynamically using a function get_from_config(), ensuring that sensitive or reusable values (e.g., API keys, URLs) do not need to be hardcoded multiple times.

Example:

# ~/.partcad/config.yaml
providers:
  <provider name>:
    type: <store|manufacturer|enrich>
    url: <...>
    parameters:
      url:
        type: string
        default: {{ get_from_config() }}