Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/UFFFiles.jl
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
module UFFFiles
using FileIO, Printf
using Dates
using FileIO
using Printf

# Base UFFDataset abstract type
abstract type UFFDataset end

# Exported Types
# Types for UFF datasets -- see https://www.ceas3.uc.edu/sdrluff/all_files.php
export Dataset15, Dataset18, Dataset55, Dataset58, Dataset82,
Dataset151, Dataset164, Dataset2411, Dataset2412, Dataset2414
Dataset151, Dataset164, Dataset1858, Dataset2411, Dataset2412, Dataset2414

# Exported functions - Main functions
export readuff, writeuff
Expand All @@ -23,10 +25,13 @@ module UFFFiles
include("datasets/dataset15.jl")
include("datasets/dataset18.jl")
include("datasets/dataset55.jl")
include("datasets/dataset58common.jl")
include("datasets/dataset58.jl")
include("datasets/dataset58b.jl")
include("datasets/dataset82.jl")
include("datasets/dataset151.jl")
include("datasets/dataset164.jl")
include("datasets/dataset1858.jl")
include("datasets/dataset2411.jl")
include("datasets/dataset2412.jl")
include("datasets/dataset2414.jl")
Expand Down
12 changes: 4 additions & 8 deletions src/datasets/dataset15.jl
Original file line number Diff line number Diff line change
Expand Up @@ -46,28 +46,24 @@ Universal Dataset Number: 15

