3D

OpenSCAD - 1장. 일반_데이타형_변수

엠칩 2020. 7. 13. 11:52
반응형

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Numbers

 

OpenSCAD User Manual/The OpenSCAD Language - Wikibooks, open books for an open world

 

en.wikibooks.org

위 메뉴얼을 기반으로 구글번역하고 군데군데 조금씩 보완만 하였습니다.

Contents

 

1 장-일반

OpenSCAD 사용자 매뉴얼 / OpenSCAD 언어

 

소개


OpenSCAD은입니다 2D / 3D  솔리드 모델링 A의 기반 프로그램 기능 프로그래밍 언어로 작성하는 데 사용되는 모델을 3D로 화면에 미리하고, 렌더링은 메쉬 모델이 2D / 3D 파일 형식의 다양한 수출 할 수있는 .

OpenSCAD 언어의 스크립트는 2D 또는 3D 모델을 작성하는 데 사용됩니다. 이 스크립트는 자유 형식의 조치 명령문 목록입니다.

 

object(); 
variable = value; 
operator() action(); 
operator() { action(); action(); } 
operator() operator() { action(); action(); } 
operator() { operator() action(); operator() { action(); action(); } }
Examples 
cube(5); 
x = 4+y; 
rotate(40) square(5,10); 
translate([10,5]) { circle(5); square(4); } 
rotate(60) color("red") { circle(5); square(4); } 
color("blue") { translate([5,3,0]) sphere(5); rotate([45,0,45]) { cylinder(10); cube([5,6,7]); } }

객체는 2D 및 3D 프리미티브로 작성된 모델의 빌딩 블록입니다. 객체는 세미콜론 ';'으로 끝납니다.

행위

액션 문장에는 프리미티브를 사용하여 객체를 생성하고 변수에 값을 할당하는 것이 포함됩니다. 액션 문장도 세미콜론 ';'으로 끝납니다.

연산자

연산자 또는 변형은 객체의 위치, 색상 및 기타 속성을 수정합니다. 연산자는 범위가 둘 이상의 조치를 포함 할 때 중괄호 '{}'을 사용합니다. 동일한 조치 또는 조치 그룹에 둘 이상의 운영자가 사용될 수 있습니다. 여러 연산자가 오른쪽에서 왼쪽으로 처리됩니다. 즉 작업에 가장 가까운 연산자가 먼저 처리됩니다. 연산자는 세미콜론 ';'으로 끝나지 않지만 포함 된 개별 동작은 끝납니다.

주석


주석은 스크립트의 작동 방식 또는 작동 방식을 설명하는 스크립트 또는 코드 (자신 또는 미래 프로그래머에게)에 메모를 남기는 방법입니다. 주석은 컴파일러에서 평가하지 않으며 자명 한 코드를 설명하는 데 사용해서는 안됩니다.

OpenSCAD는 C ++ 스타일 주석을 사용합니다.

// This is a comment myvar = 10; 
// The rest of the line is a comment 
/* Multi-line comments can span multiple lines. */

*** 주석은 주석이외에 특별한 동작내용이 추가됩니다..  이전에 올린 글의 sweepingnamecard 의 예제를 보면   주석을 이용해서 parameter값을 조절하거나 입력하는 기능을 구현할 수 있습니다.

 

값 및 데이터 유형


OpenSCAD의 값은 숫자(예 : 42), 부울(예 : true), 문자열(예 : "foo"), 범위(예 : [0 : 1:10]), 벡터 (예 : [1,2) , 3]) 또는 정의되지 않은 값 (undef)입니다. 값을 변수에 저장하고 함수 인수로 전달한 다음 함수 결과로 반환 할 수 있습니다.

[OpenSCAD는 데이터 유형이 고정 된 동적 유형 언어입니다. 유형 이름과 사용자 정의 유형이 없습니다. 함수는 값이 아닙니다. 실제로 변수와 함수는 분리 된 네임 스페이스를 차지합니다.]

숫자

숫자는 OpenSCAD에서 가장 중요한 유형의 값이며 다른 언어에서 사용되는 친숙한 10 진수 표기법으로 작성됩니다. 
예를 들어, -1, 42, 0.5, 2.99792458e + 8입니다. [8 진수 또는 16 진수 표기법을 지원하지 않습니다.]

