최근 수정 시각 : 2023-08-31 22:45:54

STEP(확장자)

파일:STL파일과 STEP파일 비교.png
STL 파일(좌측)과 STEP 파일(우측)의 텍스쳐를 비교한 사진

1. 개요2. 상세3. 파일 구조4. 타 포맷과의 비교
4.1. STL파일 vs STEP파일4.2. IGES파일 vs STEP파일4.3. OBJ파일 vs STEP파일
5. STEP을 지원하는 슬라이서6. 관련 문서7. 관련 외부 링크

[clearfix]

1. 개요

STEP 파일은 3D CAD에서 범용적으로 사용되는 국제 표준 규격이다. ISO 표준규격에도 ISO 10303-21으로 등록되어 있으며, 서로 다른 CAD 프로그램 혹은 3D 모델링 프로그램 등에서 데이터를 교환할 경우 사용할 수 있는 중간 매개 포맷으로도 사용된다.

2. 상세

처음으로 STEP파일의 사양이 발표된 것은 1994년이었고, 2번째 버전이 2002년, 3번째 버전은 2016년에 발표되었다. 본격적으로 업계에서 사용이 시작된 것은 3번째 버전이 2016년에 발표된 이후. 원래는 인코딩으로 ASCII만 사용했으나, 2016년 발표된 세 번째 버전부터 UTF-8 인코딩을 지원하기 시작했다.

파일 확장자로는 .stp 혹은 .step을 사용한다. ISO 10303의 파트 21이라는 의미에서 가끔 .p21을 사용하기도 한다.

3D 모델 정보는 NURBS형식[1]을 사용해 저장하므로, 폴리곤 방식을 사용하는 타 모델링 파일과 달리 곡면을 정확하게 표현할 수 있다는 장점을 가진다. NURBS는 모델을 수학적으로 표현하기 때문.

이러한 특징으로 인해 추후 편집이 필요한 3D 모델의 경우 STEP 파일로 저장하는 것이 좋다. STL 파일의 경우 해상도가 최대치더라도 폴리곤을 사용하는 구조적인 문제로 27mm였던 두께가 26.994mm가 되어버리거나, 직경 30mm였던 구멍이 높이 29.998mm인 180각형의 각진 형태가 되어버리기 때문. 3D 프린터에서 사용하는 경우, 대부분의 슬라이서에서 STEP 파일을 지원하기에 굳이 STL 파일로 저장할 필요도 없이 모델링부터 편집, 내보내기, 인쇄까지 STEP 파일로만 완결하는 것도 가능하다. ISO 국제표준규격으로서 애초에 여러가지 다른 CAD 프로그램에서 파일을 주고받기 위한 매개 코덱으로 개발되었기 때문에 여러가지 3D CAD 프로그램을 혼용하는 경우에는 거의 필수적으로 STEP 파일을 사용해야 한다.

다만 STEP 파일이 모든 분야에서 뛰어난 것은 아닌데, 조명 데이터나 시점 데이터를 포함할 수 없기 때문. 이로 인해 3D 모델링 및 3D 프린팅에서는 범용적으로 사용되며 사용이 권장되나, 3D 렌더링에서의 사용은 매우 제한적이다. 이로 인해 Pixar에서 만들고 Apple도 사용을 권장하고 있는[2] USD/USDZ 파일이나, FBX 파일 등이 대중적으로 사용되는 중.

STEP 파일은 텍스트 형식으로 모델을 수식적으로 해석하여 저장하기에, 역으로 프로그래밍 하듯이 텍스트로만 STEP 파일을 만들어내는 것도 가능하다. 다만 공학용 계산기의 여러 함수로 그림을 그리는 것들처럼 그 수식이 매우 복잡하고 정교하기 때문에 실제로 코딩하듯 STEP 파일을 만드는 것은 불가능하다고 봐야 한다. 일례로, 직경 100mm에 높이 100mm인 단순한 원통 형태의 모델을 만들더라도 다음과 같은 길고 긴 코드가 필요하다.
직경 100mm, 높이 100mm의 원통을 표현하는 STEP 파일 내용 【펼치기 · 접기】
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
 * from STEP Tools, Inc. (www.steptools.com) 
 */

