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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用

title: 深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用 date: 2024/6/23 updated: 2024/6/23 author: cmdragon excerpt: 摘要:“本文深入探讨了Nuxt3 Composables,重点介绍了其目录架构和内置API的高效应用。通过学习本文,读者将能够更好地理解和利用Nuxt3 Composabl

文华财经T8自动化交易程序策略模型指标公式源码

文华财经T8自动化交易程序策略模型指标公式源码: //定义变量 //资金管理与仓位控制 8CS:=INITMONEY;//初始资金 8QY:=MONEYTOT;//实际权益 8QY1:=MIN(MA(8QY,5*R),MA(8QY,2*R)); FXBL:=N1; DBKS:8QY1*N1;//计算单笔允许亏损额度 BZDKS:=MAX(AA-BB,N*1T)*UNIT; SZDKS:=MAX(

Selenium进行Web自动化测试

Selenium进行Web自动化测试 Selenium+Python实现Web自动化测试一、环境配置 Selenium+Python实现Web自动化测试 一、环境配置 环境基于win10(X64) 安装Python;安装PyCham安装chomedriver chomedriver下载地址 可以查看本地chrome软件版本下载对应的chomedriver,如果没有则下载最新

三十八篇:架构大师之路:探索软件设计的无限可能

架构大师之路:探索软件设计的无限可能 1. 引言:架构的艺术与科学 在软件工程的广阔天地中,系统架构不仅是设计的骨架,更是灵魂所在。它如同建筑师手中的蓝图,决定了系统的结构、性能、可维护性以及未来的扩展性。本节将深入探讨软件架构的定义、其在系统设计中的核心作用,以及不同架构风格对系统特性的影响。 软件架构的定义及其在系统设计中的核心作用 软件架构,简而言之,是指软件系统的基本组织结构,

uni-CMS:全端开源内容管理系统的技术探索

摘要 本文介绍了uni-CMS,一个基于uniCloud开发的开源内容管理系统(CMS)。该系统旨在帮助开发者快速搭建并管理内容丰富的网站、小程序和移动应用。通过其全端渲染、内容安全检测、广告解锁付费内容以及AI生成文章等特性,uni-CMS不仅提高了开发效率,还促进了内容生产效率的提升和变现能力的增强。本文详细探讨了uni-CMS的技术架构、功能特性以及实施步骤,为开发者提供了一个全面的技术参

selenium Python自动化测试(基本的键盘事件)

#coding=utf-8 ''' Created on 2015-5-10 @author: user ''' ''' 几种常用的键盘指令: send_keys(Keys.BACK_SPACE) 删除键(BackSpace) send_keys(Keys.SPACE) 空格键(Space) send_keys(Keys.TAB) 制表

WebDriver基本操作入门及UI自动化练手页面

在这里集中了我们在做UI自动化时常见的一些控件操作。希望能对新手有帮助。 下载地址:http://files.cnblogs.com/zhangfei/demo.rar package com.test;import java.util.List;import java.util.Set;import org.openqa.selenium.Alert;import org.o