posted by Solver Full-stack Developer 2011.05.13 16:49
 

 

 

 

<이미지 편집이 순조롭지 못합니다.. ㅠㅠ > 3개의 그림을 세로로 나열하고 싶었으나.. 제공되지 않는듯..>

 

 첫번째 그림 : STEP 및 기타 Solid Viewing을 제공하는 오픈 소스입니다. 출처는 Opencascade C#예제 소스에 담겨져 있습니다.

두번째~ 네번째 그림 : STEP파일을 읽어오기 위해 해당 메뉴버튼을 눌른 상황입니다.

●솔루션 내 프로젝트

●사용 언어

IE(인터페이스)

C#

OCC(동적 클래스 라이브러리)

C++

shell(동적 클래스 라이브러리)

C++

 

<step 파일 열기 버튼 클릭시 최초 접근하는 메소드>

 

private void ImportStep_Click(object sender, System.EventArgs e)

{

Form2 curForm = (Form2) this.ActiveMdiChild;

if (curForm == null)

return;

this.myModelFormat=IE.ModelFormat.STEP;

curForm.ImportModel(this.myModelFormat);

}

 

 

<모델 포맷의 정의>

 

protected IE.ModelFormat myModelFormat;

 

 

<this.ActiveMdiChild;>

 

//현재 활성상태인 MDI(다중 문서 인터페이스)자식창을 가져온다.

 

 

<curForm.ImportModel(this.myModelFormat);> (Form2.cs 로 이동한다.)

 

public void ImportModel(IE.ModelFormat format)

{

int theformat=10;

System.Windows.Forms.OpenFileDialog openDialog = new OpenFileDialog();

string DataDir=((Environment.GetEnvironmentVariable("CASROOT")) + "\\..\\data");

string filter="";

switch (format)

{

case ModelFormat.BREP:

openDialog.InitialDirectory = (DataDir + "\\occ");

theformat=0;

filter= "BREP Files (*.brep *.rle)|*.brep; *.rle"

break;

case ModelFormat.CSFDB:

theformat=1;

filter= "CSFDB Files (*.csfdb)|*.csfdb"

break;

 

case IE.ModelFormat.STEP:

openDialog.InitialDirectory = (DataDir + "\\step");

theformat=2;

filter="STEP Files (*.stp *.step)|*.stp; *.step"

break;

 

 

 

case IE.ModelFormat.IGES:

openDialog.InitialDirectory = (DataDir + "\\iges");

theformat=3;

filter="IGES Files (*.igs *.iges)|*.igs; *.iges"

break;

default:

break;

}

openDialog.Filter = filter+"|All files (*.*)|*.*" ;

if(openDialog.ShowDialog() == DialogResult.OK)

{

string filename = openDialog.FileName;

if ( filename=="")

return;

this.Cursor=System.Windows.Forms.Cursors.WaitCursor;

if (!myView.TranslateModel(filename, theformat, true))

MessageBox.Show("Cann't read this file", "Error!",

MessageBoxButtons.OK, MessageBoxIcon.Warning);

this.Cursor=System.Windows.Forms.Cursors.Default;

}

this.myView.ZoomAllView();

}

 

 

<this.myView.ZoomAllView();> (shell.h)

 

void ZoomAllView(void)

{

if (myOCCViewer != NULL)

myOCCViewer->ZoomAllView();

}

 

 

<myOCCViewer->ZoomAllView();> (OCCViewer.cpp)

 

void OCCViewer::ZoomAllView(void)

{

if (!myView.IsNull())

{

myView->FitAll();

myView->ZFitAll();

}

}

 

 

 

 

 

<if (!myView.IsNull())> (Handle_Standard_Transient.hxx)

 

//! Check for being null

Standard_Boolean IsNull() const

{

return entity == UndefinedHandleAddress;

}

 

 

<myView->FitAll();> (Handle_V3d_View.hxx)

 

V3d_View* operator->() const

{

return (V3d_View *)ControlAccess();

}

 

 

<return (V3d_View *)ControlAccess();> (Handle_Standard_Transient.hxx)

 

