SifIO is a Python package for reading and writing access of SIF data types to Sesam Interface Files.
Project description
OneWorkflow
SifIO is a Python package for reading and writing access of SIF data types to Sesam Interface Files.
Installation
# QuantConnect for intellisense for the .NET libraries
pip install quantconnect-stubs==16345
# .NET Runtime
pip install dnv-net-runtime
# IntelliSense support for the `with` statement for dotnet/runtime assemblies from Python
pip dnv-net-intellisense & update-stubs
# SifIO for reading and writing SIF
pip dnv-sifio
Usage/Examples
The provided code snippets serve as practical examples of utilizing the dnv.sifio
Python package to manipulate data in SESAM System Format (SIF) and SIN files. These examples underscore the versatility of SifIO
, demonstrating a variety of operations such as:
- Reading the number of occurrences of a data type and the size of the established pointer table for a datatype.
- Reading all data for a given data type name and id.
- Reading text data.
- Copying a FEM file to a SIN file, then exporting to a SIF file.
- Copying a SIN file to a new SIN file, then exporting to a SIF file.
- Creating a SIN file, writing data to tabs, exporting to SIF format, and verifying the creation.
- Adding new sets to a .SIN file and verifying the output file for the correct number of sets.
# Ensure that 'import dnv.net.runtime' is executed first in your script
import dnv.net.runtime
import os
from pathlib import Path
from System import Guid
from System.Collections.Generic import List
from dnv.sesam.sifapi.core import ISifData, ISifDataReader, ISifDataWriter
from dnv.sesam.sifapi.io import SesamDataFactory
def sif_io_get_count_and_tab_dimensions():
"""
Reads the number of occurrences of a data type and the size of the established pointer table
for a datatype.
"""
reader: ISifDataReader
with SesamDataFactory.CreateReader("T1.FEM") as reader:
reader.CreateModel()
tab_dim = reader.GetTabDimensions("BEUSLO")
assert [element for element in tab_dim] == [5, 80]
count = reader.GetCount("GBEAMG")
assert count == 8
count = reader.GetCount("GELTH")
assert count == 1
def sif_io_read_ext():
"""Reads all data for a given data type name and id."""
reader: ISifDataReader
with SesamDataFactory.CreateReader("T1.FEM") as reader:
reader.CreateModel()
# Read all data of type BEUSLO for id={5,4}
data = reader.ReadExt("BEUSLO", [5, 4])
assert data[0] == 2
assert data[1] == 17
assert data[18] == 17
def sif_io_read_text():
"""Reads text data."""
reader: ISifDataReader
with SesamDataFactory.CreateReader("T1.FEM") as reader:
reader.CreateModel()
# Read name of a section
data: List[ISifData] = reader.ReadText("TDSECT", [7])
assert data.Count == 1
sif_data: ISifData = data[0]
assert sif_data.TextList.Count == 1
assert sif_data.TextList[0] == "Pipe12"
def sif_io_read_all():
"""Reads all data for a given data type name and id."""
reader: ISifDataReader
with SesamDataFactory.CreateReader("T1.FEM") as reader:
reader.CreateModel()
# Must be called prior to ReadAll for the type
reader.SetFirstTimeReadAll("GELMNT1")
# Read all data of type GELMNT1 in blocks of 10
data_list = List[ISifData]()
data = reader.ReadAll("GELMNT1", 10)
data_list.AddRange(data)
# Read all data of type MORSMEL in blocks of 10
data = reader.ReadAll("MORSMEL", 10)
data_list.AddRange(data)
assert data_list.Count == 235
def sif_io_read_data():
"""Reads all data for a given data type name and id."""
reader: ISifDataReader
with SesamDataFactory.CreateReader("T1.FEM") as reader:
reader.CreateModel()
# Read the GELMNT1 data with id 45
data: List[ISifData] = reader.ReadData("GELMNT1", [45])
assert data.Count == 1
sif_data: ISifData = data[0].Data
assert [element for element in sif_data] == [13, 45, 45, 28, 0, 45, 51, 42, 74, 72, 141, 75, 77]
def copy_fem_to_sin_to_sif():
"""Copies a FEM file to a SIN file, then exports to a SIF file."""
with SesamDataFactory.CreateReader(test_fem_filepath) as reader:
diagnostic = reader.CreateModel()
assert diagnostic == 0, "Diagnostic failed"
number_of_nodes = reader.GetCount("GNODE")
number_of_elements = reader.GetCount("GELMNT")
random_file_name_sin = str(Guid.NewGuid()) + ".SIN"
with SesamDataFactory.CreateWriter(random_file_name_sin) as writer:
random_file_name_sif = str(Guid.NewGuid()) + ".SIF"
writer.WriteSifFile(reader, random_file_name_sif)
assert os.path.exists(random_file_name_sif), "SIF file does not exist"
with SesamDataFactory.CreateReader(random_file_name_sif) as new_reader:
assert new_reader.CreateModel() == 0, "Model creation failed"
assert number_of_nodes == new_reader.GetCount(
"GNODE"
), "Node count mismatch"
assert number_of_elements == new_reader.GetCount(
"GELMNT"
), "Element count mismatch"
os.remove(random_file_name_sif)
os.remove(random_file_name_sin)
def copy_sin_to_sif():
"""Copies a SIN file to a new SIN file, then exports to a SIF file."""
reader: ISifDataReader
writer: ISifDataWriter
random_file_name_sin = str(Guid.NewGuid()) + ".SIN"
with SesamDataFactory.CreateReader("R1.SIN") as reader, \
SesamDataFactory.CreateWriter(random_file_name_sin) as writer:
diagnostic = reader.CreateModel()
assert diagnostic == 0, "Diagnostic failed"
random_file_name_sif = str(Guid.NewGuid()) + ".SIF"
writer.WriteSifFile(random_file_name_sif)
assert os.path.exists(random_file_name_sif), "SIF file does not exist"
os.remove(random_file_name_sif)
os.remove(random_file_name_sin)
def sif_io_create_tab_write_write_sif_file():
"""Creates a SIN file, writes data to tabs, exports to SIF format, and verifies the creation."""
writer: ISifDataWriter
sin_file = Guid.NewGuid().ToString() + ".SIN" # PythonNet
with SesamDataFactory.CreateWriter(sin_file) as writer:
writer.CreateTab("HIERARCH", [1], 1)
writer.Write("HIERARCH", [8, 1, 1, 1, 1, 0, 0, 0])
writer.CreateTab("IDENT", [1], 1)
writer.Write("IDENT", [1, 1, 3])
# The maximum id is 99, but only 5 data sets are written
writer.CreateTab("GBEAMG", [99], 5)
# Note that the first entry is always the length of the written data array,
# also for datatypes which do not have the length of the data as the first
# entry according to the SIF datatype definition
writer.Write("GBEAMG", [17, 1, 0, 8.79331768e-01, 2.12802696e00, 1.06401348e00, 1.06401348e00,
0, 1.33001685e00, 6.65008426e-01, 6.65008426e-01, 4.39911306e-01,
4.39911306e-01, 0, 0, 4.35366005e-01, 4.35366005e-01])
writer.Write("GBEAMG", [17, 2, 0, 8.79331768e-01, 2.12802696e00, 1.06401348e00, 1.06401348e00,
0, 1.33001685e00, 6.65008426e-01, 6.65008426e-01, 4.39911306e-01,
4.39911306e-01, 0, 0, 4.35366005e-01, 4.35366005e-01])
writer.Write("GBEAMG", [17, 3, 0, 8.79331768e-01, 2.12802696e00, 1.06401348e00, 1.06401348e00,
0, 1.33001685e00, 6.65008426e-01, 6.65008426e-01, 4.39911306e-01,
4.39911306e-01, 0, 0, 4.35366005e-01, 4.35366005e-01])
writer.Write("GBEAMG", [17, 98, 0, 8.79331768e-01, 2.12802696e00, 1.06401348e00, 1.06401348e00,
0, 1.33001685e00, 6.65008426e-01, 6.65008426e-01, 4.39911306e-01,
4.39911306e-01, 0, 0, 4.35366005e-01, 4.35366005e-01])
writer.Write("GBEAMG", [17, 99, 0, 8.79331768e-01, 2.12802696e00, 1.06401348e00, 1.06401348e00,
0, 1.33001685e00, 6.65008426e-01, 6.65008426e-01, 4.39911306e-01,
4.39911306e-01, 0, 0, 4.35366005e-01, 4.35366005e-01])
random_filenames_sif = Guid.NewGuid().ToString() + ".SIF"
writer.WriteSifFile(random_filenames_sif)
def add_sets_to_sin_file():
"""Adds new sets to a .SIN file, verifies the output file for the correct number of sets."""
input_file, output_file = "FrameWithOneSetR1.SIN", "FrameWithThreeSetsR1.sin"
sets_to_add, total_sets = 2, 0
def create_set_data(set_number: int, number_of_elements: int, start_element_id: int) -> list[float]:
INDEX, ISTYPE, ISORIG = 1, 2, 0
initial_data = [number_of_elements + 4, set_number, 0.0, INDEX, ISTYPE, ISORIG]
element_ids = list(range(start_element_id, start_element_id + number_of_elements))
set_data = initial_data + element_ids
return set_data
sif_reader: ISifDataReader
sif_writer: ISifDataWriter
with SesamDataFactory.CreateReader(input_file) as sif_reader, \
SesamDataFactory.CreateWriter(output_file) as sif_writer:
diagnostic = sif_reader.CreateModel()
assert diagnostic == 0
for data_type in sif_reader.GetToc():
if data_type.Key in ["GSETMEMB", "TDSETNAM"]:
total_sets = data_type.Value.AllIndices[0] + sets_to_add
data_type.Value.AllIndices[0] = total_sets
sif_writer.CreateTab(data_type.Key,
[item for item in data_type.Value.AllIndices],
total_sets)
else:
sif_writer.CreateTab(data_type.Key,
[item for item in data_type.Value.AllIndices],
data_type.Value.Count)
for data_type in sif_reader.GetToc():
data = sif_reader.ReadAll(data_type.Key)
sif_writer.WriteData(data_type.Key, data)
set_info = [("SET2", 2, 27, 25), ("SET3", 3, 10, 53)]
for set_name, set_id, num_elements, start_id in set_info:
set_names = List[str]()
set_names.Add(set_name)
sif_writer.WriteText("TDSETNAM", set_id, set_names)
sif_writer.Write("GSETMEMB", create_set_data(set_id, num_elements, start_id))
with SesamDataFactory.CreateReader(output_file) as output_reader:
assert output_reader.CreateModel() == 0
for data_type in ["TDSETNAM", "GSETMEMB"]:
assert output_reader.GetCount(data_type) == total_sets
os.remove(output_file)
License
Support
If you encounter any issues, have questions, or want to provide feedback, please get in touch with our support team at software.support@dnv.com. We are committed to continuously improving SifIO Python package and providing timely assistance to our users.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file dnv_sifio-5.3.6-py3-none-any.whl
.
File metadata
- Download URL: dnv_sifio-5.3.6-py3-none-any.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3aeebc91c87e13ef06dd6130b952a918e98148961d43b2543870406e09cf3e0f |
|
MD5 | fa8981ae693ebffc69cc57cf90904695 |
|
BLAKE2b-256 | f6291d3705bde3c39a0395b405de450cb15cc474c88c550a8a4472973128924e |