Storing and Retrieving with AttributeDictionary

Posted on November 22

The AttributeDictionary class allows you to store information into a SketchUp Entity. A good way to demonstrate this is to store camera settings into an object in an AttributeDictionary, then activate a context menu on the Entity to get these camera parameters and return to the same camera. This is also a great way to visualize important views in 3D space.

You can download SketchUP from this page:
[download id=”2″]

Our first method definition will create the camera geometry and put it into a group Entity. Then we will create an AttributeDictionary in the group and store the camera settings into the

Need learning SketchUP from scratch, this book is for you:

Google SketchUp For Dummies

Price: $15.04

4.3 out of 5 stars (71 customer reviews)

76 used & new available from $1.06

AttributeDictionary.

We will start by getting the current camera parameters and storing them into variables:

def reveal_view

   m=Sketchup.active_model
   m.start_operation(“reveal view”)
   ents=m.entities
   view=m.active_view
   cam=view.camera
   up=cam.up
   target=cam.target
   persp=cam.perspective?
   fov=cam.fov
   eye=cam.eye
   focus_ray=Geom::Vector3d.new(eye,target)
   eye_axes=focus_ray.axes


Next, we’ll make a simple representation of the camera, using the stored camera settings to determine the geometry,

   target_pointer = ents.add_cline(eye,target)
   eye_point = ents.add_cpoint(eye)
   target_point = ents.add_cpoint(target)
   circle = ents.add_circle(eye, focus_ray, 20, 8)

and store them into a group. For better organization, create a “cameras” layer and put the group into this layer. Also, be sure to lock the group, so the camera geometry can’t move.

   camera_geom = []
   camera_geom.push(target_pointer,eye_point,target_point,circle)
   camera_geom.flatten!
   cam_group=ents.add_group(camera_geom)
   cam_group.name=”camera”
   cam_layer=m.layers.add(“cameras”)
   cam_group.layer=cam_layer
   cam_group.locked=true

We will then be storing the camera settings into the AttributeDictionary called “is_a_camera”.
Create the AttributeDictionary in the cam_group Entity:

   is_camera=cam_group.attribute_dictionary(“is_a_camera”, true)

The “true” indicates that the AttributeDictionary doesn’t yet exist and needs to be created. AttributeDictionary objects store arbitrary amounts of key/value pairs. Add key/value pairs to AttributeDictionary for the camera settings,

   is_camera[“cam”]=cam
   is_camera[“up”]=up
   is_camera[“target”]=target
   is_camera[“persp”]=persp

   is_camera[“fov”]=fov
   is_camera[“eye”]=eye
   is_camera[“focus_ray”]=focus_ray
   is_camera[“eye_axes”]=eye_axes

and commit the undo operation.

   m.commit_operation
end

UI.menu(“Plugins”).add_item(“reveal view”){reveal_view}

Finally, we add a context menu option to call a method only on objects which contain the AttributeDictionary “is_a_camera”. If the AttributeDictionary exists, then the option “go to view” is added to the context menu.

UI.add_context_menu_handler do |menu|
   select_one=Sketchup.active_model.selection[0]
   if select_one.class==Sketchup::Group
      if select_one.attribute_dictionary(“is_a_camera”,false)!=nil
         menu.add_item(“go to view”){go_to_view(select_one)}
      end
   end
end

When this is clicked, it calls the go_to_view() method. Our second method, go_to_view(), will take a selected Entity and recall the values stored in the AttributeDictionary “is_a_camera”. It then uses these values to return to the stored camera position and settings.

def go_to_view(sel)
   info=sel.attribute_dictionary(“is_a_camera”)
   m=Sketchup.active_model
   view=m.active_view
   view.camera=Sketchup::Camera.new(info[“eye”],info[“target”],
      info[“up”],info[“persp”],info[“fov”])
end

:: Source: Google Sketch

Tags: , // Category: Geeky Talks.

Sponsors



Comments are closed.



Categories