Class: MSPhysics::SceneData
- Defined in:
- RubyExtension/MSPhysics/scene_data.rb
Overview
Instance Method Summary collapse
-
#axes ⇒ Geom::Transformation
Get scene axes.
-
#camera ⇒ Sketchup::Camera
Get scene camera.
-
#hidden_entities ⇒ Array<Sketchup::Entity>
Get scene hidden entities.
-
#hidden_layers ⇒ Array<Sketchup::Layer>
Get scene hidden layers.
-
#initialize(*args) ⇒ SceneData
constructor
A new instance of SceneData.
-
#rendering_options ⇒ Hash
Get scene rendering options.
-
#shadow_info ⇒ Hash
Get scene shadow info.
-
#style ⇒ Sketchup::Style
Get scene style.
-
#transition(scene_data, ratio) ⇒ void
Transition between this and the desired scene data.
-
#use_axes=(state) ⇒ Object
Enable/disable axes transitioning for this scene.
-
#use_axes? ⇒ Boolean
Determine if axes transitioning is enabled.
-
#use_camera=(state) ⇒ Object
Enable/disable camera transitioning for this scene.
-
#use_camera? ⇒ Boolean
Determine if camera transitioning is enabled.
-
#use_hidden_entities=(state) ⇒ Object
Enable/disable hidden entities transitioning for this scene.
-
#use_hidden_entities? ⇒ Boolean
Determine if hidden entities transitioning is enabled.
-
#use_hidden_layers=(state) ⇒ Object
Enable/disable hidden layers transitioning for this scene.
-
#use_hidden_layers? ⇒ Boolean
Determine if hidden layers transitioning is enabled.
-
#use_rendering_options=(state) ⇒ Object
Enable/disable rendering options transitioning for this scene.
-
#use_rendering_options? ⇒ Boolean
Determine if rendering options transitioning is enabled.
-
#use_shadow_info=(state) ⇒ Object
Enable/disable shadow transitioning for this scene.
-
#use_shadow_info? ⇒ Boolean
Determine if shadow transitioning is enabled.
-
#use_style=(state) ⇒ Object
Enable/disable style transitioning for this scene.
-
#use_style? ⇒ Boolean
Determine if style transitioning is enabled.
Methods inherited from Entity
Constructor Details
#initialize ⇒ SceneData #initialize(page) ⇒ SceneData
Returns a new instance of SceneData.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 9 def initialize(*args) @axes = Geom::Transformation.new @hidden_entities = [] @hidden_layers = [] @rendering_options = {} @shadow_info = {} @style = nil @camera = nil @use_axes = true @use_hidden_entities = true @use_hidden_layers = true @use_rendering_options = true @use_shadow_info = true @use_style = true @use_camera = true model = Sketchup.active_model if args.size == 0 if Sketchup.version.to_i >= 16 @axes = model.axes.transformation end model.definitions.each { |d| d.instances.each { |i| @hidden_entities << i unless i.visible? } } model.layers.each { |layer| @hidden_layers << layer unless layer.visible? } model..each { |k, v| @rendering_options[k] = v } model.shadow_info.each { |k, v| @shadow_info[k] = v } @style = model.styles.selected_style @camera = MSPhysics.duplicate_camera(model.active_view.camera) elsif args.size == 1 page = args[0] AMS.validate_type(page, Sketchup::Page) if Sketchup.version.to_i >= 16 @axes = page.axes.transformation end if page.hidden_entities page.hidden_entities.each { |e| @hidden_entities << e } end if page.layers page.layers.each { |layer| @hidden_layers << layer } end if page. page..each { |k, v| @rendering_options[k] = v } end if page.shadow_info page.shadow_info.each { |k, v| @shadow_info[k] = v } end @style = page.style @camera = MSPhysics.duplicate_camera(page.camera) @use_axes = page.use_axes? @use_hidden_entities = page.use_hidden? @use_hidden_layers = page.use_hidden_layers? @use_rendering_options = page. @use_shadow_info = page.use_shadow_info? @use_style = page.use_style? @use_camera = page.use_camera? else raise(ArgumentError, "Wrong number of arguments! Expected 0..1 arguments but got #{args.size}.", caller) end end |
Instance Method Details
#axes ⇒ Geom::Transformation
Get scene axes.
186 187 188 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 186 def axes @axes end |
#camera ⇒ Sketchup::Camera
Get scene camera.
222 223 224 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 222 def camera @camera end |
#hidden_entities ⇒ Array<Sketchup::Entity>
Get scene hidden entities.
192 193 194 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 192 def hidden_entities @hidden_entities end |
#hidden_layers ⇒ Array<Sketchup::Layer>
Get scene hidden layers.
198 199 200 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 198 def hidden_layers @hidden_layers end |
#rendering_options ⇒ Hash
Get scene rendering options.
204 205 206 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 204 def @rendering_options end |
#shadow_info ⇒ Hash
Get scene shadow info.
210 211 212 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 210 def shadow_info @shadow_info end |
#style ⇒ Sketchup::Style
Get scene style.
216 217 218 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 216 def style @style end |
#transition(scene_data, ratio) ⇒ void
Manually wrap the operation.
This method returns an undefined value.
Transition between this and the desired scene data.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 72 def transition(scene_data, ratio) AMS.validate_type(scene_data, SceneData) ratio = AMS.clamp(ratio, 0, 1) model = Sketchup.active_model if scene_data.use_axes? && Sketchup.version.to_i >= 16 tra = AMS::Geometry.transition_transformation(@axes, scene_data.axes, ratio) model.axes.set(tra.origin, tra.xaxis, tra.yaxis, tra.zaxis) end if scene_data.use_hidden_entities? if ratio == 0 (scene_data.hidden_entities - @hidden_entities).each { |e| e.visible = true if e.valid? && !e.visible? } @hidden_entities.each { |e| e.visible = false if e.valid? && e.visible? } else (@hidden_entities - scene_data.hidden_entities).each { |e| e.visible = true if e.valid? && !e.visible? } scene_data.hidden_entities.each { |e| e.visible = false if e.valid? && e.visible? } end end if scene_data.use_hidden_layers? if ratio == 0 (scene_data.hidden_layers - @hidden_layers).each { |e| e.visible = true if e.valid? && !e.visible? } @hidden_layers.each { |e| e.visible = false if e.valid? && e.visible? } else (@hidden_layers - scene_data.hidden_layers).each { |e| e.visible = true if e.valid? && !e.visible? } scene_data.hidden_layers.each { |e| e.visible = false if e.valid? && e.visible? } end end if scene_data.use_style? desired_style = ratio == 0 ? @style : scene_data.style model.styles.selected_style = desired_style if desired_style && model.styles.selected_style != desired_style end if scene_data. model..each { |mk, mv| s1v = @rendering_options[mk] s2v = scene_data.[mk] if s1v.class == mv.class && s2v.class == mv.class if mv.is_a?(Sketchup::Color) model.[mk] = AMS::Geometry.transition_color(s1v, s2v, ratio) elsif mv.is_a?(Numeric) v = AMS::Geometry.transition_number(s1v, s2v, ratio) model.[mk] = mv.is_a?(Integer) ? v.round : v elsif mv.is_a?(TrueClass) || mv.is_a?(FalseClass) || mv.is_a?(String) || mv.is_a?(Symbol) model.[mk] = ratio == 0 ? s1v : s2v end end } end if scene_data.use_shadow_info? model.shadow_info.each { |mk, mv| s1v = @shadow_info[mk] s2v = scene_data.shadow_info[mk] if s1v.class == mv.class && s2v.class == mv.class if mv.is_a?(Numeric) && mk !~ /time_t/i v = AMS::Geometry.transition_number(s1v, s2v, ratio) model.shadow_info[mk] = mv.is_a?(Integer) ? v.round : v elsif mv.is_a?(Time) s1v = s1v.getutc s2v = s2v.getutc #t1d = Time.new(s1v.year, s1v.month, s1v.day) t1d = Time.utc(s1v.year, s1v.month, s1v.day) #t2d = Time.new(s2v.year, s2v.month, s2v.day) t2d = Time.utc(s2v.year, s2v.month, s2v.day) tdd = Time.at(t1d + ((t2d - t1d) * ratio).to_i) t1s = s1v.hour * 3600 + s1v.min * 60 + s1v.sec t2s = s2v.hour * 3600 + s2v.min * 60 + s2v.sec tds = t2s - t1s if (tds < -43200) tds += 86400 elsif (tds > 43200) tds -= 86400 end sec = t1s + (tds * ratio).to_i hour, sec = sec.divmod(3600) min, sec = sec.divmod(60) #model.shadow_info[mk] = Time.new(tdd.year, tdd.month, tdd.day, hour % 24, min, sec, ratio == 0 ? s1v.utc_offset : s2v.utc_offset) model.shadow_info[mk] = Time.utc(tdd.year, tdd.month, tdd.day, hour % 24, min, sec, 1) elsif mv.is_a?(Geom::Vector3d) model.[mk] = AMS::Geometry.transition_vector(s1v, s2v, ratio) elsif mv.is_a?(TrueClass) || mv.is_a?(FalseClass) || mv.is_a?(String) || mv.is_a?(Symbol) model.shadow_info[mk] = ratio == 0 ? s1v : s2v end end } end if scene_data.use_camera? #~ model.active_view.camera = AMS::Geometry.transition_camera(@camera, scene_data.camera, ratio) c1 = @camera c2 = scene_data.camera c3 = model.active_view.camera m = c1.eye.distance(c2.eye) * 0.5 p0 = c1.eye p1 = c1.eye + AMS::Geometry.scale_vector(c1.direction.reverse, m) p2 = c2.eye + AMS::Geometry.scale_vector(c2.direction.reverse, m) p3 = c2.eye eye = AMS::Geometry.calc_cubic_bezier_point(ratio, p0, p1, p2, p3) dir = AMS::Geometry.transition_vector(c1.direction, c2.direction, ratio) up = AMS::Geometry.transition_vector(c1.up, c2.up, ratio) c3.set(eye, eye + dir, up) t = c1.perspective? c1.perspective = c2.perspective? c3.perspective = c2.perspective? if c2.perspective? c3.focal_length = c1.focal_length + (c2.focal_length - c1.focal_length) * ratio c3.fov = c1.fov + (c2.fov - c1.fov) * ratio c3.image_width = c1.image_width + (c2.image_width - c1.image_width) * ratio else c3.height = c1.height + (c2.height - c1.height) * ratio end c1.perspective = t c3.description = ratio < 0.5 ? c1.description : c2.description end end |
#use_axes=(state) ⇒ Object
Enable/disable axes transitioning for this scene.
228 229 230 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 228 def use_axes=(state) @use_axes = state ? true : false end |
#use_axes? ⇒ Boolean
Determine if axes transitioning is enabled.
234 235 236 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 234 def use_axes? @use_axes end |
#use_camera=(state) ⇒ Object
Enable/disable camera transitioning for this scene.
300 301 302 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 300 def use_camera=(state) @use_camera = state ? true : false end |
#use_camera? ⇒ Boolean
Determine if camera transitioning is enabled.
306 307 308 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 306 def use_camera? @use_camera end |
#use_hidden_entities=(state) ⇒ Object
Enable/disable hidden entities transitioning for this scene.
240 241 242 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 240 def use_hidden_entities=(state) @use_hidden_entities = state ? true : false end |
#use_hidden_entities? ⇒ Boolean
Determine if hidden entities transitioning is enabled.
246 247 248 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 246 def use_hidden_entities? @use_hidden_entities end |
#use_hidden_layers=(state) ⇒ Object
Enable/disable hidden layers transitioning for this scene.
252 253 254 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 252 def use_hidden_layers=(state) @use_hidden_layers = state ? true : false end |
#use_hidden_layers? ⇒ Boolean
Determine if hidden layers transitioning is enabled.
258 259 260 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 258 def use_hidden_layers? @use_hidden_layers end |
#use_rendering_options=(state) ⇒ Object
Enable/disable rendering options transitioning for this scene.
264 265 266 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 264 def (state) @use_rendering_options = state ? true : false end |
#use_rendering_options? ⇒ Boolean
Determine if rendering options transitioning is enabled.
270 271 272 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 270 def @use_rendering_options end |
#use_shadow_info=(state) ⇒ Object
Enable/disable shadow transitioning for this scene.
276 277 278 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 276 def use_shadow_info=(state) @use_shadow_info = state ? true : false end |
#use_shadow_info? ⇒ Boolean
Determine if shadow transitioning is enabled.
282 283 284 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 282 def use_shadow_info? @use_shadow_info end |
#use_style=(state) ⇒ Object
Enable/disable style transitioning for this scene.
288 289 290 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 288 def use_style=(state) @use_style = state ? true : false end |
#use_style? ⇒ Boolean
Determine if style transitioning is enabled.
294 295 296 |
# File 'RubyExtension/MSPhysics/scene_data.rb', line 294 def use_style? @use_style end |