2023/09/03
Asciidoctor-pdf 한글 적용하기
개발 문서를 Asciidoctor를 사용해보고자 알아보던 중 Asciidoctor 문서를 PDF로 생성할 경우 한글 출력에 문제가 있음이 확인되었다.
Asciidoctor 의 Theme 의 font 설정을 통해 해결할 수 있다는 글을 보고 방법을 찾아 보았다.
문서의 독립적인 Theme를 설정하는 것으로 Theme중 font에 대한 내용만 재정의 하여 대응할 수 있었다.
먼저 Theme 를 재정의하고 사용할 Font를 저장하기위해 문서 폴더 하위에 res 폴더을 만들어 두었다. 그리고 그 폴더에서 사용할 맑은 고딕 폰트 "malgun.ttf"와 "D2Coding-Ver1.3.2-20180524.ttf"를 복사해 두었다.
그리고 Theme를 작성하기위해 설치된 기본 Theme인 default-theme.yaml 파일을 my-theme.yaml로 복사하였다.
default-theme.yaml파일을 asciidoctor-pdf 가 설치된 경로의 data\themes 에서 복사하였다.
복사하고 기본값을 반영하기위해 extends: default를 추가하고 필요한 부분만 아래와 같이 작성하였다.
extends: default
font:
catalog:
# Noto Serif supports Latin, Latin-1 Supplement, Latin Extended-A, Greek, Cyrillic, Vietnamese & an assortment of symbols
Noto Sans:
normal: malgun.ttf
bold: malgun.ttf
italic: malgun.ttf
bold_italic: malgun.ttf
# M+ 1mn supports ASCII and the circled numbers used for conums
M+ 1mn:
normal: D2Coding-Ver1.3.2-20180524.ttf
bold: D2Coding-Ver1.3.2-20180524.ttf
italic: D2Coding-Ver1.3.2-20180524.ttf
bold_italic: D2Coding-Ver1.3.2-20180524.ttf
page:
background_color: FFFFFF
layout: portrait
initial_zoom: FitH
margin: [0.4in, 0.4in, 0.4in, 0.4in]
# margin_inner and margin_outer keys are used for recto/verso print margins when media=prepress
margin_inner: 0.0in
margin_outer: 0.0in
size: A4
base:
font_family: Noto Sans
이렇게 정의한 theme 파일과 폰트를 적용하기위해 아래 명령을 수행하였다.
asciidoctor-pdf --theme my-theme.yml -a pdf-themesdir=res -a pdf-fontsdir="res;GEM_FONTS_DIR" test.adoc --out-file test_my2.pdf그 결과 한글은 정상적으로 출력 되는 것을 확인하였다.
그래서 추가 정보(https://docs.asciidoctor.org/pdf-converter/latest/theme/cjk/)를 찾아 수정하였다.
extends: default
font:
catalog:
merge: true
Noto Sans KR: malgun.ttf
Noto Sans Mono KR: D2Coding-Ver1.3.2-20180524.ttf
fallbacks:
- Noto Serif
page:
background_color: FFFFFF
layout: portrait
initial_zoom: FitH
margin: [0.4in, 0.4in, 0.4in, 0.4in]
# margin_inner and margin_outer keys are used for recto/verso print margins when media=prepress
margin_inner: 0.0in
margin_outer: 0.0in
size: A4
base:
font_family: Noto Sans KR
codespan:
font-family: Noto Sans Mono KR
kbd:
font-family: $codespan-font-family
code:
font-family: $codespan-font-family
위 Theme 로 얻은 결과이다.
한글과 키보드 단축키 매트로가 모두 정상적으로 출력되는 결과를 얻었다.
2022/01/02
VTK v9.1 Build Error: Failed to determine the thread implementation in use by the compiler.
오랜만에 VTK 를 빌드해 보았다.
예전과는 다른게 추가로 설정할 것이 많이 줄어 들었다.
CMake 로 구성을 하는 중 에러가 발생하였는데 이를 해결하는 것이 가장 큰 걸림돌 이였다.
에러는 Configuration 도중 Common\Core\CMakeLists.txt 파일에서 에러가 발생하였다.
Found Threads: TRUE
CMake Error at Common/Core/CMakeLists.txt:365 (message):
Failed to determine the thread implementation in use by the compiler.
인터넷 검색을 통해서 해결책(https://gitlab.kitware.com/vtk/vtk/-/issues/18281)을 찾았다.
해결 방법은 Thread를 Win32 Thread를 사용하도록 구성하는 것이였다.
문제가 발생한 CMakeLists.txt 파일에서 아래 코드를 추가하는 것이다.
set(CMAKE_USE_PTHREADS_INIT 0)
set(CMAKE_USE_WIN32_THREADS_INIT 1)
추가하는 위치는 아래 코드 바로 아래쪽에 추가해준다.
vtk_module_find_package(
PACKAGE Threads)
조치 후 Configuration 및 Build에 문제가 발생하지 않았다.
2021/10/08
Windows 11에서 이전버전의 Context Menu 사용하기
Windows 11을 사용하면서 가장 불편한 점이 개편된 Context Menu였다.

새로운 Context Menu는 몇 개의 대표 메뉴로 구성되었고 이전의 Context Menu를 보려면 "Show more options" 메뉴를 선택해야만 하였다.
Context Menu 에 등록된 압축관련 메뉴와 폴더 생성 메뉴를 자주 사용하기에 개편된 Context Menu는 상당히 불편하였다.
Windows 11 22000 버전 이전에는 옵션메뉴를 통해 이전 Context Menu로 변경할 수 있었으나 22000 버전 이후로는 이마저도 막혀버렸다.
그러던 중 레이스트리를 편집하여 이전 버전의 Context Menu를 활성화 하는 방법을 찾았다.
레지스트리 편집기를 열어 HKEY_CURRENT_USER\Software\Classes\CLSID 에 {86ca1aa0-34aa-4e8b-a509-50c905bae2a2} 를 추가하고 추가한 {86ca1aa0-34aa-4e8b-a509-50c905bae2a2} 키에 서브키 InprocServer32 를 추가한 후 (Default) 값을 공란으로 설정한다.

레지스트리 편집을 마치고 재부팅을하면 이전 Windows 10 버전의 Context Menu를 볼 수 있다.

2021/08/13
[Flutter] Android SDK 및 Android Studio 경로 설정하기
개인적으로 개발관련 프로그램 및 필요 요소 구성할 때 설치 프로그램을 사용하지 않고 구성하는 것을 선호한다.
Android SDK 와 Android Studio 를 수동 설치하여 사용중인데 Flutter를 구성하면서 이들을 수동을 구성하는 법을 알아보닸다.
방법은 Flutter config 명령을 이용하여 설정할 수 있었다.
도스 명령장에서 "Flutter config" 명령을 수행하면 도움말이 보여는데 옵션 중 "--android-sdk"와 "--android-studio-dir"를 이용하여 설정할 수 있었다.
flutter config --android-studio-dir="E:\Dev\android-studio"
위 두 명령을 설정 후 다시 flutter config 명령을 수행하면 도움말 하단에 설정된 내용을 볼 수 있었다.
android-sdk: E:\Dev\android-sdk
android-studio-dir: E:\Dev\android-studio
2021/07/13
[Flutter] Error: Cannot run with sound null safety
Flutter 개발환경을 구축해보고 공식 사이트의 안내를 따라 앱을 만들어 보았는데 실행부터 에러가 발생하였다.
https://flutter-ko.dev/docs/get-started/codelab
Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:
- package:english_words
해결을 위해 인터넷을 찾아보니 해결책은 나오는데 원인은 모르겠다. 앱을 만들기 쉽다고 하는데 내게는 그리 쉽운게 아닌 것 같다. 해결 방법은 실행 명령 파라메터에 "--no-sound-null-safety"를 추가하는 것이다.
Android Studio 를 사용하는경우, 메인 메뉴의 Run 메뉴에 있는 "Edit Configuration..." 메뉴 대화상자의 "Additional run args" 항목에 "--no-sound-null-safety"를 추가한다.
Visual Studio Code 를 사용하는 경우, File > Preferences > Settings (Ctrl + ,) 에서 "Flutter run additional args" 를 찾아서 아이템을 추가하고 "--no-sound-null-safety"를 입력한다.
파라메터 입력 후 실행을하니 정상 실행되는 결과 화면을 볼 수 있었다.
2021/07/10
[Windows 11] 구형 노트북에 Windows 11 업그레이드 하기
회사에서 사용하는 PC에 Windows 11을 업그레이드 한 후 집에서 사용하는 노트북에도 설치를 해 보고 싶었다. 그래서 시도를 해 보았지만 HW이 충족되지 않아 할 수 없었다.
그래도 역시나 비슷한 상황에서 해결하려는 사람들이 많았는지 인터넷에 해결방법이 나와 있었다.
Bypass TPM 2.0 Requirement for Windows 11 Insider Preview via Windows update / Insider Programme
사전준비는 Registry 편집 단계로 HW 조건 미충족 문제를 해결하기 위한 것으로 강제로 Dev Channel 사용할 수 있게 하는 것과 Windows 11의 필수 HW 조건인 TPM 2.0 과 Secure Boot를 무시하도록 하기위한 조치이다.
Dev Channel 을 사용하기 위해 아래 두 키에 포함되어있는 일부 항목을 수정한다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsSelfHost\UI\Selection
UIBranch = Dev
UIContentType = Mainline
UIRing = External
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsSelfHost\Applicability
BranchName = Dev
ContentType = Mainline
Ring = External
다음으로 TPM 과 Secure Boot 를 해결하기 위한 것으로 HKEY_LOCAL_MACHINE\SYSTEM\Setup 에 LabConfig 키를 추가하고 DWORD 항목 BypassTPMCheck와 BypassSecureBootCheck를 추가하여 1로 설정한다.
HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig
BypassTPMCheck = 1
BypassSecureBootCheck = 1
위의 조치로 Windows Insider Program의 Dev Channel을 사용할 수 있고 해당 채널을 이용하여 업그레이드를 진행한다.
업그레이드 도중 TPM 2.0 이 없는 경우 아래와 같이 오류 메시지가 출력되고 업그레이드가 종료된다.
이때 https://github.com/CodeProf14/Fix-TPM 에서 AppraiserRes.dll 파일을 다운로드 받아서 C:\$WINDOWS.~BT\Sources 경로에 복사해준다. 그리고 업데이트 대화상자에서 Fix Issue 버튼을 선택하고 다시 업그레이드를 시도한다. 이번에는 업그레이트가 멈춤 없이 진행되었다.
재부팅 후 Windows 11을 볼 수 있었다.
.
2021/07/07
[Windows 11] 탐색기의 파일 리스트의 간격을 줄이기
언제부터인가 탐색기의 파일 항목 리스트의 간격이 매우 넓어졌다. 아마도 20H2 버전부터인것 같다.
간격이 넓어지다보니 한화면에 보여주는 파일 수가 많이 줄어들어 불편하여 이전 형태로 변경하는 방법을 찾아보았다. 어전 버전부터 지원하는 기능인지는 모르겠으나 Windows 11 에서는 탐색기 옵션으로 간격을 원래대로 돌릴 수 있었다.
폴더 옵션 대화상자에서 "Decrease space between items (compact view)" 옵션을 선택해 주기만하면 된다.
옵션 설정후 탐색기를 다시 시작하면 예전처럼 파일 항목 간격이 줄어든 것을 볼 수 있다.
[Windows 11] 파일 탐색기의 팝업메뉴(Context Menu)을 Windows 10 형태로 변경하기
※ 22000.71 버전 이후로 적용이 되지 않는다. ☹️
Windows 11의 큰 변화중의 하나는 파일 탐색기의 리본바와 팝업메뉴의 간소화이다.
메인 메뉴의 사용이 많지 않는 나는 간소화에 큰 영향이 없는데 팝업 메뉴의 경우 간소화로 많은 불편함을 가져왔다.
탐색기 작업에 많은 부분을 팝업 메뉴로 처리를 했는데 기존의 메뉴를 부르기에는 매우 불편하게 변경이 되었다. 나와 유사한 생각을 하는 사람이 많아서인지 이전 형태의 팝업 메뉴로 전환하는 방법을 찾는 사람이 많은 것 같다.
이전 형태로 되돌리는 방법은 간단하였다. 폴더 옵션에서 "Launch folder windows in a separate process" 옵션을 선택해 주기만 하면된다.
이전 버전에도 있는 옵션인데 어찌 이번 버전에서는 탐색기의 외형까지 영향을 주는지는 모르겠으나 이 옵션을 설정하면 이전 형태의 탐색기를 사용할 수 있다.
2021/07/06
Windows 11 업그레이드
Windows 11 이 발표되고 얼마되지 않아 Windows Insider Program 의 Dev Channel에 Windows 11 인 Build 22000.51 버전이 올라왔다. 사용하고 있던 PC에 바로 설치해 보았다.
![]() |
| Windows 11 |
업그레이드는 생각보다는 빠르게 진행되었다. 업그레이드 후 로그인을 하니 산뜻한 배경화면이 맞이해 주었다.
처음에는 작업표시줄이 중앙정렬되어 다소 어색한 느낌이었다. 개인적으로 작업표시줄의 버튼의 위치가 고정되어 있는것을 선호하여 작업 표시줄을 좌측정렬로 변경하였다. 작업표시줄에서 마우스 우측 버튼 메뉴인 Taskbar Settings을 선택해서 보여지는 메뉴중 Behaviors 설정에서 정렬을 바꾸어 줄 수 있다.
![]() |
| 작업표시줄 마우스 우측 메뉴 |
![]() |
| 작업표시줄 버튼 정렬 설정 |
Windows 11 에서는 윈도우와 팝업메뉴의 모서리가 둥글게 처리되었다.
![]() |
| 윈도우와 팝업메뉴 |
윈도우와 팝업메뉴 뿐만아니라 버튼들도 둥글둥글 하게 변했고, 텍스트 입력 상자도 밑줄색이 추가되었다.
기본 윈도우 컨트롤을 사용하는 프로그램들은 모두 둥글둥글한 모습을 보여주었다.
그리고 탐색기도 큰 변화가 있었다. 둥글둥글한 윈도우에 기존 메인 메뉴인 리본메뉴와 마우스 우측 메뉴도 간소화되었다.
![]() |
| 파일 탐색기 |
![]() |
| 탐색기 우측 메뉴 |
탐색기 우측 메뉴가 간소화되면서 기존 우측 Context 메뉴의 사용 빈도가 높은 나로서는 상당히 불편한 변화였다. 계속 사용하면서 해결 방법과 장단점을 찾아 봐야겠다.
2021/07/05
Android license status unknown 문제 해결
Flutter을 해 보고 싶어서 설치를 했는데 설치후 flutter doctor을 수행하니 Android license status unknown 에러가 나왔다.
flutter doctor --android-license 를 수행하면 자바 에러가 발생하였다. JDK 는 OpenJDK 17을 사용하고 있었다.
해결 방법을 알 수 었어 인터넷에 검색을 해 보니 몇 가지 해결책이 검색이 되었다.
- JDK 버전을 JDK8 로 변경
- Android SDK Tools(Obsolete)을 설치
- SDKManager.bat 및 jar 파일 다운받아 설치
- Android SDK Command-line Tools 설치
"JDK 버전을 JDK8 로 변경"은 원치 않았다 가급적 최신 JDK를 사용하고 싶어서 이 방법은 시도하지 않았다.
"Android SDK Tools(Obsolete)" 은 내가 설치한 Android SDK 에는 해당 항목이 보이지 않았다. "Hide Obsolete Packages" 항목을 해제해도 나타나지 않았다.
"SDKManager.bat 및 jar 파일 다운받아 설치" 방법은 너무 복잡하고 뭔가 깔끔해 보이지 않았다.
그래서 마지막으로 선택한 방법이 "Android SDK Command-line Tools 설치" 이였다.
Android SDK Command-line Tools을 설치 한 후, flutter doctor를 수행하여 에러가 사라졌음을 확인하였고 flutter doctor --android-license 명려으로 다수의 라이선스를 수용하는 질의에 응답하였다.
License 관련 다섯가지 정도의 라이선스 수용 질의에 응답 후 flutter doctor 를 수행하여 상태를 확인해보니 정상적인 결과가 나왔다.
2021/05/08
[Python] 설치되어있는 모든 패키지 업데이트하기
pip freeze > pip_packages.txt pip_packages.txt 파일을 열어 "==" 를 ">=" 로 변경 pip install -r pip_packages.txt --upgrade PowerShell 을 이용한 방법 pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
2020/12/29
[Android][Kotlin] Hello World
코틀린을 이용하여 안드로이드 앱을 만들어 보기로했다.
그래서 새로운 언어를 배우는 첫 번째 관문인 Hello World를 도전해 봤다.
Android Studio 4.1.1 버전을 이용하며 시도해보았다.
Kotlin plugin이 기본으로 설치가되어 있어서 별도로 설정해 주어야 할게 없었다.
Android Studio 를 실생시켜 새로운 프로젝트를 만들었다.
"Empty Project"를 프로젝트를 생성하여 프로젝트 이름과 Kotlin 설정만 하였다.
기본적으로 만들어진 프로젝트를 AVD를 이용하여 실행해 보았다.
짜잔~ 앱이 실행되었다.
이제 슬슬 공부를 해봐야겠다.
2020/08/07
MFC 대화장자에 VTK 올리기
이전 글(VTK 9.0.1 컴파일하기)에서 만들어진 VTK 빌드 결과물을 가지고 MFC 대화상자에 VTK를 올려보았다.
Test를 위한 대화상자 생성
Visual Studio 2019버전으로 테스트를 위한 대화상자 기반의 프로젝트 TestVTK를 만들었다. 2019버전으로는 처음 프로젝트를 먄들어보았는데 이전 버전과 프로젝트를 만드는 방법이 다소 달라졌고 프로젝트 구성이 달라졌다. VTK를 64비트만 빌드하여 테스트 프로젝트도 64비트 구성만 하였다.
VTK Property 파일 생성 및 구성 설정
Property Manager 에서 새로운 Property Sheet를 VTK_v9.0.1.props 파일로 만들었다.
VTK 경로를 하나의 설정으로 통일하여 관리하기 위해 VTK 빌드 결과물 경로를 User Macro에 VTK_DIR 이름으로 추가한다.
VTK_DIR 매크로를 이용하여 Include 및 Library 경로에 VTK 경로를 설정한다.
VC++ Directories > Include Directories: $(VTK_DIR)\include\vtk-9.0
VC++ Directories > Library Directories: $(VTK_DIR)\lib
VTK 사용을위한 기본 헤더 파일 작성
VTK 사용에 필요한 내용을 하나의 헤더파일로 작성을하여 관리하기위해 VTK_Prep.h 파일을 만들었다. 이 파일에는 VTK 초기화 코드와 VTK 사용에 필요한 헤더파일의 include와 빌드 속성에따른 lib 파일의 링크를 추가하였다. 라이브러리 파일은 모든 lib 파일을 추가하였고 Debug또는 Release에따라 로드되도록 하였다.
#pragma once #include <vtkAutoInit.h> #define vtkRenderingCore_AUTOINIT 3(vtkRenderingOpenGL2, vtkInteractionStyle, vtkRenderingFreeType) #define vtkRenderingContext2D_AUTOINIT 1(vtkRenderingContextOpenGL2) #define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL) #include <vtkRenderWindow.h> #include <vtkSmartPointer.h> #include <vtkPolyData.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleTrackballCamera.h> #include <vtkConeSource.h> #include <vtkCamera.h> #include <vtkLight.h> #include <vtkPoints.h> #include <vtkCellArray.h> #include <vtkPolyData.h> #ifdef _DEBUG #pragma comment(lib, "vtkChartsCore-9.0d.lib") #pragma comment(lib, "vtkCommonColor-9.0d.lib") #pragma comment(lib, "vtkCommonComputationalGeometry-9.0d.lib") #pragma comment(lib, "vtkCommonCore-9.0d.lib") #pragma comment(lib, "vtkCommonDataModel-9.0d.lib") #pragma comment(lib, "vtkCommonExecutionModel-9.0d.lib") #pragma comment(lib, "vtkCommonMath-9.0d.lib") #pragma comment(lib, "vtkCommonMisc-9.0d.lib") #pragma comment(lib, "vtkCommonSystem-9.0d.lib") #pragma comment(lib, "vtkCommonTransforms-9.0d.lib") #pragma comment(lib, "vtkDICOMParser-9.0d.lib") #pragma comment(lib, "vtkDomainsChemistry-9.0d.lib") #pragma comment(lib, "vtkdoubleconversion-9.0d.lib") #pragma comment(lib, "vtkexodusII-9.0d.lib") #pragma comment(lib, "vtkexpat-9.0d.lib") #pragma comment(lib, "vtkFiltersAMR-9.0d.lib") #pragma comment(lib, "vtkFiltersCore-9.0d.lib") #pragma comment(lib, "vtkFiltersExtraction-9.0d.lib") #pragma comment(lib, "vtkFiltersFlowPaths-9.0d.lib") #pragma comment(lib, "vtkFiltersGeneral-9.0d.lib") #pragma comment(lib, "vtkFiltersGeneric-9.0d.lib") #pragma comment(lib, "vtkFiltersGeometry-9.0d.lib") #pragma comment(lib, "vtkFiltersHybrid-9.0d.lib") #pragma comment(lib, "vtkFiltersHyperTree-9.0d.lib") #pragma comment(lib, "vtkFiltersImaging-9.0d.lib") #pragma comment(lib, "vtkFiltersModeling-9.0d.lib") #pragma comment(lib, "vtkFiltersParallel-9.0d.lib") #pragma comment(lib, "vtkFiltersParallelImaging-9.0d.lib") #pragma comment(lib, "vtkFiltersPoints-9.0d.lib") #pragma comment(lib, "vtkFiltersProgrammable-9.0d.lib") #pragma comment(lib, "vtkFiltersSelection-9.0d.lib") #pragma comment(lib, "vtkFiltersSMP-9.0d.lib") #pragma comment(lib, "vtkFiltersSources-9.0d.lib") #pragma comment(lib, "vtkFiltersStatistics-9.0d.lib") #pragma comment(lib, "vtkFiltersTexture-9.0d.lib") #pragma comment(lib, "vtkFiltersTopology-9.0d.lib") #pragma comment(lib, "vtkFiltersVerdict-9.0d.lib") #pragma comment(lib, "vtkfreetype-9.0d.lib") #pragma comment(lib, "vtkGeovisCore-9.0d.lib") #pragma comment(lib, "vtkgl2ps-9.0d.lib") #pragma comment(lib, "vtkglew-9.0d.lib") #pragma comment(lib, "vtkhdf5-9.0d.lib") #pragma comment(lib, "vtkhdf5_hl-9.0d.lib") #pragma comment(lib, "vtkImagingColor-9.0d.lib") #pragma comment(lib, "vtkImagingCore-9.0d.lib") #pragma comment(lib, "vtkImagingFourier-9.0d.lib") #pragma comment(lib, "vtkImagingGeneral-9.0d.lib") #pragma comment(lib, "vtkImagingHybrid-9.0d.lib") #pragma comment(lib, "vtkImagingMath-9.0d.lib") #pragma comment(lib, "vtkImagingMorphological-9.0d.lib") #pragma comment(lib, "vtkImagingSources-9.0d.lib") #pragma comment(lib, "vtkImagingStatistics-9.0d.lib") #pragma comment(lib, "vtkImagingStencil-9.0d.lib") #pragma comment(lib, "vtkInfovisCore-9.0d.lib") #pragma comment(lib, "vtkInfovisLayout-9.0d.lib") #pragma comment(lib, "vtkInteractionImage-9.0d.lib") #pragma comment(lib, "vtkInteractionStyle-9.0d.lib") #pragma comment(lib, "vtkInteractionWidgets-9.0d.lib") #pragma comment(lib, "vtkIOAMR-9.0d.lib") #pragma comment(lib, "vtkIOAsynchronous-9.0d.lib") #pragma comment(lib, "vtkIOCityGML-9.0d.lib") #pragma comment(lib, "vtkIOCore-9.0d.lib") #pragma comment(lib, "vtkIOEnSight-9.0d.lib") #pragma comment(lib, "vtkIOExodus-9.0d.lib") #pragma comment(lib, "vtkIOExport-9.0d.lib") #pragma comment(lib, "vtkIOExportGL2PS-9.0d.lib") #pragma comment(lib, "vtkIOExportPDF-9.0d.lib") #pragma comment(lib, "vtkIOGeometry-9.0d.lib") #pragma comment(lib, "vtkIOImage-9.0d.lib") #pragma comment(lib, "vtkIOImport-9.0d.lib") #pragma comment(lib, "vtkIOInfovis-9.0d.lib") #pragma comment(lib, "vtkIOLegacy-9.0d.lib") #pragma comment(lib, "vtkIOLSDyna-9.0d.lib") #pragma comment(lib, "vtkIOMINC-9.0d.lib") #pragma comment(lib, "vtkIOMotionFX-9.0d.lib") #pragma comment(lib, "vtkIOMovie-9.0d.lib") #pragma comment(lib, "vtkIONetCDF-9.0d.lib") #pragma comment(lib, "vtkIOOggTheora-9.0d.lib") #pragma comment(lib, "vtkIOParallel-9.0d.lib") #pragma comment(lib, "vtkIOParallelXML-9.0d.lib") #pragma comment(lib, "vtkIOPLY-9.0d.lib") #pragma comment(lib, "vtkIOSegY-9.0d.lib") #pragma comment(lib, "vtkIOSQL-9.0d.lib") #pragma comment(lib, "vtkIOTecplotTable-9.0d.lib") #pragma comment(lib, "vtkIOVeraOut-9.0d.lib") #pragma comment(lib, "vtkIOVideo-9.0d.lib") #pragma comment(lib, "vtkIOXML-9.0d.lib") #pragma comment(lib, "vtkIOXMLParser-9.0d.lib") #pragma comment(lib, "vtkjpeg-9.0d.lib") #pragma comment(lib, "vtkjsoncpp-9.0d.lib") #pragma comment(lib, "vtklibharu-9.0d.lib") #pragma comment(lib, "vtklibproj-9.0d.lib") #pragma comment(lib, "vtklibxml2-9.0d.lib") #pragma comment(lib, "vtkloguru-9.0d.lib") #pragma comment(lib, "vtklz4-9.0d.lib") #pragma comment(lib, "vtklzma-9.0d.lib") #pragma comment(lib, "vtkmetaio-9.0d.lib") #pragma comment(lib, "vtknetcdf-9.0d.lib") #pragma comment(lib, "vtkogg-9.0d.lib") #pragma comment(lib, "vtkParallelCore-9.0d.lib") #pragma comment(lib, "vtkParallelDIY-9.0d.lib") #pragma comment(lib, "vtkpng-9.0d.lib") #pragma comment(lib, "vtkpugixml-9.0d.lib") #pragma comment(lib, "vtkRenderingAnnotation-9.0d.lib") #pragma comment(lib, "vtkRenderingContext2D-9.0d.lib") #pragma comment(lib, "vtkRenderingCore-9.0d.lib") #pragma comment(lib, "vtkRenderingFreeType-9.0d.lib") #pragma comment(lib, "vtkRenderingGL2PSOpenGL2-9.0d.lib") #pragma comment(lib, "vtkRenderingImage-9.0d.lib") #pragma comment(lib, "vtkRenderingLabel-9.0d.lib") #pragma comment(lib, "vtkRenderingLOD-9.0d.lib") #pragma comment(lib, "vtkRenderingOpenGL2-9.0d.lib") #pragma comment(lib, "vtkRenderingSceneGraph-9.0d.lib") #pragma comment(lib, "vtkRenderingUI-9.0d.lib") #pragma comment(lib, "vtkRenderingVolume-9.0d.lib") #pragma comment(lib, "vtkRenderingVolumeOpenGL2-9.0d.lib") #pragma comment(lib, "vtkRenderingVtkJS-9.0d.lib") #pragma comment(lib, "vtksqlite-9.0d.lib") #pragma comment(lib, "vtksys-9.0d.lib") #pragma comment(lib, "vtkTestingRendering-9.0d.lib") #pragma comment(lib, "vtktheora-9.0d.lib") #pragma comment(lib, "vtktiff-9.0d.lib") #pragma comment(lib, "vtkverdict-9.0d.lib") #pragma comment(lib, "vtkViewsContext2D-9.0d.lib") #pragma comment(lib, "vtkViewsCore-9.0d.lib") #pragma comment(lib, "vtkViewsInfovis-9.0d.lib") #pragma comment(lib, "vtkWrappingTools-9.0d.lib") #pragma comment(lib, "vtkzlib-9.0d.lib") #else #pragma comment(lib, "vtkChartsCore-9.0.lib") #pragma comment(lib, "vtkCommonColor-9.0.lib") #pragma comment(lib, "vtkCommonComputationalGeometry-9.0.lib") #pragma comment(lib, "vtkCommonCore-9.0.lib") #pragma comment(lib, "vtkCommonDataModel-9.0.lib") #pragma comment(lib, "vtkCommonExecutionModel-9.0.lib") #pragma comment(lib, "vtkCommonMath-9.0.lib") #pragma comment(lib, "vtkCommonMisc-9.0.lib") #pragma comment(lib, "vtkCommonSystem-9.0.lib") #pragma comment(lib, "vtkCommonTransforms-9.0.lib") #pragma comment(lib, "vtkDICOMParser-9.0.lib") #pragma comment(lib, "vtkDomainsChemistry-9.0.lib") #pragma comment(lib, "vtkdoubleconversion-9.0.lib") #pragma comment(lib, "vtkexodusII-9.0.lib") #pragma comment(lib, "vtkexpat-9.0.lib") #pragma comment(lib, "vtkFiltersAMR-9.0.lib") #pragma comment(lib, "vtkFiltersCore-9.0.lib") #pragma comment(lib, "vtkFiltersExtraction-9.0.lib") #pragma comment(lib, "vtkFiltersFlowPaths-9.0.lib") #pragma comment(lib, "vtkFiltersGeneral-9.0.lib") #pragma comment(lib, "vtkFiltersGeneric-9.0.lib") #pragma comment(lib, "vtkFiltersGeometry-9.0.lib") #pragma comment(lib, "vtkFiltersHybrid-9.0.lib") #pragma comment(lib, "vtkFiltersHyperTree-9.0.lib") #pragma comment(lib, "vtkFiltersImaging-9.0.lib") #pragma comment(lib, "vtkFiltersModeling-9.0.lib") #pragma comment(lib, "vtkFiltersParallel-9.0.lib") #pragma comment(lib, "vtkFiltersParallelImaging-9.0.lib") #pragma comment(lib, "vtkFiltersPoints-9.0.lib") #pragma comment(lib, "vtkFiltersProgrammable-9.0.lib") #pragma comment(lib, "vtkFiltersSelection-9.0.lib") #pragma comment(lib, "vtkFiltersSMP-9.0.lib") #pragma comment(lib, "vtkFiltersSources-9.0.lib") #pragma comment(lib, "vtkFiltersStatistics-9.0.lib") #pragma comment(lib, "vtkFiltersTexture-9.0.lib") #pragma comment(lib, "vtkFiltersTopology-9.0.lib") #pragma comment(lib, "vtkFiltersVerdict-9.0.lib") #pragma comment(lib, "vtkfreetype-9.0.lib") #pragma comment(lib, "vtkGeovisCore-9.0.lib") #pragma comment(lib, "vtkgl2ps-9.0.lib") #pragma comment(lib, "vtkglew-9.0.lib") #pragma comment(lib, "vtkhdf5-9.0.lib") #pragma comment(lib, "vtkhdf5_hl-9.0.lib") #pragma comment(lib, "vtkImagingColor-9.0.lib") #pragma comment(lib, "vtkImagingCore-9.0.lib") #pragma comment(lib, "vtkImagingFourier-9.0.lib") #pragma comment(lib, "vtkImagingGeneral-9.0.lib") #pragma comment(lib, "vtkImagingHybrid-9.0.lib") #pragma comment(lib, "vtkImagingMath-9.0.lib") #pragma comment(lib, "vtkImagingMorphological-9.0.lib") #pragma comment(lib, "vtkImagingSources-9.0.lib") #pragma comment(lib, "vtkImagingStatistics-9.0.lib") #pragma comment(lib, "vtkImagingStencil-9.0.lib") #pragma comment(lib, "vtkInfovisCore-9.0.lib") #pragma comment(lib, "vtkInfovisLayout-9.0.lib") #pragma comment(lib, "vtkInteractionImage-9.0.lib") #pragma comment(lib, "vtkInteractionStyle-9.0.lib") #pragma comment(lib, "vtkInteractionWidgets-9.0.lib") #pragma comment(lib, "vtkIOAMR-9.0.lib") #pragma comment(lib, "vtkIOAsynchronous-9.0.lib") #pragma comment(lib, "vtkIOCityGML-9.0.lib") #pragma comment(lib, "vtkIOCore-9.0.lib") #pragma comment(lib, "vtkIOEnSight-9.0.lib") #pragma comment(lib, "vtkIOExodus-9.0.lib") #pragma comment(lib, "vtkIOExport-9.0.lib") #pragma comment(lib, "vtkIOExportGL2PS-9.0.lib") #pragma comment(lib, "vtkIOExportPDF-9.0.lib") #pragma comment(lib, "vtkIOGeometry-9.0.lib") #pragma comment(lib, "vtkIOImage-9.0.lib") #pragma comment(lib, "vtkIOImport-9.0.lib") #pragma comment(lib, "vtkIOInfovis-9.0.lib") #pragma comment(lib, "vtkIOLegacy-9.0.lib") #pragma comment(lib, "vtkIOLSDyna-9.0.lib") #pragma comment(lib, "vtkIOMINC-9.0.lib") #pragma comment(lib, "vtkIOMotionFX-9.0.lib") #pragma comment(lib, "vtkIOMovie-9.0.lib") #pragma comment(lib, "vtkIONetCDF-9.0.lib") #pragma comment(lib, "vtkIOOggTheora-9.0.lib") #pragma comment(lib, "vtkIOParallel-9.0.lib") #pragma comment(lib, "vtkIOParallelXML-9.0.lib") #pragma comment(lib, "vtkIOPLY-9.0.lib") #pragma comment(lib, "vtkIOSegY-9.0.lib") #pragma comment(lib, "vtkIOSQL-9.0.lib") #pragma comment(lib, "vtkIOTecplotTable-9.0.lib") #pragma comment(lib, "vtkIOVeraOut-9.0.lib") #pragma comment(lib, "vtkIOVideo-9.0.lib") #pragma comment(lib, "vtkIOXML-9.0.lib") #pragma comment(lib, "vtkIOXMLParser-9.0.lib") #pragma comment(lib, "vtkjpeg-9.0.lib") #pragma comment(lib, "vtkjsoncpp-9.0.lib") #pragma comment(lib, "vtklibharu-9.0.lib") #pragma comment(lib, "vtklibproj-9.0.lib") #pragma comment(lib, "vtklibxml2-9.0.lib") #pragma comment(lib, "vtkloguru-9.0.lib") #pragma comment(lib, "vtklz4-9.0.lib") #pragma comment(lib, "vtklzma-9.0.lib") #pragma comment(lib, "vtkmetaio-9.0.lib") #pragma comment(lib, "vtknetcdf-9.0.lib") #pragma comment(lib, "vtkogg-9.0.lib") #pragma comment(lib, "vtkParallelCore-9.0.lib") #pragma comment(lib, "vtkParallelDIY-9.0.lib") #pragma comment(lib, "vtkpng-9.0.lib") #pragma comment(lib, "vtkpugixml-9.0.lib") #pragma comment(lib, "vtkRenderingAnnotation-9.0.lib") #pragma comment(lib, "vtkRenderingContext2D-9.0.lib") #pragma comment(lib, "vtkRenderingCore-9.0.lib") #pragma comment(lib, "vtkRenderingFreeType-9.0.lib") #pragma comment(lib, "vtkRenderingGL2PSOpenGL2-9.0.lib") #pragma comment(lib, "vtkRenderingImage-9.0.lib") #pragma comment(lib, "vtkRenderingLabel-9.0.lib") #pragma comment(lib, "vtkRenderingLOD-9.0.lib") #pragma comment(lib, "vtkRenderingOpenGL2-9.0.lib") #pragma comment(lib, "vtkRenderingSceneGraph-9.0.lib") #pragma comment(lib, "vtkRenderingUI-9.0.lib") #pragma comment(lib, "vtkRenderingVolume-9.0.lib") #pragma comment(lib, "vtkRenderingVolumeOpenGL2-9.0.lib") #pragma comment(lib, "vtkRenderingVtkJS-9.0.lib") #pragma comment(lib, "vtksqlite-9.0.lib") #pragma comment(lib, "vtksys-9.0.lib") #pragma comment(lib, "vtkTestingRendering-9.0.lib") #pragma comment(lib, "vtktheora-9.0.lib") #pragma comment(lib, "vtktiff-9.0.lib") #pragma comment(lib, "vtkverdict-9.0.lib") #pragma comment(lib, "vtkViewsContext2D-9.0.lib") #pragma comment(lib, "vtkViewsCore-9.0.lib") #pragma comment(lib, "vtkViewsInfovis-9.0.lib") #pragma comment(lib, "vtkWrappingTools-9.0.lib") #pragma comment(lib, "vtkzlib-9.0.lib") #endif
이렇게 작성한 Property Sheet 파일은 경로가 수정될 경우 VTK_DIR 매크로만 수정을하면 되며 사용하는 Object가 추가될 경우 VTK_Prep.h 파일만 수정하면 되며 다른 프로젝트에 적용시 이 두 파일을 적용을 하면 된다.
프로젝트 코드 작성
리소스 뷰의 대화상자 리소스에 Picture Control을 올리고 이름을 IDC_STATIC_VTK_FRAME으로 설정하고 속성중 Type를 Owner Draw로 설정한다. 그리고 아래과 같이 코드를 추가하였
// Header 파일
public:
vtkSmartPointer< vtkRenderWindow > m_pVTKRenderWnd;
void initVTKWindow(void* hWnd);
void resizeVTKWindow();
// Source 파일
void CTestVTKDlg::initVTKWindow(void* hWnd)
{
if (m_pVTKRenderWnd == nullptr)
{
// Interactor 생성
vtkSmartPointer<vtkRenderWindowInteractor> pInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
// Trackball Camera 인터랙션 스타일 적용
pInteractor->SetInteractorStyle(
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New());
// Renderer 생성
vtkSmartPointer<vtkRenderer> pRenderer =
vtkSmartPointer<vtkRenderer>::New();
pRenderer->SetBackground(0.0, 0.0, 0.0);
// RenderWindow 생성 후 Dialog 핸들, Interactor, Renderer 설정
m_pVTKRenderWnd = vtkSmartPointer<vtkRenderWindow>::New();
m_pVTKRenderWnd->SetParentId(hWnd);
m_pVTKRenderWnd->SetInteractor(pInteractor);
m_pVTKRenderWnd->AddRenderer(pRenderer);
m_pVTKRenderWnd->Render();
}
}
void CTestVTKDlg::resizeVTKWindow()
{
CRect rc;
GetDlgItem(IDC_STATIC_VTK_FRAME)->GetClientRect(&rc);
m_pVTKRenderWnd->SetSize(rc.Width(), rc.Height());
}
BOOL CTestVTKDlg::OnInitDialog()
{
|
if (GetDlgItem(IDC_STATIC_VTK_FRAME))
{
initVTKWindow(GetDlgItem(IDC_STATIC_VTK_FRAME)->GetSafeHwnd());
resizeVTKWindow();
}
return TRUE; // return TRUE unless you set the focus to a control
}
프로젝트 실행
이렇게 작성된 프로젝트를 실행하면 dll파일이 없다는 에러 메시지가 출력되는데 프로젝트의 속성에 Debugging 페이지의 Environment 항목에 VTK 빌드 결과물의 bin 폴더를 지정해준다.
Debugging > Environment: PATH=$(VTK_DIR)\bin
설정 후 프로그젝트를 실행하면 대화상자의 Picture Control에 검은색 배경이 보이면 정상적으로 실행이 된 것이다.
Cone 그려보기
대화 상자에 버튼을 올리고 버튼의 이벤트 핸들러에 아래와 같이 코드를 추가한다.
void CTestVTKDlg::OnBnClickedButtonCone()
{
// Create a cone source
vtkSmartPointer<vtkConeSource> pConeSource =
vtkSmartPointer<vtkConeSource>::New();
// Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> pMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
pMapper->SetInputConnection(pConeSource->GetOutputPort());
vtkSmartPointer<vtkActor> pActor =
vtkSmartPointer<vtkActor>::New();
pActor->SetMapper(pMapper);
// Visualize
vtkSmartPointer<vtkRenderer> pRenderer =
vtkSmartPointer<vtkRenderer>::New();
pRenderer->AddActor(pActor);
pRenderer->SetBackground(0.1, 0.2, 0.3);
pRenderer->ResetCamera();
// Rendering
m_pVTKRenderWnd->AddRenderer(pRenderer);
m_pVTKRenderWnd->Render();
}추가후 실행하면 아래와같이 각뿔 형태의 콘이 출력된다.
참고한 서적이나 인터넷의 자료에는 프로젝트의 메모리 누수를 방지하기위해서 VTK Dll들을 Delay Load를 설정해야 한다고 하였으나 본인이 테스트한 VTK 9.0.1 과 Visual Studio 2019버전에서의 테스트에서는 Delay Load를 설정하지 않아도 메모리 누수가 발생하지 않았다.
참고 자료
VTK 프로그래밍 - 일진사
https://luckygg.tistory.com/130
VTK 9.0.1 컴파일하기
오랜만에 버전업이 된 VTK를 빌드해 보았다.
버전이 올라감에따라 높은 버전의 컴파일러(Visual Studio 2015 이상)를 요구하였지만 컴파일 설정은 이전보다 단순화 되었다.
빌드는 Visual Studio 2015 버전과 Visual Studio 2019 버전을 사용하였다.
다운로드 받은 VTK v9.0.1 소스를 작업 폴더에 압축해제 한 후, CMake v3.18.1 버전을 이용하여 구성을 하였다.
컴파일러는 Visual Studio 2019 버전으로 64비트를 선택하였다.
설정은 설치 경로와 Python 버전을 3으로 설정한 것 밖에 없다.
CMAKE_INSTALL_PREFIX: D:/DevWork/VTK/VTK-9.0.1/VS2019_x64/install
VTK_PYTHON_VERSION: 3
빌드는 ALL_BUILD 프로젝트와 INSTALL 프로젝트에 대하여 Debug와 Release 만 빌드를 수행하였다.
빌드는 시간은 많이 소요되었지만 에러없이 결과물을 얻을 수 있었다.
결과물로는 CMAKE_INSTALL_PREFIX 경로에 여러 폴더가 만들어지고 dll 과 lib 그리고 헤더파일이 만들어진다.












