10 진수 외에도 특수 숫자에 대한 다음 이름이 정의됩니다.

  • PI

OpenSCAD에는 64 비트 IEEE 부동 소수점 숫자 인 단일 종류의 숫자 만 있습니다. [OpenSCAD는 정수와 부동 소수점 숫자를 서로 다른 두 유형으로 구분하지 않으며 복소수도 지원하지 않습니다.] OpenSCAD는 IEEE 부동 소수점 표준을 사용하기 때문에 수학에서의 숫자 동작과 약간의 차이가 있습니다.

  • 이진 부동 소수점을 사용합니다. 분모가 2의 거듭 제곱이 아닌 한 소수는 정확하게 표현되지 않습니다. 예를 들어 0.2 (2/10)는 정확한 내부 표현이 없지만 0.25 (1/4) 및 0.125 (1/8)는 정확하게 표현됩니다 .
  • 가장 큰 숫자는 약 1e308입니다. 숫자 결과가 너무 크면 결과가 무한대가 될 수 있습니다 (echo에 의해 inf로 인쇄 됨).
  • 표현 가능한 가장 작은 숫자는 약 -1e308입니다. 숫자 결과가 너무 작은 경우 결과는 -infinity (echo에 의해 -inf로 인쇄 됨)가 될 수 있습니다.
  • 숫자 결과가 유효하지 않은 경우 결과는 숫자가 아님 (에코로 nan으로 인쇄 됨)이 될 수 있습니다.
  • 0이 아닌 숫자 결과가 표현하기에 너무 0에 가까우면 결과가 음수이면 결과는 -0이고, 그렇지 않으면 0입니다. 0과 음수 0은 두 개의 고유 숫자로 처리됩니다. 수학 연산의 일부에 의해 동일하게 비교되지만 '에코'로 다르게 인쇄됩니다.

'echo'로이 방법으로 인쇄 된 숫자를 계산할 수 있어도 상수 'inf'및 'nan'은 OpenSCAD에서 숫자 상수로 지원되지 않습니다. 다음을 사용하여 이러한 값으로 변수를 정의 할 수 있습니다.

inf = 1e200 * 1e200; nan = 0/0; 에코 (inf, nan);

'nan'값은 자체 값을 포함하여 다른 값과 같지 않은 유일한 OpenSCAD 값입니다. 'x == undef'를 사용하여 변수 'x'에 정의되지 않은 값이 있는지 테스트 할 수 있지만 'x == 0/0'을 사용하여 x가 숫자가 아닌지 테스트 할 수는 없습니다. 대신 x가 nan인지 테스트하려면 'x! = x'를 사용해야합니다.

부울 값 [ 편집 ]

부울은 진리 값입니다. 이 즉, 두 개의 부울 값입니다 true및 false. 부울은 조건문 'if ()'에 인수로 전달됩니다. 조건부 연산자 '? : '및 논리 연산자'! ' (not), '&&'(and) 및 '||' (또는). 이러한 모든 상황에서 실제로 수량을 전달할 수 있습니다. 부울 컨텍스트에서 대부분의 값은 'true'로 변환되며 'false'로 계산되는 값은 다음과 같습니다.

  • false
  • 0과 -0
  • ""
  • []
  • undef

그 주 "false"(문자열), [0](숫자 벡터), [ [] ](빈 벡터를 포함하는 벡터), [false] (A 부울 값의 false을 포함하는 벡터)과 0/0 (숫자)가 true 모든 수를.

문자열 [ 편집 ]

문자열은 0 개 이상의 유니 코드 문자 시퀀스입니다. 문자열 값은 파일을 가져올 때 파일 이름을 지정하고 echo ()를 사용할 때 디버깅 목적으로 텍스트를 표시하는 데 사용됩니다.

문자열 리터럴은 인용 부호로 묶인 일련의 문자로 기록 된 "이 같은 ""(빈 문자열), 또는 "this is a string".

"문자열 리터럴에 문자 를 포함 시키려면을 사용하십시오 \". \문자열 리터럴에 문자 를 포함 시키려면을 사용하십시오 \\. \문자열 리터럴 내에서 다음과 같은 이스케이프 시퀀스를 사용할 수 있습니다.

  • \ "→"
  • \\ → \
  • \ t → tab 탭
  • \ n → new line  줄 바꿈
  • \ r → carridge return 캐리지 리턴
  • \ u03a9 → Ω- 유니 코드 문자에 대한 자세한 내용  text ()  참조하십시오

