본문으로 건너뛰기

V.1.7.20.921

Major Features

  • 360도 파노라마 이미지 지원 기능 추가
  • 라이선스 서버 사용 시, 인증된 제품 목록, 사용자 인원현황, 사용자 정보 조회 API 추가
  • 특정 개체의 INDEX가 지정된 부모 INDEX의 하위 여부 판단 API 추가
  • 개체 목록 중에서 특정 UDA 정보를 포함(미포함)한 개체 목록 조회 API 추가
  • 로딩된 모델에 UDA 정보 등록 API 2EA 추가
  • VIZ 파일에 UDA 정보 등록 API 추가
  • UDA 검색 결과 내 재검색 API 추가
  • 선택된 리뷰 (노트, 측정) 항목의 텍스트 복사(클립보드) 기능 추가
  • 지정(선택)된 위치로부터 축방향 최단거리 부재 검색 시 Offset 값 추가
  • 노드의 최소 정보(이름, 인덱스, 유형) 만 반환하는 API 추가 - 노드 이름 기반으로 검색/필터링 시, 반환 속도 향상
  • Geometry Property 조회 다이얼로그 및 컨트롤 추가
  • 선택된 개체의 UDA 정보 조회 다이얼로그 및 컨트롤 추가
  • 모델의 UDA 전체 Tree 구조 조회 다이얼로그 및 컨트롤 추가
  • Generic File Import 기능 추가
  • 리뷰 (노트, 측정) 항목을 1,000EA 이상 생성 시, 화면 렌더링 속도 개선
  • Frame (SHIPGRID) 로딩 여부 (HasFrame) 반환 API 상태 체크 로직 개선
  • [#1783] 아바타를 활용한 Walk-Through 시, 개체 선택 이벤트 발생하지 않는 문제 수정

Full List

Full List of Issues Covering all Changes in this Release

ModuleSummaryCategory
PanoramaManager360도 파노라마 이미지 열기 기능 추가
PanoramaManager.Open(String)
New Feature
LicenseManager라이선스 서버 사용 시, 인증된 제품 목록 및 사용자 인원 현황 조회 API 추가
LicenseManager.GetLicenseServerProducts()
LicenseManager.GetLicenseServerCurrentStatus()
New Feature
Object3DManager특정 개체의 INDEX가 지정된 부모 INDEX의 하위 여부 판단 API 추가
Object3DManager.IsChildObject3d(Int32, Int32)
New Feature
UDAManager개체 목록 중에서 특정 UDA 정보를 포함(미포함)한 개체 목록 조회 API 추가
UDAManager.ContainsNode(String, String, List<Int32>, Boolean)
New Feature
UDAManager로딩된 모델에 UDA 정보 등록 API 2EA 추가
UDAManager.Add
New Feature
UDAManagerVIZ 파일에 UDA 정보 등록 API 추가
UDAManager.Add(String, String, UserDefineAttributeCollection)
New Feature
UDAManagerUDA 검색 결과 내 재검색 API 추가
UDAManager.GetNodes
New Feature
MeasureManager선택된 측정 항목의 텍스트 복사(클립보드) 기능 추가
MeasureManager.CopySelectedItemTitle(Boolean)
New Feature
NoteManager선택된 노트 항목의 텍스트 복사(클립보드) 기능 추가
NoteManager.CopySelectedItemTitle()
New Feature
GeometryUtilityManager지정(선택)된 위치로부터 축방향 최단거리 부재 검색 시 Offset Parameter 추가
GeometryUtilityManager.GetNearestObjectsByPicking
GeometryUtilityManager.GetNearestObject
New Feature
Object3DManager노드의 최소 정보(이름, 인덱스, 유형) 만 반환하는 API 추가 - 노드 이름 기반으로 검색/필터링 시, 반환 속도 향상
Object3DManager.GetPartialNode(Boolean, Boolean, Boolean)
Object3DManager.FillNodeData(List<Node>)
New Feature
GeometryPropertyManagerGeometry Property 조회 다이얼로그 및 컨트롤 추가
GeometryPropertyManager.ShowGeometryPropertyDialog()
GeometryPropertyManager.GetGeometryPropertyControl()
New Feature
UDAManager선택된 개체의 UDA 정보 조회 다이얼로그 및 컨트롤 추가
UDAManager.ShowUDADialog()
UDAManager.GetUDAControl()
New Feature
UDAManager모델의 UDA 전체 Tree 구조 조회 다이얼로그 및 컨트롤 추가
UDAManager.ShowUDATreeDialog()
UDAManager.GetUDATreeControl()
New Feature
GenericDataManagerGeneric File Import 및 데이터 분석 기능 추가New Feature
ReviewManager
NoteManager
MeasureManager
리뷰 (노트, 측정) 항목을 1,000EA 이상 생성 시, 화면 렌더링 속도 개선Enhancement
FrameManagerFrame (SHIPGRID) 로딩 여부 (HasFrame) 반환 API 상태 체크 로직 개선
FrameManager.HasFrame
Enhancement

Resource

Figure 1 : 360º Panorama Image

VIZCore3D.NET.Panorama.png

Figure 2 : Information Window

VIZCore3D.NET.Window_001.png

Figure 3 : Geometry Property Dialog

VIZCore3D.NET.GeometryProperty_001.png

Figure 4 : UDA Dialog

VIZCore3D.NET.UDA_001.png

Figure 5 : UDA Tree Dialog

VIZCore3D.NET.UDATree_001.png

Figure 6 : Generic File (GitHub)

VIZCore3D.NET.Generic_001.png

Sample

Panorama - Add Custom Object (Poly Line)

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example1()
{
List<Data.Vertex3D> position1 = new List<Data.Vertex3D>();

for (int i = 0; i <= 360; i += 10)
{
float fAngleX = i;
float fAngleY = 0;

position1.Add(new Data.Vertex3D(fAngleX, fAngleY, 0.0f));
}

vizcore3d.Panorama.CustomObject.AddPolyLine(position1, Color.Red, 1.0f);
}

private void Example2()
{
List<Data.Vertex3D> position1 = new List<Data.Vertex3D> ();

for (int i = -90; i <= 90; i++)
{
float fAngleX = 0;
float fAngleY = i;

position1.Add(new Data.Vertex3D(fAngleX, fAngleY, 0.0f));
}

Color color = Color.FromArgb(255, 255, 128, 0);
vizcore3d.Panorama.CustomObject.AddPolyLine(position1, color, 1.0f);
}

Panorama - Add Custom Object (Text)

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example1()
{
vizcore3d.BeginUpdate();
for (int i = 0; i < 360; i += 10)
{
float fAngleX = i;
float fAngleY = 2.0f;

string text = string.Format("{0}", i);

Color color = Color.FromArgb(255, 0, 255, 0);
vizcore3d.Panorama.CustomObject.AddText(text, Data.FontSizeKind.SIZE12, color, fAngleX, fAngleY);
}
vizcore3d.EndUpdate();
}

private void Example2()
{
vizcore3d.BeginUpdate();
for (int i = -80; i < 80; i += 10)
{
float fAngleX = 2.0f;
float fAngleY = i;

string text = string.Format("{0}", i);

Color color = Color.FromArgb(255, 0, 0, 255);
vizcore3d.Panorama.CustomObject.AddText(text, Data.FontSizeKind.SIZE12, color, fAngleX, fAngleY);
}
vizcore3d.EndUpdate();
}

Object3DManager.IsChildObject3d

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
int parentIndex = 4;
int childIndex = 100;

bool result = vizcore3d.Object3D.IsChildObject3d(parentIndex, childIndex);

if (result == true)
System.Console.WriteLine("Index is a child.");
else
System.Console.WriteLine("Index is not a child.");
}

