Observers WhishList
-
suggested Purgeevent methods,
fire ONCE regardless of entities removed:
(allows bulk handling in one event, instead of dealing with multiple events firing for each purged object.)onBeforePurge(*collection, itemsObjectArray*)
onAfterPurge(*collection, itemsStringArray, purgeResult*)
(onAfterPurge must return a an array of string names because the objects are now gone; the purgeResult would be the boolean returned from .purge_unused)
for: DefinitionsObserver, LayersObserver, MaterialsObserver, StylesObserver
(and any other new observer added that gets a.purge_unused
method) -
@thomthom said:
An event that triggers when it's safe to perform model changes would be good. So we can stack up modification, based on information from the other events, and execute them during this safe event.
Do I understand it correctly that the TransactionCommit event is suppose to be doing this?
There is another issue here though. Say that TransactionCommit was working and you use that to perform actions which you have queued up during various model change events - then those changes will also trigger an TransactionCommit event. Would be useful to have some more into to what event was completed - or started. As oppose to just getting an event that says "some operation" started/ended. -
@thomthom said:
Tools observer that let you determine what custom Ruby tool is being used.
YES I agree.
Currently all custom Tools are reported as name="RubyTool" id="50003" state=nil
(or similar.)
In my custom Tool, I've made attribute getters tool_name, tool_id, tool_state but the ToolsObserver didn't ask for them I suppose. (or maybe it's the Tools collection?)Also the Tools collection does
NOT
work with custom RubyTools. Which may be the ToolObservers' problem as it gets it's info from the Tools collection.
%(#804000)[(Addition:) I'd like some VCB methods (or extra parameters passed by current methods,) to supply VCB Label and VCB value.
If new methods, something like:
onVCBlabelchange( *tools, tooldata, vcblabel* )
onVCBvalueentry( *tools, tooldata, vcbvalue* )
tooldata = Array[ tool_name, tool_id, tool_state ]reason for labelchange event, is that we cannot rely on tool states as they vary too much, and worse, not all standard tools even use / change a tool state. So in order to know where a tool is in it's process we might be able to use what's displayed for the VCB prompt label.
It would also be nice to get the VCB value after user entry from outside of a standard tool. (I know we CAN do it within our own custom tools using the
onUserText
method.) Uses, well I can think of implementing a entry history for standard tools, for one.] -
I'm a newbie to Sketchup Ruby API so this might be me and not the observer...
When using a selection observer to control the visibility of all entities based on the attributes of the selected entity, it allows me(and I don't want to be allowed) to select hidden entities even when "show hidden geometry" is unchecked.
This is my first use of an observer so maybe I just have to play with it more but I was thinking this might be a limitation of the observer.
-
@mtalbott said:
When using a selection observer to control the visibility of all entities based on the attributes of the selected entity, it allows me(and I don't want to be allowed) to select hidden entities even when "show hidden geometry" is unchecked.
You will see that SU, when you triple click a mesh, will select hidden geometry, and display it as dotted edges.
Check the entity's
.hidden?
or.visible?
property along withSketchup.active_model.rendering_options['DrawHidden']
to determine if an entity is visible and if the user has Hidden Geometry on. -
@thomthom said:
Check the entity's
.hidden?
or.visible?
property along withSketchup.active_model.rendering_options['DrawHidden']
to determine if an entity is visible and if the user has Hidden Geometry on.thomthom,
thanks for responding to my issue. However, with my limited knowledge, checking hidden or visible is only good after the selection has been made. I don't know how to effect what can be selected in the first place.The issues can be simplified to this: all entities have a dictionary with an attribute value set to either "A" or "B". The script's job is to watch the selection that the user makes and based on what is selected, change the visibility. If an entity with the "A" tag is selected, only other "A" entity are visible and visa-versa. Furthermore, if nothing is selected both "A" and "B" entities should become visible again. The problem is that after I start the observer and select an "A" entity all of the "B" entities are hidden but if I go to select a different entity (which should be another "A" because that is all that is visible), the selection tool will pick the entity as if both "B" and "A" are visible. So if there is a "B" entity is in front of the "A" that I want to select it will select the invisible "B". This also goes for selecting in white space.
I figure that I need to tell sketchup that something has changed and it should get it's act together but that is where I've fallen short and thought maybe the selection observer was just not quite observant enough.
-
I'm a bit surprised there hasn't been more activity in this thread...
-
Before, Styles where called Rendering Options. So look at the
RenderingOptions
class. You have aRenderingOptionsObserver
class: http://code.google.com/intl/nb/apis/sketchup/docs/ourdoc/renderingoptionsobserver.htmlSame thing as Scenes in the SU UI is Pages in the API.
-
@thomthom said:
Before, Styles where called Rendering Options. So look at the
RenderingOptions
class. You have aRenderingOptionsObserver
class: http://code.google.com/intl/nb/apis/sketchup/docs/ourdoc/renderingoptionsobserver.htmlOK looked at that... seems like the
RenderingOptionsObserver
class needs an overhaul:- Need to alias (rename) as:
StyleOptionsObserver
* Need to deprecate the old name.
@unknownuser said:
The type is an internal number that indicates what was changed. You will need to watch the observer for numbers you are interested in.
- That is clumsy! (or lazy programming.) Ruby is a high-level language, lets have the same identifier keys as used in the
RenderingOptions
collection class.*RenderingOptions
also needs to be aliased or renamedStyleOptions
.* Need to deprecate the old name.
This only covers the onStyleEdit method I proposed in the previous post, which is actually namedonRenderingOptionsChanged
, however, it fails to send any detail, it only tells (by ordinal,) what options WAS changed. I think it should pass oldValue and newValue as well.
So reproposing the method as:
onStyleOptionsEdit(styleOptionsCollection, optionKeyname, oldValue, newValue)
Could still have old method that sends ordinal number, as:
onStyleOptionsChange(styleOptionsCollection, optionNum)
- Need to deprecate the old name.
STILL, need as in previous post, a 'higher' level
StylesObserver
for triggering events when Styles are manipulated as a whole set (saved to, or loaded from files.) We can call these a StyleSet.- It is possible that those methods could go in the
AppObserver
rather than create a new observer class.
- Need to alias (rename) as:
-
I think you are missing a practical point - you can change a "Rendering Option" without changing the current Scene's "Style" - e.g. switching Xray-mode on won't affect the "Style" BUT it will affect what is displayed on screen [i.e. "Rendered"]. Therefore shouldn't there be two sorts of Observer - one to watch for changes to the "Rendering Options Settings" and another to watch for "Style Changes"
-
@tig said:
I think you are missing a practical point - you can change a "Rendering Option" without changing the current Scene's "Style" - e.g. switching Xray-mode on won't affect the "Style" BUT it will affect what is displayed on screen [i.e. "Rendered"]. Therefore shouldn't there be two sorts of Observer - one to watch for changes to the "Rendering Options Settings" and another to watch for "Style Changes"
If you enable X-Ray mode you change the current Style.
-
Ah. Gotcha!
-
@thomthom said:
@tig said:
I think you are missing a practical point - you can change a "Rendering Option" without changing the current Scene's "Style" - e.g. switching Xray-mode on won't affect the "Style" BUT it will affect what is displayed on screen [i.e. "Rendered"]. Therefore shouldn't there be two sorts of Observer - one to watch for changes to the "Rendering Options Settings" and another to watch for "Style Changes"
If you enable X-Ray mode you change the current Style.
That way you don't change an existing Scene's Style per se - the current Render Settings are temporary changes in that View not the Scene's defined Style - if you change back to that Scene tab the Style should be refreshed back as it was until you save its changes - I know that Xray mode is perhaps a bad example in that it transcends Style settings.
My point is that what is being Rendered in a View and a Scene's Style are different things. One is transient, one is fixed. Changing the Style changes the Render Setting it uses, but you can change the Render Settings without changing a 'named' Style - the confusion is that changing the Render Settings makes a 'temporary' Style that is used in that View from then on until you change settings again or go back to another saved Style - you can the save this temp-style as a new Style or use it to update another already defined Style...
My point was that Styles and Render Settings are linked but different as any Style's settings are not necessarily equal to the current Render Options ?
-
@tig said:
Therefore shouldn't there be two sorts of Observer - one to watch for changes to the "Rendering Options Settings" and another to watch for "Style Changes"
Yes possibly. The API is WAY out of date on this subject and not very clear.
Likely that Rendering Options came first (before Scene Styles were 'invented'?)
@unknownuser said:
(in regard to Rendering Options) The majority of the rendering information returned exists in the Model Info > Display section of SketchUp
But that is no longer true!
There is no 'Display' section in the Model Info dialog in 7.x! -
Don't think I've ever seen a Display section. But I've only used SU since v6.x.
-
@tig said:
- the current Render Settings are temporary changes in that View not the Scene's defined Style - if you change back to that Scene tab the Style should be refreshed back as it was until you save its changes - I know that Xray mode is perhaps a bad example in that it transcends Style settings.
My point is that what is being Rendered in a View and a Scene's Style are different things. One is transient, one is fixed.
I don't see any difference in practice.
I have 4 scenes tabs defined and have the Style dialog open in the edit pane.Whatever I change in the Style dialog changes on the App toolbars or menus.
Whatever I change on the menus (ie Hidden Geometery,) or toolbars (shaded, xray, wireframe etc.,) is immediately echoed in the Style dialog Edit pane.
After making changes, switching between Scenes makes no changes, however I suppose all scenes are set to the same Style.
If I purposely try to set one scene to a different style, it changes, then I switch to another scene it switches back; returning to the previous scene (which I had changed does not change the Style.) It seems there is a default Model Style.
This is confusing.
-
@dan rathbun said:
there is NO
**Sketchup::StylesObserver**
Made a few edits to proposed methods.
see original post: StylesObserver -
@thomthom said:
@whaat said:
... For example, OnEntityChanged, what constitutes a 'change'?
Yea - I spent some time on this because I was setting attributes - which seems to be a change. Not sure if I want that to trigger. At least not most of the times. attributes are like meta data.
maybe onChange for geometric changes, andonAttribChange(dict, key, oldVal, newVal)
for the attribute meta data?Do changes to an Attribute currently fire onEntityChanged events?
What about adding or deleting an attribute from a Dictionary?
What about adding or deleting a Dictionary from an Entity? -
there is NO
**Sketchup::StylesObserver**
But the Styles class has a few 'observer-like' methods:
Styles.update_selected_style
This method is a boolean method (which should have a '?' at the end of it's name.) The use of this method is confusing (partly as the example does not show the style being selected.)
Styles.active_style_changed
(again, should have a '?' at the end of it's name.)
This is a session boolean, changes anytime after saving; but no way to trigger an event.Would it be better to create a StylesObserver class?
That had methods such as:
--- (edit) names changed
onStyleSetAdd(styles, newStyle)
onStyleSetCreate(styles, newStyle, fromStyle)
onStyleSetChosen(styles, oldStyle, newStyle)
--- (edit) name added
onStyleSetRename(styles, style, oldName, newName)
onStyleSetRedescribe(styles, style, oldText, newText)
onStyleSetEdited(styles, style, styleOptions, optionsChangedHash)
(for Bulk handling instead of single option handling.)Purge methods
(as in previous post (Suggested) onBeforePurge & onAfterPurge)
onBeforePurge(styles, stylesUnusedObjectArray)
onAfterPurge(styles, removedStylesArray, purgeResult)
--- (edit) the following withdrawn
onStyleEdit(styles, style, option, oldValue, newValue)
*****- probably will need to implement a "StylesOptions"
OptionsProvider
-- in favor of updates to
RenderingOptionsObserver
as in post:
Re: StyleOptions / StyleOptionsObserver
- probably will need to implement a "StylesOptions"
-
@dan rathbun said:
@thomthom said:
@whaat said:
... For example, OnEntityChanged, what constitutes a 'change'?
Yea - I spent some time on this because I was setting attributes - which seems to be a change. Not sure if I want that to trigger. At least not most of the times. attributes are like meta data.
maybe onChange for geometric changes, andonAttribChange(dict, key, oldVal, newVal)
for the attribute meta data?Do changes to an Attribute currently fire onEntityChanged events?
What about adding or deleting an attribute from a Dictionary?
What about adding or deleting a Dictionary from an Entity?EDIT
I asked this because, it would lead to whether we need EntityObserver methods:
%(#BF0000)[onBeforeAttributeAdd(entity, dict, key, value)
onAfterAttributeAdd(entity, dict, key, value,]result%(#BF0000)[)
onBeforeAttributeDelete(entity, dict, key, value)
onAfterAttributeDelete(entity, dict, oldKey, oldVal,]result)
Also, ThomThom's example needs the entity handle passed.
onAttribChange(entity, dict, key, oldVal, newVal)%(#004000)[*- would assume change result was 'true' (successful)]%(#BF0000)[onBeforeDictionaryAdd(entity, newDict)
onAfterDictionaryAdd(entity, dict,]result%(#BF0000)[)
onBeforeDictionaryDelete(entity, dict)
onAfterDictionaryDelete(entity, oldDict,]result)
Also would a DictionaryObserver be necessary?
(I'd think not as most Attribute and Dictionary functions are available thru the Entity object.) - would assume change result was 'true' (successful)]%(#BF0000)[onBeforeDictionaryAdd(entity, newDict)
Advertisement