FILE_DESCRIPTION(
/* description */ (''),
/* implementation_level */ '2;1');

FILE_NAME(
/* name */ '',
/* time_stamp */ '2023-08-31T22:14:35+09:00',
/* author */ (''),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v20',
/* originating_system */ 'Autodesk Translation Framework v12.9.0.99',
/* authorisation */ '');

FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }'));
ENDSEC;

DATA;
#10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#86);
#11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#93,#12);
#12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#85);
#13=STYLED_ITEM('',(#102),#14);
#14=MANIFOLD_SOLID_BREP('\X2\30DC30C730A3\X0\1',#42);
#15=PLANE('',#59);
#16=PLANE('',#60);
#17=FACE_OUTER_BOUND('',#20,.T.);
#18=FACE_OUTER_BOUND('',#21,.T.);
#19=FACE_OUTER_BOUND('',#22,.T.);
#20=EDGE_LOOP('',(#32,#33,#34,#35));
#21=EDGE_LOOP('',(#36));
#22=EDGE_LOOP('',(#37));
#23=LINE('',#79,#24);
#24=VECTOR('',#67,50.);
#25=CIRCLE('',#57,50.);
#26=CIRCLE('',#58,50.);
#27=VERTEX_POINT('',#76);
#28=VERTEX_POINT('',#78);
#29=EDGE_CURVE('',#27,#27,#25,.T.);
#30=EDGE_CURVE('',#27,#28,#23,.T.);
#31=EDGE_CURVE('',#28,#28,#26,.T.);
#32=ORIENTED_EDGE('',*,*,#29,.F.);
#33=ORIENTED_EDGE('',*,*,#30,.T.);
#34=ORIENTED_EDGE('',*,*,#31,.T.);
#35=ORIENTED_EDGE('',*,*,#30,.F.);
#36=ORIENTED_EDGE('',*,*,#29,.T.);
#37=ORIENTED_EDGE('',*,*,#31,.F.);
#38=CYLINDRICAL_SURFACE('',#56,50.);
#39=ADVANCED_FACE('',(#17),#38,.T.);
#40=ADVANCED_FACE('',(#18),#15,.T.);
#41=ADVANCED_FACE('',(#19),#16,.F.);
#42=CLOSED_SHELL('',(#39,#40,#41));
#43=DERIVED_UNIT_ELEMENT(#45,1.);
#44=DERIVED_UNIT_ELEMENT(#88,-3.);
#45=(
MASS_UNIT()
NAMED_UNIT(*)
SI_UNIT(.KILO.,.GRAM.)
);
#46=DERIVED_UNIT((#43,#44));
#47=MEASURE_REPRESENTATION_ITEM('density measure',
POSITIVE_RATIO_MEASURE(7850.),#46);
#48=PROPERTY_DEFINITION_REPRESENTATION(#53,#50);
#49=PROPERTY_DEFINITION_REPRESENTATION(#54,#51);
#50=REPRESENTATION('material name',(#52),#85);
#51=REPRESENTATION('density',(#47),#85);
#52=DESCRIPTIVE_REPRESENTATION_ITEM('\X2\92FC\X0\','\X2\92FC\X0\');
#53=PROPERTY_DEFINITION('material property','material name',#95);
#54=PROPERTY_DEFINITION('material property','density of part',#95);
#55=AXIS2_PLACEMENT_3D('',#74,#61,#62);
#56=AXIS2_PLACEMENT_3D('',#75,#63,#64);
#57=AXIS2_PLACEMENT_3D('',#77,#65,#66);
#58=AXIS2_PLACEMENT_3D('',#80,#68,#69);
#59=AXIS2_PLACEMENT_3D('',#81,#70,#71);
#60=AXIS2_PLACEMENT_3D('',#82,#72,#73);
#61=DIRECTION('axis',(0.,0.,1.));
#62=DIRECTION('refdir',(1.,0.,0.));
#63=DIRECTION('center_axis',(0.,0.,1.));
#64=DIRECTION('ref_axis',(1.,0.,0.));
#65=DIRECTION('center_axis',(0.,0.,1.));
#66=DIRECTION('ref_axis',(1.,0.,0.));
#67=DIRECTION('',(0.,0.,-1.));
#68=DIRECTION('center_axis',(0.,0.,1.));
#69=DIRECTION('ref_axis',(1.,0.,0.));
#70=DIRECTION('center_axis',(0.,0.,1.));
#71=DIRECTION('ref_axis',(1.,0.,0.));
#72=DIRECTION('center_axis',(0.,0.,1.));
#73=DIRECTION('ref_axis',(1.,0.,0.));
#74=CARTESIAN_POINT('',(0.,0.,0.));
#75=CARTESIAN_POINT('Origin',(0.,0.,0.));
#76=CARTESIAN_POINT('',(-50.,-6.12323399573677E-15,100.));
#77=CARTESIAN_POINT('Origin',(0.,0.,100.));
#78=CARTESIAN_POINT('',(-50.,-6.12323399573677E-15,0.));
#79=CARTESIAN_POINT('',(-50.,-6.12323399573677E-15,0.));
#80=CARTESIAN_POINT('Origin',(0.,0.,0.));
#81=CARTESIAN_POINT('Origin',(0.,0.,100.));
#82=CARTESIAN_POINT('Origin',(0.,0.,0.));
#83=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#87,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#84=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#87,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#85=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#83))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#87,#89,#90))
REPRESENTATION_CONTEXT('','3D')
);
#86=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#84))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#87,#89,#90))
REPRESENTATION_CONTEXT('','3D')
);
#87=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#88=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT($,.METRE.)
);
#89=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#90=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#91=SHAPE_DEFINITION_REPRESENTATION(#92,#93);
#92=PRODUCT_DEFINITION_SHAPE('',$,#95);
#93=SHAPE_REPRESENTATION('',(#55),#85);
#94=PRODUCT_DEFINITION_CONTEXT('part definition',#99,'design');
#95=PRODUCT_DEFINITION('(\X2\672A4FDD5B58\X0\)','(\X2\672A4FDD5B58\X0\)',
#96,#94);
#96=PRODUCT_DEFINITION_FORMATION('',$,#101);
#97=PRODUCT_RELATED_PRODUCT_CATEGORY('(\X2\672A4FDD5B58\X0\)',
'(\X2\672A4FDD5B58\X0\)',(#101));
#98=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2009,#99);
#99=APPLICATION_CONTEXT(
'Core Data for Automotive Mechanical Design Process');
#100=PRODUCT_CONTEXT('part definition',#99,'mechanical');
#101=PRODUCT('(\X2\672A4FDD5B58\X0\)','(\X2\672A4FDD5B58\X0\)',$,(#100));
#102=PRESENTATION_STYLE_ASSIGNMENT((#103));
#103=SURFACE_STYLE_USAGE(.BOTH.,#104);
#104=SURFACE_SIDE_STYLE('',(#105));
#105=SURFACE_STYLE_FILL_AREA(#106);
#106=FILL_AREA_STYLE('\X2\92FC\X0\ - \X2\30B530C630F3\X0\',(#107));
#107=FILL_AREA_STYLE_COLOUR('\X2\92FC\X0\ - \X2\30B530C630F3\X0\',#108);
#108=COLOUR_RGB('\X2\92FC\X0\ - \X2\30B530C630F3\X0\',0.627450980392157,
0.627450980392157,0.627450980392157);
ENDSEC;
END-ISO-10303-21;

