본문으로 건너뛰기

V.2.8.23.1227

Major Features​

  • 투영 면적 중심점 기능 추가
  • 기준선 단면형상 거리 측정기능 추가
  • Json 파일 읽는 API 추가
  • Json 파일 저장하는 API 추가
  • PrimitiveManager에 Pyramid유형 추가
  • PrimitiveManager에 Cone유형 추가
  • Walkthrough 부분 단축키 변경 가능하도록 설정
  • 그리기 마크업 종료 시, 스냅샷 이미지 저장 API 추가(추가된 스냅샷 이미지는 CVR 파일 저장 시 해당 파일에 포함)
  • 그리기 마크업 라인 유형 그리기 중지 API 추가
  • CVR 파일에 저장되어 있는 스냅샷 이미지 불러오는 API 추가
  • Osnap - NodeIndex 반환하도록 추가
  • MeshEdit - API 지연속도 단축 (50% 향상)
  • View - VertexColor API 지연속도 단축 (50% 향상)
  • Box 유형의 단면 생성 후 기본 단면 추가 시, Box 유형의 단면이 사라지는 현상 보완을 위해 Add 함수 파라미터 추가(visibleOthers)
  • Box유형의 단면 숨기기 후 보이기 실행 시, Box유형의 단면이 보이지 않는 현상 보완하기 위해 Show 함수 파라미터 추가(visibleOthers)
  • 빛 방향 설정하는 API 추가
  • 표면 노트, 2D 노트, 3D 노트 생성하는 API 추가
  • 이동검사 End Position 설정하여 Path 구하는 API 추가
  • 개체 숨김 상태 변경 이벤트 추가
  • 환경설정 - 노트 - 심벌위치 옵션 추가
  • 설정 - 탐색 - 아바타 고급 - 모델 - MAN3 추가
  • 간섭 검사 결과 판단 조건 개선
  • 간섭 검사 진행 중 OnClashProgressEvent 콜백 함수에서 현재까지 검출된 결과 확인할 수 있도록 구현
  • RotateCamera로 모델 회전 시 모델이 사라지는 현상 개선

Full List​

Full List of Issues Covering all Changes in this Release

ModuleSummaryCategory
MeasureProjectedArea투영 면적 중심점 기능 추가
• GitHub (Example)
New Feature
MeasureManager기준선 단면형상 거리 측정기능 추가
• AddGeoISPlaneEdgeHeight()
New Feature
ReviewManagerJson 파일 읽는 API 추가
• Open(String)
New Feature
ReviewManagerJson 파일 저장하는 API 추가
• Save(String, String) / SaveAs(String, String)
New Feature
PrimitiveManagerPrimitiveManager에 Pyramid유형 추가
• PrimitivePyramid
New Feature
PrimitiveManagerPrimitiveManager에 Cone유형 추가
• PrimitiveCone
New Feature
DrawingMarkupManager그리기 마크업 종료 시, 스냅샷 이미지 저장 API 추가 (추가된 스냅샷 이미지는 CVR 파일 저장 시 해당 파일에 포함)
• ExitDrawMode(Boolean) / ExitDrawMode(Int32, Int32)
New Feature
DrawingMarkupManager그리기 마크업 라인 유형 그리기 중지 API 추가
• StopDrawing()
New Feature
UserViewManagerCVR 파일에 저장되어 있는 스냅샷 이미지 불러오기
• GetUserViewImage(Int32)
New Feature
GeometryUtilityManagerOsnap - NodeIndex 반환하도록 추가
• OnOsnapPickingItem
New Feature
MeshEditManagerMeshEdit - API 지연속도 단축 (50% 향상)
• GetBodyVertices(Int32) / SetBodyVertices(Int32, List<BodyVertexData>, Boolean)
Enhancement
VertexColorManagerView - VertexColor API 지연속도 단축 (50% 향상)
• GetColor(Int32)
• SetColor(List<Color> ) / SetColor(Int32, List<Color> ) / SetColor(Int32, List<VertexColorData>)
Enhancement
SectionManagerBox 유형의 단면 생성 후 기본 단면 추가 시, Box 유형의 단면이 사라지는 현상 보완을 위해 Add 함수 파라미터 추가(visibleOthers)
• Add(Boolean, Boolean, Axis)
New Feature
SectionManagerBox유형의 단면 숨기기 후 보이기 실행 시, Box유형의 단면이 보이지 않는 현상 보완하기 위해 Show 함수 파라미터 추가(visibleOthers)
• Show(Section, Boolean, Boolean)
New Feature
ViewManager빛 방향 설정하는 API 추가
• LightDirection
New Feature
NoteManager표면 노트, 2D 노트, 3D 노트 추가하는 API 추가
• AddNoteSurface(String, Boolean, String) / AddNoteSurfacePickModel(Boolean, String, Int32) / AddNote2D(String) / AddNote3D(String)
New Feature
ClashTest이동검사 End Position 설정하여 Path 구하는 API 추가
• AddTranslation(Axis, Single, Single, Single)
New Feature
LockedHiddenManager개체 숨김 상태 변경 이벤트 추가
• OnObject3DLockedHiddenChangedEvent
New Feature
AvatarModels설정 - 탐색 - 아바타 고급 - 모델 - MAN3 추가New Feature
ClashManager간섭 검사 진행 중 OnClashProgressEvent 콜백 함수에서 현재까지 검출된 결과 확인할 수 있도록 구현
• OnClashProgressEvent
• GitHub (Example)
New Feature
ViewManagerRotateCamera로 모델 회전 시 모델이 사라지는 현상 개선
• RotateCamera
• GitHub (Example)
Enhancement