NOTE: Repeat record for each node
"""
function parse_dataset15(block)
nlines = length(block)
function parse_dataset15(io)

node_ID = Int[]
def_cs_num = Int[]
disp_cs_num = Int[]
color = Int[]
node_coords = Vector{Float64}[]

i = 2
while i ≤ nlines
r1 = split(block[i])
while (line = readline(io)) != " -1"
r1 = split(line)
nid, dcs, disp_cs, col = parse.(Int, strip.(r1[1:4]))
x, y, z = parse.(Float64, strip.(r1[5:end]))

push!(node_ID, nid)
push!(def_cs_num, dcs)
push!(disp_cs_num, disp_cs)
push!(color, col)
push!(node_coords, [x, y, z])

i += 1
push!(coords, [x, y, z])
end

return Dataset15(
Expand Down
91 changes: 62 additions & 29 deletions src/datasets/dataset151.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ A struct containing UFF Dataset 151 (Header) data.
- `application::String`: Program which created the dataset
- `datetime_created::DateTime`: dataset creation date and time
- `version::String`: version from dataset
- `version2::String`: version from dataset
- `file_type::Int`: file type
- `datetime_last_saved::DateTime`: dataset last saved date and time
- `program::String`: program which created uff file
Expand All @@ -24,7 +25,8 @@ A struct containing UFF Dataset 151 (Header) data.
description::String # Record 2 - field 1
application::String # Record 3 - field 1
datetime_created::String # Record 4 - fields 1 and 2
version::String # Record 4 - fields 3 and 4
version::Int # Record 4 - fields 3
version2::Int # Record 4 - fields 4
file_type::Int # Record 4 - field 5
datetime_last_saved::String # Record 5 - fields 1 and 2
program::String # Record 6 - field 1
Expand All @@ -35,12 +37,13 @@ A struct containing UFF Dataset 151 (Header) data.
description = "",
application = "",
datetime_created = "",
version = "",
version = 0,
version2 = 0,
file_type = 0,
datetime_last_saved = "",
program = "",
datetime_written = ""
) = new(:Dataset151, "Header", model_name, description, application, datetime_created, version, file_type, datetime_last_saved, program, datetime_written)
) = new(:Dataset151, "Header", model_name, description, application, datetime_created, version, version2, file_type, datetime_last_saved, program, datetime_written)
end

"""
Expand Down Expand Up @@ -78,31 +81,35 @@ Universal Dataset Number: 151
Field 1 -- date universal file written (DD-MMM-YY)
Field 2 -- time universal file written (HH:MM:SS)
"""
function parse_dataset151(block)
model_name = strip(block[2])
description = strip(block[3])
application = strip(block[4])
function parse_dataset151(io)
model_name = strip(readline(io)) # Record 1
description = strip(readline(io)) # Record 2
application = strip(readline(io)) # Record 3

# Record 4 contains multiple fields in one line
line_creation = extend_line(strip(block[5]))
datetime_created = strip(line_creation[1:20])
version = strip(line_creation[21:40])
if isempty(strip(line_creation[41:end]))
file_type = 0
else
file_type = parse(Int, strip(line_creation[41:end]))
end

datetime_last_saved = strip(block[6])
program = strip(block[7])
datetime_written = strip(block[8])
line_creation = extend_line(readline(io))
datetime_created = strip(line_creation[1:20]) # Field 1 & 2
# compensate for files that only have date in Record 4
tmp = strip(line_creation[21:30])
version = isempty(tmp) ? 0 : parse(Int, tmp) # Field 3
tmp = strip(line_creation[31:40])
version2 = isempty(tmp) ? 0 : parse(Int, tmp) # Field 4
tmp = strip(line_creation[41:50])
file_type = isempty(tmp) ? 0 : parse(Int, tmp) # Field 5

datetime_last_saved = strip(readline(io)) # Record 5
program = strip(readline(io)) # Record 6
datetime_written = strip(readline(io)) # Record 7

_ = readline(io) # Read trailing " -1"

return Dataset151(
model_name,
description,
application,
datetime_created,
version,
version2,
file_type,
datetime_last_saved,
program,
Expand All @@ -129,35 +136,61 @@ function write_dataset(dataset::Dataset151)
push!(lines, " 151")

# Record 1: FORMAT(80A1) - model file name
push!(lines, dataset.model_name)
push!(lines, extend_line(dataset.model_name))

# Record 2: FORMAT(80A1) - model file description (empty line if no description)
push!(lines, dataset.description)
push!(lines, extend_line(dataset.description))

# Record 3: FORMAT(80A1) - program which created DB
push!(lines, dataset.application)
push!(lines, extend_line(dataset.application))

# Record 4: FORMAT(10A1,10A1,3I10) - date/time created, version, file_type
# Record 4: FORMAT(10A1,10A1,3I10) - date/time created, version, version, file_type
# The datetime_created field should already contain both date and time
# The version field should be formatted as two 10-character fields
# File type should be formatted as I10
record4 = dataset.datetime_created
if !isempty(dataset.version)
record4 *= dataset.version
# the commented out lines appear to compensate for a badly formatted dataset151
#=if !isempty(dataset.version)
record4 *= dataset.datetime_created
end
if !isempty(dataset.version2)
record4 *= dataset.version2
end
if dataset.file_type != 0
record4 *= @sprintf("%10d", dataset.file_type)
end
end=#

record4 = @sprintf("%-10s%-10s%10i%10i%10i%30s",
split(dataset.datetime_created)[1],
split(dataset.datetime_created)[2],
dataset.version,
dataset.version2,
dataset.file_type,
" "
)

push!(lines, record4)

# Record 5: FORMAT(10A1,10A1) - date/time last saved
push!(lines, dataset.datetime_last_saved)
record5 = @sprintf("%-10s%-10s%60s",
split(dataset.datetime_last_saved)[1],
split(dataset.datetime_last_saved)[2],
" "
)

push!(lines, record5)

# Record 6: FORMAT(80A1) - program which created universal file
push!(lines, dataset.program)
push!(lines, extend_line(dataset.program))

# Record 7: FORMAT(10A1,10A1) - date/time written
push!(lines, dataset.datetime_written)
record7 = @sprintf("%-10s%-10s%60s",
Dates.format(now(), "dd-uuu-yy"),
Dates.format(now(), "HH:MM:SS"),
" "
)

push!(lines, record7)

# Write footer
push!(lines, " -1")
Expand Down
33 changes: 19 additions & 14 deletions src/datasets/dataset164.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ A struct containing UFF Dataset 164 (Units) data.
- `units::Int`: Units code
- `description::String`: Units description
- `temperature_mode::Int`: Temperature mode
- `conversion_length::Float64`: Length conversion factor
- `conversion_force::Float64`: Force conversion factor
- `conversion_temperature::Float64`: Temperature conversion factor
- `conversion_temperature_offset::Float64`: Temperature offset conversion factor
- `conversion_length::Float64`: Units factors for converting to SI units
- `conversion_force::Float64`: Units factors for converting to SI units
- `conversion_temperature::Float64`: Units factors for converting to SI units
- `conversion_temperature_offset::Float64`: Units factors for converting to SI units
"""
@show_data struct Dataset164 <: UFFDataset
# Fields specific to Dataset164
Expand All @@ -30,8 +30,12 @@ A struct containing UFF Dataset 164 (Units) data.
units = 1,
description = "",
temperature_mode = 0,
conversion_factor = [1., 1., 1., 0.]
) = new(:Dataset164, "Units",units, description, temperature_mode, conversion_length, conversion_force, conversion_temperature, conversion_temperature_offset)
conversion_length = 1.0,
conversion_force = 1.0,
conversion_temperature = 1.0,
conversion_temperature_offset = 0.0
) = new(:Dataset164, "Units", units, description, temperature_mode, conversion_length,
conversion_force, conversion_temperature, conversion_temperature_offset)
end

