본문 바로가기
반응형

stl16

numpy-stl mesh 데이터를 pyvista PolyData 로 바꾸기가 힘든 이유 numpy-stl 의 mesh 모듈에서 stl 을 생성하는 방식을 먼저 알아보겠습니다. mesh 모듈에서는 하나의 face 를 구성하는 점의 좌표만을 이용하여 face 를 정의합니다. 어떤 face1 을 구성하는 점의 좌표가 p1,p2,p2 라고 한다면 아래와 같이 정의되는 것입니다. face1=[p1,p2,p3] p1,p2,p3는 각각 크기가 3인 벡터입니다. 반면! pyvista 는 사용할 점들을 모아놓은 배열을 정의하고, 배열의 인덱스를 가져다가 face 를 정의합니다. 예를들어 face1 을 구성하는 점이, 점들을 모아놓은 배열에서 각각 2,8,4 번째라면 face1 은 아래와 같이 정의됩니다. face1=[2,8,4] 자, 이제 numpy-mesh 로 정의된 stl 을 pyvista 로 변환해야.. 2023. 12. 8.
[파이썬] STL을 평면으로 자르기 #8. 속도개선 2초대로 줄임 pyvista 쓰던걸 numpy-stl 모듈로 바꿨다. 속도가 2초대로 줄었다. time5=[] for i in range(5): import timeit time_start = timeit.default_timer() # 시작 시간 체크 import os import numpy as np from stl import mesh from skspatial.objects import Plane from skspatial.objects import Point from skspatial.objects import Line #STL 가져오기 ctl = mesh.Mesh.from_file('python_stl\CAT.stl') #STL 불러오기 #교점 찾기 inter_point=np.zeros(3) #교점이 저장될.. 2022. 2. 8.
[파이썬] STL을 평면으로 자르기 #7. 속도개선 4초대로 줄임 평면의 어느편에 있는지 판단하는걸 패키지 함수를 사용했었는데, 직접 계산하도록 수정했다. >>> time4 [4.5958613000002515, 4.686201099997561, 4.7097910000011325, 4.7155559999991965, 4.911541900000884] 4초대로 줄었다. 더 줄일 수 있을까. 2022. 2. 6.
[파이썬] STL을 평면으로 자르기 #6. 시간 잡아먹는 부분 확인 else 문을 지워봤는데 시간차이가 별로 없다. 아마 else 문에 걸리는 점들이 몇개 없어서 그런 것 같다. if문 자체를 빼봤는데 시간차이가 없다. 뭐지...여기서 비교연산 등을 수행하는건 시간이 거의 들지 않는다는 말인가. 평면의 어느 쪽에 있는지 구하는 코드를 지웠더니 시간이 2초대로 줄어든다. 아래는 시간변화다. >>> time3_original [16.10053549999975, 13.224060499999723, 14.326108700000077, 16.356680699999743, 13.758388700000069] >>> time3 [2.8779554000002463, 2.8111312999999427, 2.914083199999368, 2.9338815999999497, 2.833796.. 2022. 2. 6.
[파이썬] STL을 평면으로 자르기 #5. 속도개선 시도 (성공) if 문에서 계산 후 비교하는 것을 그냥 비교하는걸로 바꿨다. 시간이 약간 줄었다. >>> time2 [13.642363099999997, 11.509126199999997, 13.2013338, 17.86278129999998, 12.619769899999994] >>> time3 [10.019133699999998, 10.265788899999961, 10.640305100000091, 11.123026500000037, 11.977286100000015] 2022. 2. 6.
[파이썬] STL을 평면으로 자르기 #4. 속도개선 시도 왼쪽 코드를 오른쪽과 같이 바꿨다. 평면 어느 쪽에 있는지 여부를 계산하는 것을 처음에만 하고 변수에 넣었다. 시간이 오히려 늘었다. 큰 의미없는 차이다. >>> time [16.898227600000155, 17.11739409999973, 16.90786509999998, 16.87015599999995, 17.234067800000048] >>> time2 [17.96122940000032, 16.95500889999994, 17.137785200000053, 17.103367199999866, 17.54229200000009] 2022. 2. 5.
[파이썬] STL을 평면으로 자르기 #3. 속도개선 (20초 근처로 단축) 코드 실행속도를 개선하기 위해 for 문을 아래와 같이 수정해보았다. for i in range(ctl.n_cells-1): #교점을 찾는 for문 p1=ctl.cell_points(i)[0] p2=ctl.cell_points(i)[1] p3=ctl.cell_points(i)[2] if (pl.side_point(p1)+pl.side_point(p2))*pl.side_point(p3)==2 : pass else : if pl.side_point(p1)*pl.side_point(p2)==-1 : inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p1,p2)))) if pl.side_point(p1)*pl.side_point(p3)=.. 2022. 2. 5.
[파이썬] STL을 평면으로 자르기 #2. 코드 실행 시간 계산하기 생각보다 실행시간이 너무 오래걸려서 코드를 개선하며 시간을 단축시키려고 한다. 시간이 단축되는지 알려면 먼저 코드 실행시간을 측정해야한다. timeit 패키지를 사용한다. 시작한 시각을 측정하고, 종료 시각을 측정해서 그 차이를 구하면 소요시간이다. 아래와 같이 코드 맨 앞과 뒤에 입력하면 된다. import timeit time_start = timeit.default_timer() # 시작 시각 체크 import os import numpy as np import pyvista as pv from skspatial.objects import Plane from skspatial.objects import Point from skspatial.objects import Line #코드 실행시간 확인 #.. 2022. 2. 5.
파이썬 pyvista 모듈에서 stl 병진,회전,변환(translate, rotate, transform) 넘파이와, pyvista 모듈을 불러옵니다. import numpy as np import pyvista as pv mesh 하나를 정의합시다. import numpy as np import pyvista as pv # mesh points vertices = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0.5, 0.5, -1]]) # mesh faces faces = np.hstack([[4, 0, 1, 2, 3], # square [3, 0, 1, 4], # triangle [3, 1, 2, 4]]) # triangle mesh = pv.PolyData(vertices, faces) 병진,회전,변환 메소드는 아래와 같이 사용합니다. STL.tran.. 2021. 11. 8.
[파이썬] STL을 평면으로 자르기 #1. 교점구하기 STL과 내가 지정한 평면 사이의 교점을 얻는 코드를 짜보았다. 고양이 모델을 사용했다. 먼저 사용한 고양이 모델을 공유한다. 평면을 하나 만들고 교점을 구했다. 평면은 skspatial 패키지를 사용했다. STL을 불러와 교점을 구하는데는 numpy-stl 패키지를 사용했고, 시각화에는 pyvista 패키지를 사용했다. 평면,선 등 정의 및 계산 : skspatial 패키지 STL 불러와 계산 : numpy-stl 패키지 시각화 : pyvista 패키지 결과는 아래와 같다. 코드는 아래와 같다. 설명은 주석에 써놓았다. import os import numpy as np import pyvista as pv from skspatial.objects import Plane from skspatial.ob.. 2021. 10. 26.
파이썬에서 stl 파일 다루는 패키지 소개(numpy-stl) STL 파일은 삼각 매쉬형태로 된 3차원 파일입니다. 파이썬에서 STL 파일을 다룰 때는 stl 패키지를 사용합니다. stl 패키지는 numyp 에 의존합니다. array를 사용한다는 말입니다. 아래와 같이 설치합니다. pip install numpy-stl stl 패키지 안에는 아래와 같은 다섯개의 모듈이 있습니다. stl.Mesh stl.main stl.base stl.mesh stl.stl stl 파일을 다룰 때는 mesh 모듈을 사용하며 아래와 같이 불러서 사용합니다. import numpy as np from stl import mesh cat.stl 이라는 파일을 갖고 있다고 합시다. stl을 불러오는 방법은 아래와 같습니다. ctl = mesh.Mesh.from_file('cat.stl') .. 2021. 10. 22.
[파이썬과 STL] 5. 두 점과 평면의 교점 함수 사용해보기 [파이썬과 STL] 5. 두 점과 평면의 교점 함수 사용해보기 지난시간에 정의한 함수를 사용해봅시다. import numpy as np def po2pl1(p,q,a,N): P_p=np.dot(N,p)-np.dot(N,a) P_q=np.dot(N,q)-np.dot(N,a) result=P_p*P_q if result>0: print("no intersection point") else : return abs(P_q)/(np.abs(P_p)+np.abs(P_q))*p+abs(P_p)/(np.abs(P_p)+np.abs(P_q))*q 평면은 (0,5,0)을 지나고, 법선벡터로 (0,1,0)을 갖는 평면입니다. a=np.array([0,5,0])N=np.array([0,1,0]) 점은 아래와 같이 세 점이 있.. 2020. 11. 12.
[파이썬과 STL] 4. 두 점과 평면의 교점 함수 [파이썬과 STL] 4. 두 점과 평면의 교점 함수 지난시간에 두 점과 평면의 교점을 구한 코드를 가져옵시다. import numpy as np #두 점p=np.array([2,4,5])q=np.array([-4,-2,-6]) #평면a=np.array([1,3,2])N=np.array([2,3,5]) #두 점의 평면의방정식 함수값P_p=np.dot(N,p)-np.dot(N,a)P_q=np.dot(N,q)-np.dot(N,a) #결과, 음수인 경우 교점 존재result=P_p*P_q #교점inter_p=abs(P_q)/(np.abs(P_p)+np.abs(P_q))*p+abs(P_p)/(np.abs(P_p)+np.abs(P_q))*q 이제 함수로 바꿔봅시다. 아래와 같이 바꿨습니다. def po2pl1(p,.. 2020. 11. 12.
[파이썬과 STL] 3. 두 점과 평면의 교점 [파이썬과 STL] 3. 두 점과 평면의 교점 STL 을 평면으로 잘라서 section 을 얻고 싶습니다. 이를 위해 평면과 두 점을 입력하면 두 점을 연결한 선분과 평면의 교점을 구해주는 함수가 필요합니다. 교점이 없는 경우는 아무 것도 반환하지 않고, 교점이 있는 경우는 점을 반환합니다. 평면은 한 점과, 법선벡터로 정의됩니다. 한점 (a,b,c)법선벡터 (n1,n2,n3) 위 두 조건을 만족하는 평면의 방정식은 아래와 같습니다. P(x,y,z)라고 놓겠습니다. P(x,y,z)=n1(x-a)+n2(y-b)+n3(z-c)=0 아래와 같이 벡터의 내적 형태로도 놓을 수 있습니다. P(x,y,z)=[n1,n2,n3][x,y,z]-[n1,n2,n3][a,b,c]=0 임의의 두 점을 (p1,p2,p3) (q1.. 2020. 11. 12.
[파이썬과 STL] 2. STL 데이터 접근하기 [파이썬과 STL] 2. STL 데이터 접근하기 지난 시간에 만든 코드에 이어서 설명하겠습니다. import osfrom stl import mesh path="C:/Users" os.chdir(path)ctl = mesh.Mesh.from_file('CAT.stl') stl 데이터가 ctl 이라는 변수에 저장되었습니다. stl 파일을 다룰 수 있는 여러가지 매소드가 있습니다. 점에 접근하는 메소드만 살펴봅시다. 1) points 매소드 점에 접근하는 method 는 points 입니다. >>> ctl.pointsarray([[ 613.4, -21935.7, 31444.1, ..., 553.4, -21868.2, 31515.9], [ 613.4, -21935.7, 31444.1, ..., 546.4, -.. 2020. 11. 12.
반응형