3. 파일 구조

STEP 파일의 구조는 크게 나눠 헤더와 데이터 섹션으로 나뉜다. 데이터 섹션에 해당 모델링 파일의 구조를 NURBS 형식의 수식으로 저장한다. 전체 파일 형식 구조는 다음과 같다.
ISO-10303-21; /* 파일 시작 선언 */

/* 이하 헤더 섹션 */
HEADER;
FILE_DESCRIPTION(...)
FILE_NAME(...);
FILE_SCHEMA (...);
FILE_POPULATION(...); /* STEP 버전 3 이후부터 사용 가능 */
SECTION_LANGUAGE( … ); /* STEP 버전 3 이후부터 사용 가능 */
SECTION_CONTEXT( … ); /* STEP 버전 3 이후부터 사용 가능 */
ENDSEC; /* 헤더 섹션 끝 */

ANCHOR; /* 앵커 섹션 (생략 가능) */
...
ENDSEC; /* 앵커 섹션 끝 */

REFERENCE; /* 레퍼런스 섹션 (생략 가능) */
#(레퍼런스 숫자) = <(레퍼런스 링크)>;
ENDSEC; //레퍼런스 섹션 끝

DATA; /* 데이터 섹션 시작 */
...
#(숫자)=(코드)
...
ENDSEC; /* 데이터 섹션 끝 */

