본문 바로가기

Robot/Robot Program - ROS

OpenSCAD의 유용한 Modifier 기능

제가 OpenSCAD라는 프로그램을 한번 소개했었는데요[바로가기] 그 후에 OpenSCAD 초보자들이 처음 부딪히는 문제인 다면체 그리는 법을 살짝 (정말 살짝^^) 소개했었습니다. [바로가기] 사실 OpenSCAD는 Document[바로가기]만으로도 충분히 대부분의 기능을 알 수 있는데다, 자체적으로도 또 많은 예제를 가지고 있어서 뭐 따로 학습의 용도로 언급할 만한 건 없었습니다만~~~^^. 살짝 재미있는 기능하나를 OpenSCAD 초보분들께 알려드리고자 합니다.^^ 바로 background modifier와 debug modifier입니다.^^.

difference() {
	// start objects
	cylinder (h = 4, r=1, center = true, $fn=100);
        // first object that will subtracted
	% rotate ([90,0,0]) cylinder (h = 4, r=0.3, center = true, $fn=100);
        // second object that will be subtracted
	% rotate ([0,90,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}

difference() {
	// start objects
	cylinder (h = 4, r=1, center = true, $fn=100);
        // first object that will subtracted
	# rotate ([90,0,0]) cylinder (h = 4, r=0.3, center = true, $fn=100);
        // second object that will be subtracted
	# rotate ([0,90,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}

먼저 OpenSCAD 문서에 나와있는 위의 두 코드를 보죠~ 똑 같죠^^. 단 %와 #을 쓰고 있다는 차이일 뿐이네요. %는 background modifier이고, #은 debug modifier입니다. 다른 프로그램에서는 주석으로 사용될 아이들입니다만, OpenSCAD에서는 꽤 유용한 기능으로 사용됩니다.

좌측은 첫번째 코드(%)이고, 우측은 두번째 코드(#)입니다. 보이시나요? 차이가? 네 % 기호를 쓴 background modifier는 원 사물을 건드리지 않고 참조용 도형을 그려줍니다. 그러나 debug modifier는 실제 가공되는 명령(difference)이 적용되고, 대신에 그 자리에 도형이 있었던 것만 나타내 줍니다. 실제 두번째 코드에서 # 기호를 빼고 그려보면

difference() {
	// start objects
	cylinder (h = 4, r=1, center = true, $fn=100);
        // first object that will subtracted
	rotate ([90,0,0]) cylinder (h = 4, r=0.3, center = true, $fn=100);
        // second object that will be subtracted
        rotate ([0,90,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}

위 코드가 될거고 그 그림은

이렇게 되거든요. 그러니까 빈 자리를 잘 보여주는 그림이 되는 겁니다. 실제 이 기능을 사용하면

이렇게 핀을 넣을 자리를 미리 확인해 볼 수 있습니다. 물론 Compile and Render 후에 STL 화일로 export 할때는 사라지는 거지만요^^. 아 위 그림은 delta 형 3D 프린터의 end effector의 도면입니다. 제가? 그리진 않았구요^^. kossel legacy 모델입니다. 3D 프린터 연재[바로가기]에서 소개했던 RepRap 홈페이지에 있답니다.[바로가기] 저 판의 코드도 보여 드릴까요?^^

difference() {
include <configuration.scad>;

separation = 37.2;  // Distance between ball joint mounting faces.
offset = 42;  // Same as DELTA_EFFECTOR_OFFSET in Marlin.
height = 8;
cone_r1 = height/2;
cone_r2 = 5.5;

// Johann's Kossel uses M3 screws for everything, but you can
// change this to 2.2 if you prefer traditional M4 screws.
extruder_mount = m3_wide_radius;

difference() {
  union() {
    cylinder(r=offset-8, h=height, center=true, $fn=6);
    for (a = [60:120:359]) rotate([0, 0, a]) {
      translate([0, offset, 0]) intersection() {
        cube([separation, 40, height], center=true);
        union() {
          for (s = [-1, 1]) scale([s, 1, 1]) {
            translate([separation/2-4, 0, 0]) rotate([0, 90, 0])
              cylinder(r1=cone_r2, r2=cone_r1, h=8, center=true, $fn=24);
            translate([separation/2-4, -10, 0])
              cube([40, 20, height], center=true);
          }
        }
      }
    }
  }
  for (a = [60:120:359]) rotate([0, 0, a]) {
    translate([0, offset, 0]) rotate([0, 90, 0])
      #cylinder(r=m3_wide_radius, h=separation+1, center=true, $fn=12);
    translate([0, offset, 0]) rotate([90, 0, 90])
      #cylinder(r=m3_nut_radius, h=separation-12, center=true, $fn=6);
    translate([0, offset, 0])
      cylinder(r=separation/2-height, height+1, center=true);
  }
  cylinder(r=20, h=height+1, center=true, $fn=36);
  for (a = [0:18:359]) rotate([0, 0, a]) {
    translate([0, 25, 0])
      cylinder(r=extruder_mount, h=2*height, center=true, $fn=12);
  }
}

위 코드는 configuration.scad라는 화일이 있어야하는데, 그건 코드 바로 위에 링크를 건 RepRap - kossel 문서에서 찾을 수 있습니다. 뭐 아무튼 오늘은 괜찮은 기능하나 소개하고 갑니다.^^

반응형