ifcsverchok - add some sockets descriptions, specify types

This commit is contained in:
Andrej730
2025-03-21 18:36:50 +05:00
parent ee2b836b84
commit a98a7ac856
13 changed files with 188 additions and 32 deletions
+34 -1
View File
@@ -18,8 +18,11 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import sverchok.core.sockets
from sverchok.data_structure import zip_long_repeat from sverchok.data_structure import zip_long_repeat
from typing import Any from typing import Any, Union, TypeVar
T_socket = TypeVar("T_socket", bound=sverchok.core.sockets.SvSocketCommon)
ifc_files: dict[str, ifcopenshell.file] = {} ifc_files: dict[str, ifcopenshell.file] = {}
@@ -28,6 +31,14 @@ class SvIfcCore:
sv_input_names: list[str] sv_input_names: list[str]
def process(self) -> None: def process(self) -> None:
"""Process inputs from `self.sv_input_names` and call `process_ifc()`.
For `process()` inputs are supposed to be double nested.
E.g. file input should have type `list[list[ifcopenshell.file]]`.
Similarly, outputs should also be double nested,
so they can be easily passed as inputs to other nodes.
"""
sv_inputs_nested = [] sv_inputs_nested = []
for name in self.sv_input_names: for name in self.sv_input_names:
sv_inputs_nested.append(self.inputs[name].sv_get()) sv_inputs_nested.append(self.inputs[name].sv_get())
@@ -38,3 +49,25 @@ class SvIfcCore:
def process_ifc(self, *args: Any, **kwargs: Any) -> None: def process_ifc(self, *args: Any, **kwargs: Any) -> None:
raise NotImplementedError raise NotImplementedError
def create_socket(
inputs_or_outputs: Union[bpy.types.NodeInputs, bpy.types.NodeOutputs],
name: str,
*,
description: str = "",
data_type: str = "",
prop_name: str = "",
socket_type: type[T_socket] = sverchok.core.sockets.SvStringsSocket,
) -> T_socket:
socket = inputs_or_outputs.new(socket_type.bl_idname, name)
assert isinstance(socket, socket_type)
if data_type:
data_type = f"Type: `{data_type}`."
description = "\n\n".join(filter(None, [description, data_type]))
socket.description = description
if prop_name:
socket.prop_name = prop_name
return socket
+21 -4
View File
@@ -19,6 +19,7 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -32,10 +33,26 @@ class SvIfcAdd(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCor
entity: StringProperty(name="entity", update=updateNode) entity: StringProperty(name="entity", update=updateNode)
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "file").prop_name = "file" helper.create_socket(
self.inputs.new("SvStringsSocket", "entity").prop_name = "entity" self.inputs,
self.outputs.new("SvStringsSocket", "file") "file",
self.outputs.new("SvStringsSocket", "entity") description="File to add entity to.",
data_type="list[list[ifcopenshell.file]]",
prop_name="file",
)
helper.create_socket(
self.inputs,
"entity",
description="Entity to add to file.",
data_type="list[list[ifcopenshell.entity_instance]]",
prop_name="entity",
)
helper.create_socket(
self.outputs, "file", description="File with added entity.", data_type="list[list[ifcopenshell.file]]"
)
helper.create_socket(
self.outputs, "entity", description="Added entity.", data_type="list[list[ifcopenshell.entity_instance]]"
)
def process(self): def process(self):
self.sv_input_names = ["file", "entity"] self.sv_input_names = ["file", "entity"]
+22 -5
View File
@@ -19,10 +19,11 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import sverchok.core.sockets
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from ifcsverchok.ifcstore import SvIfcStore from ifcsverchok.ifcstore import SvIfcStore
import bpy
import json import json
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
@@ -52,10 +53,26 @@ class SvIfcAddPset(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIf
Elements: StringProperty(name="Element Ids", update=updateNode) Elements: StringProperty(name="Element Ids", update=updateNode)
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "Name").prop_name = "Name" helper.create_socket(
self.inputs.new("SvTextSocket", "Properties").prop_name = "Properties" self.inputs, "Name", description="Name of the property set.", data_type="list[list[str]]", prop_name="Name"
self.inputs.new("SvStringsSocket", "Elements").prop_name = "Elements" )
self.outputs.new("SvStringsSocket", "Entity") helper.create_socket(
self.inputs,
"Properties",
description="Properties in a JSON format.",
data_type="list[list[str]]",
prop_name="Properties",
socket_type=sverchok.core.sockets.SvTextSocket,
)
helper.create_socket(
self.inputs, "Elements", description="Element Ids.", data_type="list[list[str]]", prop_name="Elements"
)
helper.create_socket(
self.outputs,
"Entity",
description="Added/edited psets.",
data_type="list[list[ifcopenshell.entity_instance]]]",
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = ( layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = (
+16 -2
View File
@@ -19,7 +19,9 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import sverchok.core.sockets
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from bpy.props import StringProperty, EnumProperty from bpy.props import StringProperty, EnumProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -56,8 +58,20 @@ class SvIfcApi(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfcCor
usecase: StringProperty(name="Usecase", update=update_usecase) usecase: StringProperty(name="Usecase", update=update_usecase)
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "usecase").prop_name = "usecase" helper.create_socket(
self.outputs.new("SvVerticesSocket", "file") self.inputs,
"usecase",
description="Usecase to run.",
data_type="list[list[str]]",
prop_name="usecase",
)
helper.create_socket(
self.outputs,
"file",
description="Use case output.",
data_type="list[Any]",
socket_type=sverchok.core.sockets.SvVerticesSocket,
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
op = layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False) op = layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False)
+7 -2
View File
@@ -21,6 +21,7 @@ import itertools
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from ifcsverchok.ifcstore import SvIfcStore from ifcsverchok.ifcstore import SvIfcStore
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
@@ -37,8 +38,12 @@ class SvIfcByGuid(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfc
guids: list[str] guids: list[str]
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "guid").prop_name = "guid" helper.create_socket(
self.outputs.new("SvStringsSocket", "Entities") self.inputs, "guid", description="Entities guids.", data_type="list[list[str]]", prop_name="guid"
)
helper.create_socket(
self.outputs, "Entities", description="Entities", data_type="list[list[ifcopenshell.entity_instance]]"
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = ( layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = (
+2 -1
View File
@@ -24,6 +24,7 @@ import ifcopenshell.api.geometry
import ifcopenshell.api.root import ifcopenshell.api.root
import ifcopenshell.util.schema import ifcopenshell.util.schema
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from ifcsverchok.ifcstore import SvIfcStore from ifcsverchok.ifcstore import SvIfcStore
from bpy.props import StringProperty, BoolProperty from bpy.props import StringProperty, BoolProperty
@@ -79,7 +80,7 @@ class SvIfcCreateEntity(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper
self.inputs.new("SvStringsSocket", "Representations").prop_name = "Representations" self.inputs.new("SvStringsSocket", "Representations").prop_name = "Representations"
self.inputs.new("SvMatrixSocket", "Locations").is_mandatory = False self.inputs.new("SvMatrixSocket", "Locations").is_mandatory = False
# self.inputs.new("SvStringsSocket", "Properties").prop_name = "Properties" # self.inputs.new("SvStringsSocket", "Properties").prop_name = "Properties"
self.outputs.new("SvStringsSocket", "Entities") helper.create_socket(self.outputs, "Entities", description="Created entities ids.", data_type="list[list[int]]")
self.node_dict[hash(self)] = {} self.node_dict[hash(self)] = {}
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
+12 -2
View File
@@ -20,6 +20,8 @@ import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.guid import ifcopenshell.guid
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
import sverchok.core.sockets
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -48,8 +50,16 @@ class SvIfcCreateFile(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.S
schema: StringProperty(name="schema", update=updateNode, default="IFC4") schema: StringProperty(name="schema", update=updateNode, default="IFC4")
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "schema").prop_name = "schema" helper.create_socket(
self.outputs.new("SvVerticesSocket", "file") self.inputs, "schema", description="IFC schema to use.", data_type="str", prop_name="schema"
)
helper.create_socket(
self.outputs,
"file",
description="Opened IFC file.",
data_type="list[list[ifcopenshell.file]]",
socket_type=sverchok.core.sockets.SvVerticesSocket,
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
self.wrapper_tracked_ui_draw_op(layout, "node.sv_ifc_create_file_refresh", icon="FILE_REFRESH", text="Refresh") self.wrapper_tracked_ui_draw_op(layout, "node.sv_ifc_create_file_refresh", icon="FILE_REFRESH", text="Refresh")
+11 -5
View File
@@ -20,6 +20,7 @@ import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
@@ -28,11 +29,16 @@ class SvIfcCreateProject(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helpe
bl_label = "IFC Create Project" bl_label = "IFC Create Project"
def sv_init(self, context): def sv_init(self, context):
input_socket = self.inputs.new("SvStringsSocket", "file") helper.create_socket(
input_socket.description = "ifc file to add the project to" self.inputs, "file", description="IFC file to add the project to", data_type="list[list[ifcopenshell.file]]"
input_socket = self.inputs.new("SvStringsSocket", "project_name") )
input_socket.description = "Project name" helper.create_socket(self.inputs, "project_name", description="Project name", data_type="list[list[str]]")
self.outputs.new("SvVerticesSocket", "file") helper.create_socket(
self.outputs,
"file",
description="IFC file with the project added",
data_type="list[list[ifcopenshell.file]]",
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
op = layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = ( op = layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = (
@@ -20,7 +20,9 @@
from email.mime import application from email.mime import application
import bpy import bpy
import ifcopenshell import ifcopenshell
import sverchok.core.sockets
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -57,7 +59,13 @@ class SvIfcQuickProjectSetup(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.h
input_socket.description = "Project GlobalId" input_socket.description = "Project GlobalId"
input_socket = self.inputs.new("SvStringsSocket", "project_name") input_socket = self.inputs.new("SvStringsSocket", "project_name")
input_socket.description = "Project name" input_socket.description = "Project name"
self.outputs.new("SvVerticesSocket", "file") helper.create_socket(
self.outputs,
"file",
description="New IFC file with the project added.",
data_type="list[list[ifcopenshell.file]]",
socket_type=sverchok.core.sockets.SvVerticesSocket,
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
op = layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = ( op = layout.operator("node.sv_ifc_tooltip", text="", icon="QUESTION", emboss=False).tooltip = (
+7 -2
View File
@@ -20,6 +20,7 @@ import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.guid import ifcopenshell.guid
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -32,8 +33,12 @@ class SvIfcReadFile(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvI
path: StringProperty(name="path", update=updateNode) path: StringProperty(name="path", update=updateNode)
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "path").prop_name = "path" helper.create_socket(
self.outputs.new("SvVerticesSocket", "file") self.inputs, "path", description="Path to IFC file.", data_type="list[list[str]]", prop_name="path"
)
helper.create_socket(
self.outputs, "file", description="Opened IFC file.", data_type="list[list[ifcopenshell.file]]"
)
def process(self): def process(self):
self.sv_input_names = ["path"] self.sv_input_names = ["path"]
+21 -3
View File
@@ -19,6 +19,7 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -32,9 +33,26 @@ class SvIfcRemove(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.SvIfc
entity: StringProperty(name="entity", update=updateNode) entity: StringProperty(name="entity", update=updateNode)
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "file").prop_name = "file" helper.create_socket(
self.inputs.new("SvStringsSocket", "entity").prop_name = "entity" self.inputs,
self.outputs.new("SvStringsSocket", "file") "file",
description="IFC file to remove entity from.",
data_type="list[list[ifcopenshell.file]]",
prop_name="file",
)
helper.create_socket(
self.inputs,
"entity",
description="Entity to remove from IFC file.",
data_type="list[list[ifcopenshell.entity_instance]]",
prop_name="entity",
)
helper.create_socket(
self.outputs,
"file",
description="New IFC file with the entity removed.",
data_type="list[list[ifcopenshell.file]]",
)
def process(self): def process(self):
file: ifcopenshell.file file: ifcopenshell.file
@@ -21,6 +21,7 @@ import ifcopenshell
import ifcopenshell.util.selector import ifcopenshell.util.selector
import bonsai.tool as tool import bonsai.tool as tool
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from bpy.props import StringProperty from bpy.props import StringProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
from sverchok.data_structure import updateNode from sverchok.data_structure import updateNode
@@ -50,7 +51,13 @@ class SvIfcSelectBlenderObjects(bpy.types.Node, SverchCustomTreeNode, ifcsvercho
query: StringProperty(name="query", update=updateNode) query: StringProperty(name="query", update=updateNode)
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "entities").prop_name = "entities" helper.create_socket(
self.inputs,
"entities",
description="IFC entities to select Bonsai Blender objects for (selects only objects by matching GlobalId).",
data_type="list[list[ifcopenshell.entity_instance]]",
prop_name="entities",
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
self.wrapper_tracked_ui_draw_op( self.wrapper_tracked_ui_draw_op(
+18 -3
View File
@@ -22,6 +22,7 @@ import ifcopenshell
import ifcopenshell.api import ifcopenshell.api
import ifcopenshell.util.element import ifcopenshell.util.element
import ifcsverchok.helper import ifcsverchok.helper
import ifcsverchok.helper as helper
from ifcsverchok.ifcstore import SvIfcStore from ifcsverchok.ifcstore import SvIfcStore
from bpy.props import StringProperty, BoolProperty from bpy.props import StringProperty, BoolProperty
from sverchok.node_tree import SverchCustomTreeNode from sverchok.node_tree import SverchCustomTreeNode
@@ -39,7 +40,9 @@ class SvIfcWriteFile(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.Sv
self.process() self.process()
self.refresh_local = False self.refresh_local = False
refresh_local: BoolProperty(name="Write", description="Write to file", update=refresh_node_local) refresh_local: BoolProperty(
name="Write", description="Write to file when changed to True.", update=refresh_node_local
)
bl_idname = "SvIfcWriteFile" bl_idname = "SvIfcWriteFile"
bl_label = "IFC Write File" bl_label = "IFC Write File"
@@ -50,8 +53,20 @@ class SvIfcWriteFile(bpy.types.Node, SverchCustomTreeNode, ifcsverchok.helper.Sv
) )
def sv_init(self, context): def sv_init(self, context):
self.inputs.new("SvStringsSocket", "path").prop_name = "path" helper.create_socket(
self.outputs.new("SvStringsSocket", "output") self.inputs,
"path",
description="File path to write to. Can be relative.",
data_type="str",
prop_name="path",
)
helper.create_socket(
self.outputs,
"output",
description="Node result output message.",
data_type="str",
prop_name="output",
)
def draw_buttons(self, context, layout): def draw_buttons(self, context, layout):
row = layout.row(align=True) row = layout.row(align=True)