FEM: Plot single frame index data as point

This commit is contained in:
Stefan Tröger
2025-06-15 10:27:27 +02:00
parent f5533a5f53
commit cb4ab225a6
5 changed files with 57 additions and 38 deletions

View File

@@ -70,6 +70,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>999999999</number>
</property>
</widget>
</item>
</layout>

View File

@@ -149,36 +149,40 @@ class PostIndexOverFrames1D(base_fempostextractors.Extractor1D):
obj.Table = table
return
# check if we have timesteps (required!)
abort = True
# check if we have timesteps
timesteps = []
info = obj.Source.getOutputAlgorithm().GetOutputInformation(0)
if info.Has(vtkStreamingDemandDrivenPipeline.TIME_STEPS()):
timesteps = info.Get(vtkStreamingDemandDrivenPipeline.TIME_STEPS())
if len(timesteps) > 1:
abort = False
if abort:
FreeCAD.Console.PrintWarning("Not sufficient frames available in data, cannot extract data")
obj.Table = table
return
algo = obj.Source.getOutputAlgorithm()
setup = False
frame_array = vtkDoubleArray()
idx = obj.Index
for i, timestep in enumerate(timesteps):
algo.UpdateTimeStep(timestep)
if timesteps:
setup = False
for i, timestep in enumerate(timesteps):
algo.UpdateTimeStep(timestep)
dataset = algo.GetOutputDataObject(0)
array = self._x_array_from_dataset(obj, dataset, copy=False)
if not setup:
frame_array.SetNumberOfComponents(array.GetNumberOfComponents())
frame_array.SetNumberOfTuples(len(timesteps))
setup = True
frame_array.SetTuple(i, idx, array)
else:
algo.Update()
dataset = algo.GetOutputDataObject(0)
array = self._x_array_from_dataset(obj, dataset, copy=False)
if not setup:
frame_array.SetNumberOfComponents(array.GetNumberOfComponents())
frame_array.SetNumberOfTuples(len(timesteps))
setup = True
frame_array.SetNumberOfComponents(array.GetNumberOfComponents())
frame_array.SetNumberOfTuples(1)
frame_array.SetTuple(0, idx, array)
frame_array.SetTuple(i, idx, array)
if frame_array.GetNumberOfComponents() > 1:
frame_array.SetName(f"{obj.XField} ({obj.XComponent}) @Idx {obj.Index}")

View File

@@ -174,41 +174,49 @@ class PostIndexOverFrames2D(base_fempostextractors.Extractor2D):
return
# check if we have timesteps (required!)
abort = True
timesteps = []
info = obj.Source.getOutputAlgorithm().GetOutputInformation(0)
if info.Has(vtkStreamingDemandDrivenPipeline.TIME_STEPS()):
timesteps = info.Get(vtkStreamingDemandDrivenPipeline.TIME_STEPS())
if len(timesteps) > 1:
abort = False
if abort:
FreeCAD.Console.PrintWarning("Not sufficient frames available in data, cannot extract data")
obj.Table = table
return
algo = obj.Source.getOutputAlgorithm()
frame_x_array = vtkDoubleArray()
frame_x_array.SetNumberOfTuples(len(timesteps))
frame_x_array.SetNumberOfComponents(1)
frame_y_array = vtkDoubleArray()
idx = obj.Index
setup = False
for i, timestep in enumerate(timesteps):
frame_x_array.SetTuple1(i, timestep)
if timesteps:
setup = False
frame_x_array.SetNumberOfTuples(len(timesteps))
frame_x_array.SetNumberOfComponents(1)
for i, timestep in enumerate(timesteps):
algo.UpdateTimeStep(timestep)
frame_x_array.SetTuple1(i, timestep)
algo.UpdateTimeStep(timestep)
dataset = algo.GetOutputDataObject(0)
array = self._y_array_from_dataset(obj, dataset, copy=False)
if not setup:
frame_y_array.SetNumberOfComponents(array.GetNumberOfComponents())
frame_y_array.SetNumberOfTuples(len(timesteps))
setup = True
frame_y_array.SetTuple(i, idx, array)
else:
frame_x_array.SetNumberOfTuples(1)
frame_x_array.SetNumberOfComponents(1)
frame_x_array.SetTuple1(0,0)
algo.Update()
dataset = algo.GetOutputDataObject(0)
array = self._y_array_from_dataset(obj, dataset, copy=False)
if not setup:
frame_y_array.SetNumberOfComponents(array.GetNumberOfComponents())
frame_y_array.SetNumberOfTuples(len(timesteps))
setup = True
frame_y_array.SetTuple(i, idx, array)
frame_y_array.SetNumberOfComponents(array.GetNumberOfComponents())
frame_y_array.SetNumberOfTuples(1)
frame_y_array.SetTuple(0, idx, array)
frame_x_array.SetName("Frames")
if frame_y_array.GetNumberOfComponents() > 1:

View File

@@ -1,4 +1,4 @@
# ***************************************************************************
2# ***************************************************************************
# * Copyright (c) 2025 Stefan Tröger <stefantroeger@gmx.net> *
# * *
# * This file is part of the FreeCAD CAx development system. *

View File

@@ -516,6 +516,10 @@ class VPPostLineplot(view_base_fempostvisualization.VPPostVisualization):
xdata = VTKArray(table.GetColumn(i))
ydata = VTKArray(table.GetColumn(i+1))
# ensure points are visible if it is a single datapoint
if len(xdata) == 1 and tmp_args["marker"] == "None":
tmp_args["marker"] = "o"
# legend labels
if child.ViewObject.Legend:
if not legend_multiframe: