-
-
Save itsanov/a6b9016dff5a5c0ee270ff8b82ebf66f to your computer and use it in GitHub Desktop.
| # Fixes the view each time the view changes | |
| require 'sketchup' | |
| def refresh | |
| UI.start_timer(0, false) { | |
| Sketchup.active_model.active_view.invalidate.refresh | |
| } | |
| end | |
| module NH | |
| module ViewFix | |
| @observer = nil | |
| @selection_observer = nil | |
| @model_observer = nil | |
| @layer_observer = nil | |
| @tool_observer = nil | |
| @rendering_observer = nil | |
| class MyViewObserver < Sketchup::ViewObserver | |
| def onViewChanged( view ) | |
| puts "New View changed: #{view.inspect}" | |
| refresh | |
| end | |
| end | |
| class MySelectObserver < Sketchup::SelectionObserver | |
| def onSelectionBulkChange(selection) | |
| puts "MySelectObserver.onSelectionBulkChange" | |
| refresh | |
| end | |
| def onSelectionCleared(selection) | |
| puts "MySelectObserver.onSelectionBulkChange" | |
| refresh | |
| end | |
| end | |
| class MyModelObserver < Sketchup::ModelObserver | |
| def onActivePathChanged(model) | |
| puts "onActivePathChanged: #{model}" | |
| refresh | |
| end | |
| def onEraseAll(model) | |
| puts "onEraseAll: #{model}" | |
| refresh | |
| end | |
| def onExplode(model) | |
| puts "onExplode: #{model}" | |
| refresh | |
| end | |
| def onExplode(model) | |
| puts "onExplode: #{model}" | |
| refresh | |
| end | |
| # def onPidChanged(model, old_pid, new_pid) | |
| # puts "onPidChanged: #{model}, #{old_pid} => #{new_pid}" | |
| # refresh | |
| # end | |
| def onTransactionCommit(model) | |
| puts "onTransactionCommit: #{model}" | |
| refresh | |
| end | |
| def onTransactionAbort(model) | |
| puts "onTransactionAbort: #{model}" | |
| refresh | |
| end | |
| def onTransactionRedo(model) | |
| puts "onTransactionRedo: #{model}" | |
| refresh | |
| end | |
| def onTransactionUndo(model) | |
| puts "onTransactionUndo: #{model}" | |
| refresh | |
| end | |
| def onDeleteModel(model) | |
| puts "onDeleteModel: #{model}" | |
| refresh | |
| end | |
| def onPlaceComponent(instance) | |
| puts "onPlaceComponent: #{instance}" | |
| refresh | |
| end | |
| end | |
| class MyLayersObserver < Sketchup::LayersObserver | |
| def onCurrentLayerChanged(layers, layer) | |
| puts "onCurrentLayerChanged: #{layer.name}" | |
| refresh | |
| end | |
| def onLayerAdded(layers, layer) | |
| puts "onLayerAdded: #{layer.name}" | |
| refresh | |
| end | |
| def onLayerChanged(layers, layer) | |
| puts "onLayerChanged: #{layer.name}" | |
| refresh | |
| end | |
| def onLayerRemoved(layers, layer) | |
| puts "onLayerRemoved: #{layer.name}" | |
| refresh | |
| end | |
| def onRemoveAllLayers(layers) | |
| puts "onRemoveAllLayers: #{layers}" | |
| refresh | |
| end | |
| end | |
| class MyToolObserver < Sketchup::ToolsObserver | |
| def onActiveToolChanged(tools, tool_name, tool_id) | |
| puts "onActiveToolChanged: #{tool_name}" | |
| refresh | |
| end | |
| def onToolStateChanged(tools, tool_name, tool_id, tool_state) | |
| puts "onToolStateChanged: #{tool_name}" | |
| refresh | |
| end | |
| end | |
| class MyRenderingOptionsObserver < Sketchup::RenderingOptionsObserver | |
| def onRenderingOptionsChanged(rendering_options, type) | |
| puts "onRenderingOptionsChanged(#{rendering_options}, #{type})" | |
| refresh | |
| end | |
| end | |
| def self.fix_view | |
| fix_view_disable | |
| fix_view_enable | |
| end | |
| def self.is_fix_set | |
| !!@observer | |
| end | |
| def self.fix_view_disable | |
| # Remove old observers | |
| Sketchup.active_model.active_view.remove_observer( @observer ) if @observer | |
| @observer = nil | |
| Sketchup.active_model.selection.remove_observer( @selection_observer ) if @selection_observer | |
| @selection_observer = nil | |
| Sketchup.active_model.remove_observer( @model_observer ) if @model_observer | |
| @model_observer = nil | |
| Sketchup.active_model.layers.remove_observer( @layer_observer ) if @layer_observer | |
| @layer_observer = nil | |
| Sketchup.active_model.tools.remove_observer( @tool_observer ) if @tool_observer | |
| @tool_observer = nil | |
| Sketchup.active_model.rendering_options.remove_observer( @rendering_observer ) if @rendering_observer | |
| @rendering_observer = nil | |
| end | |
| def self.fix_view_enable | |
| # Attach the observers. | |
| @layer_observer = MyLayersObserver.new | |
| Sketchup.active_model.layers.add_observer( @layer_observer ) | |
| @observer = MyViewObserver.new | |
| Sketchup.active_model.active_view.add_observer( @observer ) | |
| @selection_observer = MySelectObserver.new | |
| Sketchup.active_model.selection.add_observer(@selection_observer) | |
| @tool_observer = MyToolObserver.new | |
| Sketchup.active_model.tools.add_observer(@tool_observer) | |
| @rendering_observer = MyRenderingOptionsObserver.new | |
| Sketchup.active_model.rendering_options.add_observer(@rendering_observer) | |
| @model_observer = MyModelObserver.new | |
| Sketchup.active_model.add_observer(@model_observer) | |
| end | |
| end | |
| end | |
| cmd = UI::Command.new("Refresh delay fix for Wine") { | |
| if NH::ViewFix.is_fix_set | |
| NH::ViewFix.fix_view_disable | |
| else | |
| NH::ViewFix.fix_view_enable | |
| end | |
| } | |
| cmd.menu_text = "Refresh delay fix for Wine" | |
| cmd.set_validation_proc { | |
| if NH::ViewFix.is_fix_set | |
| MF_CHECKED | |
| else | |
| MF_UNCHECKED | |
| end | |
| } | |
| UI.menu("Plugins").add_item cmd | |
| class MyAppObserver < Sketchup::AppObserver | |
| def onNewModel(model) | |
| puts "onNewModel: #{model}" | |
| NH::ViewFix.fix_view | |
| end | |
| def onOpenModel(model) | |
| puts "onOpenModel: #{model}" | |
| NH::ViewFix.fix_view | |
| end | |
| def expectsStartupModelNotifications | |
| return true | |
| end | |
| end | |
| # Attach the observer | |
| Sketchup.add_observer(MyAppObserver.new) |
I wanted to say thanks to the original author and to @itsanov for this work - Sketchup is one of my last core apps needed in my linux migration. I have noticed one issue - when drag-selecting, no selection box lines are shown. Is this something anyone else is seeing (or not as the case may be!)?
I am noticing the same lately. Using : Linux Mint 22.3 Kernel: 6.17.0-19-generic.
I wanted to say thanks to the original author and to @itsanov for this work - Sketchup is one of my last core apps needed in my linux migration. I have noticed one issue - when drag-selecting, no selection box lines are shown. Is this something anyone else is seeing (or not as the case may be!)?
I can see the drag-selecting box. I'm using Sketchup 2017 (version 17.2.2555 64-bit) on Fedora 39.
@smashsmashin are you using Wayland or X11 desktop?
I have attempted to address the drag-selection box issue, and combined the two fixes into a single plugin. You can check it out on github. Comments/bugs welcome. Note, I am not an experienced coder, though I used to many years ago. I used Claude to work through this, have reviewed it over multiple versions and tests myself before publishing.
@Swazib0y Thank you for the fix. Now all works 100% again. I am using X11 btw.
I never had this problem with the selection lines in Linux Mint.
Here is a video I made showing the selection lines.
https://youtu.be/aUIXELEOwkE?si=JMCkaeUkZaPlDitj&t=189
Mint 21.3 64-bit
GeForce GTX 1650
Nvidia 580
@Swazib0y Thank you for the fix. Now all works 100% again. I am using X11 btw.
Glad it worked, happy to continue refining it over on the github page if you encounter any issues.
I never had this problem with the selection lines in Linux Mint.
Here is a video I made showing the selection lines. https://youtu.be/aUIXELEOwkE?si=JMCkaeUkZaPlDitj&t=189
Mint 21.3 64-bit GeForce GTX 1650 Nvidia 580
What version of wine are you using? I am curious why there's a difference...
Awesome and thank you!
Sketchup Make 2017 now completely works on my linux box.