Resource​

Figure 1: 기준선 단면형상 거리 측정기능 추가​

RELEASE_2.8.23.1128.001.png

Figure 2: 빛 방향 설정하는 API 추가​

RELEASE_2.8.23.1128.002.png

Figure 3: 아바타 (Data.AvatarModels.MAN3 에서만 아래 동작 수행)​

ReleaseNote_2.8.23.1218_1.gif ReleaseNote_2.8.23.1218_2.gif

Sample​

투영 면적 중심점 기능 추가​

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

private void Example()
{
VIZCore3D.NET.Data.MeasureProjectedArea area = vizcore3d.Review.Measure.GetProjectedArea(plane);

txtProjectionArea.Text = area.Projected.ToString();
txtTotalArea.Text = area.Outer.ToString();
txtEmptyArea.Text = area.Inner.ToString();
txtCenter.Text = area.Center.ToString(); //투영 면적 중심점

pbProjection.Image = area.Image;

VIZCore3D.NET.Data.CameraData camera = vizcore3d.View.GetCameraData();

switch (plane)
{
case Data.Planes.YZ:
vizcore3d.View.MoveCamera(VIZCore3D.NET.Data.CameraDirection.X_MINUS);
break;
case Data.Planes.ZX:
vizcore3d.View.MoveCamera(VIZCore3D.NET.Data.CameraDirection.Y_MINUS);
break;
case Data.Planes.XY:
vizcore3d.View.MoveCamera(VIZCore3D.NET.Data.CameraDirection.Z_MINUS);
break;
default:
break;
}

List<VIZCore3D.NET.Data.Line3D> lines = vizcore3d.Projection.GetProjection2DLines();

vizcore3d.View.SetCameraData(camera, false);

StringBuilder sb3D = new StringBuilder();
StringBuilder sb2D = new StringBuilder();

foreach (VIZCore3D.NET.Data.Line3D line in lines)
{
sb3D.AppendLine(line.ToString(VIZCore3D.NET.Data.Dimensions.D3));
sb2D.AppendLine(line.ToString(VIZCore3D.NET.Data.Dimensions.D2));
}

txtPoints3D.Text = sb3D.ToString();
txtPoints2D.Text = sb2D.ToString();

DrawingControl.SetData(lines);
}

기준선 단면형상 거리 측정기능 추가​

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

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

vizcore3d.Review.Measure.AddGeoISPlaneEdgeHeight();
}

Json 파일 읽는 API 추가 / Json 파일 저장하는 API 추가​

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

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

vizcore3d.Review.SaveAsJson(@"D:\test\test1.json"); //Json 리뷰파일 저장

OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "JSON File (*.json)|*.json";
dlg.Multiselect = false;

if (dlg.ShowDialog() != DialogResult.OK) return;

vizcore3d.Review.Open(dlg.FileName); //Json 리뷰파일 읽기
}

PrimitiveManager에 Pyramid유형 추가 / PrimitiveManager에 Cone유형 추가​

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

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

// Color Index : rev2bst.config.rev 파일 참고
VIZCore3D.NET.Manager.PrimitiveObject root = vizcore3d.Primitive.AddNode("Root", 4 /* Yellow Color*/);