UDAManager.ContainsNode

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
string key = "TYPE";
string val = "PIPE";

List<int> node = new List<int>() { 1, 4, 5, 7, 9, 100, 200 };

Dictionary<int, bool> result =
vizcore3d.Object3D.UDA.ContainsNode(
key /* UDA::KEY */
, val /* UDA::VALUE */
, node /* Node List */
, true /* True(Bottom Up), False(Current Node Index) */
);

foreach (KeyValuePair<int, bool> item in result)
{
if(item.Value == true)
{
System.Console.WriteLine("Contain");
}
else
{
System.Console.WriteLine("Does Not Contain");
}
}
}

UDAManager.Add

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
int nodeIndex = 5;

Dictionary<string, string> property = new Dictionary<string, string>();
property.Add("TYPE", "PIPE");
property.Add("SYSTEM", "GENERAL SERVICE LINE");
property.Add("SERVICE", "GENERAL SERVICE LINE");
property.Add("PRESS", "3.00");
property.Add("TEMP", "32.00");

vizcore3d.Object3D.UDA.Add(
nodeIndex /* NODE INDEX */
, property /* UDA */
, false /* RECURSIVE */
);
}

UDAManager.Add

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
List<int> node = new List<int>() { 4, 10, 20, 30 };

Dictionary<string, string> property = new Dictionary<string, string>();
property.Add("TYPE", "PIPE");
property.Add("SYSTEM", "GENERAL SERVICE LINE");
property.Add("SERVICE", "GENERAL SERVICE LINE");
property.Add("PRESS", "3.00");
property.Add("TEMP", "32.00");