Standard_Transient* ControlAccess() const

{

return entity;

}

 

 

<myView->ZFitAll();> (Handle_V3d_View.hxx)

 

V3d_View* operator->() const

{

return (V3d_View *)ControlAccess();

}

 

 

<return (V3d_View *)ControlAccess();> (Handle_Standard_Transient.hxx)

 

Standard_Transient* ControlAccess() const

{

return entity;

}

 

 

(Form1.cs)

 

private void Form1_Activated(object sender, System.EventArgs e)

{

if (this.toolBarView.Visible) //true

this.SelectionChanged();

}

 

 

 

 

<this.SelectionChanged();> (Form1.cs)

 

public void SelectionChanged()

{

if (this.MdiChildren.Length == 0 )

return

IE.Form2 curForm = (IE.Form2) this.ActiveMdiChild;

if ( curForm == null )

return

switch (curForm.View.DisplayMode())

{

case -1:

this.shading.Enabled=false

this.wireframe.Enabled=false

break

case 0:

this.wireframe.Enabled=false

this.shading.Enabled=true

this.transparency.Enabled=false

break

case 1:

this.wireframe.Enabled=true

this.shading.Enabled=false

this.transparency.Enabled=true

break

case 10:

this.wireframe.Enabled=true

this.shading.Enabled=true

this.transparency.Enabled=true

break

default:

break

}

bool IsSelected = curForm.View.IsObjectSelected();

if (IsSelected)

{

this.color.Enabled=true

this.material.Enabled=true

this.delete.Enabled=true

}

else

{

this.color.Enabled=false

this.material.Enabled=false

this.transparency.Enabled=false

this.delete.Enabled=false

}

if (curForm.DegenerateMode)

{

this.HlrOff.Pushed=false

this.HlrOn.Pushed=true

}

else

{

this.HlrOff.Pushed=true

this.HlrOn.Pushed=false

}

if (curForm.Mode == IE.CurrentAction3d.CurAction3d_WindowZooming)

this.ZoomWin.Pushed=false

 

}

 

 

<switch (curForm.View.DisplayMode())> (Form2.cs) -> (shell.h)

 

public shell View

{

get

{

return this.myView;

}

set

{

this.myView=value

}

}

 

 

int DisplayMode(void)

{

if (myOCCViewer != NULL)

return myOCCViewer->DisplayMode();

else return -1;

}

 

 

 

<return myOCCViewer->DisplayMode();> (OCCViewer.cpp)

 

int OCCViewer::DisplayMode(void)

{

if (myAISContext.IsNull())

return -1;

int mode = -1;

bool OneOrMoreInShading=false

bool OneOrMoreInWireframe=false

for (myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent())

{

if ( myAISContext->IsDisplayed( myAISContext->Current(), 1 ) )

OneOrMoreInShading = true

if ( myAISContext->IsDisplayed( myAISContext->Current(), 0 ) )

OneOrMoreInWireframe = true

}

if (OneOrMoreInShading&&OneOrMoreInWireframe)

mode=10;

else if(OneOrMoreInShading)

mode=1;

else if (OneOrMoreInWireframe)

mode=0;

return mode;

}

 

 

<if (myAISContext.IsNull())> (Handle_Standard_Transient.hxx)

 

//! Check for being null

Standard_Boolean IsNull() const

{

return entity == UndefinedHandleAddress;

}

 

 

<for(myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent())> (OCCViewr.cpp)

-> (Handle_AIS_InteractiveContext.hxx)

 

AIS_InteractiveContext* operator->() const

{

return (AIS_InteractiveContext *)ControlAccess();

}

 

 

 

 

 

<return (AIS_InteractiveContext *)ControlAccess();> (Handle_Standard_Transient.hxx)

 

//! Returns non-const pointer to referred object

Standard_Transient* ControlAccess() const

{

return entity;

}

 

 

->(Handle_AIS_InteractiveContext.hxx)

 

AIS_InteractiveContext* operator->() const

{

return (AIS_InteractiveContext *)ControlAccess();

}

 

 

<return (AIS_InteractiveContext *)ControlAccess();> ->(Handle_Standard_Transient.hxx)

 

//! Returns non-const pointer to referred object

Standard_Transient* ControlAccess() const

{

return entity;

}

 

 

<bool IsSelected = curForm.View.IsObjectSelected();> (Form1.cs)

 

public shell View

{

get

{

return this.myView;

}

set

{

this.myView=value

}

}

 

 

->(shell.h)

 

bool IsObjectSelected(void){

if (myOCCViewer != NULL)

return myOCCViewer->IsObjectSelected();

else

return false

}

 

<return myOCCViewer->IsObjectSelected();> (OCCViewer.cpp)

 

bool OCCViewer::IsObjectSelected(void)

{

if (myAISContext.IsNull())

return false

myAISContext->InitCurrent();

return (bool)myAISContext->MoreCurrent();

}

 

 

<if (myAISContext.IsNull())> (Handle_Standard_Transient.hxx)

 

//! Check for being null

Standard_Boolean IsNull() const

{

return entity == UndefinedHandleAddress;

}

 

 

<myAISContext->InitCurrent();> (Handle_AIS_InteractiveContext.hxx)

 

AIS_InteractiveContext* operator->() const

{

return (AIS_InteractiveContext *)ControlAccess();

}

 

 

<return (AIS_InteractiveContext *)ControlAccess();> (Handle_Standard_Transient.hxx)

 

Standard_Transient* ControlAccess() const

{

return entity;

}

 

 

<return (bool)myAISContext->MoreCurrent();> (Handle_AIS_InteractiveContext.hxx)

 

AIS_InteractiveContext* operator->() const

{

return (AIS_InteractiveContext *)ControlAccess();

}

 

<return (AIS_InteractiveContext *)ControlAccess();> (Handle_Standard_Transient.hxx)

 

//! Returns non-const pointer to referred object

Standard_Transient* ControlAccess() const

{

return entity;

}

 

 

<if (curForm.DegenerateMode)> (Form2.cs)

 

public bool DegenerateMode

{

get

{

return this.myDegenerateModeIsOn;

}

set

{

this.myDegenerateModeIsOn=value

}

}

 

 

<if (curForm.Mode == IE.CurrentAction3d.CurAction3d_WindowZooming)> (Form2.cs)

 

public CurrentAction3d Mode

{

get

{

return this.myCurrentMode;

}

set

{

this.myCurrentMode=value

}

}

 

 

 

 

private void Form2_SizeChanged(object sender, System.EventArgs e)

{

myView.UpdateView();

}

 

 

 

[분석결과 ]

STEPControl_Reader는 XSControl_Reader를 파생시켜 데이터를 분석하기 위한 클래스.

실제 파일을 읽는 작업은 XSControl_Reader의 메소드 ReadFile메소드에서 진행.

 

STEP은 기계관련 파일이므로 IFC파일을 읽어내야 했으나.

Opencascade에서는 IFCControl_Reader를 제공 하고 있지 않음.

 

[결론]

IFC파일을 읽어 내려면 XSControl_Reader를 상속받은 IFCControl_Reader를 만들어야 한다.

IFCControl_Reader는 IFC파일 데이터 분석 기능을 Opencascade가 그려내기에 적합한 데이터로 변환하는

기능을 제공 해야한다. (STEP파일 포멧과 IFC파일 포멧은 상당히 유사하다. 단, 스키마가 약간 다름)

출처: 원호형
신고
posted by Solver Full-stack Developer 2011.05.13 16:42

 1.결과

 

2.소스 분석

3.해설

1)붉은색 box에서 면을 탐색한다.

2) 각 면의 위치에서 새로운 면을 생성한다.

3)새로운 면은 각각 색이 다르다.

4)생성된 면은 해당 붉은색 box 면에서 평행 이동하여 이동한다.

5)모든면이 위와 같은 작업 수행

6)붉은색 box는 제거된다.


 

 

신고
posted by Solver Full-stack Developer 2011.05.13 16:37


1.두 TopoDS_Shape 의 교집합부분을 표시하는 skill  (Topo란 Topology: 위상학 기하학)


(설명: 왼쪽-> 전, 오른쪽 -> 후)

2.소스코드

- 201 줄 BRepAlgoAPI_Common

//=======================================================================
//function : BRepAlgoAPI_Common
//purpose  :
//=======================================================================

  BRepAlgoAPI_Common::BRepAlgoAPI_Common(const TopoDS_Shape& S1,
      const TopoDS_Shape& S2)
: BRepAlgoAPI_BooleanOperation(S1, S2, BOP_COMMON)
{
  BRepAlgoAPI_BooleanOperation* pBO=
    (BRepAlgoAPI_BooleanOperation*) (void*) this;
  pBO->Build();
}


 

신고
posted by Solver Full-stack Developer 2011.05.12 10:34

1.

 

2.OCAF Architecture

 

 

3.Open CASCADE Application Framework Overview

 

shape는 필연적으로 기본 구조에 묶여있다. 반대로 말하면 기본 구조들이 서로 모여 shape가 되는 것이다.

이 때 Topology-driven하면 기본구조마다(동일한 face라 하더라도) face들을 각각 많들어야 함으로 비효율 적일 것이다.

하지만 OCAF일 경우 reference key-driven 하기때문에 참조형식으로 face를 가져온다. 아래 그림을 보면 좀더 이해하기 쉬울것이다.

 

 

 

 

 

 


사진출처 : www.opencascade.org

 


신고
posted by Solver Full-stack Developer 2011.05.12 10:14

 

신고
posted by Solver Full-stack Developer 2011.05.12 10:13

 


신고
posted by Solver Full-stack Developer 2011.05.12 10:12

 

 

 

신고
posted by Solver Full-stack Developer 2011.05.12 10:11

친절하게 설명해 드릴께요.

따라해 보아요. ^^

 

1.www.opencascade.org를 들어가요.

 

2.상단에 Developer Corner가 있을꺼에요. 그럼 그 아래 Getting started가 있을꺼에요. 클릭해요.

 

3.글의 상단에 Certainly, first install the latest available public version either downloading it or ordering the CD-ROM.
   이 있을꺼에요. downloading을 클릭해요.

 

4.글 중간에 Download Open CASCADE Technology latest public version!가 있을꺼에요. 클릭해요.

 

5.OpenCASCADE_win32.exe는 c드라이브에 설치되는 것으로 소스, 라이브러리 등이 있어요.

  OpenCASCADE_doc.exe는 시작-> 프로그램-> Open CASCADE Technology 6.3.0에서 sample들을 바로 실행해 볼 수 있어요.

 

6. download하고 설치해요.

 

7.C:\OpenCASCADE6.3.0\samples에 있는 예제들을 실행해 봐요. 에러가 날꺼에요. 아래 스샷과 함께 에러를 잡아봐요.

 

8.처음 라는 에러가 나올꺼에요. 이건 포함 파일(Include files)와 라이브러리 파일(Library files)를 참조 안해서 생기는 에러에요.

 

9.포함 파일(Include files)을 참조해 봐요.(Microsoft Visual C++ 6.0에서 동일하게 하는거에요. 한글을 영어로 바꾸어 보아요^^)

   파아랗게 표시되어 있어요. 동일하게 참조를 해요.

 

10. 라이브러리 파일(Library files)를 참조해 보아요.

 

11.참조를 다했는데 라는 에러가 나와요. 이건 보이는 것과 같이

mfcsample.lib를 참조 안해서 생기는 에러에요. C:\OpenCASCADE6.3.0\samples\standard\mfc\mfcsample 에서 빌드를 하여

mfcsample.lib를 생성해요.

 

12.생성된 lib를 참조할 꺼에요.

 

13.추가 라이브러리 디렉터리 에서 추가를 해요.

 

14.파아랗게 표시된 경로를 추가 해요.

 

휴.. 그럼 예제가 실행될 꺼에요. ^^

신고