No.
In fact, the Extension Warehouse Developer Best Practices (Technical Requirements section) requires a SketchupExtension
class instance, which makes use of at least 2
rb files and an extension sub-folder.
Yes.
Many plugins have multiple custom classes. And it helps to maintain the code if it is separated into functional portions, each portion in a separate file.
Of course you can!
However, ALL YOUR plugin’s classes MUST be wrapped within YOUR plugin’s module
, and ALL YOUR various plugin modules, MUST be wrapped (defined) within YOUR toplevel namespace module.
NOTE: The examples below have now been generalized and posted in topic thread:
[Template] Multi-File, Multi-Class with SharedConstants Mixin
registrar script
“.../Plugins/MRME_SomePlugin.rb
”
registers a SketchupExtension
loader file:
# encoding: UTF-8
#
# file "MRME_SomePlugin.rb"
require 'sketchup.rb'
require 'extensions.rb'
module MRME
module SomePlugin
VERSION = "1.0.0"
# Create an entry in the "Extensions" list ("Preferences" dialog):
@@extension = SketchupExtension.new(
"MRME: SomePlugin", # The extension name
"MRME_SomePlugin/SomePlugin_loader.rb" # The loader file path
)
@@extension.version = VERSION
@@extension.creater = "MaryamR"
@@extension.copyright = "©2016, by author, All Rights Reserved"
@@extension.description = 'An extension that does nifty things.'
# Register this extension with the Sketchup::ExtensionsManager:
Sketchup.register_extension( @@extension, true )
end # this plugin sub-module
end # author's toplevel namespace module
And “.../Plugins/MRME_SomePlugin/SomePlugin_loader.rb
”,
might look like:
# encoding: UTF-8
#
# file "MRME_SomePlugin/SomePlugin_loader.rb"
module MRME
module SomePlugin
require "MRME_SomePlugin/SomePlugin_SharedConstants.rb"
include SharedConstants # mixin the constant module
require "MRME_SomePlugin/SomePlugin_House.rb"
require "MRME_SomePlugin/SomePlugin_Type.rb"
require "MRME_SomePlugin/SomePlugin_Roof.rb"
# ... etc.
end
end
Then the mixin module file for sharing constants:
# encoding: UTF-8
#
# file "MRME_SomePlugin/SomePlugin_SharedConstants.rb"
module MRME
module SomePlugin
module SharedConstants
# define constants to be shared here:
end
end
end
Then of the plugin’s class definition files:
# encoding: UTF-8
#
# file "MRME_SomePlugin/SomePlugin_House.rb"
module MRME
module SomePlugin
class House
include SharedConstants # mixin the constant module
# define unshared constants here:
# define class variables here:
# define class methods here:
# define instance methods here:
end
end
end
etc, etc, … and so forth …
The class
and module
blocks mean “Open the object for editing (creating the object if it does not yet exist.)”
So a Ruby class
or module
can be opened and edited any number of times, by a single file, or multiple files.
Tip: Ruby is a dynamic language, meaning it allows modification of classes and modules during runtime (or anytime,) not just at load time. (Or, not just at compile time like static languages.)