참고 :이 동작은 OpenSCAD-2011.04 이후의 새로운 기능입니다. 다음 sed 명령을 사용하여 이전 파일을 업그레이드 할 수 있습니다. sed 's / \\ / \\\\ / g'non-escaped.scad> escaped.scad

Example: 
echo("The quick brown fox \tjumps \"over\" the lazy dog.\rThe quick brown fox.\nThe \\lazy\\ dog."); 
result
ECHO: "The quick brown fox jumps "over" the lazy dog. The quick brown fox. The \lazy\ dog." 
old result 
ECHO: "The quick brown fox \tjumps \"over\" the lazy dog. The quick brown fox.\nThe \\lazy\\ dog."

범위는 for () 루프  children ()에 의해 사용됩니다 . 그들은 두 가지 종류가 있습니다 :

[<start>:<end>]
[<start>:<increment>:<end>]

대괄호 []로 묶지 만 벡터는 아닙니다. 콜론을 사용합니다 : 쉼표 대신 구분 기호로 사용하십시오.

r1 = [0:10]; 
r2 = [0.5 : 2.5 : 20]; 
echo (r1); // ECHO : [0 : 1:10] 
echo (r2); // ECHO : [0.5 : 2.5 : 20]

이진 부동 소수점 숫자로 정확하게 표현할 수없는 단계 값을 피해야합니다. 분모가 2의 거듭 제곱 인 분수 값과 마찬가지로 정수도 괜찮습니다. 예를 들어 0.25 (1/4) 및 0.125 (1/8)는 안전하지만 0.2 (2/10)는 피해야합니다. 이 단계 값의 문제점은 부정확 한 산술로 인해 범위에 요소가 너무 많거나 너무 적을 수 있다는 것입니다.

은 <누락 증분 형태 1. 범위> 디폴트 [< 시작 > <  >]와 < 시작 > <이상 단부 > 경고를 발생 동등 [<  > 1 : < 시작 >] . 형태의 범위는 [< 시작 > 1 <  >]로 < 시작 보다> <  > 경고를 생성하고 동등하지 않는다 []. 범위 의 < 증가 >는 음수 일 수 있습니다 (2014 이후 버전의 경우).


정의되지 않은 가치 

정의되지 않은 값은 undef로 작성된 특수 값입니다 . 값이 할당되지 않은 변수의 초기 값이며, 종종 잘못된 인수로 전달 된 함수 나 연산에 의해 결과로 반환됩니다. 마지막으로, 다른 프로그래밍 언어 undef와 동등 null하거나 NULL다른 프로그래밍 언어에서 null 값으로 사용할 수 있습니다 .

undef값을 포함하는 모든 산술 표현식 은로 평가됩니다 undef. 논리식에서는와 undef같습니다 false. 와 관계 연산자 표현식 undef으로 평가 false를 제외 undef==undef하는가이다 true.

숫자 연산은 잘못된 인수를 나타 내기 위해 'nan'(숫자가 아님)을 반환 할 수도 있습니다. 예를 들어 0/falseis undef이지만 0/0'nan'입니다. <및>와 같은 관계 연산자 false는 잘못된 인수를 전달하면 반환 합니다. undef언어 가치는 있지만 'nan'은 아닙니다.

 

변수


OpenSCAD 변수는 이름 또는 식별자 가있는 명령문 , 표현식 및 세미콜론을 통한 지정 으로 작성됩니다 . 많은 명령형 언어에서 발견되는 배열의 역할은 OpenSCAD에서 벡터를 통해 처리됩니다.

var = 25;
xx = 1.25 * cos(50);
y = 2*xx+var;
logic = true;
MyString = "This is a string";
a_vector = [1,2,3];
rr = a_vector[2];      // member of vector
range1 = [-1.5:0.5:3]; // for() loop range
xx = [0:5];            // alternate for() loop range

OpenSCAD는 함수형 프로그래밍 언어입니다. 이러한 변수 는 표현식에 바인딩되어 있으며 참조 투명성 요구 사항으로 인해 전체 수명 동안 단일 값을 유지합니다 . 에서는 명령형 언어 C와 같은, 동일한 동작은 일반적으로 통상의 변수와 대조되는 상수로 간주된다.

