Skip to content

Commit 4c55224

Browse files
committed
using Scene instead of SceneOptions
1 parent 6411883 commit 4c55224

File tree

9 files changed

+138
-24
lines changed

9 files changed

+138
-24
lines changed

src/Composition/dynamicCollision.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ function visualizeContactAndSupportPoints(ch, world)
189189
end
190190
end
191191

192-
printWarnContSupPoints(nVisualContSupPoints) = @warn("If all contact points and/or support points should be visualized please set nVisualContSupPoints = $nVisualContSupPoints in SceneOptions.")
192+
printWarnContSupPoints(nVisualContSupPoints) = @warn("If all contact points and/or support points should be visualized please set nVisualContSupPoints = $nVisualContSupPoints in Scene.")
193193

194194
# the sphere is visible and its absolute position is updated (this point was computed by the mpr algorithm)
195195
function setVisualizationContactProperties!(obj::Composition.Object3D, transparency::Float64, point::SVector{3,Float64})

src/Composition/dynamics.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ function getJointsAndObject3DsWithoutParents!(evaluatedParameters,
66
if typeof(value) == Object3D
77
if value.parent === value
88
push!(object3DWithoutParents, value)
9-
elseif typeof(value.feature) == Modia3D.Composition.SceneOptions
10-
error(value.path, ": Object3D has a parent and defines SceneOptions!")
9+
elseif typeof(value.feature) == Modia3D.Composition.Scene
10+
error(value.path, ": Object3D has a parent and defines Scene!")
1111
end
1212

1313
elseif typeof(value) <: Modia3D.AbstractJoint
@@ -66,10 +66,10 @@ end
6666

6767

6868
function initAnalysis2!(world)
69-
# Construct Scene(..) object
69+
# use Scene(..) of world object
7070
Modia3D.Composition.EmptyObject3DFeature
71-
if typeof(world.feature) <: Modia3D.SceneOptions
72-
scene = Modia3D.Scene(world.feature)
71+
if typeof(world.feature) <: Modia3D.Scene
72+
scene = world.feature
7373
else
7474
scene = Modia3D.Scene()
7575
end
@@ -150,9 +150,11 @@ function setModiaJointVariables!(id::Int, _leq_mode, instantiatedModel::ModiaLan
150150
separateObjects[id] = mbs
151151

152152
# Print
153+
#=
153154
if false
154155
printScene(scene)
155156
end
157+
=#
156158

157159
if scene.visualize
158160
TimerOutputs.@timeit instantiatedModel.timer "Modia3D_0 initializeVisualization" Modia3D.Composition.initializeVisualization(Modia3D.renderer[1], scene.allVisuElements)

src/Composition/handler.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,7 @@ function build_superObjs!(scene::Scene, world::Object3D)::Nothing
299299
end
300300

301301

302-
function visualizeWorld!(world::Object3D; sceneOptions = SceneOptions())::Nothing
303-
scene = Scene(sceneOptions)
302+
function visualizeWorld!(world::Object3D; scene = Scene())::Nothing
304303
scene.analysis = Modia3D.KinematicAnalysis
305304
initAnalysis!(world, scene)
306305
updatePosition!(world)
@@ -400,7 +399,7 @@ function chooseAndBuildUpTree(world::Object3D, scene::Scene)
400399
else
401400
build_tree!(scene, world)
402401
if scene.options.enableContactDetection
403-
error("Collision handling is only possible with the optimized structure. Please set useOptimizedStructure = true in Modia3D.SceneOptions.")
402+
error("Collision handling is only possible with the optimized structure. Please set useOptimizedStructure = true in Modia3D.Scene.")
404403
end
405404
end
406405
if length(scene.allVisuElements) > 0

src/Composition/object3D.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ mutable struct Object3D <: Modia3D.AbstractObject3D
108108
I_CM::SMatrix{3,3,Float64,9} # Inertia matrix at Center of Mass resolved in a frame in the center of mass that is parallel to Object3D in [kg*m^2]
109109

110110
# Additional information associated with Object3D
111-
feature::Union{Modia3D.AbstractObject3DFeature, Modia3D.AbstractSceneOptions} # Optional feature associated with Object3D
111+
feature::Union{Modia3D.AbstractObject3DFeature, Modia3D.AbstractScene} # Optional feature associated with Object3D
112112
twoObject3Dobject::Vector{Modia3D.AbstractTwoObject3DObject} # Optional AbstractTwoObject3DObject object associated with Object3D
113113
hasCutJoint::Bool # = true if it has a cut joint
114114
hasForceElement::Bool # = true if it has a force element
@@ -496,7 +496,7 @@ hasParent( obj::Object3D) = !(obj.parent === obj)
496496
hasNoParent( obj::Object3D) = obj.parent === obj
497497
hasChildren( obj::Object3D) = length(obj.children) > 0
498498
hasNoChildren( obj::Object3D) = length(obj.children) == 0
499-
isWorld( obj::Object3D) = hasNoParent(obj) && typeof(obj.feature) == Modia3D.SceneOptions
499+
isWorld( obj::Object3D) = hasNoParent(obj) && typeof(obj.feature) == Modia3D.Scene
500500
isNotWorld( obj::Object3D) = !(isWorld(obj))
501501
isMovable( obj::Object3D) = obj.interactionManner.movable
502502
isLockable( obj::Object3D) = obj.interactionManner.lockable
@@ -517,13 +517,13 @@ objectHasMovablePos( obj::Object3D) = !isnothing(obj.interactionManner.movableP
517517

518518
featureHasMass(obj::Object3D) = featureHasMass(obj.feature)
519519
featureHasMass(feature::Modia3D.AbstractObject3DFeature) = false
520-
featureHasMass(feature::Modia3D.AbstractSceneOptions) = false
520+
featureHasMass(feature::Modia3D.AbstractScene) = false
521521
featureHasMass(feature::Shapes.Solid) = !isnothing(feature.massProperties)
522522

523523
isVisible(obj::Object3D, renderer::Modia3D.AbstractRenderer) = isVisible(obj.feature, renderer)
524524
isVisible(feature::Modia3D.AbstractObject3DFeature, renderer::Modia3D.AbstractRenderer) = false
525525

526-
isVisible(feature::Modia3D.AbstractSceneOptions, renderer::Modia3D.AbstractRenderer) = false
526+
isVisible(feature::Modia3D.AbstractScene, renderer::Modia3D.AbstractRenderer) = false
527527

528528
canCollide(feature::Modia3D.AbstractObject3DFeature) = false
529529

src/Composition/scene.jl

Lines changed: 119 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ end
192192

193193

194194

195-
#-------------------------------------- Global Scene Options -------------------------------
196-
struct SceneOptions <: Modia3D.AbstractSceneOptions
195+
#-------------------------------------- Global SceneOptions -------------------------------
196+
struct SceneOptions
197197

198198
# Gravity field
199199
gravityField::Modia3D.AbstractGravityField
@@ -417,7 +417,7 @@ Defines global properties of the system, such as the gravity field. Exactly one
417417
418418
- `lightLatitude::Float64`: latitude angle of light position (0 = horizontal)
419419
"""
420-
mutable struct Scene
420+
mutable struct Scene <: Modia3D.AbstractScene
421421
name::String # model name
422422
autoCoordsys::Shapes.CoordinateSystem # Coordinate system that is automatically included (e.g. due to visualizeFrames=true)
423423
stack::Vector{Object3D} # Stack to traverse objs
@@ -458,7 +458,75 @@ mutable struct Scene
458458
prismatic::Vector{Prismatic}
459459
freeMotion::Vector{FreeMotion}
460460

461-
function Scene(sceneOptions::SceneOptions = SceneOptions())
461+
462+
function Scene(;gravityField = UniformGravityField(),
463+
useOptimizedStructure = true,
464+
contactDetection = ContactDetectionMPR_handler(),
465+
nVisualContSupPoints = 5,
466+
gap = 0.001,
467+
enableContactDetection = true,
468+
defaultContactSphereDiameter = 0.1,
469+
elasticContactReductionFactor = 1.0,
470+
nominalLength = 1.0,
471+
defaultFrameLength = 0.2*nominalLength,
472+
defaultJointLength = nominalLength/10,
473+
defaultJointWidth = nominalLength/20,
474+
defaultForceLength = nominalLength/10,
475+
defaultForceWidth = nominalLength/20,
476+
defaultBodyDiameter = nominalLength/9,
477+
defaultWidthFraction = 20,
478+
defaultArrowDiameter = nominalLength/40,
479+
defaultN_to_m = 1000,
480+
defaultNm_to_m = 1000,
481+
enableVisualization = true,
482+
animationFile = nothing,
483+
visualizeGravity = true,
484+
visualizeFrames = false,
485+
visualizeConvexHulls = true,
486+
visualizeBoundingBox = false,
487+
visualizeContactPoints = false,
488+
visualizeSupportPoints = false,
489+
cameraDistance = 10.0*nominalLength,
490+
cameraLongitude = 30/180*pi,
491+
cameraLatitude = 15/180*pi,
492+
lightDistance = 10.0*nominalLength,
493+
lightLongitude = 60/180*pi,
494+
lightLatitude = 45/180*pi)
495+
496+
sceneOptions = SceneOptions(gravityField = gravityField,
497+
useOptimizedStructure = useOptimizedStructure,
498+
contactDetection = contactDetection,
499+
nVisualContSupPoints = nVisualContSupPoints,
500+
gap = gap,
501+
enableContactDetection = enableContactDetection,
502+
defaultContactSphereDiameter = defaultContactSphereDiameter,
503+
elasticContactReductionFactor = elasticContactReductionFactor,
504+
nominalLength = nominalLength,
505+
defaultFrameLength = defaultFrameLength,
506+
defaultJointLength = defaultJointLength,
507+
defaultJointWidth = defaultJointWidth,
508+
defaultForceLength = defaultForceLength,
509+
defaultForceWidth = defaultForceWidth,
510+
defaultBodyDiameter = defaultBodyDiameter,
511+
defaultWidthFraction = defaultWidthFraction,
512+
defaultArrowDiameter = defaultArrowDiameter,
513+
defaultN_to_m = defaultN_to_m,
514+
defaultNm_to_m = defaultNm_to_m,
515+
enableVisualization = enableVisualization,
516+
animationFile = animationFile,
517+
visualizeGravity = visualizeGravity,
518+
visualizeFrames = visualizeFrames,
519+
visualizeConvexHulls = visualizeConvexHulls,
520+
visualizeBoundingBox = visualizeBoundingBox,
521+
visualizeContactPoints = visualizeContactPoints,
522+
visualizeSupportPoints = visualizeSupportPoints,
523+
cameraDistance = cameraDistance,
524+
cameraLongitude = cameraLongitude,
525+
cameraLatitude = cameraLatitude,
526+
lightDistance = lightDistance,
527+
lightLongitude = lightLongitude,
528+
lightLatitude = lightLatitude)
529+
462530
exportAnimation = false
463531
if !isnothing(sceneOptions.animationFile)
464532
(base, ext) = splitext(sceneOptions.animationFile)
@@ -468,6 +536,7 @@ mutable struct Scene
468536
@warn("Extension of animationFile=$(sceneOptions.animationFile) is not 'json'.\n-> Animation export is disabled.")
469537
end
470538
end
539+
471540
new("Scene",
472541
Shapes.CoordinateSystem(length=sceneOptions.defaultFrameLength),
473542
Vector{Object3D}[],
@@ -493,9 +562,55 @@ mutable struct Scene
493562
exportAnimation,
494563
Vector{animationStep}[],
495564
0,
565+
Revolute[],
566+
Prismatic[],
567+
FreeMotion[])
568+
569+
end
570+
#=
571+
function Scene(sceneOptions::SceneOptions = SceneOptions())
572+
573+
574+
exportAnimation = false
575+
if !isnothing(sceneOptions.animationFile)
576+
(base, ext) = splitext(sceneOptions.animationFile)
577+
if ext == ".json"
578+
exportAnimation = true
579+
else
580+
@warn("Extension of animationFile=$(sceneOptions.animationFile) is not 'json'.\n-> Animation export is disabled.")
581+
end
582+
end
496583
584+
585+
586+
new("Scene",
587+
Shapes.CoordinateSystem(length=sceneOptions.defaultFrameLength),
588+
Vector{Object3D}[],
589+
Vector{Object3D}[],
590+
sceneOptions,
591+
false,
592+
false,
593+
false,
594+
false,
595+
false,
596+
Modia3D.KinematicAnalysis,
597+
Vector{SuperObjsRow}[],
598+
Vector{Object3D}[],
599+
Vector{Object3D}[],
600+
Vector{Object3D}[],
601+
Vector{Object3D}[],
602+
Vector{Object3D}[],
603+
Vector{Object3D}[],
604+
Vector{Vector{Int64}}[],
605+
Dict{Modia3D.AbstractJoint,Vector{Int64}}(),
606+
Vector{Union{Bool}}[],
607+
Vector{Vector{Basics.BoundingBox}}[],
608+
exportAnimation,
609+
Vector{animationStep}[],
610+
0,
497611
Revolute[],
498612
Prismatic[],
499613
FreeMotion[])
500614
end
615+
=#
501616
end

src/Modia3D.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ abstract type AbstractObject3D end
3131
abstract type AbstractTwoObject3DObject <: AbstractObject3D end # Object related to two Object3Ds
3232
abstract type AbstractJoint <: AbstractTwoObject3DObject end # Constraint between two Object3Ds
3333

34-
abstract type AbstractSceneOptions end
34+
abstract type AbstractScene end
3535

3636
using StaticArrays
3737
@inline cross(x::SVector{3,Float64}, y::SVector{3,Float64}) = @inbounds SVector{3,Float64}(x[2]*y[3]-x[3]*y[2],
@@ -162,7 +162,7 @@ export Revolute, Prismatic
162162

163163
export UniformGravityField, PointGravityField, NoGravityField
164164
export VisualMaterial
165-
export SceneOptions, SimulationModel
165+
export Scene, SimulationModel
166166
export print_ModelVariables
167167

168168
export PTP_path, pathEndTime, getPosition!, getPosition, getIndex, plotPath

src/ModiaInterface/model3D.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ModiaLang interface to Modia3D
22
Object3D( ; kwargs...) = Par(; _constructor = :(Modia3D.Object3D), _path = true, kwargs...)
3-
Scene( ; kwargs...) = Par(; _constructor = :(Modia3D.SceneOptions) , kwargs...)
3+
Scene( ; kwargs...) = Par(; _constructor = :(Modia3D.Scene) , kwargs...)
44
Visual( ; kwargs...) = Par(; _constructor = :(Modia3D.Visual) , kwargs...)
55
Solid( ; kwargs...) = Par(; _constructor = :(Modia3D.Solid) , kwargs...)
66
Box( ; kwargs...) = Par(; _constructor = :(Modia3D.Box) , kwargs...)

test/old/Move_Pendulum.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ cyl = Modia3D.Object3D(parent=frame1, feature = Modia3D.Visual(shape =
2121
rev = Modia3D.Revolute(obj1=world, obj2=frame1)
2222

2323
# Visualize pendulum
24-
# Modia3D.visualizeWorld!(world, sceneOptions=Modia3D.SceneOptions(visualizeFrames=true, defaultFrameLength=0.3*Lx))
25-
26-
scene = Modia3D.Scene(Modia3D.SceneOptions(visualizeFrames=true, defaultFrameLength=0.3*Lx))
24+
scene = Modia3D.Scene(visualizeFrames=true, defaultFrameLength=0.3*Lx)
2725
Modia3D.initAnalysis!(world, scene)
2826

2927
tStart = 0.0

test/old/Visualize_Beam.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ beam = Modia3D.Object3D(parent=world, translation=[1.0, 1.0, 1.0],
1010
feature = Modia3D.Visual(shape=Modia3D.Beam(axis=1, length=0.4, width=0.5, thickness=0.3), visualMaterial=mat1))
1111

1212
Modia3D.visualizeWorld!(world,
13-
sceneOptions=Modia3D.SceneOptions(visualizeFrames=true, defaultFrameLength=0.7, enableContactDetection=false))
13+
scene=Modia3D.Scene(visualizeFrames=true, defaultFrameLength=0.7, enableContactDetection=false))
1414

1515
println("... test/old/Visualize_Beam.jl completed.")
1616

0 commit comments

Comments
 (0)