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
| Module | Summary | Category |
|---|---|---|
| MeasureProjectedArea | 투영 면적 중심점 기능 추가 • GitHub (Example) | New Feature |
| MeasureManager | 기준선 단면형상 거리 측정기능 추가 • AddGeoISPlaneEdgeHeight() | New Feature |
| ReviewManager | Json 파일 읽는 API 추가 • Open(String) | New Feature |
| ReviewManager | Json 파일 저장하는 API 추가 • Save(String, String) / SaveAs(String, String) | New Feature |
| PrimitiveManager | PrimitiveManager에 Pyramid유형 추가 • PrimitivePyramid | New Feature |
| PrimitiveManager | PrimitiveManager에 Cone유형 추가 • PrimitiveCone | New Feature |
| DrawingMarkupManager | 그리기 마크업 종료 시, 스냅샷 이미지 저장 API 추가 (추가된 스냅샷 이미지는 CVR 파일 저장 시 해당 파일에 포함) • ExitDrawMode(Boolean) / ExitDrawMode(Int32, Int32) | New Feature |
| DrawingMarkupManager | 그리기 마크업 라인 유형 그리기 중지 API 추가 • StopDrawing() | New Feature |
| UserViewManager | CVR 파일에 저장되어 있는 스냅샷 이미지 불러오기 • GetUserViewImage(Int32) | New Feature |
| GeometryUtilityManager | Osnap - NodeIndex 반환하도록 추가 • OnOsnapPickingItem | New Feature |
| MeshEditManager | MeshEdit - API 지연속도 단축 (50% 향상) • GetBodyVertices(Int32) / SetBodyVertices(Int32, List<BodyVertexData>, Boolean) | Enhancement |
| VertexColorManager | View - VertexColor API 지연속도 단축 (50% 향상) • GetColor(Int32) • SetColor(List<Color> ) / SetColor(Int32, List<Color> ) / SetColor(Int32, List<VertexColorData>) | Enhancement |
| SectionManager | Box 유형의 단면 생성 후 기본 단면 추가 시, Box 유형의 단면이 사라지는 현상 보완을 위해 Add 함수 파라미터 추가(visibleOthers) • Add(Boolean, Boolean, Axis) | New Feature |
| SectionManager | Box유형의 단면 숨기기 후 보이기 실행 시, 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 |
| ViewManager | RotateCamera로 모델 회전 시 모델이 사라지는 현상 개선 • RotateCamera • GitHub (Example) | Enhancement |
Resource
Figure 1: 기준선 단면형상 거리 측정기능 추가

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

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

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); // 많이 굽힘 준비자세
*/
}