Plugin 구현
본 내용은 Visual Studio 2017 및 C# 언어 기준으로 설명합니다.
예제
- Visual Studio 실행
- [클래스 라이브러리(.NET Framework)] 프로젝트 유형 선택

- 프로젝트 이름에 MyPlugin 입력 후 확인 선택
- MyPlugin 프로젝트 선택 후
마우스 오른쪽 버튼 클릭 → 추가 → 사용자 정의 컨트롤 선택

- 이름에 MyControl.cs 입력 후 추가 선택

- MyPlugin 프로젝트 하위 참조 선택 후
마우스 오른쪽 버튼 클릭 → 참조 추가 선택

- 참조 관리자에서 찾아보기 선택 →
VIZZARD 설치 폴더의 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;
}
⚠️ 해당 메서드에서 라이선스 체크 후
false를 반환하면
Plugin이 로딩되지 않습니다.
(Plugin 개발사의 라이선스 정책 지원 목적)
- Plugin.xml 정의
→ Plugin.xml 정의 문서
최종 코드 예제
using System;
using System.Collections.Generic;
using System.Drawing;
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;
}
Plugin Code Template
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using SHConnector;
namespace MyPlugin
{
public partial class MyControl : UserControl, IEntryConnector
{
public IVIZZARDService Connector { get; set; }
public MyControl()
{
InitializeComponent();
}
public MyControl(IVIZZARDService conn) : this()
{
Connector = conn;
Connector.OnInitializedAppEvent += Connector_OnInitializedAppEvent;
Connector.OnClosingApplicationEvent += Connector_OnClosingApplicationEvent;
Connector.OnOpenedDocumentEvent += Connector_OnOpenedDocumentEvent;
Connector.ObjectIndexChangedEvent += Connector_ObjectIndexChangedEvent;
Connector.ObjectSelectedEvent += Connector_ObjectSelectedEvent;
Connector.ObjectsSelectedEvent += Connector_ObjectsSelectedEvent;
}
public bool CheckLicense(int hostApp)
{
return true;
}
private void Connector_OnInitializedAppEvent(object sender, EventArgs e)
{
Connector.IgnoreModelChangedStatus(true);
Connector.EnableShapeCache(UsingShapeCacheModes.NOT_USE_SHAPE_CACHE);
Connector.SetReadEdge(true);
}
private void Connector_OnClosingApplicationEvent(object sender, EventArgs e)
{
// 종료 처리
}
private void Connector_OnOpenedDocumentEvent(object sender, OpenedDocumentEventArgs e)
{
Connector.SetShaderEffect(SHADER_TYPE.PHONG, true);
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)
{
}
private void Connector_ObjectSelectedEvent(object sender, ObjectSelectedEventArgs e)
{
if (e.Index >= 0)
{
NodeVO item = Connector.GetObject(e.Index);
ObjectPropertyVO prop = Connector.GetObjectProperty(e.Index, false);
}
}
private void Connector_ObjectsSelectedEvent(object sender, EventArgs e)
{
List<NodeVO> items = Connector.GetSelectedObjects(false);
}
}
}