다시 말해 OpenSCAD 변수는 상수와 비슷하지만 중요한 차이점이 있습니다. 변수에 여러 번 값을 할당하면 마지막으로 할당 된 값만 코드의 모든 위치에서 사용됩니다. 에서 자세한 설명을 참조 변수는 컴파일 타임이 아닌 런타임에 설정되어 있습니다 . 이 동작은 -D variable = value 옵션을 사용 하여 명령 행 에 변수 입력을 제공해야하기 때문 입니다. OpenSCAD는 현재 소스 코드 끝에 할당을 배치하므로 이러한 목적으로 변수 값을 변경할 수 있어야합니다.

런타임 중에는 값을 수정할 수 없습니다. 모든 변수는 사실상 변하지 않는 상수입니다. 각 변수는 함수형 프로그래밍 언어 에 따라 컴파일 타임에 마지막으로 할당 된 값을 유지 합니다. C와 같은 명령형 언어 와 달리 OpenSCAD는 반복 언어가 아니며 x = x + 1 의 개념은 유효하지 않습니다. 이 개념을 이해하면 OpenSCAD의 아름다움을 이해하게됩니다.

버전 2015.03 이전

파일 최상위 및 모듈 최상위를 제외한 모든 위치에서 할당을 수행 할 수 없습니다. if / else   또는 for   루프 안에서 assign ()이 필요했습니다.

2015.03 버전 이후

이제 모든 범위에서 변수를 할당 할 수 있습니다. 할당은 정의 된 범위 내에서만 유효합니다. 값을 외부 범위로 누출 할 수는 없습니다. 자세한 내용 은 변수 범위 를 참조하십시오.

a=0;
if (a==0) 
  {
 a=1; //  before 2015.03 this line would generate a Compile Error
      //  since 2015.03  no longer an error, but the value a=1 is confined to within the braces {}
      // 2015.03 이후 더 이상 오류가 없지만 값 a = 1은 중괄호 {} 안에 제한됩니다. } 
  }

 

 

Undefined variable정의되지 않은 변수

할당되지 않은 변수에는 특수 값 undef가 있습니다. 조건식으로 테스트하고 함수에 의해 반환 될 수 있습니다.

 Example
  
 echo("Variable a is ", a);                // Variable a is undef
 if (a==undef) {
   echo("Variable a is tested undefined"); // Variable a is tested undefined
 }

 

 

Scope of variables 변수의 범위 

translate () 및 color ()와 같은 연산자가 둘 이상의 작업을 포함해야하는 경우 (작업은;로 끝남) 작업을 그룹화하기 위해 중괄호 {}가 필요하며 새로운 내부 범위를 만듭니다. 세미콜론이 하나만 있으면 중괄호는 일반적으로 선택 사항입니다.

각 괄호 쌍은 사용 된 범위 내에 새 범위를 만듭니다. 2015.03부터이 새로운 범위 내에서 새로운 변수를 생성 할 수 있습니다. 외부 범위에서 작성된 변수에 새로운 값을 부여 할 수 있습니다. 이 변수와 해당 값은이 범위 내에서 생성 된 추가 내부 범위에도 사용할 수 있지만 이 범위 밖의 모든 범위  에는 사용할 수 없습니다 . 변수에는 여전히 범위 내에서 마지막으로 지정된 값만 있습니다.

                       // scope 1
 a = 6;                // create a
 echo(a,b);            //                6, undef
 translate([5,0,0]){   // scope 1.1
   a= 10;
   b= 16;              // create b
   echo(a,b);          //              100, 16   a=10; was overridden by later a=100;
   color("blue") {     // scope 1.1.1
     echo(a,b);        //              100, 20
     cube();
     b=20;
   }                   // back to 1.1
   echo(a,b);          //              100, 16
   a=100;              // override a in 1.1
 }                     // back to 1   
 echo(a,b);            //                6, undef
 color("red"){         // scope 1.2
   cube();
   echo(a,b);          //                6, undef
 }                     // back to 1
 echo(a,b);            //                6, undef
  
 //In this example, scopes 1 and 1.1 are outer scopes to 1.1.1 but 1.2 is not.


 

