首页/文章/ 详情

使用fish操作导入的geometry

2年前浏览4895

前言


    这串代码最初是我当年使用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    endloopend


    这里使用一个demo测试一下,为了方便参考,这里生成一个box。


image.png

image.png

image.png


    可以发现这个导入的车轮模型有点偏的严重了,可以用参数表发现这里的坐标范围是偏大的。


、将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,接着上一节的继续

image.png

image.png

image.png


    这里可以看出geometry成功的移动到了中心位置,而且坐标范围也得到了更新。


、将geometry放大缩小


    这里的函数可以将形状进行放大或者缩小,这里输入的n为尺寸的放大系数,大于1就是放大,小于1就是缩小。这里的算法也很简单,得到位置的中点坐标,然后以中点为中心进行矢量的放大缩小就可以了。


image.png

    这里用个demo测试一下,这里介绍一个技巧,可以先执行得到坐标范围的函数,然后放大系数为60/(x_max-x_min),对于对称图形来说,得以得到指定尺寸的形状,比如这里就是得到直径为60的车轮形状。












newdomain extent -10 10wall generate box -3 3geometry import chelun.dxf format dxf set 1call geo_tool@get_min_max(1)[nn=60/(x_max-x_min)]@sacle(1,@nn)

image.png

image.png


可以看出尺寸得到我们想要的了


、移动geometry


    这里道理更加简单了,不想讲,很好理解的。

image.png

、生成差不多还行的geometry




这里分别进行以下操作

1)得到坐标范围

2)缩小到直径为3

3)移动到坐标原点

4)移动到坐标为(3,3)的位置

5)导入为墙体

image.png

image.png


这里附上这个geo_tool的代码位置,大家可以学习一下,也可以补充更多的功能


链接:https://pan.baidu.com/s/1m1aZ5iM8yHmlzuKB6CczHQ
提取码:ee7p

代码&命令科普PFC
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-07-21
最近编辑:2年前
lobby
硕士 |擅长颗粒流PFC
获赞 873粉丝 4943文章 83课程 22
点赞
收藏
作者推荐
未登录
1条评论
仿真秀0427130320
签名征集中
7月前
老师,请问pfc3d可以这样用dxf文件生成dfn吗?
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