GRASSHOPPER WORKEXAMPLE
VB SCRIPTING + GALAPAGOS GH VER. 0.8.0010 woojae sung woojae.sung@yahoo.com http://woojsung.com
IDEA ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์๋ก ๋ ๋ฆฝ์ ์ธ ๋ณ์์ ์ํด ์ ์๋๋ ๋ค๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ํ ์ด๋ฅผ ์ด์ํ์ฌ ๋ฐฐ์ดํ๋ ๊ฒ์ผ๋ก ๋ถํฐ ์ถ๋ฐํฉ๋๋ค. ์๋ ๊ทธ๋ฆผ์ step 01 ์์ ๋ณผ์ ์๋ฏ์ด, ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฒ์์ ์ฌ์๊ฐ์ ์ํด ์ ์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด type A์ ๊ฒฝ์ฐ๋ ์ฌ์๊ฐ์ด 5๋์์ 10๋ ์ฌ์ด์ ์ด๋ ํ ๊ฐ์ด๋ ๊ฐ์ง ์ ์์ผ๋ฉฐ type B๋ 7๋์์ 12๋ ์ฌ์ด์ ์ด๋ค ๊ฐ๋ ๊ฐ์ง์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์๋ก ๋์ผํ ๊ธฐํํ์ ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ์์ผ๋ฉด์๋ ์๋ก ๋ค๋ฅธ ์ฌ์๊ฐ์ ๊ฐ์ง๋ ๋ค ๊ฐ์ง์ ์ปดํฌ๋ํธ๋ค์, ์๋ก ๋ณ์ ๊ณต์ ํ๋ฉฐ ์ผ์ ํ ์์-์์๋ ์ฐจํ ์กฐ์ ํ๊ฒ ๋ฉ๋๋ค-์ ์ํ์ฌ ์ ํ๋ฐฐ์ด์ ํ๊ฒ ๋ฉ๋๋ค. ๋ค๋ฅธ type๋ค ๊ฐ์ ์๋ก ์กฐ๊ธ์ฉ ๋ค๋ฅธ ์ฌ์๊ฐ๋ค๋ก ์ธํด step 02์ ๊ฐ์ ์ด๊ธฐ ๋ฐฐ์ด์ ํํ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ ๋ ๋ฆฝ์ ์ธ ๋ค๊ฐ์ ์ฌ์๊ฐ ๋ณ์๋ค์ ์กฐ๊ธ์ฉ ์กฐ์ ํ๋ ๊ณผ์ ์ ํตํด step 02 ์์ ๋ณผ์ ์๋ ์ ํ๋ฐฐ์ด์ step 03์์ ์ฒ๋ผ ์ํ ๋ฐฐ์ด์ ํํ๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. ์ฆ step 03์ ๊ทธ๋ฆผ์์ ๋ณผ์ ์๋ฏ์ด, ์์ํ๋ ์ ๊ณผ ๋๋๋ ์ ์ ์์์ ๊ณผ ๋์ ์์์ ๊ฐ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ D1๊ณผ D2๋ผ๊ณ ํ ๋, ๋ ๊ฑฐ๋ฆฌ๊ฐ์ ํฉ์ด ์ต์๊ฐ ๋๋๋ก ๊ฐ๊ฐ์ ์ฌ์๊ฐ์ ์กฐ๊ธ์ฉ ์กฐ์ ํ์ฌ ๋๊ฐ๋ ๊ณผ์ ์์ ์ต์ ์ ๋ฐฐ์ด, ์ฆ ์ต์ ํ์ ๊ฑฐ๋ฆฌ๊ฐ์ ๊ฐ์ง๋ ์ฌ์๊ฐ๋ค์ ์กฐํฉ์ ์ฐพ์๋ด๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ผ์ผํ ๋๋ฒ ์ฌ๋ผ์ด๋๋ฅผ ์กฐ์ ํ์ฌ์๋ ์ฝ์ง ์์ผ๋ฆฌ๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌด ์ํ ์ํ-์ฐฉ์ค์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ ๋ฐฉ์ ์์ ํด๋ Grasshopper์ Galapagos๋ผ๋ ๋ฐฉ์ ์ ํ์ด ๋ชจ๋์ ํตํด ์ฝ๊ฒ ์ฐพ์๋ผ์ ์์ต๋๋ค.
STEP01 COMPONENTS
STEP02 INITIAL ARRAY
VARIABLE ANGLE 01
VARIABLE ANGLE 02
VARIABLE ANGLE 03
VARIABLE ANGLE 04
TYPE A
TYPE B
TYPE C
TYPE D
STEP03 PACKED D1
D2
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 01
DEFINING A COMPONENT ์ฒซ๋ฒ์งธ ๋จ๊ณ๋ก, ์ฐ๋ฆฌ๋ Grasshopper์ ๊ธฐ๋ณธ ์ค๋ธ์ ํธ๋ง์ ํตํด ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด ๋ณผ๊ฒ์ ๋๋ค. ์ฒซ๋ฒ์งธ๋ก ํด์ผ ํ ๊ฒ์, ๋ผ์ด๋ ธ์์ ๊ธธ์ด 20์ด ๋๋ ์ ์ ๊ทธ๋ฆฌ ๊ณ (Start Line) ์ด๋ฅผ Grasshopper์ Curve ์ค๋ธ์ ํธ์ ์ฐ๊ฒฐํฉ๋๋ค. ๊ทธํ ๊ทธ ์ ์ ์ค์ (Start Leg Pt)์ ์ฐพ๊ณ ์ด ์ ์์ ๊ธธ์ด 2.5์ ๋ฒ์ (Start Leg)์ ๊ทธ๋ฆฝ๋๋ค. ์ด ์ ์ ๋๋๋ ์ ์ ์ฐพ๊ณ (Center Pt), ์ด๋ฅผ ์ค์ ์ผ๋ก ํ๋ฉฐ Start Line์ ์ ํ๋ ์(Circle / Pivot Cell)์ ๊ทธ๋ฆฝ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ด ์์ ์ค์ฌ(Pivot Point)์ ํ์ ์ถ์ผ๋ก ์ผ์ Start Leg, Start Leg Pt, Start Line์ ํน์ ๊ฐ๋(Angle)๋ก ํ์ ์์ผ End Leg, End Leg Pt, End Line์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
End Line
L = 0.5
Start Leg Pt
LENGTH = 2.5
Center Pt
RADIUS = 2.5
INPUT GEOMETRY Start Line
Circle / Pivot Cell
End Leg
ANGLE Start Leg
Pivot Point
End Leg Pt
01 A CENTER POINT
02 A PERPENDICULAR LINE
03 A CIRCLE
04 ROTATE BY ANGLE
05 ROTATE BY ANGLE
GH DEFINITION
์๋ ์คํฌ๋ฆฐ ์ท์ ์์ฑ๋ Grasshopper Definition์ ๋ชจ์ต์ ๋๋ค. ( 001 component GH objects.ghx ํ์ผ์ ์ฐธ์กฐํ์ธ์ ).
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 02
CUSTOM VB COMPONENT ์ด๋ฒ์๋ ์์์ ์ ์ํ Grasshopper ๊ฐ์ฒด๋ค์ VB ์คํฌ๋ฆฝํธ๋ฅผ ํตํ์ฌ ๋จ์ผ ์ค๋ธ์ ํธ๋ก ๋ณํํด๋ณด๊ฒ ์ต๋๋ค. ์๋ ์คํฌ๋ฆฐ์ท์์ ๋ณด์๋ input / output ๋ณ์์ ์ด๋ฆ๋ค์ ์์ฅ์ ์ปดํฌ๋ํธ ์ ์ ๋ค์ด์ด๊ทธ๋จ์ ๋ณ์๋ช ๋ค๊ณผ ๋์ผํฉ๋๋ค. ์ฆ, input line, ๋ฐ์ง๋ฆ, ๊ทธ๋ฆฌ๊ณ ์ฌ์๊ฐ์ ๊ฐ๋๋ฅผ input ํ๋ผ๋ฉํฐ๋ก ๊ฐ์ง๊ณ ๊ฒฐ๊ณผ๋ฌผ๋ก์จ pivot_cell, pivot_pt ๋ฑ๋ฑ์ ๋ง๋ค์ด ๋ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ์์ ์ ํ๊ฒ ๋์ง๋ง ๋จ ํ๋์ ์ค๋ธ์ ํธ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. (002 component VB.ghx ํ์ผ์ ์ฐธ์กฐํ์ธ์)
๊ทธ๋ ๋ค๋ฉด, ๊ตณ์ด ์ด๋ฌํ VB Scripting์ ์จ์ ์์ ์ ํด์ผ ํ๋ ์ด์ ๊ฐ ๋ญ๊น์? ๋ง์ ๋ค๋ฅธ ์ด์ ๋ค์ด ์์์ ์๊ฒ ์ง๋ง, ๋ณธ ์์ ์ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ์ด ์ปจํธ๋กค ํ ๊ธฐ ์ด๋ ค์ด ์ํฉ์ ๋ง๋ค์ง ์๊ธฐ ์ํด์ ์ ๋๋ค.
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 03
CODE REVIEW ์ด๋ฒ์๋ VB ์ค๋ธ์ ํธ์ ์ฝ๋๋ฅผ ํ์ค์ฉ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. VB ์ค๋ธ์ ํธ๋ฅผ ๋๋ธํด๋ฆญํ๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ ์ ์๋ ์ฐฝ์ด ๋์ต๋๋ค.
Circle /
Dim s_pt As New point3d(start_crv.PointAt(0.5)) Pivot Cell
Start Leg Pt
LENGTH = 2.5
L = 0.5
โข โข โข โข โข
End Leg
RADIUS = 2.5
Center Pt
start_leg_pt = s_pt
โ ๋ก ์์ํ๋ ์ค์ ์ฃผ์์ ๋๋ค. ์ฆ ์ด๋ ํ ์ผ๋ ํ์ง ์๋ ์ค์ ๋๋ค. ๋๋ฒ์งธ ์ค์์๋ s_pt๋ผ๋ ์๋ก์ด ์ ์ ์์ฑํ๊ณ ์ด ์ ์ start_crv์ L=0.5 ์ฆ ์ค์ ์ ํด๋นํ๋ ์ ์ ํ ๋นํฉ๋๋ค. ๊ทธ ๋ค์, s_pt๋ฅผ start_leg_pt๋ผ๋ output๋ณ์์ ํ ๋นํ์ฌ ์ค๋๋ค. ์ฆ ๋ผ์ด๋ ธ ๋ทฐํฌํธ์์ ์ด์ ์ ๋ณผ์ ์๊ฒ ํด์ค๋๋ค. ANGLE ๋ง์ฝ ์ธ๋ฒ์งธ ์ค์ ๋ช ๋ น์ด ์๋ค๋ฉด VB๋ ์ ์ ์์ฑํ์ฌ ๋๊ณ ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ณด์ฌ์ฃผ์ง ์์ต๋๋ค. Start Leg์ ์์ ์ ์ผ๋ก ๊ตฌ๋ถ๋๋ ๋ช ๋ น์ด๋ค์ ๋ณ์์ Pivot Point ๋ํ ์ข ๋ ์์ธํ ์ค๋ช ์ ์ฐพ์ผ์๋ ๋ถ์ http://www.rhino3d.com/5/ rhinocommon/ ์ ๋ฐฉ๋ฌธํ์๋ฉด ๋ฉ๋๋ค.
End Leg Pt
01 A CENTER POINT
02 A PERPENDICULAR LINE
03 A CIRCLE
04 ROTATE BY ANGLE
05 ROTATE BY ANGLE
End Line 'defines start_leg /////////////////////////////////////////////////////////////////////////////////////////////
UT GEOMETRY t Line
Circle /
End Leg Dim start_crv_start Pivot Cell As New Point3d(start_crv.PointAt(0.0)) Dim start_crv_end As New Point3d(start_crv.pointat(1.0)) RADIUS = 2.5
Center Pt
Dim original_vector As New Vector3d(start_crv_start - start_crv_end)
LENGTH = 2.5
t Leg Pt
End Line 'defines start_leg_pt //////////////////////////////////////////////////////////////////////////////////////////
INPUT GEOMETRY Start Line
Dim rotation_ang_start_leg As Double = math.PI / 2 Dim rotation_axis_start_leg As New Vector3d(0, 0, 1) ANGLE
original_vector.Rotate(rotation_ang_start_leg, rotation_axis_start_leg) Start Leg
Pivot Point
Dim line_start As New line(start_leg_pt, original_vector, pivot_cell_radius) start_leg = line_start
End Leg Pt
โข โข
02 A PERPENDICULAR LINE
์ด๋ฒ์๋ ์ ๋จ๊ณ์์ ์์ฑํ ์ค์ , ์ฆ start_leg_pt๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ํ๋ ๋ฒ์ ์ ๊ทธ๋ฆด ์ฐจ๋ก์ ๋๋ค. ๋จผ์ , ๊ธฐ์ค์ด ๋๋ ์ , ์ฆ start_crv์ ๋ฐฉํฅ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ ์ด ๋ฒกํฐ๋ฅผ ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ๋๋ ค์ค์ผ๋ก์จ ๋ฒ์ ๋ฒกํฐ๋ฅผ 03 A CIRCLE ์์ฑํ๊ฒ ๋ฉ๋๋ค. 04 ROTATE BY ANGLE 05 ROTATE BY ANGLE โข ๊ธฐ์ค์ด ๋๋ ์ , start_crv์ ์๋์ ์ ์ ์ํ์ฌ ์ค๋๋ค. โข ๊ทธ๋ค์ ๋ ์ ์ ์ฐจ๋ฅผ ํตํด original_vector๋ฅผ ์ ์ํด ์ค๋๋ค. ์ด๋ ์ผํธ๊ทธ๋ฆผ์ ํ๋์ ํ์ดํ๋ก ํ์๋์ด์ ธ ์์ต๋๋ค. โข ์ด์ ๋ ์ด ํ๋์ ๋ฒกํฐ๋ฅผ ํ์ ์์ผ ์ด๋ก์ ๋ฒกํฐ๋ก ๋ง๋ค์ด ์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ rotation์ด๋ methods๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. rotation method๋ ํ์ ๊ฐ๊ณผ ํ์ ์ถ์ด๋ผ๋ ๋๊ฐ์ง ๋ณ์๋ฅผ ํตํด ์๋ํฉ๋๋ค. โข ํ์ ๊ฐ, rotation_ang_start_leg๋ฅผ 90๋๋ก ์ ์ ํฉ๋๋ค. (ํ์ด/2 = 90๋) โข ํ์ ์ถ์ Z ๋ฐฉํฅ๋ฒกํฐ๋ก ์ก์ต๋๋ค. โข ๊ทธํ original_vector์ rotate method๋ฅผ ์ ์ฐ๊ฒฐ์๋ก ์ฐ๊ฒฐํ๊ณ ํ์ ๊ฐ๊ณผ ํ์ ์ถ์ ์ ๋ ฅํ์ฌ original_vector๋ฅผ 90๋ ๋๋ฆฝ๋๋ค. ํ์ ๋ ๋ฒกํฐ๋ ์ด์ ์ด๋ก์ ํ์ดํ์ ๋์ผํฉ๋๋ค. โข ์ด์ ์๋ก์ด ์ ์ ๊ธ์ต๋๋ค. ์์์ (start_leg_pt)์ ๋ฐฉํฅ(์ด๋ฏธ ํ์ ๋ original_vector)์ ๊ธธ์ด(pivot_cell_radius)๋ฅผ ์ ๋ ฅํ์ฌ line_start๋ผ๋ ์ ์ ์์ฑํฉ๋๋ค. โข ์ด์ ๊ทธ ์ ์ start_leg๋ผ๋ output ํ๋ผ๋ฉํฐ์ ์ฐ๊ฒฐํ์ฌ ๋ทฐํฌํธ์์ ์ถ๋ ฅ๋ ์ ์๋๋ก ํฉ๋๋ค.
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 04
End Line 'defines pivot_pt //////////////////////////////////////////////////////////////////////////////////////////////
RADIUS = 2.5
nter Pt
Circle / Pivot Cell
End Leg Dim p_pt As New point3d(line_start.PointAt(1.0))
pivot_pt = p_pt 'defines pivot_cell //////////////////////////////////////////////////////////////////////////////////////////// Dim pivot_circle As New Circle(line_start.PointAt(1.0), pivot_cell_radius) ANGLE
pivot_cell = pivot_circle
eg
Pivot Point
โข โข โข
R LINE
03 A CIRCLE
์ ๋จ๊ณ์์ ๋ง๋ ๋ฒ์ , line_start๋ฅผ ์ด์ฉํ์ฌ ์์ ๊ทธ๋ฆฝ๋๋ค. ์ฐ์ line_start์ ๋์ ์ ์ ์ ์์ฑํ์ฌ ์ด๋ฅผ p_pt๋ผ๋ ์ ์ ํ ๋นํ๊ณ ์ด๋ฅผ ๋ค์ pivot_pt๋ผ๋ output ํ๋ผ๋ฉํฐ์ ํ ๋นํฉ๋๋ค. End Leg Pt p_pt๋ผ๋ ์ ์ ์ค์ฌ์ผ๋ก ํ๊ณ pivot_cell_radius๋งํผ์ ๋ฐ์ง๋ฆ์ ๊ฐ์ง๋ ์์ ์์ฑํ์ฌ pivot_circle์ด๋ผ๋ ์์ ํ ๋น ํฉ๋๋ค. ์ด๋ ๋ค์ pivot_cell์ด๋ผ๋ output ํ๋ผ๋ฉํฐ์ ํ ๋น๋ฉ๋๋ค.
04 ROTATE BY ANGLE
05 ROTATE BY ANGLE
End Line 'defines end_leg /////////////////////////////////////////////////////////////////////////////////////////////// Circle / Pivot Cell
End Leg
Dim rot As transform = transform.Rotation(pivot_ang * math.PI / 180, vector3d.ZAxis, line_start.PointAt(1.0)) Dim rotated_leg As line = line_start rotated_leg.Transform(rot) end_leg = rotated_leg
ANGLE
'defines end_leg_pt ////////////////////////////////////////////////////////////////////////////////////////////
Pivot Point
s_pt.Transform(rot) End Leg Pt
end_leg_pt = s_pt 'defines end_crv ///////////////////////////////////////////////////////////////////////////////////////////////
04 ROTATE BY ANGLE
Dim st_line As line = start_crv
05 ROTATE BY ANGLE
st_line.Transform(rot) End Line
Dim end_line_st_pt As New Point3d(st_line.PointAt(1.0)) Dim end_line_end_pt As New Point3d(st_line.PointAt(0.0)) Dim end_line As New line(end_line_st_pt, end_line_end_pt) end_crv = end_line โข โข โข โข โข
Pt
โข โข 05 ROTATE BY ANGLE
โข
์ด๋ฒ๋จ๊ณ์์๋ ์ ๋จ๊ณ์์ ๋ง๋ค์๋ start line, start leg, start leg point๋ค์ ์ค์ ์ธ pivot point๋ฅผ ์ค์ฌ์ผ๋ก pivot_ ang๋งํผ ํ์ ์์ผ์ end line, end leg, end leg point๋ฑ์ ์์ฑํ๋๋ก ํฉ๋๋ค. ํ๊ฐ ์ด์์ ํ์ ์์ ์ ํด์ผ ํ๋ฏ๋ก ํ์ matrix๋ฅผ ์์ฑํ ์ด๋ฅผ ์ฌ์ฐจ ์ฌ์ฉํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ํ์ matrix์ input์ผ๋ก๋ ํ์ ๊ฐ(pivot_ang), ํ์ ์ถ(z axis), ๊ทธ๋ฆฌ๊ณ ํ์ ์ ์ค์ฌ์ด ๋๋ ์ ์ด ํ์ํฉ๋๋ค. rotated_leg๋ผ๋ ์๋ก์ด ๋ผ์ธ์ ์์ฑํ ์ด์ ๊ธฐ์กด์ ์ ์ธ line_start๋ฅผ ํ ๋นํฉ๋๋ค. rotated_leg๋ฅผ transform matrix์ธ rot์ ํตํด ํ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํ์ ๋ ์ ์ end_leg๋ผ๋ output ํ๋ผ๋ฉํฐ์ ํ ๋นํฉ๋๋ค. let_pt์๋ ๋์ผํ ์์ ์ ํด ์ค๋๋ค. end_crv์๋ ๋์ผํ ์์ ์ ํด ์ค๋๋ค. ํ์ง๋ง ์ ์ ๋ฐฉํฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก start_crv๋ฅผ ํ์ ์ ๋ฐฉํฅ์ด ๋ฐ๋๊ฒ ๋ฉ๋ ๋ค. (์ด๋ก์ ํ์ดํ๋ก ํ์). ๊ทธ๋์ ์ด ์ ์ ๋ฐฉํฅ์ ๋ฐ๋๋ก ๋๋ ค์ผ ํฉ๋๋ค. ์ผ๋จ ์ ์ ํ์ ํํ, (st_line.Transform(rot)), ์ด ์ ์ ์๋์ ์ ์ฐพ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐํ์ฌ end_crv์ ๋ฐฉํฅ์ ๋ฐ ๋ก ์ก์ต๋๋ค. COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 05
USING A SUBROUTINE (FUNCTION) IN VB COMPONENT ์ด์ VB custom ์ค๋ธ์ ํธ๊ฐ ์ ์๋์ ํฉ๋๋ค. ์ด๋ฒ์๋ ์ปดํฌ๋ํธ์ ํ์ ์ ์๊ฑฐํด์ ์ด ์ปดํฌ๋ํธ๋ค์ ๋ฐฐ์ดํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ ๊ทธ๋ฆผ์์ ๋ณด๋ฏ ์์ง ๋ ๋ณต์ฌ์ ๋ถ์์ด๋ผ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ฏ๋ก ์ญ์๋ ๋ฒ๊ฑฐ๋กญ๊ณ ๋๋ ์์ ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. (003 subroutine component VB.ghx ํ์ผ์ ์ฐธ์กฐํ์ธ์)
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ VB scripting์ ์๋ธ๋ฃจํด์ ๊ฐ๋ ์ ์ดํด ํ๋ค๋ฉด ์ด๋ ๊ฒ ๊ธด ์ฝ๋๋ฅผ ์ข๋ ํจ์จ์ ์ผ๋ก ์ค์ผ์๋ ์์๊ฒ๋๋ค. ์๋ธ๋ฃจํด์ด๋ ์ผ์ข ์ ์ฌ์ฉ์ ํจ์์ ๊ฐ์ ๊ฐ๋ ์ธ๋ฐ, ์ผ๋จ ์ ์๋ฅผ ํด ๋์ผ๋ฉด, ์๋ธ๋ฃจํด์ ์ฐ๋ฆฌ๊ฐ VB scripting์์ line์ด๋ผ๋ ๊ณต์ฉ ํจ์๋ฅผ ์ฐ๋๊ฒ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
line(start point, direction vector, distance)
์๋ฅผ ๋ค์ด, FunctionA๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๋ธ๋ฃจํด์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ํฉ์๋ค. ์ด ์๋ธ๋ฃจํด์ ๋๊ฐ์ input๊ณผ ํ๋์ output์ผ๋ก ์ด๋ค์ ธ ์๊ณ ์ด๋ค์ผ์ธ๊ฐ๋ฅผ ํ๊ฒ ๋ฉ๋ ๋ค. ์ด ํจ์๊ฐ ์๋ํ๊ฒ ํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ์ VB ์ฝ๋๋ด์ ์ด๋๊ฐ์๊ฐ๋ ์ด ํจ์๊ฐ ๋ฌด์์ ํ๋ ํจ์์ธ์ง์๋ํด ์ ์๋ฅผ ํด์ค์ผ ํ๋ฉฐ ๋ ๋ค๋ฅธ ์ด๋ค ๋ถ๋ถ์ธ๊ฐ์ ์๋ ์ด ํจ์๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ ์ํด call ํ๋ ๋ถ๋ถ๋ ์์ด์ผ ํ ๊ฒ ์ ๋๋ค. ํจ์์ ์ ์๋ ๋ณดํต Custom additional code ๋ฅผ ์ํ ๋ณ๋์ ๊ณต๊ฐ์ ์์นํ๊ฒ ๋ ๋ฉฐ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด callํ๋ ๋ถ๋ถ์ ์ฐ๋ฆฌ๊ฐ ํํ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ ๊ณณ์ ์์นํ์ฌ์ผ ํฉ๋๋ค. ํจ์์ ์ ์์ ๋์ฌ๊ฒจ ๋ด์ผ ํ ๋ถ๋ถ์ ByVal๊ณผ ByRef์ธ๋ฐ์, ByVal์ ์ด ๋ณ์๊ฐ input๋ณ์๋ผ๋ ๊ฒ์ ๋งํ๊ณ ByRef๋ ์ด ๋ณ์๊ฐ output ํ๋ผ๋ฉํฐ๋ผ๋ ๊ฒ์ ์์ํ์ฌ ์ค๋๋ค.
FunctionA (ByVal input1, ByVal input2, ByRef output1)
โ<Custom additional code> Sub FunctionA (ByVal input1, ByVal input2, ByRef output1) ...... End Sub โ</Custom additional code>
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 06
์คํฌ๋ฆฝํธ ์๋ํฐ๋ฅผ ์ด๊ณ
๊ทธ๋ค์ ์ด๋ฅผ
โPrivate Sub ~โ ์์ โEnd Subโ ๊น์ง๋ฅผ ๋ณต์ฌํฉ๋๋ค.
โ<Custom additional code> ๊ณผ โ</Custom additional code> ์ฌ์ด์ ๊ณต๊ฐ์ ๋ถ์ฌ ๋ฃ์ต๋๋ค.
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 07
๊ทธ๋ฆฌ๊ณ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํจ์์ ์ด๋ฆ์ ์ ์ ํด ์ค๋๋ค. ์ด๋ฒ ๊ฒฝ์ฐ๋ ํจ์์ ์ด๋ฆ์ด component์ ๋๋ค.
์ด์ VB์ค๋ธ์ ํธ์ ์ค์ง์ ์ธ input๊ณผ outputํญ์ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฐ๊พธ์ด ์ค๋๋ค. input์ celltype์ด๋ผ๋ string ๋ณ์๊ฐ ์ถ๊ฐ๋๊ณ ์ธ๊ฐ์ ์ถ๊ฐ์ ์ธ ์ฌ์๊ฐ ๋ณ์๊ฐ ์ถ๊ฐ๋๊ฒ์ ์ ์ธํ๊ณ ๋ ๊ฑฐ์ ์ด์ ๊ณผ ๋์ผํฉ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ celltype์ด๋ผ๋ ๋ฌธ์์ด ๋ณ์์ ๋๋ค. ์ด ๋ณ์๋ ์ผ๋ง๋ ๋ง์ ์ปดํฌ๋ํธ๋ค์ด ์ด๋ ํ ๋ฐฐ์ด๋ก ์ฐ๊ฒฐ๋์ด ์๋์ง๋ฅผ ์ ์ํ๋ ๋ณ์์ ๋๋ค.
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 08
CODE REVIEW ์ด๋ฒ์๋ VB ์ค๋ธ์ ํธ์ ์ฝ๋๋ฅผ ํ์ค์ฉ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. VB ์ค๋ธ์ ํธ๋ฅผ ๋๋ธํด๋ฆญํ๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ ์ ์๋ ์ฐฝ์ด ๋์ต๋๋ค.
โdefines output parameters ////////////////////////////////////////////////////////////////////////////////////// Dim pivot_cell_list As New List(Of circle) Dim pivot_pt_list As New List(Of point3d) Dim start_leg_list As New List(Of Line) Dim start_leg_pt_list As New List(Of point3d) Dim end_leg_list As New List(Of Line) Dim end_leg_pt_list As New List(Of point3d) Dim end_crv_list As New List(Of Line) โข
์ด ๋ถ๋ถ์์๋ VB์ปดํฌ๋ํธ์ output ๊ฐ๋ค์ ์ ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ณต์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด๋ค์ ๋ชจ๋ ์์๋ค, ์ฆ start line, start leg, pivot cell, pivot point, end leg, end line๋ฑ๋ฑ์ด ๋ชจ๋ ๋ทฐํฌํธ์์ ์ถ๋ ฅ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๋ฅผ ์ํด์ ๋จ์ผ ๊ฐ๋ณด๋ค๋ ๋ฆฌ์คํธ์ ํํ๋ก ์ถ๋ ฅ์ ํ๋๊ฒ์ด ๋ ๋ฐ ๋์งํฉ๋๋ค.
โdefines output parameters of โcomponentโ subroutine ///////////////////////////////////////////////////////////// Dim pivot_cell As circle Dim pivot_pt As point3d Dim start_leg As line Dim start_leg_pt As point3d Dim end_leg As line Dim end_leg_pt As point3d Dim end_crv As line โข
์ด ๋ถ๋ถ์ ์๋ธ๋ฃจํด์ output ํ๋ผ๋ฉํฐ๋ค์ ์ ์ ํฉ๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์๋ธ๋ฃจํด์ callํ๊ธฐ ์ ์ ์ด ๋ณ์๋ค์ ์ค์ ํด๋์ง ์๋๋ค๋ฉด VB์ค๋ธ์ ํธ๋ ์ ๋ฌ๋ฉ์ธ์ง๋ฅผ ๋ํ๋ด๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ์๋ ๋ฐ๋๋ก ์๋ธ๋ฃจํด์ input ๋ณ์๋ค์ ๋ฏธ๋ฆฌ ์ ์ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ์ด ๋ณ์๋ค์ ์๋ธ๋ฃจํด ๋ด์์ ์ ์๊ฐ ๋๊ฑฐ๋ ํน์ VB์ค๋ธ์ ํธ ์์ฒด์ input ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
โdefines rotation_ang /////////////////////////////////////////////////////////////////////////////////////////// Dim rotation_ang As Double โข
์ด๋ถ๋ถ์ ์ฌ์๊ฐ์ ์ ์ ํ๋๋ฐ์, ๋ค๊ฐ๋ ์ฌ์๊ฐ์ ์ ๋ ฅํ๋ฉด์ ์ ๋ ๋ค๋ฅธ ๋ณ์๊ฐ ํ์ํ๊ฑธ๊น์. ์ด๋ ๋ค๊ฐ์ง ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฌ์๊ฐ์ ์ ๋ ฅ ํ๊ฒ ๋๋ฏ๋ก ์์ง์ ์ด๋ค ๊ฐ์ด ์ฌ์๊ฐ์ผ๋ก ๋ค์ด๊ฐ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ๋ฏธ๋ฆฌ ๊ฐ์์ ๊ฐ์ ์ ํด ๋๊ณ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ด ๊ฐ์์ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ๋ฐ๊ฟ์น๊ธฐ ํจ์ผ๋ก์จ ๋ณต์์ ๊ฒฝ์ฐ์ ์์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์์ต๋๋ค.
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 09
โchecks component types and computes output based on the types ///////////////////////////////////////////////// For i As Integer = 0 To celltype.Count - 1 If i = 0 Then If celltype(i) = โAโ Then rotation_ang = A_ang Else If celltype(i) = โBโ Then rotation_ang = B_ang Else If celltype(i) = โCโ Then rotation_ang = C_ang Else If celltype(i) = โDโ Then rotation_ang = D_ang End If component(int_line, r, rotation_ang, pivot_cell, pivot_pt, start_leg, start_leg_pt, end_leg, end_leg_pt, end_crv) โข โข โข
์ด์ ์ปดํฌ๋ํธ ํ์ ์ ๋ํ๋ด๋ ๋ฌธ์์ด์ ์ํด ์ปดํฌ๋ํธ๋ฅผ ์ฆ์์ํค๋๋ก ํฉ๋๋ค. ๋ฌธ์์ด์ ์ผ๋ง๋ ๋ง์ ๋ฌธ์๊ฐ ์๋๊ฐ์ ๋ฐ๋ผ for ๊ตฌ๋ฌธ์ ๋๋ฆฝ๋๋ค. ๋ง์ฝ ์ด๋ฒ ํ์ ์ด ์ฒซ๋ฒ์งธ๋ผ๋ฉด(if i = 0 then), โint_lineโ, ์ฆ ๋ผ์ด๋ ธ์์ ๋ง๋ ์ด๊ธฐ ์ง์ค๋ฉํธ๋ฆฌ๊ฐ ์๋ธ๋ฃจํด component์ ์ด๊ธฐ ์ ๋ ฅ๊ฐ์ด ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์ด์ ์ ์ฐ์ฐ์์ ๊ฒฐ๊ณผ๋ฌผ๋ก ๋์จ โend_crvโ๋ฅผ ์๋ธ๋ฃจํด์ ์ ๋ ฅ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ค์ ์ค์์๋ ์ด๋ ํ ํ์ ๋ฌธ์ (A/B/C/D)๊ฐ ๋์ค๋์ง์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฌ์๊ฐ โrotation_angโ์ ์ ์ฉํ๋ ์ง์ ๋ํ ๋ด์ฉ์ ๋๋ค. ๊ทธ ๋ค์์์๋ ๋๋์ด ์๋ธ๋ฃจํด component๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. ์ ๋ ฅ์ โint_lineโ(input geometry), โrโ(radius of a circle) ๊ณผ โrotation_angโ ์ด๋ฉฐ ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ โpivot_cellโ, โstart_legโ, โstart_leg_ptโ, โend_legโ, โend_leg_ptโ, ๊ณผ โend_crvโ ๋ฅผ ์ป์ต๋๋ค.
โข โข
Else If celltype(i) = โAโ Then rotation_ang = A_ang Else If celltype(i) = โBโ Then rotation_ang = B_ang Else If celltype(i) = โCโ Then rotation_ang = C_ang Else If celltype(i) = โDโ Then rotation_ang = D_ang End If int_line = end_crv component(int_line, r, rotation_ang, pivot_cell, pivot_pt, start_leg, start_leg_pt, end_leg, end_leg_pt, end_crv) End If โข
์๋ธ๋ฃจํด์ ํธ์ถํ๊ธฐ ์ โend_crvโ ๋ฅผ ๋ค์ iteration ์ ์ํ ์ด๊ธฐ๊ฐ์ธ โint_lineโ ์ ํ ๋นํฉ๋๋ค. COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 10
pivot_cell_list.Add(pivot_cell) pivot_pt_list.Add(pivot_pt) start_leg_list.Add(start_leg) start_leg_pt_list.Add(start_leg_pt) end_leg_list.Add(end_leg) end_leg_pt_list.Add(end_leg_pt) end_crv_list.Add(end_crv) Next โข
๊ฐ๊ฐ์ iteration์์ ๋ฐ์ํ output๊ฐ์ ๋ฆฌ์คํธ์ ํํ๋ก ์ ์ ํฉ๋๋ค.
โoutput ///////////////////////////////////////////////////////////////////////////////////////////////////////////// A = pivot_cell_list B = pivot_pt_list C = start_leg_list D = start_leg_pt_list E = end_leg_list F = end_leg_pt_list G = end_crv_list โข
์ด ๋ณ์๋ค์ ๋ผ์ด๋ ธ ๋ทฐํฌํธ์ ๋ฟ๋ ค์ฃผ๊ธฐ ์ํด A,B,C,D,E,F,G๋ผ๋ output ํญ์ ์ฐ๊ฒฐ ์ํต๋๋ค.
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 11
STEP03 PACKED
OPTIMUM SOLUTION BY GALAPAGOS
์ฃผ์งํ๋ค์ํผ, ์ปดํฌ๋ํธ๋ค์ ์์ฃผ ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ์ํค๊ธฐ ์ํด ์ฐ์ธก ๋ค ์ด์ด๊ทธ๋จ์ ๋ ๊ฑฐ๋ฆฌ๊ฐ์ ํฉ์ ๋๋๋ก ์์์ผ ํฉ๋๋ค. ํ์ง๋ง Galapagos ๋ ์ต์๊ฐ์ด ์๋ ์ต๋๊ฐ์ ์ฐพ๋๋ก ์ค๊ณ๋์ด์ ธ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฐ ๋ฆฌ๋ ๋๊ฐ์ ํฉํํ ์ด์ ์ญ์๋ฅผ ๊ตฌํด์ ์ด ๊ฐ์ด ์ต๋๊ฐ ๋๋ ์ฌ์๊ฐ์ ์กฐํฉ์ Galapagos์๊ฒ ์ฐพ๋๋ก ํฉ๋๋ค. (004 galapagos.ghx ํ์ผ์ ์ฐธ์กฐํ์ธ์) โข โข โข โข โข โข
VB ์์ ์์ฑ๋ end line์ค ์ ์ผ ๋ง์ง๋ง ๋ผ ์ธ๊ณผ start line์ค ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๋ผ์ธ์ ์ฐพ๋๋ค. ์ด๋ค์ด ์๋์ ์ ์ฐพ์ ์์์ ๋ผ๋ฆฌ์ ๊ฑฐ๋ฆฌ์ ๋์ ๋ผ๋ฆฌ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด D1, D2๋ผ ์ ์ ํ๋ค. ๋ ๊ฐ์ ํฉํํ ์ญ์๋ฅผ ์ทจํ๋ค. Galapagos์ Genomeํญ์ ์ฌ์๊ฐ ์ฌ๋ผ์ด๋ ๋ค์ ์ฐ๊ฒฐํด ์ค๋ค. Galapagos์ Fitness ํญ์ ๊ฑฐ๋ฆฌ๊ฐ์ ์ญ์์ ์ฐ๊ฒฐํ๋ค. Galapagos๋ฅผ ๋๋ธํด๋ฆญํ์ฌ solver ํญ์ผ๋ก ์ด ๋ํ start solver๋ฒํผ์ ๋๋ฅธํ ์ฐ์ฐ์ด ์๋ฃ ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
D1
D2
COMPONENT PACKING VB + GALAPAGOS - http://woojsung.com 12