VIZCore3D.NET.Manager.PrimitiveObject child1 = root.AddNode("CHILD1", 7 /* Blue Color */);
{
VIZCore3D.NET.Manager.PrimitiveBox box1 = new VIZCore3D.NET.Manager.PrimitiveBox();
box1.Set2Point( new float[] { 0, 0, 0 },
new float[] { 100, 100, 100 },
50.0f
);

child1.AddPrimitive(box1);

VIZCore3D.NET.Manager.PrimitiveBox box2 = new VIZCore3D.NET.Manager.PrimitiveBox();

VIZCore3D.NET.Data.BoundBox3D boundBox1 = new VIZCore3D.NET.Data.BoundBox3D(
new VIZCore3D.NET.Data.Vertex3D( 200, 200, 200 ),
new VIZCore3D.NET.Data.Vertex3D( 300, 300, 300 ));

box2.SetMinMaxPoints(boundBox1);
child1.AddPrimitive(box2);
}

VIZCore3D.NET.Manager.PrimitiveObject child2 = root.AddNode("CHILD2", 11 /* Pink Color */);
{
VIZCore3D.NET.Manager.PrimitiveCylinder cylinder1 = new VIZCore3D.NET.Manager.PrimitiveCylinder();
cylinder1.Set2Point( new float[] { 400, 400, 400 },
new float[] { 600, 600, 600 },
50.0f
);

child2.AddPrimitive(cylinder1);
}

VIZCore3D.NET.Manager.PrimitiveObject child3 = root.AddNode("CHILD3", 11 /* Pink Color */);
{
VIZCore3D.NET.Manager.PrimitivePyramid pyramid1 = new VIZCore3D.NET.Manager.PrimitivePyramid();
float[] matrix = new float[]
{
1.0f, 0.0f, 0.0f, 12550.0f
, 0.0f, 1.0f, 0.0f, 31857.0f
, 0.0f, 0.0f, 1.0f, 1300.0f
};
pyramid1.Matrix = matrix;

float[] parameter = new float[]
{
10f /* X Top */
, 20f /* Y Top */
, 30f /* X Bottom */
, 40f /* Y Bottom */
, 2.5f /* X Offset */
, 4.5f /* Y Offset */
, 50f /* Height */
};

pyramid1.Parameter = parameter;
child3.AddPrimitive(pyramid1);
}

VIZCore3D.NET.Manager.PrimitiveObject child4 = root.AddNode("CHILD4", 11 /* Pink Color */);
{
VIZCore3D.NET.Manager.PrimitiveCone cone1 = new VIZCore3D.NET.Manager.PrimitiveCone();
float[] matrix = new float[]
{
1.0f, 0.0f, 0.0f, 6572.2214f
, 0.0f, 1.0f, 0.0f, 25308.0577f
, 0.0f, 0.0f, 1.0f, 3587.6716f
};
cone1.Matrix = matrix;

float[] parameter1 = new float[]
{
100.0f /* Bottom Radius */
, 0.0f /* Top Radius */
, 200.0f /* Height */
, 0.0f /* X Offset */
, 0.0f /* Y Offset */
, 0.0f /* Bottom X Shear */
, 0.0f /* Bottom Y Shear */
, 0.0f /* Top X Shear */
, 0.0f /* Top Y Shear */
};

float[] parameter2 = new float[]
{
100.0f /* Bottom Radius */
, 30.0f /* Top Radius */
, 200.0f /* Height */
, 0.0f /* X Offset */
, 0.0f /* Y Offset */
, 0.0f /* Bottom X Shear */
, 0.0f /* Bottom Y Shear */
, 0.0f /* Top X Shear */
, 0.0f /* Top Y Shear */
};

float[] parameter3 = new float[]
{
100.0f /* Bottom Radius */
, 30.0f /* Top Radius */
, 200.0f /* Height */
, 50.0f /* X Offset */
, 50.0f /* Y Offset */
, 0.0f /* Bottom X Shear */
, 0.0f /* Bottom Y Shear */
, 0.0f /* Top X Shear */
, 0.0f /* Top Y Shear */
};

cone1.Parameter = parameter3;
child4.AddPrimitive(cone1);
}

// Open Model
vizcore3d.Primitive.OpenModel("Primitive", false);
}

