<!-- Generated by tools/generate_llm_files.py from index.html. -->

Automation for Archicad

# Archicad, on *autopilot.*

Number every door along a line. Colour the model by any property. Check a project before it goes out. Tapir adds hundreds of commands to Archicad and a palette that runs scripts in one click.

[Download WINDOWS](https://github.com/ENZYME-APD/tapir-archicad-automation/releases/latest/download/TapirInstaller_Win.exe) [Download MACOS](https://github.com/ENZYME-APD/tapir-archicad-automation/releases/latest/download/TapirInstaller_Mac.zip)

100% free Open source (MIT) [Watch the tutorials](https://archicad-api.com/tutorials/) [All downloads](https://github.com/ENZYME-APD/tapir-archicad-automation/releases/latest)

**Automatic Numbering Based on Polyline** · 6 doors numbered D01–D06

**Mon** [A new release every week](https://github.com/ENZYME-APD/tapir-archicad-automation/releases)

## Start where you *already work.*

Two of the three need no programming. All of them use the same commands.

For architects

### Scripts in the palette

Open the Tapir palette, pick a script and press Run Script. The built-in scripts are there from the start, and more are shared by the community.

[Browse scripts](https://archicad-api.com/scripts/)

For computational designers

### Grasshopper

The tapir package in Rhino's Package Manager. Walls, doors, windows and more as components that read and change the model, with the names of Archicad's settings dialogs.

[Grasshopper guide](https://archicad-api.com/grasshopper/)

For developers

### Python and the JSON API

Every command answers on port 19723, each with a schema and an example. Python's standard library is enough.

[Command reference](https://archicad-api.com/archicad-addon/)

## Six jobs it *already does.*

Five built-in scripts of the Tapir palette and one workflow script, each a short Python file you can read and change.

- Built-in script

### Number elements along a line

Select a polyline and the doors, zones or objects to number. Each one gets its Element ID in the order the polyline passes it.

Changes the model `SetPropertyValuesOfElements`

[Automatic Numbering Based on Polyline](https://github.com/ENZYME-APD/tapir-archicad-automation/blob/main/builtin-scripts/AutomaticNumberingBasedOnPolyline.py)
- Built-in script

### Colour the model by a property

Pick a property; every element gets a colour for its value, with a legend of the values and how many elements have each. Number values can be grouped into ranges.

Read only `HighlightElements`

[Property Highlighter](https://github.com/ENZYME-APD/tapir-archicad-automation/blob/main/builtin-scripts/PropertyHighlighter.py)
- Built-in script

### Check a project before it goes out

Lists elements without an ID, zones with the same number, unclassified and duplicate elements, empty stories and unused layers. Export the list to Excel or turn it into Issues.

Read only `GetClassificationsOfElements`

[Project Health Check](https://github.com/ENZYME-APD/tapir-archicad-automation/blob/main/builtin-scripts/ProjectHealthCheck.py)
- Built-in script

### Publish on a schedule

Publishes the chosen Publisher Sets now or on a schedule, every few hours or daily at a set time. It can receive the Teamwork changes and update the drawings first, and logs every run.

Writes files `PublishPublisherSet`

[Batch Publisher](https://github.com/ENZYME-APD/tapir-archicad-automation/blob/main/builtin-scripts/BatchPublisher.py)
- Built-in script

### Tidy up the View Map

Finds the views that are neither placed on a layout nor published, and moves the ones you choose into a separate folder that keeps their folder structure.

Changes the model `API.MoveNavigatorItem`

[Unused View Cleaner](https://github.com/ENZYME-APD/tapir-archicad-automation/blob/main/builtin-scripts/UnusedViewCleaner.py)
- Workflow

### Export the model to OBJ

Writes the 3D model, or only the selected elements, to a Wavefront OBJ file, one object per element, for Blender and other tools.

Writes files `Get3DGeometryOfElements`

[export_obj.py](https://github.com/ENZYME-APD/tapir-archicad-automation/blob/main/archicad-addon/Workflows/export_obj.py)

## What you can do *today.*

Twelve kinds of work offices automate with Tapir, from a palette script to a Grasshopper definition.

### Property management

Read and update the properties of hundreds of elements in seconds.

### Geometry generation

Create walls, slabs and beams from Python, with the settings you choose.

### Quantity take-offs

Material and element quantities for reports, straight from the model.

### AI assistants (MCP)

Let an AI assistant read and change your model through a Tapir MCP server.

### BCF issue tracking

Create and track issues and exchange them as BCF files from Python.

### Classification mapping

Classify elements by naming conventions or by rules on their geometry.

### Views and layouts

Script views, sections and the Layout Book.

### Model checking

Find missing values and elements that break the office's standards.

### Office workflows

Python scripts made for your office's standards, run from the palette.

### Grasshopper links

Connect Rhino and Grasshopper definitions to native Archicad elements.

### Element filtering

Select elements by type, layer, classification or nested properties.

### Bulk renaming

Rename views, layouts and Publisher Sets to match the project's standards.

## One file, *no packages.*

With a project open, Archicad answers JSON commands on `http://127.0.0.1:19723`. Tapir's commands go through Archicad's `API.ExecuteAddOnCommand`. Save this as `walls.py` and run it with any Python 3.

With several Archicads open, the next ones answer on 19724, 19725 and so on.

[Your first Python script, step by step](https://archicad-api.com/start/#python)

walls.pyport 19723

```
import json
import urllib.request

def run_tapir_command(command, parameters=None):
    body = json.dumps({
        'command': 'API.ExecuteAddOnCommand',
        'parameters': {
            'addOnCommandId': {'commandNamespace': 'TapirCommand', 'commandName': command},
            'addOnCommandParameters': parameters or {}
        }
    }).encode('utf-8')
    request = urllib.request.Request('http://127.0.0.1:19723', body, {'Content-Type': 'application/json'})
    with urllib.request.urlopen(request) as response:
        result = json.loads(response.read())
    if not result['succeeded']:
        raise RuntimeError(result['error'])
    return result['result']['addOnCommandResponse']

print(run_tapir_command('GetAddOnVersion'))
walls = run_tapir_command('GetElementsByType', {'elementType': 'Wall'})['elements']
print(len(walls), 'walls')
```

## Where to go *next.*

The reference, sharing your own scripts, and the people who build Tapir.

Docs

### [The reference](https://archicad-api.com/docs/)

Every command with its schema and an example, the Grasshopper guide, and what Tapir covers of the Archicad API.

Open the docs

Share

### [Send yours in](https://archicad-api.com/scripts/share/)

Post a script on Discord or as a pull request. It is checked, adapted for any office and listed with your name. No GitHub account needed.

How sharing works

Community

### [Ask, report, test](https://archicad-api.com/community/)

Discord, the video series, and how a bug report becomes a fix.

Join in
