SketchUp的二次开发探索 (四)自动化建筑遐想

2023-12-29 10:10

本文主要是介绍SketchUp的二次开发探索 (四)自动化建筑遐想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我有一个梦想

如果能在地基内种建筑,那是多么美妙的一件事儿,晒晒太阳吹吹风,方案就生成了~ ▼

image

虽然,上面只是我做的一个概念图,但是,整天埋头画图的建筑师是否已经忽略了身边事物的发展?AI设计其实已经在我们身边,它如同BIM,VR设计一样席卷而来。可能踉踉跄跄,但一定会来。

计算机替代设计师已经不可避免,特别是对大多数做重复劳动的绘图员而言,更是如此。学会编程将和使用计算机一样变为大势所趋。

尽管不是编程专业,但已经有很多人在自学Ruby、Python等脚本语言,工作和生活上,用来爬虫、找方案爬资料,甚至在做设计,协同软件,非常方便。

SketchUp提供了丰富的Ruby API,让我们不限于现有的工具和插件来做设计。更能直接通过API操控我们的模型。

如果把建筑的生长封装成一个方法,接受各种场地/时间/天气/阳光等参数,那这样生长出来的建筑会是什么样的呢?


自动化建筑道阻且长,

需要各位建筑师的共同努力!!!

今天我们通过实现一个动态时钟,

来学习一些自动化操作模型的基础知识。

​动态时钟▼

细节展示

动态时钟准确匹配当前时间

思路分析

1、绘制表盘和表针

2、操控秒/分/时针旋转关系

3、根据当前时间初始化指针角度

​1、绘制表盘和表针▼ ​

绘制表盘和时钟

对应代码:(由于顶点参数太占位置简化了表达式)


# 初始化模型实例
ent = Sketchup.active_model.entities
​
# 表盘/时针/分针/秒针组件
group_circle = ent.add_group
group_hour = ent.add_group
group_minute = ent.add_group
group_second = ent.add_group
​
# 表盘
circle = group_circle.entities.add_circle [0,0.1,2.2],[0,1,0],2.2
circle_face = group_circle.entities.add_face circle
​
# 时针/分针/秒针 P1 P2 P3 P4 代表指针面的4个顶点坐标
face_hour = group_hour.entities.add_face Ph1,Ph2,Ph3,Ph4
face_minute = group_minute.entities.add_face Pm1,Pm2,Pm3,Pm4
face_second = group_second.entities.add_face Ps1,Ps2,Ps3,Ps4# 时针/分针/秒针填色
face_hour.material = "black"
face_minute.material = "black"
face_second.material = "red"# 表盘/时针/分针/秒针推拉出高度
circle_face.pushpull -0.1
face_hour.pushpull 0.015
face_minute.pushpull 0.015
face_second.pushpull 0.01

​2、操控秒/分/时针旋转关系

首先我们需要知道怎么操控一个组件旋转,

查看官方文档可以看到:


.rotation(point, vector, angle) ⇒ Geom::Transformation
point = Geom::Point3d.new(10, 20, 0)
vector = Geom::Vector3d.new(0, 0, 1)
angle = 45.degrees # Return 45 degrees in radians.
transformation = Geom::Transformation.rotation(point, vector, angle)

通过Geom::Transformation.rotation(point, vector, angle)即可创建一个旋转动效,

point旋转中心点

vector旋转平面向量

angle旋转角度

我们先来试试操控一条线旋转30度▼

image

对应代码:


mod = Sketchup.active_model # Open model
ent = mod.entities # All entities in model
sel = mod.selection # Current selection
​
# 旋转30度
tr = Geom::Transformation.new [0,0,0],[0,1,0],30.degrees
ent.transform_entities tr, sel

那么怎样才能让组件1秒之后旋转30度呢?

这时候我们需要用到延时动画,

我们找一下文档:


# Beep once after 10 seconds.
id = UI.start_timer(10, false) { UI.beep }

把我们的旋转动画放到3秒的延时动画里面:

image

对应代码:


mod = Sketchup.active_model # Open model
ent = mod.entities # All entities in model
sel = mod.selection # Current selection
# 旋转30度
tr = Geom::Transformation.new [0,0,0],[0,1,0],30.degrees
# 10s后开始
(0..20).each do |i|UI.start_timer(i+10,false){ent.transform_entities tr, sel}
end

再来分析一下时针/分针/秒针的旋转关系:

  • 秒针1秒旋转6度

  • 分针1 60秒旋转6度

  • 时针1 60 60 秒旋转30度


# 设置秒针/分针和时针的一次旋转角度
tr_ms = Geom::Transformation.new [0,0,2.2],[0,1,0],6.degrees
tr_h = Geom::Transformation.new [0,0,2.2],[0,1,0],30.degrees
​
# 设置1小时的持续时间
(0..60*60*1).each do |s|
# 9:10
UI.start_timer(s, false) {
group_second.entities.transform_entities tr_ms, group_second
puts "sec:"+s.to_s
}
UI.start_timer(s*60, false) {
group_minute.entities.transform_entities tr_ms, group_minute
puts "min"+s.to_s
}
UI.start_timer(s*60*60, false) {
group_hour.entities.transform_entities tr_h, group_hour
puts "hour"+s.to_s
}
end

如果想要指针更圆滑的旋转,

可以拆分一下角度,

比如每0.1秒旋转0.6度。

​3、根据当前时间初始化指针角度

最后我们来处理一下指针初始角度,对应上当前的时间。

在Ruby中可用Time.new来获取当前时间,

然后计算出指针到12点的夹角度数。


# 获取当前时间转换成指针的初始角度
time = Time.new
tr_hour = Geom::Transformation.new [0,0,0],[0,1,0],time.hour*30.degrees
tr_min = Geom::Transformation.new [0,0,0],[0,1,0],time.min*6.degrees
tr_sec = Geom::Transformation.new [0,0,0],[0,1,0],time.sec*6.degrees
​
# 旋转相应角度
group_hour.entities.transform_entities tr_hour, group_hour
group_minute.entities.transform_entities tr_min, group_minute
group_second.entities.transform_entities tr_sec, group_second

至此我们就实现了我们的目标效果。

最后我把这个时钟做成了一个插件,

动态时钟插件

交互窗口

扫描下方二维码,

关注公众号Nicaicaiwo,

回复 时钟,

即可免费获取

关注公众号获取更多有趣脚本

这篇关于SketchUp的二次开发探索 (四)自动化建筑遐想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549188

相关文章

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.