2017-10-24 24 views
1

Autodesk Fusion 360を使用して3D部品をモデリングしています(下図参照)。これをエクスポートして.step、.iges、.sat、または.smtファイル。PythonでCADオブジェクトをインポートし、配列として保存

私が達成しようとしているのは、この部分をPythonで3D numpy配列に変換することです。アレイの各要素は、その位置に固体物質があるか全く物質(空気)がないかを示すまたはとなります。

たとえば、私のオブジェクトが図の寸法を持つ場合、サイズ100x100x50の配列の各要素は、オブジェクトの1 のボリュームを表します。すべての明るい青色の小さな立方体は、の値を持ち、この位置にソリッドマテリアルがあることを示します。赤い立方体はの値を持ち、このスペースはソリッドマテリアルではないことを示します。

enter image description here

これはFreeCADのAPIを使用して行うことができますか?あるいは、.step/.iges/.sat/.smtファイルをPythonでインポートし、それを変換/解析して必要な配列を作成する他の方法はありますか?

答えて

0

小さな部分に分割することができます。次の例は、 /Mod/Part/BOPTools/SplitFeatures.pyです。しかし、あなたのニーズに応える準備ができておらず、採用する時間が必要です。

import FreeCAD 
import Part 
import numpy as np 

# Creating sample parts 
solid_ = Part.makeBox(10, 10, 10) 
shell_ = Part.makeShell(solid_.Shells) 
part_compound = [solid_, shell_] 

# Generate numpy array 
result = [] 
for part in part_compound: 
    result = [*result, [part.CenterOfMass.x, 
         part.CenterOfMass.y, 
         part.CenterOfMass.z, 
         isinstance(part, Part.Solid)]] 
print(np.array(result)) 

これは、配列を、なります: https://www.freecadweb.org/wiki/Part_Slice

は、その後、あなたがnumpyの配列を構築するために、このコードを使用することがあります。しかし、間違いなくそれはあなたが好きな任意の形状の多くの部分に一部を分割することが可能です各部分の重心はx、y、zによって示され、4番目の要素はその部分が中実であれば1、それ以外なら0である。 https://github.com/ZhukovGreen/docker-freecad-cli

+0

'* result'は私にエラーを与えます。その上に、私はあなたのコードが私に全体の部分の質量の中心を与えると思う。私は最初OPで見ることができる小さなティカルキューブの部分を分割し、それぞれを表すポイントの配列を取得します。 – DimP

+0

@DimP私はエラーの理由はあなたが別のバージョンのPythonを使用していると思います。私は3.6(https://github.com/ZhukovGreen/docker-freecad-cli)です。 –

+0

@DimP '小口腔キューブ'と 'それぞれを表現する点の配列 'の背後にあるあなたの考えを理解しているかどうかはわかりません。キューブが1つ1つある場合、その位置を説明するために、マス中心座標 –

0

は私が最終的に私のために動作し、実際に私が達成しようとしているものをよりよく説明するかもしれない方法を発見した:

コードは、Python 3.6でのみ、そのドッキングウィンドウの画像を使用する互換性があります。

FreeCADには、「ポイント」ワークベンチをアクティブにした後で、オブジェクトを「point cloud」に変換するオプションがあります。各ポイントには質量がなく、新しいポイントクラウド構造全体をスペースで区切られた '.asc'ファイルにエクスポートできます。

その後、Pythonのnumpy配列にこれをインポートするのは簡単です。私は個人的にvoxel-based表現を使用して、インポートされたオブジェクトをPythonで視覚化しました。これは最新のmatplotlibまたはmayavi(これらは私が少なくとも試した2つです)を使用して行うことができます。

0

ポイントは、固体の内側にある場合は、チェックすることができます。

solid_shape.isInside(point:App.Vector, tolerance:float, on_boundary_is_inside:bool) 

は例:

import numpy as np 
import FreeCAD as App 
import Part 

num_pts = 50 

shape = Part.makeSphere(1) # radius 
bb = shape.BoundBox 
x = np.linspace(bb.XMin, bb.XMax, num_pts) 
y = np.linspace(bb.YMin, bb.YMax, num_pts) 
z = np.linspace(bb.ZMin, bb.ZMax, num_pts) 

mesh_x = np.array([[x] * num_pts] * num_pts).transpose(0, 1, 2) 
mesh_y = np.array([[y] * num_pts] * num_pts).transpose(2, 0, 1) 
mesh_z = np.array([[z] * num_pts] * num_pts).transpose(1, 2, 0) 

mesh = np.array([mesh_x.flatten(), mesh_y.flatten(), mesh_z.flatten()]).T 
bool_array = np.array([shape.isInside(App.Vector(p), 0.000001, False) for p in mesh]) 

v_r = float(sum(bool_array))/float(len(bool_array)) 
v_r # estimation of Volumeratio 
関連する問題