2017-10-24 6 views
1

Autodesk Fusion 360을 사용하여 3D 부품을 모델링했습니다 (아래 그림 참조). 그런 다음 .step, .iges, .sat 또는 .smt로 내보내고 저장할 수 있습니다. 파일.Python에서 CAD 객체 가져 오기 및 배열로 저장

내가 이룩하고자하는 것은이 부분을 파이썬에서 3D numpy 배열로 변환하는 것입니다. 배열의 모든 요소는 그 위치에 고체 물질이 있는지 전혀 없음 (공기)인지를 나타내는 또는 이됩니다.

예를 들어, 내 개체의 크기가 그림 크기 인 경우 크기가 100x100x50 인 배열의 각 요소는 1mm 의 개체를 나타냅니다. 모든 밝은 파란색 작은 큐브는 의 값을 가지고이 위치에 단단한 재료가 있음을 나타내고 빨간색 큐브는 의 값을 갖게됩니다. 이는이 공간이 단단한 재료로 구성되지 않음을 나타냅니다.

enter image description here

이는 FreeCAD API를 사용하여 수행 할 수 있을까요? 또는 파이썬에서 .step/.iges/.sat/.smt 파일을 가져 와서 변환/구문 분석하여 필요한 배열을 생성하는 다른 방법이 있습니까?

답변

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로 표시되고 네 번째 요소는 해당 부분이 솔리드이면 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 by 1 인 경우 위치를 설명하기 위해 매스 중심 좌표를 부여합니다. –

0

가 드디어 나를 위해 작동 실제로 내가 달성하기 위해 노력하고 무엇을 더 잘 설명 할 수있는 방법을 발견했다 :

코드는 파이썬 3.6 만, 그래서 고정 표시기 이미지를 사용하여 호환됩니다.

분명히 FreeCAD에는 "Points"워크 벤치를 활성화 한 후에 객체를 "point cloud"으로 변환 할 수있는 옵션이 있습니다. 각 점에는 질량이없고 새로운 점 구름 구조 전체를 공간으로 구분 된 '.asc'파일로 내보낼 수 있습니다.

그 후, 이것을 파이썬 numpy 배열로 임포트하는 것은 간단합니다. 개인적으로 voxel-based 표현을 사용하여 Python에서 가져온 객체를 시각화했습니다.이 객체는 최신 matplotlib 또는 mayavi를 사용하여 수행 할 수 있습니다 (이 중 적어도 두 가지를 시도했습니다). 포인트는 고체의 내부에있는 경우

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