🌓
搜索
 找回密码
 立即注册

SketchUp的自动化探索 (一)构建私有模型库

admin 2022-8-12 19:33:14 98232
每个建筑师的硬盘里面,
是不是都存了多年来收集的几个T的精品模型?
草、树、雕塑、桌椅...
甚至还有剑圣和钢铁侠。
日常建场景去一个个打开我们存的模型copy进去
是不是比较费时间?
今天我们来做个插件快速的从本地导入我们需要的模型。


导入内置模型


导入本地模型


思路分析
1.通过UI.openpanel读取内置/本地需要导入的模型 路径
2.通过DefinitionList.load从文件 读取 组件
3.通过Model.place_component放置 模型


1、选择.skp文件
UI.openpanel可以开启系统选择文件的窗口,
获取到选中文件的路径。
.openpanel(title, directory, filename) ⇒ String
  • title 选择文件窗口的标题;
  • directory 窗口默认打开的系统路径,可以不填,也可以指定到你模型库的路径;
  • filename 默认的文件名,可以通过UIname|wildcard||来筛选你需要打开的文件类型;
那我们只需要选择.skp文件,就可以这样写(过滤文件这个功能只在Windows上有效)
chosen_skp = UI.openpanel("Open Skp File", "", "Skp Files|*.skp||")


2、从.skp文件读取出组件
DefinitionList.load可以从文件读取出组件
load(path) ⇒ Sketchup::ComponentDefinition
  • path 组件文件路径,就是我们的.skp文件路径;
从第一步我们就可以获取到我们需要导入的文件路径。


3、摆放组件

Model.place_component可以在模型中摆放我们想导入的模型

place_component(componentdef, repeat = false) ⇒ Sketchup::Model?
  • componentdef 从第二步获取到的 ComponentDefinition
  • repeat 是否重复导入,如果你只想导入一次就默认false,true可以多次创建我们想导入的模型

我们来整合一下放到插件结构里面即可:
toolbar = UI::Toolbar.new 'pricate_model_library'
cmd = UI::Command.new('pricate_model_library') do model = Sketchup.active_model com_path = UI.openpanel('Open Skp File', '', 'Skp Files|*.skp||') com_def = model.definitions.load com_path model.place_component(com_def)end
toolbar = toolbar.add_item cmdtoolbar.show

4、内置组件
如果我们使用频率非常高的组件,
我们也可以内置到插件里面。
下面我们找了三个莫比乌斯带形体组件来内置到插件里面去,
我们对上面的导入方法重写,
设置参数接收需要内置的模型名称
def self.place_in_model(name) skp = File.join(@modelsdir, name + '.skp') com_def = @model.definitions.load skp @model.place_component(com_def, true)end

然后我们遍历内置文件名来调用place_in_model插入多个插件。
shapes = %w[uzi_fir uzi_sec uzi_thir]shapes.each do |s| cmd = UI::Command.new(s.capitalize) { place_in_model(s) } cmd.small_icon = File.join(@imagesdir, s + '.png') cmd.large_icon = File.join(@imagesdir, s + '.png') cmd.tooltip = s.capitalize cmd.status_bar_text = 'Place ' + s + ' (multiple)' toolbar.add_item cmdend

上面有部@开头的实例变量
其实就是为了方便提取了部分会多次用到的变量。
为了项目规范我把模型和插件图标分别放到了各自的文件夹,
项目结构是这样的:
private_model_libs├── images│   ├── grow.png│   ├── import.png│   ├── uzi_fir.png│   ├── uzi_sec.png│   └── uzi_thir.png├── models│   ├── uzi_fir.skp│   ├── uzi_sec.skp│   └── uzi_thir.skp└── private_model_libs.rb
文件夹同级目录下还有个private_model_libs.rb来声明插件的一些其他信息,

比如插件名称版本号码作者等信息。


5、总结
这是一个结构轻巧的插件,
代码也经过了rubocop规范,
适合初学者学习如何制作插件。

其实内置的几个组件不一定是我们用的到的,
我们可以预留几个内置模型的位置,
用的时候每个人都可以修改成自己常用的组件。

维护好自己的组件库,
借用这种导入模式,
希望能有效的帮助各位小可爱提高工作效率。

