建筑师编程指南之SketchUp插件开发 1
本系列指南使用的是 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.messagebox 是 SketchUp 里的提示框,类似于 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 添加进 model 的 entities 里。
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 来添加直线,SketchUp 叫 edges 。先使用 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 当然,还有资深的专家在星球里。
*
热门文章
*
关于公众号:
本公众号定期更新人工智能&设计&科技内容。
谈点设计,敲点代码,偶尔创作点人工智能实验产品。
码字不易,开启新的打赏方式: