new list utility nodes (#13)

* add List-related nodes for Checkpoints / LoRAs / Samplers/ Schedulers
* wiki: reorg XY Plot 3rd tutorial and add example
* bump version
This commit is contained in:
Bug, Ltd.
2025-01-29 11:18:14 +01:00
committed by GitHub
parent 1c6034bbcb
commit 9dcf6660de
45 changed files with 1613 additions and 400 deletions
+1 -1
View File
@@ -9,6 +9,6 @@
- [1 - the basics](./XY%20Plot/1%20-%20the%20basics/)
- [2 - pimp my grid](./XY%20Plot/2%20-%20pimp%20my%20grid/)
- [3 - advanced techniques](./XY%20Plot/3%20-%20advanced%20techniques/)
- [3 - complex variations](./XY%20Plot/3%20-%20complex%20variations/)
**[Format](./Format/)**
@@ -138,11 +138,12 @@ That being said, I hope you have found these tutorials interesting and easy to f
> [!NOTE]
> If you have any suggestion to improve them (content, features, better English, shorter sentences, ...), feel free to open [an issue](https://github.com/bugltd/ComfyLab-Pack/issues), [a discussion](https://github.com/bugltd/ComfyLab-Pack/discussions), or even a Pull Request if you can.
Thank you for reading, and enjoy your beautiful grids my friends!
Thank you for reading, and enjoy your beautiful grids!
## Going further (advanced)
These 2 tutorials are intended for a large audience, and to cover the most standard use cases.\
These 2 tutorials are intended for a large audience, and to cover the most standard use cases.
But please note there are **many advanced techniques you can apply with ComfyLab XY Plot nodes**, for example:
- vary checkpoints, LoRA (any model in fact), ... virtually anything
@@ -153,11 +154,11 @@ But please note there are **many advanced techniques you can apply with ComfyLab
- with the [ComfyLab `Output Config` node](../../Output%20Config/)
- ...
If you want to dive deeper, I propose we move to the **next (and last) tutorial of the XY Plot series: 3 - advanced techniques**.\
But before doing that, please note:
If you want to go deeper, we can now move to the **next tutorial of the XY Plot series: 3 - complex variations**.\
It will show how you can vary many things like checkpoints / LoRAs / ..., and virtually any model or value in a combo widget, by using 3 methods:
- it addresses some edge cases that may not be needed for most
- it is not as detailed as those 2 first tutorials, we'll go faster
- if you haven't done it yet, I strongly advise you read the [XY Plot core concepts](../../../node%20reference/xy%20plot/0%20-%20core%20concepts.md): it's not long, and you may learn some important design choices there.
- simple, with dedicated nodes for checkpoints / LoRAs / samplers / schedulers
- versatile, that should adapt to any kind of model (or combo widget)
- with the [`Output Config` node](../../Output%20Config/), to standardize your workflow and keep parameters separated
Interested? Let's go to the next tutorial: **[3 - advanced techniques](../3%20-%20advanced%20techniques/)**
Interested? Let's go to the next tutorial: **[3 - complex variations](../3%20-%20complex%20variations/)**
@@ -1,139 +0,0 @@
# Tutorials / XY Plot: 3 - advanced techniques
Welcome to this third (and last) tutorial of the XY Plot series!
Here we are going to see a few advanced techniques you may find useful.\
Of course, I cannot anticipate all the use cases, but by following this tutorial, I hope you will see the versatility of the ComfyLab XY Plot nodes, and understand how to adapt for your scenario.\
Here, no frills, we'll go straight to the point, to focus of the functionalities rather than fancy grid customization.
> [!IMPORTANT]
> If you haven't yet, it is recommended to follow (at least read) the first 2 tutorials ([1](../1%20-%20the%20basics/) & [2](../2%20-%20pimp%20my%20grid/)), and read the [XY Plot core concepts](../../../node%20reference/xy%20plot/0%20-%20core%20concepts.md).\
> You will probably need them in this advanced tutorial.
Tutorial sections:
- [Part 1 - Various checkpoints (or LoRAs, ...)](#part-1---various-checkpoints-or-loras-)
- [Part 2 - Various resolutions and aspect ratios](#part-2---various-resolutions-and-aspect-ratios)
- [Part 3 - Using the Output Config node](#part-3---using-the-output-config-node)
- [TL;DR / Conclusion](#tldr--conclusion)
> [!TIP]
> As for all nodes in this extension, you can get useful contextual information, by just **moving the mouse pointer over a node or its inputs / widgets / outputs**. This should help you understand some details, without reading the more detailed wiki pages (yet).
And as always, if you do not want to follow all the steps, you can jump directly to [the conclusion](#tldr--conclusion).
---
## Part 1 - Various checkpoints (or LoRAs, ...)
**Load either `workflow - part 1.json` or `workflow - part 1.png` into ComfyUI.**\
**Important:**
- in the first input list, adjust to checkpoints that are available in your ComfyUI instance
- do no add the `.safetensors` extension, it will be added automatically
Execute the workflow.
![result - part 1](./details/result%20-%20part%201.jpg)
Here we build a grid with 2 different checkpoints, vs a list of predefined seeds.
What should be noticed:
<ins>Checkpoints:</ins>
- we have chosen not to include the `.safetensors` extension in the input
- it would have been displayed in the row headers, making them too long
- instead, we have used a `Format: String` node, to append `.safetensors` to the `dim1 value` output of the `Queue` node
- but by simply doing so, we cannot pipe the text output to the `Load Checkpoint` node, why?
- the `chkpt_name` widget does not accept any string, but a string that exists in the list
- so to bypass this limitation we simply convert the text output to Any, thanks to the `Convert to Any` node
- ![Any output](./details/detail%20-%20part%201%20-%20any.jpg)
> [!NOTE]
> You can read more about the Any output in the [XY Plot core concepts](../../../node%20reference/xy%20plot/0%20-%20core%20concepts.md), and the [2nd tutorial of the `Output Config` node](../../Output%20Config/2%20-%20more%20options)
<ins>Seeds:</ins>
- theoritically, we should have converted the list values to integers, thanks to the `convert` combo widget
- but it also works (for seeds only AFAIK)
### Lessons learned
- combo widgets (as `chkpt_name` in `Load Checkpoint`) do not accept simple strings
- a workaround is to use an output with type Any (`"*"`)
- should we have included the `.safetensors` in the first input, we could have dropped the `Format: String` and `Convert to Any` node, because the type of `Queue` outputs is Any
- but this wouldn't be great in terms of display in the grid
- the checkpoint list is connected to `dim1`, not `dim2`, for a performance reason
- if you want: just switch dim1 / dim2 and check the processing time _(more in the [core concepts page](../../../node%20reference/xy%20plot/0%20-%20core%20concepts.md))_
> [!TIP]
> You can basically use this approach for any combo widget, in particular when loading models (LoRA, ...).\
> But be **very cautious** about the values you set in input: by using the Any type, we bypass the standard ComfyUI type checks, so the workflow may fail if the values are incorrect.
### Variant: Random seeds
Instead of fixed seeds, if you prefer to have a new random set of seeds each time you generate the grid, just replace the `List: ftom Multiline` node with `List: Random Seeds`.
## Part 2 - Various resolutions and aspect ratios
**Load either `workflow - part 2.json` or `workflow - part 2.png` into ComfyUI.**\
Adjust the checkpoint to one available in your ComfyUI instance.\
Execute the workflow.
![result - part 2](./details/result%20-%20part%202.jpg)
What we did:
- include the ComfyLab `Resolution to Dimensions` node, to split the first input (`1024 x 1024`, ...) into width and height, piped into `Empty Latent Image`
- we could have done this differently, I chose this method as it is straightforward in this case
- we also used a 2nd input list to set rotations, piped into the `rotation` input of `Rotate Latent`
- remember, we can do that because the `Queue` outputs are of type Any
While probably not the most useful as such, this example demonstrates **the ability of the ComfyLab XY Plot to handle various resolutions or aspect ratios within the same grid**.
## Part 3 - Using the Output Config node
Here the workflow is similar to [Part1](#part-1---various-checkpoints-or-loras-), except that we use the `Output Config` node, to simplify and standardize our workflow.
**Load either `workflow - part 3.json` or `workflow - part 3.png` into ComfyUI.**\
**Copy one of the `output config - part 3.*` file, adjust the checkpoints to your env, and load it into the `Output Config` node.**
- you should get outputs like this (more than the 4 displayed here):
- ![outputs](./details/detail%20-%20part%203%20-%20output%20config.jpg)
Execute the workflow.
![result - part 3](./details/result%20-%20part%201.jpg)
As expected, we have strictly the same results as in [Part 1](#part-1---various-checkpoints-or-loras-).
What should be noticed:
- the output config file is available in 3 different formats: JSON, JSON5 and YAML
- we replaced the input lists by a single `Output Config` node
- we also added more outputs to the config file: CFG, steps, sampler, ... quite a lot indeed
- of course, we could have used 2 different `Output Config` nodes, one for the XY Plot itself, and another one for the other values: it's up to you to define how you want to standardize your configs
- note how the `Output Config` node auto-detects the type from output values:
- for example, `cfg` is written without quotes, so it's detected as a string
- but for more combo widgets (sampler, scheduler), we have to force type to be Any (`*`)
> [!TIP]
> We won't go into details here about the configuration file itself, but you can find more information in the corresponding [node reference](../../../node%20reference/output%20config.md) and the [dedicated tutorials](../../../tutorials/Output%20Config/).
## TL;DR / Conclusion
In this tutorial, we have:
- seen how to handle various checkpoints (or virtually any sort of model)
- and optimized the grid display at the same time
- demonstrated the ability of the XY Plot to include images or various dimensions / apect ratios within the same grid
- shown how we can use the `Output Config` node, to keep a collection of configs, while standardizing our workflow
This tutorial is still in construction, so I will certainly add most techniques in the future, be sure to check.
Also, you will find [various examples](../../../examples/) in the wiki (with less explanations).
In the meantime, if you have any suggestion, feel free to open [a discussion](https://github.com/bugltd/ComfyLab-Pack/discussions).
Thank you for reading, enjoy!
Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 389 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

@@ -0,0 +1,145 @@
# Tutorials / XY Plot: 3 - Complex variations
Welcome to this third tutorial of the XY Plot series!
Here we are going to see a few advanced techniques, to make virtually anything vary, for example models or any value in a combo widget.\
To achieve that, we will use 3 different methods:
- simple: with dedicated nodes, for checkpoints / LoRAs / samplers / schedulers
- versatile: adaptable to any kind of model (or combo widget)
- with the [`Output Config`](../../Output%20Config/) node: to standardize your workflow, and keep parameters separated
Each of these approaches will generate the same results: depending on your specifity, pick the one that matches your specific needs.
> [!TIP]
> In the following, we vary checkpoints vs a fixed list of seeds.
> If you prefer to have a new set of **random seeds** each time you generate the grid, just replace the corresponding `List: ftom Multiline` node with `List: Random Seeds`.
Tutorial sections:
- [Expected results](#expected-results)
- [Part 1 - Simple: with a dedicated node (for checkpoints, LoRAs, samplers, schedulers)](#part-1---simple-with-a-dedicated-node-for-checkpoints-loras-samplers-schedulers)
- [Part 2 - Versatile: any model (or combo widget)](#part-2---versatile-any-model-or-combo-widget)
- [Part 3 - With the `Output Config` node](#part-3---with-the-output-config-node)
- [TL;DR / Conclusion](#tldr--conclusion)
And as always, if you do not want to follow all the steps, you can jump directly to [the conclusion](#tldr--conclusion).
---
## Expected results
If you use the exact same parameters:
- checkpoints: `sd_xl_base_1.0`, `Juggernaut-XI-byRunDiffusion`
- seeds: `156680208700286`, `715168739510668`, `568208062071311`
You should get the same result:\
![result grid](./details/result%20.jpg)
## Part 1 - Simple: with a dedicated node (for checkpoints, LoRAs, samplers, schedulers)
> [!TIP]
> Here we use the `List: Checkpoints` node, that allows to select any number of checkpoints (from your ComfyUI `models/checkpoints` folder), and get a list of file names.\
> Similar nodes exist for: LoRAs, samplers, schedulers.
**Load either `workflow - part 1.json` or `workflow - part 1.png` into ComfyUI.**\
**Important:**
- in the `List: Checkpoints` node, select a few checkpoints from your env
- in the example, I use SDXL 1.0 and Juggernaut XL v11
- ensure the widget `with file extension?` is unchecked, as we will add the extension later
Execute the workflow.
### What should be noticed
> [!NOTE]
> we have chosen to not include the `.safetensors` extension in the input: it would have been displayed in the row headers, making them too long. Of course, you can keep it, and skip the following.
To append the `.safetensors` extension:
- we use a `Format: String` node, to add the extension to the `dim1 value` output of the `Queue` node
- but by simply doing so, we cannot pipe the text output to the `Load Checkpoint` node, why?
- the `chkpt_name` widget does not accept any string, but a string that exists in the list
- so to bypass this limitation we simply convert the text output to Any, thanks to the `Convert to Any` node
- ![Any output](./details/detail%20-%20part%201-%20any.jpg)
> [!NOTE]
> You can read more about the Any output in the [XY Plot core concepts](../../../node%20reference/xy%20plot/0%20-%20core%20concepts.md), and the [2nd tutorial of the `Output Config` node](../../Output%20Config/2%20-%20more%20options/)
### Lessons learned
- combo widgets (as `chkpt_name` in `Load Checkpoint`) do not accept simple strings
- a workaround is to use an output with type Any (`"*"`)
- should we have included the `.safetensors` in the first input, we could have dropped the `Format: String` and `Convert to Any` nodes, because the `XY Plot: Queue` outputs are themselves of type Any
- but this wouldn't be great in terms of display in the grid
- the checkpoint list is connected to `dim1`, not `dim2`, for a performance reason
- for the test: just switch dim1 / dim2 and check the processing time _(more in the [core concepts page](../../../node%20reference/xy%20plot/0%20-%20core%20concepts.md))_
## Part 2 - Versatile: any model (or combo widget)
While it is usually simpler to use the `List` nodes dedicated to checkpoints / LoRAs / samplers / schedulers, there are some cases where we need to use a more versatile approach:
- we want to vary another type of model / value from a combo widget
- we have stored the list as a separate text file (e.g. test case), and prefer to re-use it, rather than manually selecting the values
This short part will cover exactly that, to show how you can adapt the XY Plot to many specific cases.
**Load either `workflow - part 2.json` or `workflow - part 2.png` into ComfyUI.**\
**Important:**
- in the first input list, adjust to checkpoints that are available in your ComfyUI instance
- do no add the `.safetensors` extension, it will be added automatically
Execute the workflow.
### Lessons learned
By using a `List: String` or `List: Multiline`, we can basically send any value, as long as we ensure it matches the destinastion widget.\
You can use this approach for any combo widget, in particular when loading models, or any value in a combo widget.
> [!IMPORTANT]
> Be **very cautious** about the values you set in input: by using the Any type, we bypass the standard ComfyUI type checks, so the workflow may fail if the values are incorrect.
## Part 3 - With the `Output Config` node
Here we use the ComfyLab [`Output Config`](../../../node%20reference/output%20config.md) node, to keep our workflow and values separated.
**Load either `workflow - part 3.json` or `workflow - part 3.png` into ComfyUI.**\
**Copy one of the `output config - part 3.*` files, adjust the checkpoints to your env, and load it into the `Output Config` node.**
- you should get outputs like this (more than the 4 displayed here):
- ![outputs](./details/detail%20-%20part%203%20-%20output%20config.jpg)
Execute the workflow.
As expected, we have strictly the same results as in [Part1](#part-1---simple-with-a-dedicated-node-for-checkpoints-loras-samplers-schedulers) and [Part 2](#part-2---versatile-any-model-or-combo-widget).
### What should be noticed
- the output config file is available in 3 different formats: JSON, JSON5 and YAML
- we have replaced the input lists by a single `Output Config` node
- we've also added more outputs to the config file: CFG, steps, sampler, ... quite a lot indeed
- of course, we could have used 2 different `Output Config` nodes, one for the XY Plot itself, and another one for the other values: it's up to you to define how you want to standardize your configs
- note how the `Output Config` node auto-detects the type from output values:
- for example, `cfg` is written without quotes, so it's detected as a float
- but for combo widgets (sampler, scheduler), we have to force type to be Any (`*`)
> [!TIP]
> We won't go into details here about the configuration file itself, but you can find more information in the corresponding [node reference](../../../node%20reference/output%20config.md) and the [dedicated tutorials](../../../tutorials/Output%20Config/).
## TL;DR / Conclusion
In this tutorial, we have covered 3 different methods to vary checkpoints (or many other things):
- simple one, using a dedicated node: applicable to checkpoints, LoRAs, samplers, schedulers
- a more versatile one, that should adapt to many of your use cases: use a `List: from String` or `List: from Multiline`
- one using the `Output Config` node, to standardize your workflow and keep the values separated
> [!TIP]
> You can find [more examples](../../../examples/) in the wiki.
If you have any suggestion on how to improve this wiki, feel free to open [a discussion](https://github.com/bugltd/ComfyLab-Pack/discussions).
Thank you for reading, enjoy!

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 139 KiB

@@ -1,4 +1,4 @@
# Tutorials / XY Plot / 3 - Advanced techniques / Part 3
# Tutorials / XY Plot / 3 - Complex variations / Part 3
# more details about the config format in the Output Config node reference and tutorials
checkpoints:
value:
@@ -1,5 +1,5 @@
/*
Tutorials / XY Plot / 3 - Advanced techniques / Part 3
Tutorials / XY Plot / 3 - Complex variations / Part 3
more details about the config format in the Output Config node reference and tutorials
*/
{
@@ -1,6 +1,6 @@
{
"last_node_id": 20,
"last_link_id": 22,
"last_node_id": 21,
"last_link_id": 23,
"nodes": [
{
"id": 7,
@@ -305,49 +305,6 @@
1
]
},
{
"id": 15,
"type": "ListFromMultiline",
"pos": [
-240,
180
],
"size": [
290,
200
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
18
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
},
"widgets_values": [
0,
true,
"disabled",
"# here we list seed values\n156680208700286\n715168739510668\n568208062071311"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 10,
"type": "PreviewImage",
@@ -460,49 +417,6 @@
"color": "#2a363b",
"bgcolor": "#3f5159"
},
{
"id": 14,
"type": "ListFromMultiline",
"pos": [
-430,
-100
],
"size": [
470,
200
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
15
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
},
"widgets_values": [
0,
true,
"disabled",
"# here we list the checkpoints\n# do not add the '.safetensors' extension, it will be appended later\nsd_xl_base_1.0\nJuggernaut-XI-byRunDiffusion"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 13,
"type": "XYPlotQueue",
@@ -521,7 +435,7 @@
{
"name": "dim1",
"type": "LIST",
"link": 15,
"link": 23,
"shape": 6
},
{
@@ -652,6 +566,96 @@
],
"color": "#2a363b",
"bgcolor": "#3f5159"
},
{
"id": 21,
"type": "ListCheckpoints",
"pos": [
-280,
-110
],
"size": [
315,
126
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
23
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListCheckpoints"
},
"widgets_values": [
{
"selected": [
"sd_xl_base_1.0.safetensors"
]
},
false,
"sd_xl_base_1.0.safetensors",
"none"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 15,
"type": "ListFromMultiline",
"pos": [
-240,
180
],
"size": [
290,
200
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
18
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
},
"widgets_values": [
0,
true,
"integer",
"# here we list seed values\n156680208700286\n715168739510668\n568208062071311"
],
"color": "#232",
"bgcolor": "#353"
}
],
"links": [
@@ -751,14 +755,6 @@
0,
"XY_PLOT_DATA"
],
[
15,
14,
0,
13,
0,
"LIST"
],
[
18,
15,
@@ -798,21 +794,29 @@
3,
4,
"INT"
],
[
23,
21,
0,
13,
0,
"LIST"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 1.1000000000000003,
"scale": 1,
"offset": [
478.0620672954512,
266.4479981606637
564,
126
]
},
"node_versions": {
"comfy-core": "0.3.10",
"ComfyLab-Pack": "1985411cc05fb8b6faa361d2fc18c3d867e9bdb5"
"ComfyLab-Pack": "4fe6425c10985b88586d861d8d5e45b62b8cd1fa"
}
},
"version": 0.4
Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

@@ -1,6 +1,6 @@
{
"last_node_id": 22,
"last_link_id": 31,
"last_node_id": 20,
"last_link_id": 22,
"nodes": [
{
"id": 7,
@@ -14,7 +14,7 @@
180.6060791015625
],
"flags": {},
"order": 4,
"order": 8,
"mode": 0,
"inputs": [
{
@@ -40,6 +40,64 @@
"text, watermark"
]
},
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [
26,
474
],
"size": [
315,
98
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "ckpt_name",
"type": "COMBO",
"link": 21,
"widget": {
"name": "ckpt_name"
}
}
],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
1
],
"slot_index": 0
},
{
"name": "CLIP",
"type": "CLIP",
"links": [
3,
5
],
"slot_index": 1
},
{
"name": "VAE",
"type": "VAE",
"links": [
8
],
"slot_index": 2
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"v1-5-pruned-emaonly.ckpt"
]
},
{
"id": 8,
"type": "VAEDecode",
@@ -120,7 +178,7 @@
164.31304931640625
],
"flags": {},
"order": 3,
"order": 7,
"mode": 0,
"inputs": [
{
@@ -146,55 +204,6 @@
"beautiful scenery nature glass bottle landscape, , purple galaxy bottle,"
]
},
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [
26,
474
],
"size": [
315,
98
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
1
],
"slot_index": 0
},
{
"name": "CLIP",
"type": "CLIP",
"links": [
3,
5
],
"slot_index": 1
},
{
"name": "VAE",
"type": "VAE",
"links": [
8
],
"slot_index": 2
}
],
"properties": {
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"sd_xl_base_1.0.safetensors"
]
},
{
"id": 3,
"type": "KSampler",
@@ -228,7 +237,15 @@
{
"name": "latent_image",
"type": "LATENT",
"link": 26
"link": 2
},
{
"name": "seed",
"type": "INT",
"link": 22,
"widget": {
"name": "seed"
}
}
],
"outputs": [
@@ -245,7 +262,7 @@
"Node name for S&R": "KSampler"
},
"widgets_values": [
134178653729123,
440313153020244,
"randomize",
20,
8,
@@ -254,139 +271,27 @@
1
]
},
{
"id": 15,
"type": "ListFromMultiline",
"pos": [
-410,
160
],
"size": [
218.39999389648438,
220
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
18
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
},
"widgets_values": [
0,
true,
"disabled",
"# rotations\nnone\n90 degrees"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 22,
"type": "ResolutionToDims",
"pos": [
190,
-110
],
"size": [
252,
102
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "resolution",
"type": "STRING",
"link": 29,
"widget": {
"name": "resolution"
}
}
],
"outputs": [
{
"name": "width",
"type": "INT",
"links": [
30
],
"slot_index": 0
},
{
"name": "height",
"type": "INT",
"links": [
31
],
"slot_index": 1
}
],
"properties": {
"Node name for S&R": "ResolutionToDims"
},
"widgets_values": [
"1024x1024",
1
],
"color": "#2a363b",
"bgcolor": "#3f5159"
},
{
"id": 5,
"type": "EmptyLatentImage",
"pos": [
500,
-10
473,
609
],
"size": [
315,
106
],
"flags": {},
"order": 7,
"order": 0,
"mode": 0,
"inputs": [
{
"name": "width",
"type": "INT",
"link": 30,
"widget": {
"name": "width"
}
},
{
"name": "height",
"type": "INT",
"link": 31,
"widget": {
"name": "height"
}
}
],
"inputs": [],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
25
2
],
"slot_index": 0
}
@@ -400,52 +305,6 @@
1
]
},
{
"id": 21,
"type": "LatentRotate",
"pos": [
860,
10
],
"size": [
210,
70
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 25
},
{
"name": "rotation",
"type": "COMBO",
"link": 28,
"widget": {
"name": "rotation"
}
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
26
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "LatentRotate"
},
"widgets_values": [
"none"
]
},
{
"id": 10,
"type": "PreviewImage",
@@ -454,8 +313,8 @@
180
],
"size": [
720,
640
440,
320
],
"flags": {},
"order": 12,
@@ -474,61 +333,103 @@
"widgets_values": []
},
{
"id": 14,
"type": "ListFromMultiline",
"id": 20,
"type": "FormatString",
"pos": [
-410,
-110
470,
-100
],
"size": [
220,
210
210,
78
],
"flags": {},
"order": 2,
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
"inputs": [
{
"name": "list",
"type": "LIST",
"links": [
15
],
"slot_index": 0,
"shape": 6
"name": "arg0",
"type": "STRING,INT,FLOAT,BOOLEAN",
"link": 19,
"label": "arg0"
},
{
"name": "count",
"type": "INT",
"links": null
"name": "arg1",
"type": "STRING,INT,FLOAT,BOOLEAN",
"link": null
}
],
"outputs": [
{
"name": "formatted",
"type": "STRING",
"links": [
20
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
"Node name for S&R": "FormatString"
},
"widgets_values": [
0,
true,
"disabled",
"# image dimensions\n1024 x 1024\n896 x 1152\n1216 x 832"
"{arg0}.safetensors"
],
"color": "#232",
"bgcolor": "#353"
"color": "#2a363b",
"bgcolor": "#3f5159"
},
{
"id": 19,
"type": "ConvertToAny",
"pos": [
730,
-100
],
"size": [
168,
26
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "value",
"type": "*",
"link": 20
}
],
"outputs": [
{
"name": "value_any",
"type": "*",
"links": [
21
],
"slot_index": 0,
"label": "value (Any)"
}
],
"properties": {
"Node name for S&R": "ConvertToAny"
},
"widgets_values": [],
"color": "#2a363b",
"bgcolor": "#3f5159"
},
{
"id": 13,
"type": "XYPlotQueue",
"pos": [
-150,
-100
110,
-120
],
"size": [
315,
146
],
"flags": {},
"order": 5,
"order": 3,
"mode": 0,
"inputs": [
{
@@ -561,7 +462,7 @@
"name": "dim1_value",
"type": "*",
"links": [
29
19
],
"slot_index": 1,
"label": "dim1 value"
@@ -570,7 +471,7 @@
"name": "dim2_value",
"type": "*",
"links": [
28
22
],
"slot_index": 2,
"label": "dim2 value"
@@ -661,10 +562,96 @@
"widgets_values": [
"{dim1}",
"{dim2}",
false
true
],
"color": "#2a363b",
"bgcolor": "#3f5159"
},
{
"id": 14,
"type": "ListFromMultiline",
"pos": [
-430,
-100
],
"size": [
470,
200
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
15
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
},
"widgets_values": [
0,
true,
"disabled",
"# here we list the checkpoints\n# do not add the '.safetensors' extension, it will be appended later\nsd_xl_base_1.0\nJuggernaut-XI-byRunDiffusion"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 15,
"type": "ListFromMultiline",
"pos": [
-240,
180
],
"size": [
290,
200
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "list",
"type": "LIST",
"links": [
18
],
"slot_index": 0,
"shape": 6
},
{
"name": "count",
"type": "INT",
"links": null
}
],
"properties": {
"Node name for S&R": "ListFromMultiline"
},
"widgets_values": [
0,
true,
"integer",
"# here we list seed values\n156680208700286\n715168739510668\n568208062071311"
],
"color": "#232",
"bgcolor": "#353"
}
],
"links": [
@@ -676,6 +663,14 @@
0,
"MODEL"
],
[
2,
5,
0,
3,
3,
"LATENT"
],
[
3,
4,
@@ -773,51 +768,35 @@
"LIST"
],
[
25,
5,
0,
21,
0,
"LATENT"
],
[
26,
21,
0,
3,
3,
"LATENT"
],
[
28,
19,
13,
2,
21,
1,
20,
0,
"STRING,INT,FLOAT,BOOLEAN"
],
[
20,
20,
0,
19,
0,
"*"
],
[
21,
19,
0,
4,
0,
"COMBO"
],
[
29,
22,
13,
1,
22,
0,
"STRING"
],
[
30,
22,
0,
5,
0,
"INT"
],
[
31,
22,
1,
5,
1,
2,
3,
4,
"INT"
]
],
@@ -825,15 +804,15 @@
"config": {},
"extra": {
"ds": {
"scale": 1.1000000000000003,
"scale": 1,
"offset": [
458.9711582045418,
260.08436179702727
544,
216
]
},
"node_versions": {
"comfy-core": "0.3.10",
"ComfyLab-Pack": "1985411cc05fb8b6faa361d2fc18c3d867e9bdb5"
"ComfyLab-Pack": "4fe6425c10985b88586d861d8d5e45b62b8cd1fa"
}
},
"version": 0.4
Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Before

Width:  |  Height:  |  Size: 972 KiB

After

Width:  |  Height:  |  Size: 972 KiB

+6 -5
View File
@@ -41,12 +41,13 @@ Contents:
- make the grid RGBA to add a custom background inage
- display 'page X / Y'
## Tutorial 3 - advanced techniques
## Tutorial 3 - complex variations
**[>> Go to the tutorial](./3%20-%20advanced%20techniques/)**
**[>> Go to the tutorial](./3%20-%20complex%20variations/)**
Contents:
- various checkpoints (or virtually any model, LoRA, ...)
- integrate various image resolutions / aspect ratios in the grid
- combine the XY Plot with the `Output Config` node
- various checkpoints (or virtually any model, LoRA, ...), following 3 methods using:
- dedicated nodes to manually select a list of checkpoints / LoRAs / samplers / scheduler
- a more versatile approach for vurtually anything (models, any combo value)
- the `Output Config` node to keep the use case data separated from your workflow