The #style method actually returns a copy of the entity’s style attributes, rather than a direct reference. What you need to do is save the style to a variable, set the dimension units, then apply that style back to the original entity. It’s unintuitive and non-ideal, but was necessary due to the internal architecture.
Although this works for set_dimension_units it doesn’t seem to work for other styling options like start_arrow_type. The following code only applies the dimension units to the styling of the entity and none of the others:
# get current style object
current_style = new_dimension.style
# overwrite things
current_style.start_arrow_type = Layout::Style::ARROW_FILLED_TRIANGLE
current_style.start_arrow_size = 2
current_style.end_arrow_type = Layout::Style::ARROW_FILLED_TRIANGLE
current_style.end_arrow_size= 2
current_style.stroke_width = 0.5
current_style.set_dimension_units(Layout::Style::FRACTIONAL_INCHES, 0.065)
# and apply to our freshly created dimension
new_dimension.style = current_style
Only the dimension units will be correctly applied in this case it seems.
This is another area of complexity with the style attributes. To properly set the arrow type and size, you need to apply it using a sub-entity style. For example:
style = new_dimension.style
# Set the dimension units on the root style
style.set_dimension_units(Layout::Style::FRACTIONAL_INCHES, 0.065)
# Get the dimension text style to make text changes
dim_text_style = style.get_sub_style(Layout::Style::DIMENSION_TEXT)
dim_text_style.text_color = Sketchup::Color.new(255, 0, 0, 255)
# Get the dimension line style to make arrow head changes
dim_line_style = style.get_sub_style(Layout::Style::DIMENSION_LINE)
dim_line_style.start_arrow_type = Layout::Style::ARROW_FILLED_TRIANGLE
dim_line_style.start_arrow_size = 2
dim_line_style.end_arrow_type = Layout::Style::ARROW_FILLED_TRIANGLE
dim_line_style.end_arrow_size= 2
dim_line_style.stroke_width = 0.5
# Apply the dimension text style changes to the dimension style
style.set_sub_style(Layout::Style::DIMENSION_TEXT, dim_text_style)
# Apply dimension line style changes to the dimension style
style.set_sub_style(Layout::Style::DIMENSION_LINE, dim_line_style)
# Apply the dimension style changes to the dimension
new_dimension.style = style
You may also want to get the DIMENSION_START_EXTENSION_LINE or DIMENSION_END_EXTENSION_LINE sub style objects if you want to modify the extent lines.