Plugin 구현
예제
Visual Studio 실행
[클래스 라이브러리(.NET Framework)] 유형 선택
Figure 1 : 프로젝트 유형 선택
이름에 "MyPlugin" 입력 후, 확인 버튼 선택
"MyPlugin" 선택 후, 마우스 오른쪽 버튼 클릭해서 Context Menu에서 추가 선택하고 사용자 정의 컨트롤 유형 선택
Figure 2 : 사용자 정의 컨트롤 추가
이름에 "MyControl.cs" 입력 후, 추가 버튼 선택
Figure 3 : 사용자 정의 컨트롤 추가
"MyPlugin" 프로젝트 하위의 "참조" 선택 후, 마우스 오른쪽 버튼 클릭해서 Context Menu에서 참조 추가 선택
Figure 4 : 참조 추가
"참조 관리자"의 "찾아보기" 선택 후, 찾아보기... 선택하고, VIZZARD가 설치된 폴더의 "SHConnector.dll" 선택 후, 추가
Figure 5 : SHConnector.dll 추가
Namespace 추가
using SHConnector;
Base Class 추가
IEntryConnector
VIZZARD 응용프로그램과 연결을 위한 객체 선언
public IVIZZARDService Connector { get; set; }
생성자 재정의 (추가)
public MyControl(IVIZZARDService conn) : this()
{
Connector = conn;
}
Plugin 자체 라이선스 체크를 위한 메서드 추가
public bool CheckLicense(int hostApp)
{
return true;
}
최종 코드 내용
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SHConnector;
namespace MyPlugin
{
public partial class MyControl : UserControl, IEntryConnector
{
// ========================================
// Property
// ========================================
public IVIZZARDService Connector { get; set; }
// ========================================
// Construction
// ========================================
public MyControl()
{
InitializeComponent();
}
public MyControl(IVIZZARDService conn) : this()
{
Connector = conn;
}
// ========================================
// Custom License
// ========================================
public bool CheckLicense(int hostApp)
{
return true;
}
}
}
필수 이벤트 선언
public MyControl(IVIZZARDService conn) : this()
{
Connector = conn;
// ========================================
// 기본 이벤트 선언
// ========================================
// VIZZARD 초기화 완료 이벤트
Connector.OnInitializedAppEvent += Connector_OnInitializedAppEvent;
// VIZZARD 종료 예정 이벤트
Connector.OnClosingApplicationEvent += Connector_OnClosingApplicationEvent;
// 모델 열림(열기/추가) 이벤트
Connector.OnOpenedDocumentEvent += Connector_OnOpenedDocumentEvent;
// 모델의 인덱스 변경 이벤트
Connector.ObjectIndexChangedEvent += Connector_ObjectIndexChangedEvent;
// 모델 선택 이벤트
Connector.ObjectSelectedEvent += Connector_ObjectSelectedEvent;
// 여러 모델 선택 이벤트
Connector.ObjectsSelectedEvent += Connector_ObjectsSelectedEvent;
}
// ========================================
// Event
// ========================================
private void Connector_OnInitializedAppEvent(object sender, EventArgs e)
{
// 이벤트 발생 시, VIZZARD 초기 구동 프로세스가 완료된 상태임.
// ========================
// 기본 설정 변경
// ========================
// 변경사항 알림 해제
Connector.IgnoreModelChangedStatus(true);
// 모델전체보기
Connector.EnableShapeCache(UsingShapeCacheModes.NOT_USE_SHAPE_CACHE);
// 모델 파일의 EDGE 정보 읽기
Connector.SetReadEdge(true);
}
private void Connector_OnClosingApplicationEvent(object sender, EventArgs e)
{
// 이벤트 발생 시, VIZZARD 종료 혹은 시스템 아이콘[X] 클릭한 상태
// 변경사항 저장이 필요 시, 처리 필요
}
private void Connector_OnOpenedDocumentEvent(object sender, OpenedDocumentEventArgs e)
{
// 이벤트 발생 시, 모델이 열림
// Rendering Mode 필요시 재정의
Connector.SetShaderEffect(SHADER_TYPE.PHONG, true); // PHONG SHADING 활성화
Connector.SetShaderEffect(SHADER_TYPE.SILHOUETTEDGE, true); // 윤곽 활성화
Connector.SetShaderEffect(SHADER_TYPE.SSAO, true); // 음영 활성화
Connector.SetShaderEffect(SHADER_TYPE.SHADOWMAPPING, true); // 실시간 그림자 활성화
Connector.SetShaderEffect(SHADER_TYPE.LIGHT, true); // 환경조명 활성화
}
private void Connector_ObjectIndexChangedEvent(object sender, ObjectIndexChangedEventArgs e)
{
// 이벤트 발생 시, 일부 모델 파일이 Unload 혹은 모델 삭제가 발생
}
private void Connector_ObjectSelectedEvent(object sender, ObjectSelectedEventArgs e)
{
// 이벤트 발생 시, 모델이 선택됨
if(e.Index < 0)
{
// 선택된 모델이 없음
}
else
{
// 선택된 모델의 인덱스
int NodeIndex = e.Index;
// 선택된 모델 정보
NodeVO item = Connector.GetObject(NodeIndex);
// 선택된 모델의 속성
ObjectPropertyVO prop = Connector.GetObjectProperty(NodeIndex, false);
}
}
private void Connector_ObjectsSelectedEvent(object sender, EventArgs e)
{
// 이벤트 발생 시, 여러 모델이 선택됨
List<NodeVO> items = Connector.GetSelectedObjects(false);
foreach (NodeVO item in items)
{
// 처리 로직 추가...
}
}
Plugin Code Template
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SHConnector;
namespace MyPlugin
{
public partial class MyControl : UserControl, IEntryConnector
{
// ========================================
// Property
// ========================================
public IVIZZARDService Connector { get; set; }
// ========================================
// Construction
// ========================================
public MyControl()
{
InitializeComponent();
}
public MyControl(IVIZZARDService conn) : this()
{
Connector = conn;
// ========================================
// 기본 이벤트 선언
// ========================================
// VIZZARD 초기화 완료 이벤트
Connector.OnInitializedAppEvent += Connector_OnInitializedAppEvent;
// VIZZARD 종료 예정 이벤트
Connector.OnClosingApplicationEvent += Connector_OnClosingApplicationEvent;
// 모델 열림(열기/추가) 이벤트
Connector.OnOpenedDocumentEvent += Connector_OnOpenedDocumentEvent;
// 모델의 인덱스 변경 이벤트
Connector.ObjectIndexChangedEvent += Connector_ObjectIndexChangedEvent;
// 모델 선택 이벤트
Connector.ObjectSelectedEvent += Connector_ObjectSelectedEvent;
// 여러 모델 선택 이벤트
Connector.ObjectsSelectedEvent += Connector_ObjectsSelectedEvent;
}
// ========================================
// Custom License
// ========================================
public bool CheckLicense(int hostApp)
{
return true;
}
// ========================================
// Event
// ========================================
private void Connector_OnInitializedAppEvent(object sender, EventArgs e)
{
// 이벤트 발생 시, VIZZARD 초기 구동 프로세스가 완료된 상태임.
// ========================
// 기본 설정 변경
// ========================
// 변경사항 알림 해제
Connector.IgnoreModelChangedStatus(true);
// 모델전체보기
Connector.EnableShapeCache(UsingShapeCacheModes.NOT_USE_SHAPE_CACHE);
// 모델 파일의 EDGE 정보 읽기
Connector.SetReadEdge(true);
}
private void Connector_OnClosingApplicationEvent(object sender, EventArgs e)
{
// 이벤트 발생 시, VIZZARD 종료 혹은 시스템 아이콘[X] 클릭한 상태
// 변경사항 저장이 필요 시, 처리 필요
}
private void Connector_OnOpenedDocumentEvent(object sender, OpenedDocumentEventArgs e)
{
// 이벤트 발생 시, 모델이 열림
// Rendering Mode 필요시 재정의
Connector.SetShaderEffect(SHADER_TYPE.PHONG, true); // PHONG SHADING 활성화
Connector.SetShaderEffect(SHADER_TYPE.SILHOUETTEDGE, true); // 윤곽 활성화
Connector.SetShaderEffect(SHADER_TYPE.SSAO, true); // 음영 활성화
Connector.SetShaderEffect(SHADER_TYPE.SHADOWMAPPING, true); // 실시간 그림자 활성화
Connector.SetShaderEffect(SHADER_TYPE.LIGHT, true); // 환경조명 활성화
}
private void Connector_ObjectIndexChangedEvent(object sender, ObjectIndexChangedEventArgs e)
{
// 이벤트 발생 시, 일부 모델 파일이 Unload 혹은 모델 삭제가 발생
}
private void Connector_ObjectSelectedEvent(object sender, ObjectSelectedEventArgs e)
{
// 이벤트 발생 시, 모델이 선택됨
if(e.Index < 0)
{
// 선택된 모델이 없음
}
else
{
// 선택된 모델의 인덱스
int NodeIndex = e.Index;
// 선택된 모델 정보
NodeVO item = Connector.GetObject(NodeIndex);
// 선택된 모델의 속성
ObjectPropertyVO prop = Connector.GetObjectProperty(NodeIndex, false);
}
}
private void Connector_ObjectsSelectedEvent(object sender, EventArgs e)
{
// 이벤트 발생 시, 여러 모델이 선택됨
List<NodeVO> items = Connector.GetSelectedObjects(false);
foreach (NodeVO item in items)
{
// 처리 로직 추가...
}
}
}
}
Last modified: 04 3월 2024