Champion the 3D Web using COLLADA Contest

Thursday, May 7, 2009

Our friends over at the Khronos group are holding a Champion the 3D Web using COLLADA Contest. They're looking for the best 3D models, avatars, worlds, or simulations created using COLLADA. Prizes include cash awards and opportunities at a future Immersive Education Initiative in-world (virtual) events. The contest will run through July 15, 2009. Winners will be announced at Siggraph this year in New Orleans. The contest is sponsored by the Khronos Group and the Media Grid Immersive Education Initiative. Please check out the contest site for full details.

Using SketchUp to enter the contest

SketchUp can be used to create models for this contest. SketchUp Pro and the Pro Evaluation both export COLLADA (DAE) files directly. The free version of SketchUp can export Google Earth (KMZ) files which contain a COLLADA model. To extract a COLLADA model from a KMZ file follow these steps:

  1. Export your SketchUp model to KMZ.
  2. Change the file extension from ".kmz" to ".zip".
  3. Double-click on the ZIP file.
  4. Double-click on the "models" folder.
  5. Locate the DAE file. Copy and paste this file to your Desktop.
  6. Check your file's appearance in a COLLADA viewer like Swirl X3D Viewer©
  7. Submit your model to the contest.

Good Luck!
Bryce Stout
Product Manager
Google

Ruby API Objects diagram

Friday, April 17, 2009

Have you ever wondered how the various classes are organized in the ruby API?
Well, I recently created a diagram to show the objects hierarchy for the SketchUp Ruby API.

It can be found here and it provides an easy way to visualize relationships between SU API's various objects.

Below are some examples of ways in which the diagram can be used:

Example 1
In the diagram, it is evident that the Entity class has several subclasses which all inherit the Entity class methods. For example, the Face class can add an EntityObserver to its instances just by taking advantage of the inherited methods from the Entity class.

Example 2
It is also visually clear that I can get handles to different entities using Ruby. For example, if I want to obtain a handle to my current model, I can do so using Sketchup.active_model or Entity.model. The Entity.model method will work on any class that inherits from Entity.

Example 3
I can clearly visualize which classes have observers and which do not. For example, I can easily see that the View class has its own observer, while the camera class does not.

To keep it as simple as possible, some classes were not included in the diagram.

Hopefully this will help you better visualize the organization of the Ruby API elements.

Simone.

SketchUp API Updates

Wednesday, April 1, 2009

Updated Ruby API Documentation

The guys over at the SketchUcation Community Forums have been submitting documentation corrections to us and we just pushed a bunch of updates to our Ruby API Site . Thanks to everyone who's been helping us improve our docs! If you find other typos or problems please join the thread on SketchUcation or post to our ruby group.

New Ruby Tutorial

Check out our new tutorial on Attribute Reporting to learn how to read attribute data from entities in your models.

New SDK Package

We recently repackaged the SDK to make it a bit easier to use. Improvements include:

- Reorganized folders to make them more understandable
- New GettingStarted.html intro to help get folks headed down the right path
- Updated SkpReader and SkpWriter documentation
- Updated SkpToXml example to compile on the PC

We also removed Client Warehouse SDK from the package. If you need support on this please post your contact info to the SDK support group.

There were no changes to the headers or binaries so there are no code fixes with this release. Please download the latest package at - http://code.google.com/apis/sketchup/docs/downloadsdksubmit.html

Bryce Stout
Product Manager
Google

Deleting Unnecessary Edges

Thursday, March 12, 2009



Have you ever opened a SketchUp file that you didn’t create, or imported a model from another application, and found that it has hundreds of needless hidden or softened lines separating coplanar faces? Wish you could get rid of them with a simple ruby script? Now you can!

First, set up a few variables:

def variables
@group_list = []
@component_list = []
@delete_these = []
@model_list = Sketchup.active_model.entities
end

Then write a method that determines if an edge is 1) hidden or softened, and 2) bordered by two co-planar faces. If the edge meets each of those requirements, it is added to @delete_these list.

def delete_soft_lines(e)
# Determine if the edge is soft or hidden, and if it is bordered by
# two faces.