"""
Expand Down Expand Up @@ -65,14 +69,15 @@ Universal Dataset Number: 164
Field 3 -- temperature
Field 4 -- temperature offset
"""
function parse_dataset164(block)
record1 = extend_line(strip(block[2]))
units = parse(Int, record1[1])
description = strip(record1[2:29])
temperature_mode = parse(Int, strip(record1[31:end]))

(conversion_length, conversion_force, conversion_temperature) .= parse.(Float64, split(replace(block[3], "D" => "E")))
conversion_temperature_offset = parse(Float64, strip(replace(block[4], "D" => "E")))
function parse_dataset164(io)
record1 = extend_line(readline(io))
units = parse(Int, record1[1:10])
description = strip(record1[11:30])
temperature_mode = parse(Int, strip(record1[31:40]))
(conversion_length, conversion_force, conversion_temperature) = parse.(Float64, split(replace(readline(io), "D" => "E")))
conversion_temperature_offset = parse(Float64, strip(replace(readline(io), "D" => "E")))

_ = readline(io) # Read trailing " -1"

return Dataset164(
units,
Expand Down
16 changes: 6 additions & 10 deletions src/datasets/dataset18.jl
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,7 @@ Universal Dataset Number: 18

Records 1 thru 3 are repeated for each coordinate system in the model.
"""
function parse_dataset18(block)
nlines = length(block)
function parse_dataset18(io)

cs_num = Int[]
cs_type = Int[]
Expand All @@ -83,31 +82,28 @@ function parse_dataset18(block)
cs_x = Vector{Float64}[]
cs_xz = Vector{Float64}[]

i = 2 # Start after the dataset type line
while i ≤ nlines
while (line = readline(io)) != " -1"
# Parse record 1
csn, cst, ref_csn, col, md = parse.(Int, split(strip(block[i])))
csn, cst, ref_csn, col, md = parse.(Int, split(line))
push!(cs_num, csn)
push!(cs_type, cst)
push!(ref_cs_num, ref_csn)
push!(color, col)
push!(method_def, md)

# Parse record 2
i += 1
push!(cs_name, strip(block[i]))
push!(cs_name, strip(readline(io)))

# Parse record 3
_cs_params = Float64[]
for _ in 1:2
i += 1
append!(_cs_params, parse.(Float64, split(strip(block[i]))))
append!(_cs_params, parse.(Float64, split(strip(readline(io)))))
end
push!(cs_origin, _cs_params[1:3])
push!(cs_x, _cs_params[4:6])
push!(cs_xz, _cs_params[7:9])

i += 1 # Move to the next coordinate system
# Move to the next coordinate system
end

return Dataset18(
Expand Down
Loading