Skip to content

compoundAll feature request #38

@craftoid

Description

@craftoid

We had a little workshop, where we used the compound function quite a lot :)
The participants asked for a function similar to combine that would allow them to create a compound of several shapes at once.

I think a compoundAll function that takes a list of shapes to create a compound would be quite useful. Here's a demo of how it might work ...

Screenshot

compoundall

Project

{
    "title": "funcTest01",
    "color": "teal",
    "dependencies": {
        "core/g": "dev"
    },
    "assets": {},
    "functions": [
        {
            "name": "main",
            "type": "network",
            "renderedNode": "combine1",
            "nodes": [
                {
                    "name": "colorize1",
                    "x": 395,
                    "y": 315,
                    "fn": "g.colorize",
                    "values": {
                        "fill": "rgba(0, 0, 0, 0.08888888888888889)"
                    }
                },
                {
                    "name": "combine1",
                    "x": 395,
                    "y": 485,
                    "fn": "g.combine"
                },
                {
                    "name": "compoundAll1",
                    "x": 555,
                    "y": 315,
                    "fn": "funcTest01.compoundAll",
                    "values": {}
                },
                {
                    "name": "ellipse1",
                    "x": 395,
                    "y": 25,
                    "fn": "g.ellipse",
                    "values": {
                        "width": 200,
                        "height": 200
                    }
                },
                {
                    "name": "resampleByAmount1",
                    "x": 395,
                    "y": 75,
                    "fn": "g.resampleByAmount",
                    "values": {
                        "amount": 8
                    }
                },
                {
                    "name": "toPoints1",
                    "x": 395,
                    "y": 125,
                    "fn": "g.toPoints"
                },
                {
                    "name": "ellipse2",
                    "x": 395,
                    "y": 195,
                    "fn": "g.ellipse",
                    "values": {
                        "width": 300,
                        "height": 300
                    }
                }
            ],
            "connections": [
                {
                    "output": "colorize1",
                    "input": "combine1",
                    "parameter": "list1"
                },
                {
                    "output": "compoundAll1",
                    "input": "combine1",
                    "parameter": "list2"
                },
                {
                    "output": "ellipse1",
                    "input": "resampleByAmount1",
                    "parameter": "shape"
                },
                {
                    "output": "resampleByAmount1",
                    "input": "toPoints1",
                    "parameter": "shape"
                },
                {
                    "output": "toPoints1",
                    "input": "ellipse2",
                    "parameter": "position"
                },
                {
                    "output": "ellipse2",
                    "input": "colorize1",
                    "parameter": "shape"
                },
                {
                    "output": "ellipse2",
                    "input": "compoundAll1",
                    "parameter": "shapes"
                }
            ],
            "parameters": [],
            "returnsList": true,
            "ref": "More functional programming powers such as `reduce`.\n\nThis way we can turn binary functions such as `compound` into functions that take a list of items."
        },
        {
            "name": "reduce",
            "type": "code",
            "outputType": "",
            "parameters": [
                {
                    "name": "items",
                    "type": "",
                    "value": "",
                    "takesList": true
                },
                {
                    "name": "fn",
                    "type": "string",
                    "value": "g.add"
                },
                {
                    "name": "args",
                    "type": "",
                    "value": "",
                    "takesList": true
                }
            ],
            "source": "funcTest01.reduce = function (items, fn, args) {\n\n    if (!items) return;\n\n    // get the function\n    var parts = fn.split('.');\n    var func = window;\n    parts.forEach(part => func = func[part]);\n    if(!func) return;\n\n    // reduce the items, passing in additional arguments\n    return items.reduce((x, y) => func(x, y, ... args));\n\n};",
            "ref": "Apply a binary function iteratively to all elements of the list.\n\nSee also: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce",
            "category": "",
            "returnsList": true,
            "async": false
        },
        {
            "name": "compoundAll",
            "type": "network",
            "renderedNode": "reduce1",
            "nodes": [
                {
                    "name": "reduce1",
                    "x": 35,
                    "y": 235,
                    "fn": "funcTest01.reduce",
                    "values": {
                        "fn": "g.compound"
                    }
                },
                {
                    "name": "string1",
                    "x": 135,
                    "y": 135,
                    "fn": "g.string",
                    "values": {
                        "s": "xor"
                    }
                }
            ],
            "connections": [
                {
                    "inlet": "shapes",
                    "input": "reduce1",
                    "parameter": "items"
                },
                {
                    "inlet": "method",
                    "input": "string1",
                    "parameter": "s"
                },
                {
                    "output": "string1",
                    "input": "reduce1",
                    "parameter": "args"
                }
            ],
            "parameters": [
                {
                    "name": "shapes",
                    "type": "shape",
                    "value": "",
                    "takesList": true
                },
                {
                    "name": "method",
                    "type": "string",
                    "value": "xor",
                    "choices": [
                        [
                            "union",
                            "Union"
                        ],
                        [
                            "difference",
                            "Difference"
                        ],
                        [
                            "intersection",
                            "Intersection"
                        ],
                        [
                            "xor",
                            "Xor"
                        ]
                    ],
                    "takesList": true
                }
            ],
            "returnsList": true,
            "outputType": "shape",
            "ref": "Add, subtract or intersect multiple geometries."
        }
    ],
    "id": "funcTest01"
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions