首页/文章/ 详情

使用fish操作导入的geometry

1年前浏览4060

前言


    这串代码最初是我当年使用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
          最近编辑:1年前
          lobby
          硕士 |擅长颗粒流PFC
          获赞 834粉丝 4505文章 84课程 21
          点赞
          收藏
          作者推荐
          未登录
          1条评论
          仿真秀0427130320
          签名征集中
          3月前
          老师,请问pfc3d可以这样用dxf文件生成dfn吗?
          回复
          课程
          培训
          服务
          行家
          VIP会员 学习 福利任务 兑换礼品
          下载APP
          联系我们
          帮助与反馈