# ifcpatch

`ifcpatch` is a little CLI utility and library that lets you run a predetermined
modification on an IFC file, known as a patch recipe. This is great for
distributing little scripts that need to modify an IFC to users who don't know
how to code or aren't interested in knowing the details.

## Installation

`ifcpatch` is a simple Python module. No compilation or packaging is necessary.
Just download the `ifcpatch` directory and add it to your Python site packages.
Then, you can run it as a CLI like:

```
$ python -m ifcpatch
```

If you want something more Unix-like ...

```
$ alias ifcpatch='python -m ifcpatch'
```

Alternatively, you can package it as a distributable.

```
$ python make.py
$ ./dist/ifcpatch
```

## Usage

Usage is like any other CLI app.

```
$ ifcpatch -h

usage: __main__.py [-h] -i INPUT [-o OUTPUT] -r RECIPE [-l LOG]
                   [-a ARGUMENTS [ARGUMENTS ...]]

Patches IFC files to fix badly formatted data

optional arguments:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        The IFC file to patch
  -o OUTPUT, --output OUTPUT
                        The output file to save the patched IFC
  -r RECIPE, --recipe RECIPE
                        Name of the recipe to use when patching
  -l LOG, --log LOG     Specify a log file
  -a ARGUMENTS [ARGUMENTS ...], --arguments ARGUMENTS [ARGUMENTS ...]
                        Specify custom arguments to the patch recipe
```

Exactly how it is run depends on the recipe. A recipe may require zero or more
arguments which are specific to the recipe. Here's an example which runs the
`ExtractElements` recipe, which, as the same suggests, extracts out elements.
This recipe expects one argument, which uses the [IFC Query
syntax](https://wiki.osarch.org/index.php?title=IfcOpenShell_code_examples#IFC_Query_Syntax).
In this example, we'll extract out all `IfcWall` elements.

```
$ ifcpatch -i input.ifc -o output.ifc -r ExtractElements -a ".IfcWall"
```

You can also use it as a library.

```python
import ifcpatch


ifcpatch.execute({
    "input": "input.ifc",
    "output": "output.ifc",
    "recipe": "ExtractElements",
    "log": "ifcpatch.log",
    "arguments": [".IfcWall"],
})
```