公众号回复私有库获取完整插件。

修改private_model_libs.rbzprivate_model_libs.zip即可解压出插件源码。
欢迎小可爱们一起交流学习。

文章转载请注明出处author by Nicaicaiwo

扫一扫

109125.jpg

1 回复

admin
2022-8-12 19:33:14
楼主
作者:nicaicai



思路分析
  • 通过UI.openpanel读取内置/本地需要导入的模型 路径
  • 通过DefinitionList.load从文件 读取 组件
  • 通过Model.place_component来 放置 模型

1、选择.skp文件
UI.openpanel可以开启系统选择文件的窗口,
获取到选中文件的路径。
.openpanel(title, directory, filename) ⇒ String
  • title 选择文件窗口的标题;
  • directory 窗口默认打开的系统路径,可以不填,也可以指定到你模型库的路径;
  • filename 默认的文件名,可以通过UIname|wildcard||来筛选你需要打开的文件类型;
那我们只需要选择.skp文件,就可以这样写(过滤文件这个功能只在Windows上有效)
chosen_skp = UI.openpanel("Open Skp File", "", "Skp Files|*.skp||")

2、从.skp文件读取出组件
DefinitionList.load可以从文件读取出组件
load(path) ⇒ Sketchup::ComponentDefinition
  • path 组件文件路径,就是我们的.skp文件路径;
从第一步我们就可以获取到我们需要导入的文件路径。

3、摆放组件
Model.place_component可以在模型中摆放我们想导入的模型
place_component(componentdef, repeat = false) ⇒ Sketchup::Model?
  • componentdef 从第二步获取到的 ComponentDefinition
  • repeat 是否重复导入,如果你只想导入一次就默认false,true可以多次创建我们想导入的模型

我们来整合一下放到插件结构里面即可:
toolbar = UI::Toolbar.new 'pricate_model_library'​cmd = UI::Command.new('pricate_model_library') do  model = Sketchup.active_model  com_path = UI.openpanel('Open Skp File', '', 'Skp Files|*.skp||')  com_def = model.definitions.load com_path  model.place_component(com_def)end​toolbar = toolbar.add_item cmdtoolbar.show

4、内置组件
如果我们使用频率非常高的组件,
我们也可以内置到插件里面。
下面我们找了三个莫比乌斯带形体组件来内置到插件里面去,
我们对上面的导入方法重写,
设置参数接收需要内置的模型名称
def self.place_in_model(name)  skp = File.join(@modelsdir, name + '.skp')  com_def = @model.definitions.load skp  @model.place_component(com_def, true)end

然后我们遍历内置文件名来调用place_in_model插入多个插件。
shapes = %w[uzi_fir uzi_sec uzi_thir]shapes.each do |s|  cmd = UI::Command.new(s.capitalize) { place_in_model(s) }  cmd.small_icon = File.join(@imagesdir, s + '.png')  cmd.large_icon = File.join(@imagesdir, s + '.png')  cmd.tooltip = s.capitalize  cmd.status_bar_text = 'Place ' + s + ' (multiple)'  toolbar.add_item cmdend

上面有部份以@开头的实例变量
其实就是为了方便提取了部分会多次用到的变量。
为了项目规范我把模型和插件图标分别放到了各自的文件夹,
项目结构是这样的:
private_model_libs├── images│   ├── grow.png│   ├── import.png│   ├── uzi_fir.png│   ├── uzi_sec.png│   └── uzi_thir.png├── models│   ├── uzi_fir.skp│   ├── uzi_sec.skp│   └── uzi_thir.skp└── private_model_libs.rb
文件夹同级目录下还有个private_model_libs.rb来声明插件的一些其他信息,
比如插件名称版本号码作者等信息。

5、总结▼​
这是一个结构轻巧的插件,
代码也经过了rubocop规范,
适合初学者学习如何制作插件。

其实内置的几个组件不一定是我们用的到的,
我们可以预留几个内置模型的位置,
用的时候每个人都可以修改成自己常用的组件。

维护好自己的组件库,
借用这种导入模式,
希望能有效的帮助各位小可爱提高工作效率。


高级模式
游客
返回顶部