본문 바로가기
STL/stl - cutting하기

[파이썬] STL을 평면으로 자르기 #8. 속도개선 2초대로 줄임

by 만다린망고 2022. 2. 8.
반응형

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) #교점이 저장될 변수

    a=[0,-160,0]
    n=[0,1,0]

    for i in range(ctl.vectors.shape[0]-1): #교점을 찾는 for문
        p1=ctl.vectors[i][0]
        p2=ctl.vectors[i][1]
        p3=ctl.vectors[i][2]

        p1_sp=sum((p1-a)*n)/abs(sum((p1-a)*n))
        p2_sp=sum((p2-a)*n)/abs(sum((p2-a)*n))
        p3_sp=sum((p3-a)*n)/abs(sum((p3-a)*n))

        if p1_sp==p2_sp==p3_sp :
            pass
        else :
            if p1_sp*p2_sp==-1 :
                inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p1,p2))))

            if p1_sp*p3_sp==-1 :
                inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p1,p3))))

            if p2_sp*p3_sp==-1 :
                inter_point=np.vstack((inter_point,pl.intersect_line(Line.from_points(p2,p3))))

    inter_point=inter_point[1:,] #찾은 교점에서 더미로 입력한 [0,0,0] 제거

    print(inter_point) #교점 출력해보기



    # ##시각화하기

    # pvpoint=pv.PolyData(inter_point) #교점을 PolyData 형식으로 변환
    # cat = pv.read('python_stl\CAT.stl') #STL을 시각화하기 위해 pyvista 패키지이용해서 불러옴

    # p = pv.Plotter() # 캔버스 정의 
    # p.add_mesh(cat, opacity=1, color='red') # STL 시각화
    # p.add_mesh(pvpoint,point_size=5,style='points') # 교점 시각화
    # p.show() #그래프 보이기


    time_end = timeit.default_timer() # 종료 시간 체크  
    
    print("소요시간 : %f초" % (time_end - time_start)) 

    time5.append(time_end - time_start)

 

아래는 결과다. 

 

>>> time5
[2.4808239999983925, 2.4890664999984438, 2.510372999997344, 2.5054430999880424, 2.5771495000080904]
반응형

댓글