查看原文
其他

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

2018-02-27 shadow 科技Mix设计Lab

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


环境准备

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


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

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 里。

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]


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

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! 清空下模型。然后,试下一下代码:

point1 = [0,0,0] point2 = [100,100,100] entities.add_edges(point1, point2)

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

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 的代码注释,单行使用的是 #

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

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! 清空下模型。然后,试下一下代码:

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

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


*

知识星球

更多 SketchUp 插件的开发,代码的下载,可以在知识星球交流。还包括:


1 看到一些好案例关键技术解决方案,写出文章又不成体系,发星球;

2 我会在知识星球发一些非常机密的研究心得;

3 一些非常有技巧的知识,给付费用户;

4 公众号的迭代版本,针对文章发更为升级、核心的内容。

5 当然,还有资深的专家在星球里。



*

热门文章

DIY一个Sketch插件,生成猫猫狗狗的全家福

我们利用周末尝试了一次CO-CODING活动

全栈设计+编程的方法论,以“猜对联”小程序为例


*

关于公众号:

本公众号定期更新人工智能&设计&科技内容。

谈点设计,敲点代码,偶尔创作点人工智能实验产品


码字不易,开启新的打赏方式:

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存