SIGNATURE; /* 시그니처 섹션 (생략 가능) */
...
ENDSEC; /* 시그니처 섹션 끝 */

END-ISO-10303-21; /* 파일 끝 */


이 중 STEP 파일로서 인식하기 위해 반드시 필요한 섹션은 ISO-10303-21;HEADER; 섹션, DATA; 섹션 및 END-ISO-10303-21; 뿐이다. STEP 버전 2까지는 그 외 제한 사항이 많아 사용이 불편했으나 버전 3부터 외부 리소스 참조나 ZIP 알고리즘 압축 데이터 공유, UTF-8 인코딩 지원이나 디지털 서명 등을 지원하면서 현대적인 파일 포맷에 가까워졌다. 또한 코멘트는 여타 프로그래밍 언어와 동일하게 /* */로 사용할 수 있다. 또한 데이터 섹션 속 #(숫자)는 10, 11, 12 등 이어지는 숫자를 사용해야 한다. 데이터 섹션에서 사용하는 설정값으로는 x, y, z 좌표를 나타내는 CARTESIAN_POINT나 방향 벡터를 나타내는 DIRECTION, VECTOR, LINE, CIRCLE 등이 존재하며, 이런 여러가지 수식을 사용해 모델링의 내부 정보를 저장한다.

4. 타 포맷과의 비교

4.1. STL파일 vs STEP파일

아마도 3D 모델링이나 3D 프린팅을 하는 경우 가장 직접적으로 비교하게 되는 대상은 STL 파일 포맷일 것이다. 다만 STL 파일과 STEP 파일은 근본적으로 완전히 다른 구조를 가진다.
STL 파일은 폴리곤을 이용해 무수히 많은 삼각형으로 입체를 쪼개 만드는 구조이나, STEP 파일은 상술한 대로 NURBS 형식을 사용하기에 원, 타원, 곡선 등이 포함된 파일일 경우 STL보다 압도적으로 우위에 있다.

다만 STL 파일이 워낙 범용적으로 사용되던 파일이다 보니 기존 STL 파일이 사용되던 모든 분야에서 사용이 가능한 것은 아니다. 일례로, macOS의 미리보기에서 STL 파일은 3D 형태로 미리보기를 지원하나 STEP 파일은 macOS 14.0 Sonoma 기준 아직 지원하지 않는다. Printables나 Thingiverse에 업로드되는 모델들도 거의 전부 STL 파일만 제공하고 있다. GIF AVIF APNG에 비해 기술적으로 부족하지만 여전히 GIF가 범용적으로 사용되는 것과 동일한 케이스라고 볼 수 있다.

4.2. IGES파일 vs STEP파일

3D CAD 파일의 중간 매개 코덱이라는 면에서 IGES 파일과 STEP 파일은 거의 동일하다. IGES 파일도 NURBS 형식을 사용하고 있어 사실상 STEP과 구조적인 차이점이 존재하지 않는다. 물론 사소한 차이점은 존재하는데, IGES 파일은 파일 구조상 TEXT 부분에 다중 언어를 지원하나 STEP은 지원하지 않으며, 반대로 IGES 파일은 STEP에 비해 저장하는 데이터셋의 크기가 적다. 다만 IGES는 당초 미 공군에서 사용하기 위해 1980년 즈음에 개발된 물건인지라 ISO 국제표준인 STEP 파일과 비교해 범용성이 부족하다. STEP 파일은 범용적으로 사용하는 대부분의 슬라이서에서 사용할 수 있으나 IGES는 사용할 수 없는 경우가 대부분.

4.3. OBJ파일 vs STEP파일

5. STEP을 지원하는 슬라이서

6. 관련 문서

7. 관련 외부 링크


[1] Non-Uniform Rational B-Spline의 약자. [2] Pixar 컴퓨터의 역사상 NeXT를 인수한 Apple과 인연이 있어 동일한 파일 포맷을 밀어주는 중.