当我们在进行建模的时候,如果希望根据数据不同的属性构建模型,在GUI中可能设置起来有一定的难度,本文以原本宽度不一致的道路为例,介绍如何使用Python来增加这些道路的宽度。
- 创建新的Python脚本
在菜单中选择File → New ... → Python → Python Module,在向导中确定脚本的存储位置以及名称命名为:setStreetWidths,并且选择Module:Main模板。
2. 在python编辑器中添加下面的语句
def incrementStreetWidth(increment):
selectedSegments = ce.getObjectsFrom(ce.selection, ce.isGraphSegment)
for segment in selectedSegments:
oldWidth = ce.getAttribute(segment, "/ce/street/streetWidth")
newWidth = oldWidth+increment
ce.setAttribute(segment, "/ce/street/streetWidth", newWidth)
这些代码的含义是找到场景中的线段,获取到这些线段的streetWidth属性值,并该值赋给oldWidth,然后给oldWidth都增加一定的宽度值increment之后,作为新的道路宽度值newWidth,最后将newWidth再赋到线段的streetWidth属性中去。
通过这段代码就可以给原本道路宽度不一样的数据同时扩宽,而不需要手动去分别选择道路并修改街道宽度值了。
上面写好的incrementStreetWidth()函数要添加到main()中进行调用,并写入拓宽的值:
if __name__ == '__main__':
incrementStreetWidth(10)
选择一部分道路,运行脚本。
执行脚本的过程中需要略微等待一几秒,这是因为脚本执行的过程中是在独立的线程并且每个命令运行之后都会更新GUI以及3D视图窗口。在上面这个例子中,每次调用setAttribute()的时候,都会更新道路网络并且重新绘制3D视图窗口。为了使脚本执行速度更快一些,可以在写的函数前面添加@noUIupdate标识符:
@noUIupdate
def incrementStreetWidth(increment):
添加标识符之后,会阻止GUI更新从而加快脚本的运行。但要注意,有时候在多个函数前面使用@noUIupdate的时候可能会冻结用户界面。如果使用了@noUIupdate后遇到UI冻结或者其他意外的结果,尝试修改脚本,使得@noUIupdate只标记在简单而具体的某个函数前面,而不要放在整个脚本前面。
下面要写的另一个函数是同时设置几个属性:streetWidth、sidewalkWidthLeft、sidewalkWidthRight,可以指定道路按照原宽度一定的倍数拓宽。
@noUIupdate
def multiplySegmentWidths(factor):
selectedSegments = ce.getObjectsFrom(ce.selection, ce.isGraphSegment)
for segment in selectedSegments:
multiplyAttribute(segment, "/ce/street/streetWidth", factor)
multiplyAttribute(segment, "/ce/street/sidewalkWidthLeft", factor)
multiplyAttribute(segment, "/ce/street/sidewalkWidthRight", factor)
def multiplyAttribute(object, attrname, factor):
oldval = ce.getAttribute(object, attrname)
newval = oldval*factor
ce.setAttribute(object, attrname, newval)
if __name__ == '__main__':
multiplySegmentWidths(1.5)
以上代码指定了扩展的倍数,用原有宽度值乘以扩大的倍数,并将新的宽度值赋给相应的属性。选择一些道路数据,运行脚本,就可以看到道路以及两侧的人行道按照倍数扩宽了。
以上代码也可以在Python控制台中进行调用:
>> scriptpath = ce.toFSPath("scripts")
>> sys.path.append(scriptpath)
>> import setStreetWidth
>> setStreetWidths.multiplySegmentWidths(0.5)
以上便是通过Python来对道路模型进行修改的示例,可以帮助我们快速完成模型的修改。