Blender와 FreeCAD를 조합하여 Loft 기능(복수 단면을 연결하는 기능)을 작성했다

동기 부여



회사에서 사용하는 유료 CAD의 Loft 기능이 너무 멋지기 때문에 Blender와 FreeCAD를 조합하여 자작했습니다. FreeCAD만으로도 할 수 있지만, 유감스럽지만 형상이나 포인트수에 의해서 잘 연결되지 않았기 때문에, 단면을 연결하는 기능은 Blender에 맡겼습니다.

환경 만들기 (windows10)


  • Anaconda3-5.2.0-Windows-x86_64 설치
  • FreeCAD와 Blender를 Anaconda 환경에 설치
  • conda install -c conda-forge freecad
    conda install -c kitsune.one python-blender 
    

    하고 싶은 일



    좌표(x, y, z)로 정의된 단면을 연결하여 CAD 형상을 만들고 싶다.
    ※CAE로 해석하기 위해서는, CAD형상이 편리하기 때문에. . . STL을 성공적으로 리메시하고 분석 할 수 있으면 좋겠다.

    했던 일


  • 단면 좌표를 pandas dataframe으로 정의 (회사에서는 Excel에서 읽습니다)

  • sectiondata.py
    import pandas as pd
    df1 = pd.DataFrame([[0.0, -0.16, -1.61],
                         [0.0, -1.86, -1.26],
                         [0.0, -1.67, 0.77],
                         [0.0, -0.14, 1.29],
                         [0.0, 1.08, 1.58],
                         [0.0, -0.16, -1.61]],columns=["x","y","z"])
    
    df2 = pd.DataFrame([[1.0, -0.76, -1.38],
                         [1.0, -1.77, -0.12],
                         [1.0, -1.1, 1.02],
                         [1.0, 0.14, 1.9],
                         [1.0, 0.9, 1.87],
                         [1.0, 1.31, 2.22],
                         [1.0, 0.99, -0.54],
                         [1.0, -0.17, -0.84],
                         [1.0, -0.76, -1.38]],columns=["x","y","z"])
    
    lim=(-3,3)
    df1.plot(x="y",y="z",xlim=lim,ylim=lim,linestyle='-',marker='.',title="section1")
    df2.plot(x="y",y="z",xlim=lim,ylim=lim,linestyle='-',marker='.',title="section2")
    

    【실행 결과】

  • blender에서 위의 좌표 점을 만들고 에지 루프 브리지로 3D 모양을 만들고 blnder 및 stl 형식으로 출력합니다.

    blender.py
    import bpy
    #立ち上げ時に存在するオブジェクト(立方体)を削除
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete(use_global=True)
    
    #前処理
    n1,n2 = len(df1),len(df2)#座標点の数を取得
    verts = pd.concat([df1,df2]).values.tolist()#blenderで認識できるように座標点をリスト化する
    faces = [[i for i in range(n1)], [i for i in range(n1,n1+n2)]]#各々の面を定義するリストを作成
    
    #Loftの作成
    mesh = bpy.data.meshes.new(name="test")
    mesh.from_pydata(verts,[],faces)#点と面を作成
    mesh.update
    obj = bpy.data.objects.new(name="test",object_data=mesh)
    scene =bpy.context.scene
    bpy.context.scene.objects.link(obj)
    bpy.context.scene.objects.active = obj
    bpy.ops.object.mode_set(mode = "EDIT")
    bpy.ops.mesh.bridge_edge_loops()#辺ループのブリッジ->ここでLoft形状が作成される
    bpy.ops.object.mode_set(mode = "OBJECT")
    
    #output
    bpy.ops.wm.save_mainfile(filepath="test.blend")#blenderfileを出力
    bpy.ops.export_mesh.stl(filepath="test.stl")#STLを出力
    

    【실행 결과】
    test.blender와 test.stl이 토출됩니다. 아래 그림과 같이 훌륭하게 Loft 해줍니다. Blender는 매우 우수합니다! ! !

  • 위의 stl을 FreeCAD로로드하고 stl에서 CAD 모양을 일으키고 iges 형식으로 내뿜는다

  • freecad.py
    import FreeCAD as APP
    import Mesh
    import Part
    
    freecad = APP.newDocument("model")
    
    meshobj = freecad.addObject("Mesh::Feature","MyMesh")
    meshobj.Mesh = Mesh.Mesh("test.stl")
    
    shape = Part.Shape()
    shape.makeShapeFromMesh(meshobj.Mesh.Topology,0.100000)
    freecad.addObject("Part::Feature","test").Shape=Part.Solid(shape)
    freecad.removeObject(meshobj.Name)
    freecad.recompute()
    freecad.saveAs("test.FCStd")
    Part.export([freecad.Objects[0]],"test.iges")
    

    【실행 결과】
    test.FCStd와 test.iges가 토출됩니다. CAD의 Solid가 되었습니다!


    소스 코드



    아래 사이트의 Loft.ipynb에 있습니다.
    htps : // 기주 b. 코 m / 미오 9494 / ぉ ft_ 훗 아츠레 _ py

    혼자


  • 계산 결과를 3D 프린터로 출력 할 수도 있습니다.
  • 지도 데이터의 등고선을 CAD화하거나 할 때도 도움이 될 것 (후지산을 CAD화 등)
  • 3D 스캐너의 결과를 CAD 화하여 CAE에 곱할 수 있어야합니다 (역 엔지니어링)

  • 포인트 클라우드를 CAD화하는 유료 소프트 등을 사용할 수 있으면, 고생하지 않아도 좋을지도. . . 좋은 점이 있으면 알려주세요.
    (뭐, 좋은 것도, 간단하게 사서 받을 수 없는 회사입니다만...하지만 덕분에, OpenSource에 동동 자세하게 되어 간다)

    좋은 웹페이지 즐겨찾기