前言
这串代码最初是我当年使用PFC做循环单剪的时候,我需要从外部导入空心圆柱体来模拟叠环,导入折叠的形状模拟墙体的粗糙度。因为画图的时候比较粗糙,没有注意好大小和数量级,导致导入的时候发现墙体超级无敌大,这时候便需要自己写一下fish来操作一下geometry来调整到自己需要的样子。为了方便理解,这里使用二维的作为讲解。
我们首先使用geometry import 将外部的dxf或者stl文件导入为geometry格式。
geometry import chelun.dxf format dxf set 1
一、得到geometry坐标范围
这里先讲第一部分,也是导入形状后的第一个操作,读取形状geometry的尺寸。这里使用loop foreach local gn geom.node.list(gs)来遍历geometry中所有的节点(node)。然后比较大小,得到geometry的尺寸范围,也就是node坐标的最大值和最小值。这里的x_min、x_max、y_min、y_max为坐标的尺寸范围。这个函数会经常用到,我们需要这个来知道我们需要的geometry的定位。
def get_min_max(id)
global x_min=1e100
global x_max=-1e100
global y_min=1e100
global y_max=-1e100
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
local pos = geom.node.pos(gn)
if x_min > comp.x(pos)
x_min = comp.x(pos)
endif
if y_min > comp.y(pos)
y_min = comp.y(pos)
endif
if x_max < comp.x(pos)
x_max = comp.x(pos)
endif
if y_max < comp.y(pos)
y_max = comp.y(pos)
endif
endloop
end
这里使用一个demo测试一下,为了方便参考,这里生成一个box。
可以发现这个导入的车轮模型有点偏的严重了,可以用参数表发现这里的坐标范围是偏大的。
二、将geometry移动到原点
第二个部分也是比较常用的,一般执行一次就可以了,这个函数的作用是将geometry移动到坐标原点。这里的代码可以看见,执行的时候首先读取坐标范围,然后减去范围的一半,就可以实现移动到原点的作用
def moveToOrigin(id)
get_min_max(id)
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
geom.node.pos.x(gn)=geom.node.pos.x(gn)-(x_max x_min)*0.5
geom.node.pos.y(gn)=geom.node.pos.y(gn)-(y_max y_min)*0.5
endloop
get_min_max(id)
end
下面为测试的demo,接着上一节的继续
这里可以看出geometry成功的移动到了中心位置,而且坐标范围也得到了更新。
二、将geometry放大缩小
这里的函数可以将形状进行放大或者缩小,这里输入的n为尺寸的放大系数,大于1就是放大,小于1就是缩小。这里的算法也很简单,得到位置的中点坐标,然后以中点为中心进行矢量的放大缩小就可以了。
这里用个demo测试一下,这里介绍一个技巧,可以先执行得到坐标范围的函数,然后放大系数为60/(x_max-x_min),对于对称图形来说,得以得到指定尺寸的形状,比如这里就是得到直径为60的车轮形状。
new
domain extent -10 10
wall generate box -3 3
geometry import chelun.dxf format dxf set 1
call geo_tool
@get_min_max(1)
[nn=60/(x_max-x_min)]
@sacle(1,@nn)
可以看出尺寸得到我们想要的了
三、移动geometry
这里道理更加简单了,不想讲,很好理解的。
四、生成差不多还行的geometry
这里分别进行以下操作
1)得到坐标范围
2)缩小到直径为3
3)移动到坐标原点
4)移动到坐标为(3,3)的位置
5)导入为墙体
这里附上这个geo_tool的代码位置,大家可以学习一下,也可以补充更多的功能