前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >建筑师编程指南之SketchUp插件开发 1

建筑师编程指南之SketchUp插件开发 1

作者头像
mixlab
发布2018-04-17 15:48:18
2.1K0
发布2018-04-17 15:48:18
举报

本系列指南使用的是 SketchUp2018 最新版本,基于 ruby 语言进行插件开发。

1

环境准备

先下载一个扩展,用于方便调试代码:

https://github.com/Aerilius/sketchup-console-plus

打开 Extension Manager

选择 Install Extension

安装成功后,打开,界面如下:

这样,我们可以输入多行代码,并且代码也有了提示功能了~

2

SketchUp模型

通过 Sketchup.active_model 获取当前的 SketchUp 模型,它充当大多数 Ruby API 交互的“入口”。通过 model 下的各种方法,进行相关的操作,详情可以参看 API 文档:

http://ruby.sketchup.com/Sketchup/Model.html

其中, UI.messageboxSketchUp 里的提示框,类似于 web 开发的 alert

代码语言:javascript
复制
model = Sketchup.active_model

entities = model.entities
layers = model.layers
materials = model.materials
component_definitions = model.definitions
selection = model.selection

first_entity = entities[0]
UI.messagebox("First thing in your model is a #{first_entity.typename}")

number_materials = materials.length
UI.messagebox("Your model has #{number_materials} materials.")

3

添加点

通过 Geom::Point3d.new 构造一个空间点,再通过 add_cpoint 添加进 modelentities 里。

代码语言:javascript
复制
model = Sketchup.active_model
entities = model.active_entities

point1 = Geom::Point3d.new(100,200,300)

constpoint = entities.add_cpoint point1

if (constpoint)
  UI.messagebox constpoint
else
  UI.messagebox "Failure"
end

ps:

构造点也可以通过 point1 = [100,200,350]

试一下生成大批量的随机点吧!

代码语言:javascript
复制
model = Sketchup.active_model
entities = model.active_entities

for i in 0..1000

  r1=rand(0)>0.5?1:(-1)
  r2=rand(0)>0.5?1:(-1)

  x=i*rand(100)*r1*r2
  y=i*rand(100)*r1*r2
  z=i*rand(200)*r1*r2

  puts "x:#{x},y:#{y},z:#{z}"
  point = [x,y,z]
  constpoint = entities.add_cpoint point

end

效果如下图:

4

添加直线

通过 model.entities 来添加直线,SketchUpedges 。先使用 entities.clear! 清空下模型。然后,试下一下代码:

代码语言:javascript
复制
point1 = [0,0,0] 
point2 = [100,100,100] 
entities.add_edges(point1, point2)

改造下上文随机生成空间点的代码:

代码语言:javascript
复制
model = Sketchup.active_model
entities = model.active_entities
points=[]

for i in 0..1000

  r1=rand(0)>0.5?1:(-1)
  r2=rand(0)>0.5?1:(-1)

  x=i*rand(100)*r1*r2
  y=i*rand(100)*r1*r2
  z=i*rand(200)*r1*r2

  #puts "x:#{x},y:#{y},z:#{z}"
  point = [x,y,z]
  points.push(point)

  entities.add_edges(points[points.length-2], point)
  #constpoint = entities.add_cpoint point

end

ps:

ruby 的代码注释,单行使用的是 #

一团乱麻~哈哈,我们再改造下代码。

代码语言:javascript
复制
model = Sketchup.active_model
entities = model.active_entities
points=[[0,0,0]]

for i in 0..500
  p=points[points.length-1]
  r1=rand(0)>0.5?1:(-1)
  r2=rand(0)>0.5?1:(-1)

  x=p[0]+i*rand(1000)*r1*r2
  y=p[1]+i*rand(1000)*r1*r2
  z=p[2]+i*rand(2000)*r1*r2

  #puts "x:#{x},y:#{y},z:#{z}"
  point = [x,y,z]
  points.push(point)

  entities.add_edges(points[points.length-2], point)
  #constpoint = entities.add_cpoint point

end

空间随机生长的一个折线:

5

空间折线构筑物

SketchUp 通过 entities.add_face 添加面。先使用 entities.clear! 清空下模型。然后,试下一下代码:

代码语言:javascript
复制
model = Sketchup.active_model
entities = model.active_entities
points=[[0,0,0]]

for i in 0..500
  p=points[points.length-1]
  r1=rand(0)>0.5?1:(-1)
  r2=rand(0)>0.5?1:(-1)

  x=p[0]+i*rand(200)
  y=p[1]+i*rand(20)*r1*r2
  z=i*rand(100)

  #puts "x:#{x},y:#{y},z:#{z}"
  
  point = [x,y,z]
  entities.add_edges(p, point)
  points.push(point)

  #constpoint = entities.add_cpoint point

  if points.length>3
      
      p1 = points[points.length-3]
      p2 = points[points.length-2]
      p3 = points[points.length-1]

      entities.add_face(p1, p2, p3, p1)
  end

end

多生成几个就可以达到下图效果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科技Mix设计Lab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档