[Plugin] AttributeInspector 1.1.1 β 2014-05-08
- 
 Hello Arilius ! Your plugin is very useful for me thanks ! Just missing an "update" button, in order to avoid closing an openning the window to refresh and it will be perfect ! 
 Thank you !
 Inteloide
- 
 @inteloide said: Just missing an "update" button, in order to avoid closing an openning the window to refresh and it will be perfect ! +1  
- 
 I found a conflict with TIG's 2DTools. This plugin adds an attribute dictionnary to the model called "2Dtools", with a key "z" and a value of "0.0" in my case. 
 This causes the AttributeInspector to not load anything for the model, and the ruby console outputs this:AE;;AttributeInspector;;Dialog Error for callback 'get_all'; comparison of Length with true failed C;/Users/Marjorie/AppData/Roaming/SketchUp/SketchUp 2014/SketchUp/Plugins/ae_AttributeInspector/AttributeInspector.rb;505;in `==' C;/Users/Marjorie/AppData/Roaming/SketchUp/SketchUp 2014/SketchUp/Plugins/ae_AttributeInspector/AttributeInspector.rb;505;in `block (2 levels) in get_attributes' Blablabla...(I was able to find the conflicting dictionnary using Eneroth's Attribute Editor) 
- 
 That is the Trimble SketchUpAPI team's fault. They did not properly override the ==method in theLengthsubclass.It (the overridden method,) should have an unlessclause that invokessuperif the argument is not aNumericsubclass.like: def ==(arg) unless arg.is_a?(Numeric) super else # check if arg is within SketchUp's # tolerance of this Length instance end end
- 
 So any plugin which saves an attribute as a Lengthwill return an error if the test on it is not sufficiently robust ?
 So make a test like:
 unless object.get_attribute(key, value, nil).class == NilClass ... else next ### end
 So now if the key's value is NOTnilyou do something...
 BUT if it isnilyou skip it ###...But as I read this plugin's code its line #505 uses: 
 type = (value == true || value == false) ? "Boolean" : value.class.to_s
 That is where the failure happens.
 The Length is checked for true/false.
 If it's recast as something more like:
 type = value.class.to_s; type = "Boolean" if type =~ /TrueClass|FalseClass/
 Then it'll work with Lengths too...
 You could also add a trap forNilClassand perhaps skip that key/value pair ?
 ; type = "Nil" if type =~ /NilClass/
 OR take it as equivalent toFalseClass??
- 
 Thanks for pointing this out! I didn't think about that I could get an error when comparing things. I assumed something that doesn't compare would return "false". The ruby way would maybe be to do feature testing: 
 type = (value.is_a?(Comparable) && (value == true || value == false) ? "Boolean" : value.class.to_s
 Which also fails due to SketchUp's bugged API method (Length is a Comparable).
 This should be better (and without string comparison). Or shouln't ruby have a "Boolean" super class of which TrueClass and FalseClass are subclasses?
 type = (value.is_a?(TrueClass) || value.is_a?(FalseClass)) ? "Boolean" : value.class.to_s@unknownuser said: You could also add a trap for NilClass and perhaps skip that key/value pair ? I wanted to list all existing attributes. An attribute can persist with a value "nil" without being deleted/garbage collected. 
- 
 Every object, of every class inherits a .nil?()instance method (fromObject.)
 So:val = thing.get_attribute(key, value, nil) unless val.nil? # do something else # recover gracefully end
- 
 BTW... you can currently use the triple equal method with Lengthclass, so this will work:
 true === length_value || false === length_value
- 
 @aerilius said: Or shouln't ruby have a "Boolean" super class of which TrueClass and FalseClass are subclasses? 
 type = (value.is_a?(TrueClass) || value.is_a?(FalseClass)) ? "Boolean" : value.class.to_sI always wondered why not ? One thing I have done in the past is create a boolean?()query method forObject(or something else likeComparable.
 Now this is frowned upon, and I never released it, just suggested, or had it in my test scripts.def boolean?() is_a?(TrueClass) || is_a?(FalseClass) end unless method(;boolean?)
 AND / OR, ... create a Booleanmixin module, and then mix it into onlyTrueClassandFalseClass. The mixin module may not actually need any additional functionality, at all ?Then the kind_of?(aliasis_a?,) methods will return the appropriatetrueorfalseusing aBooleanclass argument, for any, and ALL objects.
 The===will also work for all objects, which makes case statements work:
 Boolean === value
 Whichever one (or both,) ya'll want, would need to be adopted as an API extension, by the community. (And we'd need to convince the Trimble team to add it.) 
- 
 The Length class is a bit of a special case. It's trying to be a sub-class of Float - but the Ruby API doesn't really let you do this. So there's some hackery in the background to make it work. I'll file an issue to see if we can avoid the argument error. 
- 
 Thanks TT. Just returning falsewould be preferable, instead of raising anArgumentError(when reallyTypeErroroccurs.)
- 
 Yea, there's a few annoying inconsistency where the correct error isn't raised. 
Advertisement





 
                             
                             
                             
                             
                             
                             
                            