Hello Rick,
We have now done a local test with filtering by a specific area. This worked well, here is the code:
import rhino3dm
# Pfad zur ursprĂŒnglichen Rhino-Datei
original_file_path = r"C:\Program Files\Viktor_apps\viktor_grasshopper\Modell.3dm"
# Pfad, unter dem die neue Datei gespeichert werden soll
new_file_path = r"C:\Program Files\Viktor_apps\viktor_grasshopper\Test.3dm"
# Die ursprĂŒngliche Rhino-Datei laden
with open(original_file_path, "rb") as file:
rhino_data = file.read()
original_file = rhino3dm.File3dm.FromByteArray(rhino_data)
# Eine neue Rhino-Datei erstellen, in die die ausgewÀhlten Objekte kopiert werden
new_file = rhino3dm.File3dm()
# Der Name des Layers, dessen Objekte extrahiert werden sollen
desired_layer_name = 'TEST'
# Flag, um zu ĂŒberprĂŒfen, ob der Layer gefunden wurde
layer_found = False
# Alle Objekte durchgehen und die zum gewĂŒnschten Layer gehörenden in die neue Datei kopieren
for obj in original_file.Objects:
layer = original_file.Layers[obj.Attributes.LayerIndex]
if layer.Name == desired_layer_name:
new_file.Objects.Add(obj.Geometry, obj.Attributes)
layer_found = True
if not layer_found:
print(f'Layer "{desired_layer_name}" wurde nicht gefunden')
else:
# Die neue Datei mit den gefilterten Objekten speichern
new_file.Write(new_file_path, 6) # Der zweite Parameter ist die Version der Rhino-Datei
print(f'Die neue Datei wurde unter {new_file_path} gespeichert.')`

We then tried applying this to our app.py code. Maybe we are too stupid but we donât really understand the method. We have to encode the geometry so that it can be read by the Grasshopper Node get_geometry. But how do we pass this endcoded object. Is it also passed as bytes Io in the json file? We have tried to add our encoded object to the input json file. Or do we have to do it differently and save a separate file locally so that the get_geometry node can retrieve the filtered object?
here is our code:
from io import BytesIO
import json
import rhino3dm
import os
from viktor import ViktorController, File
from viktor.parametrization import NumberField, FileField, Text, ViktorParametrization, OptionField, ActionButton
from viktor.external.generic import GenericAnalysis
from viktor.views import GeometryAndDataView, GeometryAndDataResult, DataGroup, DataItem
class Parametrization(ViktorParametrization):
intro = Text("## PV Optimierung Level 1 \n Das Script Level 1 berechnet den Ertrag der jeweiligen Input Fassaden FlÀche \n\n Laden sie Ihre FassadenflÀche und Kontextgeometrien hoch und geben sie die vorgegebenen Parameter an:")
# Input fields
#WetterFile = FileField('Wetter File', file_types=['.epw'], max_size=10_000_000)
Modell = FileField('Modell', file_types=['.3dm'], max_size=100_000_000)
#Flaechenausrichtung = ActionButton('FlÀchenausrichtung Àndern', method='perform_action')
#KontextGeometrien = FileField('Kontext Geometrien', file_types=['.3dm'], max_size=100_000_000)
#Modultyp = OptionField('Modultyp', options=['0', '1', '2', '3'], default=0)
#ScriptStarten = ActionButton('Script Starten', method='perform_action')
Eigenverbrauch = NumberField("Eigenverbrauch in % des Gesamtertrages", default=50)
Investitionskosten = NumberField("Investitionskosten", default=10000)
Instandhaltungskosten = NumberField("Instandhaltungskosten in % der Investitionskosten", default=5.0)
Foerderbeitrag = NumberField("Förderbeitrag %", default=50)
Strompreis = NumberField("Strompreis(Fr./kWh)", default=0.3)
Einspeiseverguetung = NumberField("Einspeiseverguetung(Fr./kWh)", default=20)
Zeitraum = NumberField("Zeitraum(Jahre)", default=20)
class Controller(ViktorController):
label = 'My Entity Type'
parametrization = Parametrization(width=30)
@GeometryAndDataView("Geometry", duration_guess=0, update_label='Run Grasshopper')
def run_grasshopper(self, params, **kwargs):
rhino_upload = params['Modell'].file
# Read the rhino file
gh_file = rhino3dm.File3dm.FromByteArray(rhino_upload.getvalue_binary())
layer_name = 'TEST'
encoded_objects = []
# Durchlaufen aller Objekte und Kodieren der zum gewĂŒnschten Layer gehörenden
for obj in gh_file.Objects:
layer = gh_file.Layers[obj.Attributes.LayerIndex]
if layer.Name == layer_name:
geom = obj.Geometry
# Kodieren des Geometrieobjekts
encoded_data = geom.Encode()
encoded_objects.append(encoded_data)
# Erstellen einer JSON-Datei aus den Eingabeparametern
params['encoded_geometry'] = encoded_objects # FĂŒgen Sie die kodierten Geometrien zu den Parametern hinzu
input_json = json.dumps(params) # Konvertieren aller Parameter inklusive der Geometrie in JSON
# Erstellen der Eingabedateien fĂŒr die Analyse
files = [
('input.json', BytesIO(bytes(input_json, 'utf8'))),
]
# Run the Grasshopper analysis and obtain the output files
generic_analysis = GenericAnalysis(files=files, executable_key="run_grasshopper", output_filenames=[
"geometry.3dm", "output.json"
])
generic_analysis.execute(timeout=60)
rhino_3dm_file = generic_analysis.get_output_file("geometry.3dm", as_file=True)
output_values: File = generic_analysis.get_output_file("output.json", as_file=True)
# Create a DataGroup object to display output data
output_dict = json.loads(output_values.getvalue())
print(output_dict)
data_group = DataGroup(
*[DataItem(key.replace("_", " "), val) for key, val in output_dict.items()]
)
return GeometryAndDataResult(geometry=rhino_3dm_file, geometry_type="3dm", data=data_group)
we get this error in powershell: Traceback (most recent call last):
File âviktor_connector\connector.pyxâ, line 295, in connector.Job.execute
File âviktor\core.pyxâ, line 1926, in viktor.core._handle_job
File âviktor\core.pyxâ, line 1911, in viktor.core._handle_job._handle_view
File âviktor\views.pyxâ, line 2047, in viktor.views.View.wrapper
File âC:\Program Files\Viktor_apps\my-first-app\app.pyâ, line 57, in run_grasshopper
input_json = json.dumps(params) # Konvertieren aller Parameter inklusive der Geometrie in JSON
File "C:\Program Files\Python310\lib\json_init.py", line 231, in dumps
return _default_encoder.encode(obj)
do you maybe have time for a short call? because we donÂŽt really now if itÂŽs possible with viktor what we would like to achieve
thanks alot
samuel & marco