Translate pie chart graph family
This commit is contained in:
parent
d85380909d
commit
50c2079ed3
8 changed files with 481 additions and 4 deletions
145
examples/geometry_script/shriinivas_piechart.py
Normal file
145
examples/geometry_script/shriinivas_piechart.py
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
"""Geometry Script recreation of the small pie chart from Shriinivas/piechart.blend."""
|
||||
|
||||
try:
|
||||
from tools.geometry_script_loader import load_repo_geometry_script
|
||||
except ModuleNotFoundError:
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
|
||||
from tools.geometry_script_loader import load_repo_geometry_script
|
||||
|
||||
load_repo_geometry_script()
|
||||
|
||||
from geometry_script import * # noqa: F403 - Geometry Script exposes node functions as DSL globals.
|
||||
|
||||
TAU = 6.2831854820251465
|
||||
|
||||
|
||||
@tree("VG Pie Segment")
|
||||
def vg_pie_segment(
|
||||
start: Float = TAU,
|
||||
value: Float = 0.5,
|
||||
total: Float = 0.5,
|
||||
shift: Float = 0.5,
|
||||
segment_material: Material = None,
|
||||
text_material: Material = None,
|
||||
):
|
||||
fraction = math(operation=Math.Operation.DIVIDE, value=(value, total))
|
||||
sweep = math(operation=Math.Operation.MULTIPLY, value=(fraction, TAU))
|
||||
end = math(operation=Math.Operation.ADD, value=(start, sweep))
|
||||
|
||||
percentage = math(operation=Math.Operation.MULTIPLY, value=(fraction, 100.0))
|
||||
percentage_string = value_to_string(data_type=ValueToString.DataType.FLOAT, value=percentage, decimals=2)
|
||||
label = join_strings(delimiter="", strings=[percentage_string, string(string="%")])
|
||||
|
||||
arc_curve = arc(
|
||||
mode=Arc.Mode.RADIUS,
|
||||
resolution=64,
|
||||
radius=1.0,
|
||||
start_angle=start,
|
||||
sweep_angle=sweep,
|
||||
connect_center=True,
|
||||
)
|
||||
face = arc_curve.fill_curve()
|
||||
extruded_face = face.extrude_mesh(mode=ExtrudeMesh.Mode.FACES, offset_scale=-0.1)
|
||||
|
||||
text_curve = string_to_curves(string=label, size=0.2, align_x="Center", align_y="Middle").curve_instances
|
||||
text_face = text_curve.fill_curve()
|
||||
text_mesh = text_face.extrude_mesh(mode=ExtrudeMesh.Mode.FACES, offset_scale=0.025).mesh
|
||||
face_center = attribute_statistic(
|
||||
data_type=AttributeStatistic.DataType.FLOAT_VECTOR,
|
||||
domain=AttributeStatistic.Domain.FACE,
|
||||
geometry=face,
|
||||
attribute=position(),
|
||||
).mean
|
||||
positioned_text = text_mesh.set_position(offset=face_center).set_material(material=text_material)
|
||||
|
||||
mid_angle = math(operation=Math.Operation.ADD, value=(start, math(operation=Math.Operation.DIVIDE, value=(sweep, 2.0))))
|
||||
shift_vector = combine_xyz(
|
||||
x=math(operation=Math.Operation.MULTIPLY, value=(math(operation=Math.Operation.COSINE, value=mid_angle), shift)),
|
||||
y=math(operation=Math.Operation.MULTIPLY, value=(math(operation=Math.Operation.SINE, value=mid_angle), shift)),
|
||||
z=0.0,
|
||||
)
|
||||
|
||||
segment = extruded_face.mesh.set_material(material=segment_material)
|
||||
cap = face.set_material(material=segment_material)
|
||||
geometry = join_geometry(geometry=[positioned_text, segment, cap]).set_position(offset=shift_vector)
|
||||
return {"Curve": geometry, "End": end}
|
||||
|
||||
|
||||
@tree("VG Pie Chart")
|
||||
def vg_pie_chart(
|
||||
geometry: Geometry,
|
||||
a: Float = 0.5,
|
||||
a_shift: Float = 0.5,
|
||||
a_material: Material = None,
|
||||
b: Float = 0.5,
|
||||
b_shift: Float = 0.0,
|
||||
b_material: Material = None,
|
||||
c: Float = 0.5,
|
||||
c_shift: Float = 0.0,
|
||||
c_material: Material = None,
|
||||
text_material: Material = None,
|
||||
):
|
||||
del geometry
|
||||
|
||||
total = math(operation=Math.Operation.ADD, value=(math(operation=Math.Operation.ADD, value=(a, b)), c))
|
||||
a_geometry, a_end = vg_pie_segment(
|
||||
start=0.0,
|
||||
value=a,
|
||||
total=total,
|
||||
shift=a_shift,
|
||||
segment_material=a_material,
|
||||
text_material=text_material,
|
||||
)
|
||||
b_geometry, b_end = vg_pie_segment(
|
||||
start=a_end,
|
||||
value=b,
|
||||
total=total,
|
||||
shift=b_shift,
|
||||
segment_material=b_material,
|
||||
text_material=text_material,
|
||||
)
|
||||
c_geometry, _c_end = vg_pie_segment(
|
||||
start=b_end,
|
||||
value=c,
|
||||
total=total,
|
||||
shift=c_shift,
|
||||
segment_material=c_material,
|
||||
text_material=text_material,
|
||||
)
|
||||
return join_geometry(geometry=[a_geometry, b_geometry, c_geometry])
|
||||
|
||||
|
||||
def _finalize_groups():
|
||||
import bpy
|
||||
|
||||
groups = []
|
||||
for name in ("VG Pie Segment", "VG Pie Chart"):
|
||||
group = bpy.data.node_groups.get(name)
|
||||
if not group:
|
||||
continue
|
||||
group.use_fake_user = True
|
||||
if hasattr(group, "interface"):
|
||||
for item in group.interface.items_tree:
|
||||
if item.item_type == "SOCKET" and item.in_out == "OUTPUT" and item.name == "Result":
|
||||
item.name = "Geometry"
|
||||
if item.item_type == "SOCKET" and item.in_out == "INPUT" and item.name in {"A", "B", "C"}:
|
||||
item.name = item.name.lower()
|
||||
groups.append(group)
|
||||
return groups
|
||||
|
||||
|
||||
_finalize_groups()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for group in _finalize_groups():
|
||||
print(
|
||||
"VG_PIE_GROUP",
|
||||
group.name,
|
||||
len(group.nodes),
|
||||
len(group.links),
|
||||
sorted(set(node.bl_idname for node in group.nodes)),
|
||||
)
|
||||
Loading…
Reference in a new issue