Anonymous scopes 익명 범위  범위 로 간주되지 않습니다.

 {
   angle = 45;
 }
 rotate(angle) square(10);

For () 루프는 범위 내에서 값이 하나 뿐인 변수에 대한 규칙에서 예외가 아닙니다. 각 패스마다 루프 내용의 사본이 작성됩니다. 각 패스에는 자체 범위가 지정되므로 변수에 해당 패스에 대한 고유 한 값을 가질 수 있습니다. 아니요, 여전히 a = a + 1을 수행 할 수 없습니다.

Variables are set at compile-time, not run-time  변수는 런타임이 아닌 컴파일 타임에 설정됩니다

OpenSCAD는 런타임이 아닌 컴파일 타임에 변수 값을 계산하기 때문에 범위 내에서 마지막 변수 할당은 해당 범위의 모든 범위 또는 내부 범위에 적용됩니다. 변수가 아니라 재정의 가능한 상수로 생각하면 도움이 될 수 있습니다.

// The value of 'a' reflects only the last set value  'a'의 값은 마지막 설정 값만 반영합니다 
   a = 0;
   echo(a);  // 5
   a = 3;
   echo(a);  // 5
   a = 5;

이는 직관적이지 않은 것처럼 보이지만 몇 가지 흥미로운 작업을 수행 할 수 있습니다. 예를 들어 공유 라이브러리 파일을 루트 수준에서 변수로 정의 된 기본값을 갖도록 설정 한 경우 해당 파일을 고유 코드에 포함 할 경우 , 단순히 새 값을 지정하여 해당 상수를 '정의'하거나 무시할 수 있습니다.


Special Variables  특수 변수

특수 변수는 인수를 모듈과 함수에 전달하는 대체 수단을 제공합니다. '$'로 시작하는 모든 변수는 lisp의 특수 변수와 유사한 특수 변수입니다. 따라서 일반 변수보다 동적입니다. (자세한 내용은 기타 언어 기능 참조 )


벡터


벡터는 0 개 이상의 OpenSCAD 값 시퀀스입니다. 벡터는 숫자 또는 부울 값, 변수, 벡터, 문자열 또는 이들의 조합으로 구성된 모음 (또는 목록 또는 테이블)입니다. 또한 이들 중 하나로 평가되는 표현식 일 수도 있습니다. 벡터는 많은 명령형 언어에서 발견되는 배열의 역할을 처리합니다. 여기에있는 정보는 데이터에 벡터를 사용하는 목록 및 테이블에도 적용됩니다.

벡터에는 대괄호가 있으며, []는 0 개 이상의 항목 (요소 또는 멤버)을 쉼표로 구분하여 묶습니다. 벡터는 벡터 등을 포함하는 벡터를 포함 할 수 있습니다.