그리기 마크업 종료 시, 스냅샷 이미지 저장 API 추가​

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

private void Example1()
{
//스냅샷 이미지 320 x 240 자동 추가
vizcore3d.Review.DrawingMarkup.ExitDrawMode(true);

vizcore3d.Review.Save("D:\\TEST\\Test.cvr");
}

private void Example2()
{
//스냅샷 이미지 추가하지 않음
vizcore3d.Review.DrawingMarkup.ExitDrawMode(false);

vizcore3d.Review.Save("D:\\TEST\\Test.cvr");
}

private void Example3()
{
//스냅샷 이미지 1024 x 768 크기로 추가
vizcore3d.Review.DrawingMarkup.ExitDrawMode(1024, 768);

vizcore3d.Review.Save("D:\\TEST\\Test.cvr");
}

CVR 파일에 저장되어 있는 스냅샷 이미지 불러오기​

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

private void Example()
{
List<VIZCore3D.NET.Data.ReviewItem> items = vizcore3d.Review.Items;
if (items.Count == 0) return;

VIZCore3D.NET.Data.ReviewItem item = items[items.Count - 1];

if (item.Kind != VIZCore3D.NET.Manager.ReviewManager.ReviewKind.RK_USER_VIEW) return;

int id = item.ID;

System.Drawing.Image img = vizcore3d.Review.UserView.GetUserViewImage(id); //스냅샷 이미지 불러오기
if (img == null) return;

SaveFileDialog dlg = new SaveFileDialog();
dlg.Filter = "Image (*.jpg)|*.jpg";
if (dlg.ShowDialog() != DialogResult.OK) return;

img.Save(dlg.FileName);
}

Osnap - NodeIndex 반환하도록 추가​

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

private void Example()
{
List<VIZCore3D.NET.Data.Node> items = vizcore3d.Object3D.FromFilter( VIZCore3D.NET.Data.Object3dFilter.SELECTED_TOP );

if (items.Count == 0) return;

vizcore3d.GeometryUtility.OnOsnapPickingItem += GeometryUtility_OnOsnapPickingItem;

vizcore3d.GeometryUtility.ShowOsnap(
items[0].Index /* Node Index */
, false /* Item : Surface */
, true /* Item : Vertex */
, true /* Item : Line */
, true /* Item : Circle */
);
}

private void GeometryUtility_OnOsnapPickingItem(object sender, VIZCore3D.NET.Event.EventManager.OsnapPickingItemEventArgs e)
{
int nodeIndex = e.NodeIndex; // 선택한 부재의 인덱스

VIZCore3D.NET.Data.OsnapKind kind = e.Kind;
VIZCore3D.NET.Data.Vertex3D point = e.Point;
VIZCore3D.NET.Data.Vertex3D start = e.Start;
VIZCore3D.NET.Data.Vertex3D end = e.End;
VIZCore3D.NET.Data.Vertex3D normal = e.Normal;
}

빛 방향 설정하는 API 추가​

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

private void Example()
{
//X = 카메라 좌우
//Y = 카메라 상하
//Z = 카메라 앞뒤

//범위 설정: X, Y, Z축마다 -1 ~ +1
//Z축: -1에 가까울 수록 모델의 앞이 어두어짐

// 빛 방향 설정
// 카메라 우측
vizcore3d.View.LightDirection = new Data.Vector3D(-1, 0, 1);
}

설정 - 탐색 - 아바타 고급 - 모델 - MAN3 추가​

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

private void Example()
{
vizcore3d.Walkthrough.AvatarModel = (int)Data.AvatarModels.MAN3;

vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.HANDS_UP); // 양손 위로

/*
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.KNEEL_IDLE); // 엎드리기
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.SIT1_IDLE); // 앉기1
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.SIT2_IDLE); // 앉기2
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.SIT3_IDLE); // 앉기3
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.CLIMBING_DOWN); // 내려감
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.CLIMBING); // 올라감
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.HANDS_HALF_UP_IDLE); // 한 손 위로
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.HANDS_HALF_UP_READY); // 한 손 위로 올림
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.LAY_DOWN_IDLE); // 눕기
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.LAY_DOWN_READY); // 눕기 준비자세
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.SEEING90_IDLE); // 많이 굽힘
vizcore3d.Walkthrough.SetAvatarPose(Data.AvatarPose.SEEING90_READY); // 많이 굽힘 준비자세
*/
}