if ((e.soft? and e.faces.size == 2) or (e.hidden? and e.faces.size == 2))
# Determine if the two bordering faces are coplanar.
# Note: This will only catch cases where the front faces are pointing
# in the same direction.

if (e.faces[0].normal.dot(e.faces[1].normal) > 0.999999999)
# Add the edge to the list of entities that will be deleted.
@delete_these.push(e)
end
end
end

Now create a method to find all the edges in the model, including edges that are embedded in groups and components:

def traverse_model_entities
# @model_list will not be empty until all of the groups, components
# and edges have been traversed.

while @model_list != []
@model_list.each do |item|
# Determine if the entity is an edge, group, or component.
type = item.typename
case type
when "Edge"
# Determine if the edge should be deleted, and add it to the
# @delete_these list.

delete_soft_lines(item)
when "Group"
# Add each of the entities in the group into the group_list
# array.

item.entities.each do |entity|
@group_list.push entity
end
when "ComponentInstance"
# .entities can be called on a Component Definition, but not on
# a Component Instance.
# Use the .definition method to access the Component Definition
# that the instance belongs to.

item.definition.entities.each do |entity|
# Add each of the entities in the component into the
# component_list array.

@component_list.push entity
end
end
end
# Update the @model_list so it contains only the entities that were
# embedded in groups or components. These entities haven't been
# counted yet.

@model_list = @group_list + @component_list
# Clear out the group and component lists so they're ready for the
# next level of sub-groups/components.

@group_list = []
@component_list =[]
end
# The edges that need to be deleted have all been added to the
# @delete_these list, so erase those entities from the
# active SketchUp model.

Sketchup.active_model.entities.erase_entities(@delete_these)
end


Finally, add a “Delete unnecessary edges” item to Tools menu, and pop a dialog letting you know the edges were deleted:
def delete_edges
variables
traverse_model_entities
UI.messagebox("Edges deleted.")
end

UI.menu("Tools").add_item("Delete unnecessary edges") {delete_edges}

Google I/O 2009

Friday, March 6, 2009



The Google I/O Developer Conference is May 28th and 27th in San Francisco, CA. Members of the SketchUp team will be presenting in the What you don't know about Geo APIs can't hurt you session and will also be available during Office Hours. Hope to see you there!


Posted by Bryce Stout, Product Manager

SketchUp Importers

Monday, February 23, 2009



There's a lot of 3D content out there, and we understand that a lot of it is not in the SketchUp file format. But, if you can read the content, you can use the Ruby Importer plugin API to import it into SketchUp.


It's easy to write and use your own Ruby importers in SketchUp. Just follow these steps:

1. Define a class with the plugin API methods.
2. Register an object of the class with SketchUp.
3. Recover from Mardi Gras festivities (may not be applicable).

An importer class must have the following methods:

def description
  # Returns a brief description of your importer plugin.
end

def file_extension
  # Returns the file extension of the file format your
  # importer can read (e.g. fbx, dae, etc.)
end

def supports_options?
  # Returns true if your plugin supports import options.
end

def do_options
  # Presents the import options dialog panel to the user.
end

def id
  # Returns the id string of your importer.
end

def load_file(file_name, show_summary)
  # Reads the contents of location on disk specified
  # by file_name.
  # Shows the summary dialog panel if show_summary is true.
  # Returns 0 on success, returns 1 on failure.
  0
end

Once you have defined your importer class, register your importer with SketchUp:

Sketchup.register_importer MyImporter.new

Now your importer plugin will be available when you select the Import item under the File menu of SketchUp. The Ruby Importer capability is available in both SketchUp Free and Pro. Now go forth and import.

The SketchUp 7 SDK is now available

Wednesday, January 21, 2009



We have recently updated the SketchUp SDK for folks who need read and/or write SketchUp 7 files. It is available on http://code.google.com/apis/sketchup/docs/downloadsdksubmit.html. If you have feedback or questions, please post your questions or suggestions to the SketchUp SDK Group. If you would like to be notified about future SDK updates and news, please subscribe to this blog, if you haven't already.

Happy SketchUp Developing!
Bryce Stout
Product Manager