examples
   [1,2,3]
   [a,5,b]
   []
   [5.643]
   ["a","b","string"]
   [[1,r],[x,y,z,4,5]]
   [3, 5, [6,7], [[8,9],[10,[11,12],13], c, "string"]
   [4/3, 6*1.5, cos(60)]



OpenSCAD에서 사용 :

 cube( [width,depth,height] );           // optional spaces shown for clarity
  translate( [x,y,z] )
  polygon( [ [x0,y0],  [x1,y1],  [x2,y2] ] );



creation 창조

요소 목록을 작성하여 쉼표로 구분하고 대괄호로 묶어 벡터를 만듭니다. 변수는 값으로 대체됩니다.

  cube([10,15,20]);
  a1 = [1,2,3];
  a2 = [4,5];
  a3 = [6,7,8,9];
  b  = [a1,a2,a3];    // [ [1,2,3], [4,5], [6,7,8,9] ]  note increased nesting depth



elements within vectors  벡터 내의 요소

벡터 내의 요소는 0부터 n-1까지 번호가 매겨지며 여기서 n은 len ()에서 반환 한 길이 입니다. 다음 표기법으로 벡터 내의 요소를 처리하십시오.

e[5] // element no 5 (sixth) at 1st nesting level 1 차 중첩 수준에서 요소 번호 5 
e[5][2] // element 2 of element 5 2nd nesting level 요소 5의 요소 2 2 차 중첩 수준
e[5][2][0] // element 0 of 2 of 5 3rd nesting level  5/5 중 3 번째 네 스팅 수준
e[5][2][0][1] // element 1 of 0 of 2 of 5 4th nesting level  5/4 중 네 번째 수준의 0 중 2의 요소 1

길이가 len () 인 요소 예

e = [ [1], [], [3,4,5], "string", "x", [[10,11],[12,13,14],[[15,16],[17]]] ]; // length 6
address length element
e[0]      1      [1]
e[1]      0      []
e[5]      3      [ [10,11], [12,13,14], [[15,16],[17]] ]
e[5][1]        3      [ 12, 13, 14 ]
e[5][2]         2      [ [15,16], [17] ]
e[5][2][0]      2      [ 15, 16 ]
e[5][2][0][1]   undef      16

e[3] 6 "string"
e[3 ][2] 1 "r" s = [2,0,5]; a = 2;
s[a] undef 5
e[s[a]] 3 [ [10,11], [12,13,14], [[15,16],[17]] ]

대체 도트 표기법

대체 점 표기법으로 벡터의 처음 세 요소에 액세스 할 수 있습니다.

e.x //equivalent to e[0] 
e.y //equivalent to e[1] 
e.z //equivalent to e[2]

concat

[ 참고 : 2015.03 버전 필요 ]

concat ()은 2 개 이상의 벡터 요소를 단일 벡터로 결합합니다. 중첩 수준은 변경되지 않습니다.

vector1 = [1,2,3];   vector2 = [4];    vector3 = [5,6]; 
new_vector = concat(vector1, vector2, vector3); // [1,2,3,4,5,6] 

string_vector = concat("abc","def"); // ["abc", "def"] 
one_string = str(string_vector[0],string_vector[1]); // "abcdef"

 

len ()은 벡터 나 문자열의 길이를 반환하는 함수입니다. 요소의 인덱스는 [0]에서 [length-1]입니다.

벡터이 레벨의 요소 수를 돌려줍니다.벡터  아닌 단일 값은 undef를 반환 합니다.문자열의 문자 수를 반환합니다.a = [1,2,3]; 반향 (len (a)); // 삼

길이가있는 예제 요소보기


MATRIX 매트릭스

행렬은 벡터로 구성된 벡터입니다.

2D 회전 행렬을 정의하는 

Example 
which defines a 2D rotation matrix 
mr = [
         [cos(angle), -sin(angle)],
         [sin(angle), cos(angle)]
];



입력 받기


이제 변수가 생겼으니 코드에서 값을 설정하는 대신 변수를 입력 할 수있게되었습니다. DXF 파일에서 데이터를 읽는 기능이 몇 가지 있거나 명령 행에서 -D 스위치를 사용하여 변수를 설정할 수 있습니다.

도면에서 포인트 얻기

점을 얻는 것은 기술 도면의 2D 뷰에서 원점을 읽는 데 유용합니다. dxf_cross 함수는 지정한 레이어에서 두 선의 교점을 읽고 교점을 반환합니다. 이것은 점 개체가 아니라 DXF 파일에 두 개의 선으로 점이 제공되어야 함을 의미합니다.

OriginPoint = dxf_cross(file="drawing.dxf", layer="SCAD.Origin", origin=[0, 0], scale=1);

 

차원 값 얻기

기술 도면에서 치수를 읽을 수 있습니다. 회전 각도, 돌출 높이 또는 부품 간 간격을 읽는 데 유용 할 수 있습니다. 도면에서 치수 값을 표시하지 않고 식별자를 나타내는 치수를 작성하십시오. 값을 읽으려면 프로그램에서이 식별자를 지정하십시오.

TotalWidth = dxf_dim(file="drawing.dxf", name="TotalWidth", layer="SCAD.Origin", origin=[0, 0], scale=1);

두 기능의 좋은 예는 Example009 및 OpenSCAD 홈페이지의 이미지를 참조하십시오 .

반응형

'3D' 카테고리의 다른 글

3d 프린터 필라멘트 초간단 사용기  (0) 2020.08.21
문씨티 무드등  (0) 2020.07.16
원더우먼 (큐라 다림질 비교)  (0) 2020.07.09
Nier automata : Yorha 2B Fieguer  (0) 2020.07.06
OpenSCAD 그림(poligon)추출  (1) 2020.07.05