๋ฐ˜์‘ํ˜•

์†Œ๊ฐœ

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ Node Editor UI์— ๋Œ€ํ•ด ์†Œ๊ฐœ๋ฅผ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. Node Editor๋Š” ๋ชจ๋“ˆ ๋‹จ์œ„์ธ ๋…ธ๋“œ(Node)๋ฅผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ํŽธ์ง‘ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

[.Net] Node Editor UI ํ”„๋ ˆ์ž„์›Œํฌ ์†Œ๊ฐœ - NodeNetwork

 

[.Net] Node Editor UI ํ”„๋ ˆ์ž„์›Œํฌ ์†Œ๊ฐœ - NodeNetwork

Node Editor UI๋ž€? ํ˜น์‹œ ๋ธ”๋ Œ๋”(Blender)๋ผ๋Š” 3D CG ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ณธ ์ ์ด ์žˆ๋‚˜์š”? ์ด ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์˜คํ”ˆ ์†Œ์Šค๋กœ ์†Œ์Šค๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ์žˆ๊ณ , ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Node Editor๋ž‘ ๋ฌด์Šจ

luckygg.tistory.com

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Node Editor UI ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜์ธ WPF Node Network๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์€ NodeNetwork Documentation์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

https://wouterdek.me/NodeNetwork/doc

 

NodeNetwork

A node editor component library for C# WPF using ReactiveUI.

wouterdek.me

NodeNetwork ํŠน์ง•

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ–ˆ๋˜ ๋‚ด์šฉ ์ค‘ ์ค‘์š”ํ•œ ํŠน์ง•์„ ๋‹ค์‹œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • .Net Framework 4.7.2์™€ .Net Core 3.1 ์ด์ƒ
  • WPF ๊ธฐ๋ฐ˜
  • MVVM ๊ตฌ์กฐ๋กœ ๋Œ€ํ™”ํ˜• ์ปจํŠธ๋กค ๊ตฌ์ถ•
  • ํŒจ๋‹(panning), ํ™•๋Œ€/์ถ•์†Œ(zooming) ์ง€์›
  • ๋ ˆ์ด์•„์›ƒ ์ž๋™ ์ œ์–ด
  • ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ (์ƒ‰์ƒ, ํฌํŠธ ๋ชจ์–‘, ์ปจํŠธ๋กค ์ถ”๊ฐ€, ๊ทธ๋ฃนํ™” ๋“ฑ)
  • ์•„ํŒŒ์น˜(Apache) 2.0 ๋ผ์ด์„ ์Šค

ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„์‰ฝ๊ฒŒ๋„ WPF์—์„œ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” WPF๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ WinForm์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ง€์›๋˜์ง€ ์•Š๋”๊ตฐ์š”. ๋งŒ์•ฝ WPF ๋ชจ๋“ˆ์„ WinForm์— ๋Œ๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณค ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” MVVM(Model-View-ViewModel) ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. MVVM ํŒจํ„ด์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์— ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. MVVM ํŒจํ„ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

https://www.codeproject.com/Articles/100175/Model-View-ViewModel-MVVM-Explained

 

Model-View-ViewModel (MVVM) Explained

An introduction to the Model-View-ViewModel (MVVM) pattern.

www.codeproject.com

NodeNetwork ๊ธฐ๋ณธ ๊ฐœ๋…

๋ณธ๋ฌธ์˜ ์„ค๋ช…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  GUI ์ปจํŠธ๋กค์˜ ์šฉ์–ด๋ฅผ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ(Network)
    • ๋…ธ๋“œ(Node)
      • ์ž…๋ ฅ(Input)
        • ์—๋””ํ„ฐ(Editor, ์ œ์–ด ํŒŒ๋ผ๋ฏธํ„ฐ)
        • ํฌํŠธ(Port, ์—ฐ๊ฒฐ ์ง€์ )
      • ์ถœ๋ ฅ
        • Editor
        • Port
    • ์—ฐ๊ฒฐ(Connection)
    • ๋ณด๋ฅ˜ ์ค‘์ธ ์—ฐ๊ฒฐ(Pending connection)
    • ์ ˆ๋‹จ(Cutline)
    • ์˜์—ญ ์„ ํƒ(Selection rectanlge)

๊ฐ ์šฉ์–ด๊ฐ€ ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Node components

๋…ธ๋“œ๋Š” ํ•จ์ˆ˜(function)์ด๋ฉฐ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ(end point)์„ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์€ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํฌํŠธ(port)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ์€ ๋…ธ๋“œ์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์—๋””ํ„ฐ(editor)๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฐŒ ๋ณด๋ฉด ์—๋””ํ„ฐ๋Š” ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ์—๋„ ์—๋””ํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ž…๋ ฅ์—์„œ ์ถœ๋ ฅ์„ ๊ฒฐ์ •์ง“๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋ง๋กœ ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๋  ๊ฒ๋‹ˆ๋‹ค.

๋…ธ๋“œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์„ฑ
๋…ธ๋“œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์„ฑ

Connections

์—ฐ๊ฒฐ(connection)์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠœํ”Œ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ ๊ฐ„์—๋งŒ ํ˜•์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ์ž…๋ ฅ์—๋Š” 1๊ฐœ์˜ ์—ฐ๊ฒฐ๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ถœ๋ ฅ์—๋Š” ๋ฌด์ œํ•œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ค์ •์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด๋ฅ˜ ์ค‘์ธ ์—ฐ๊ฒฐ(pending connection)์€ ํฌํŠธ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋“œ๋ž˜๊ทธ ์ค‘์ธ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์—ฐ๊ฒฐ์ด ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์ด์ฃ .

์—ฐ๊ฒฐ๊ณผ ๋ณด๋ฅ˜ ์ค‘์ธ ์—ฐ๊ฒฐ ์ƒํƒœ
์—ฐ๊ฒฐ๊ณผ ๋ณด๋ฅ˜ ์ค‘์ธ ์—ฐ๊ฒฐ ์ƒํƒœ

Cutline

์ ˆ๋‹จ(cutline)์€ ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  ๋“œ๋ž˜๊ทธํ•˜๋ฉด ๋‚˜ํƒ€๋‚˜๋Š” ์„ ์ž…๋‹ˆ๋‹ค. ์ด ์„ ๊ณผ ๊ต์ฐจ๋˜๋Š” ๋ชจ๋“  ์—ฐ๊ฒฐ์ด ๊ฐ•์กฐ ํ‘œ์‹œ๋˜๋ฉฐ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ๋–ผ๋ฉด ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง‘๋‹ˆ๋‹ค.

์ ˆ๋‹จ ํ‘œ์‹œ
์ ˆ๋‹จ ํ‘œ์‹œ

Selection rectangle

์‚ฌ์šฉ์ž๊ฐ€ Shift ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ์—์„œ ์™ผ์ชฝ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  ๋“œ๋ž˜๊ทธํ•˜๋ฉด ์‚ฌ๊ฐํ˜•์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ๊ฐํ˜•์— ํฌํ•จ๋˜๊ฑฐ๋‚˜ ๊ต์ฐจํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„ ํƒ๋˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์„ ํƒ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์˜์—ญ ์„ ํƒ ํ‘œ์‹œ
์˜์—ญ ์„ ํƒ ํ‘œ์‹œ

๋ฐ˜์‘ํ˜•