vizcore3d.Object3D.UDA.Add(
node /* NODE INDEX */
, property /* UDA */
, false /* RECURSIVE */
);
}

UDAManager.Add

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
if (vizcore3d.Model.IsOpen() == false) return;

StringBuilder sb = new StringBuilder();

string path = vizcore3d.Model.Files[0];
sb.AppendLine(string.Format("File : {0}", path));

List<VIZCore3D.NET.Data.Node> nodes =
vizcore3d.Object3D.FromFilter(Data.Object3dFilter.ALL);

sb.AppendLine(string.Format("Count : {0}", nodes.Count));

VIZCore3D.NET.Data.UserDefineAttributeCollection udac =
new Data.UserDefineAttributeCollection();

foreach (VIZCore3D.NET.Data.Node node in nodes)
{
if (node.Index == 0) continue;

VIZCore3D.NET.Data.UserDefineAttributeItem uda =
new Data.UserDefineAttributeItem();

uda.NodeId.Add(node.ID);

for (int i = 0; i < 10; i++)
{
string key = String.Empty;
string val = String.Empty;

switch (i)
{
case 0:
{
key = "NAME";
val = node.NodeName;
}
break;
case 1:
{
key = "ID";
val = node.ID.ToString();
}
break;
case 2:
{
key = "INDEX";
val = node.Index.ToString();
}
break;
case 3:
{
key = "PARENT";
val = node.ParentIndex.ToString();
}
break;
case 4:
{
key = "TYPE";
val = node.Kind.ToString();
}
break;
case 5:
{
key = "CHILD";
val = node.ChildCount.ToString();
}
break;
case 6:
{
key = "DEPTH";
val = node.Depth.ToString();
}
break;
case 7:
{
key = "UDA#1";
val = string.Format("{0}-{1}", node.ID, node.NodeName);
}
break;
case 8:
{
key = "UDA#2";
val = string.Format("{0}-{1}", node.Index, node.NodeName);
}
break;
case 9:
{
key = "UDA#3";
val = string.Format("{0}-{1}", node.ParentIndex, node.NodeName);
}
break;
default:
break;
}

if (uda.Property.ContainsKey(key) == false)
uda.Property.Add(key, val);
}

udac.Items.Add(uda);
}

string output = string.Format(
"{0}\\{1}_Attribute.viz"
, System.IO.Path.GetDirectoryName(path)
, System.IO.Path.GetFileNameWithoutExtension(path)
);

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();

vizcore3d.Object3D.UDA.Add(
path /* INPUT VIZ */
, output /* OUTPUT VIZ */
, udac /* UDA Collection */
);

sw.Stop();

sb.AppendLine(
string.Format(
"ElapsedMilliseconds : {0:#,0}"
, sw.ElapsedMilliseconds
)
);

MessageBox.Show(sb.ToString(), "VIZCore3D.NET", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

UDAManager.GetNodes

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
if (vizcore3d.Model.IsOpen() == false) return;

// 대분류 - TYPE : PIPE
List<VIZCore3D.NET.Data.Node> pipe =
vizcore3d.Object3D.UDA.GetNodes(
"TYPE" /* KEY */
, "PIPE" /* VALUE */
);

// 상세분류 - SERVICE : BILGE & GENERAL SERVICE LINE
List<VIZCore3D.NET.Data.Node> service =
vizcore3d.Object3D.UDA.GetNodes(
"SERVICE" /* KEY */
, "BILGE & GENERAL SERVICE LINE" /* VALUE */
, pipe /* 검색 대상 노드 */
, true /* 포함(미포함) */
);
}

Object3DManager.GetPartialNode / Object3DManager.FillNodeData

// VIZCore3D.NET Control
private VIZCore3D.NET.VIZCore3DControl vizcore3d;

private void Example()
{
// 어셈블리 노드 목록
List<VIZCore3D.NET.Data.Node> items = vizcore3d.Object3D.GetPartialNode(true, false, false);

List<VIZCore3D.NET.Data.Node> result = new List<VIZCore3D.NET.Data.Node>();

// 필터링
foreach (VIZCore3D.NET.Data.Node item in items)
{
string[] vals = item.SplitNodeName("/");
if (vals.Length != 4) continue;

result.Add(item);
}

// 노드의 부가정보 채우기 : Index 및 Node Name만 필요한 경우, 호출 불필요.
result = vizcore3d.Object3D.FillNodeData(result);
}