2 #include ".\occviewer.h"
4 #pragma warning( disable : 4800 )
5 OCCViewer::OCCViewer(void)
13 OCCViewer::~OCCViewer(void)
18 bool OCCViewer::InitViewer(void* wnd)
22 Handle(Aspect_DisplayConnection) aDisplayConnection;
23 myGraphicDriver = Graphic3d::InitGraphicDriver (aDisplayConnection);
25 catch (Standard_Failure)
30 TCollection_ExtendedString a3DName("Visu3D");
31 myViewer = new V3d_Viewer (myGraphicDriver, a3DName.ToExtString(),"", 1000.0,
32 V3d_XposYnegZpos, Quantity_NOC_GRAY30,
33 V3d_ZBUFFER,V3d_GOURAUD,V3d_WAIT,
34 Standard_True, Standard_False);
37 myViewer->SetDefaultLights();
38 myViewer->SetLightOn();
39 myView = myViewer->CreateView();
40 Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (wnd));
41 myView->SetWindow(aWNTWindow);
42 if (!aWNTWindow->IsMapped())
44 myAISContext = new AIS_InteractiveContext(myViewer);
45 myAISContext->UpdateCurrentViewer();
47 myView->MustBeResized();
52 bool OCCViewer::ImportBRep(char* filename)
54 Standard_CString aFileName = (Standard_CString) filename;
56 BRep_Builder aBuilder;
57 Standard_Boolean result = BRepTools::Read(aShape,aFileName,aBuilder);
60 if(myAISContext->HasOpenedContext())
61 myAISContext->CloseLocalContext();
62 myAISContext->Display(new AIS_Shape(aShape));
66 void OCCViewer::UpdateView(void)
69 myView->MustBeResized();
72 void OCCViewer::RedrawView(void)
78 void OCCViewer::SetDegenerateModeOn(void)
81 myView->SetDegenerateModeOn();
84 void OCCViewer::SetDegenerateModeOff(void)
87 myView->SetDegenerateModeOff();
90 void OCCViewer::WindowFitAll(int Xmin, int Ymin, int Xmax, int Ymax)
93 myView->WindowFitAll(Xmin, Ymin, Xmax, Ymax);
96 void OCCViewer::Place(int x, int y, float zoomFactor)
98 Quantity_Factor aZoomFactor = zoomFactor;
100 myView->Place(x, y, aZoomFactor);
103 void OCCViewer::Zoom(int x1, int y1, int x2, int y2)
105 if (!myView.IsNull())
106 myView->Zoom(x1, y1, x2, y2);
109 void OCCViewer::Pan(int x, int y)
111 if (!myView.IsNull())
115 void OCCViewer::Rotation(int x, int y)
117 if (!myView.IsNull())
118 myView->Rotation(x, y);
121 void OCCViewer::StartRotation(int x, int y)
123 if (!myView.IsNull())
124 myView->StartRotation(x, y);
127 void OCCViewer::Select(int x1, int y1, int x2, int y2)
129 if (!myAISContext.IsNull())
130 myAISContext->Select(x1, y1, x2, y2, myView);
133 void OCCViewer::Select(void)
135 if (!myAISContext.IsNull())
136 myAISContext->Select();
139 void OCCViewer::MoveTo(int x, int y)
141 if ((!myAISContext.IsNull()) && (!myView.IsNull()))
142 myAISContext->MoveTo(x, y, myView);
145 void OCCViewer::ShiftSelect(int x1, int y1, int x2, int y2)
147 if ((!myAISContext.IsNull()) && (!myView.IsNull()))
148 myAISContext->ShiftSelect(x1, y1, x2, y2, myView);
151 void OCCViewer::ShiftSelect(void)
153 if (!myAISContext.IsNull())
154 myAISContext->ShiftSelect();
157 void OCCViewer::BackgroundColor(int& r, int& g, int& b)
162 if (!myView.IsNull())
163 myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
171 void OCCViewer::UpdateCurrentViewer(void)
173 if (!myAISContext.IsNull())
174 myAISContext->UpdateCurrentViewer();
177 void OCCViewer::FrontView(void)
179 if (!myView.IsNull())
180 myView->SetProj(V3d_Xpos);
183 void OCCViewer::TopView(void)
185 if (!myView.IsNull())
186 myView->SetProj(V3d_Zpos);
189 void OCCViewer::LeftView(void)
191 if (!myView.IsNull())
192 myView->SetProj(V3d_Ypos);
195 void OCCViewer::BackView(void)
197 if (!myView.IsNull())
198 myView->SetProj(V3d_Xneg);
201 void OCCViewer::RightView(void)
203 if (!myView.IsNull())
204 myView->SetProj(V3d_Yneg);
207 void OCCViewer::BottomView(void)
209 if (!myView.IsNull())
210 myView->SetProj(V3d_Zneg);
213 void OCCViewer::AxoView(void)
215 if (!myView.IsNull())
216 myView->SetProj(V3d_XposYnegZpos);
219 void OCCViewer::ZoomAllView(void)
221 if (!myView.IsNull())
228 float OCCViewer::Scale(void)
233 return (float)myView->Scale();
236 void OCCViewer::ResetView(void)
238 if (!myView.IsNull())
242 void OCCViewer::SetDisplayMode(int aMode)
244 if (myAISContext.IsNull())
246 AIS_DisplayMode CurrentMode;
248 CurrentMode=AIS_WireFrame;
250 CurrentMode=AIS_Shaded;
251 if(myAISContext->NbCurrents()==0 || myAISContext->NbSelected()==0)
252 myAISContext->SetDisplayMode(CurrentMode);
255 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
256 myAISContext->SetDisplayMode(myAISContext->Current(),aMode,Standard_False);
259 myAISContext->UpdateCurrentViewer();
262 void OCCViewer::SetColor(int r, int g, int b)
264 if (myAISContext.IsNull())
266 Quantity_Color col = Quantity_Color(r/255.,g/255.,b/255.,Quantity_TOC_RGB);
267 for (;myAISContext->MoreCurrent ();myAISContext->NextCurrent ())
268 myAISContext->SetColor (myAISContext->Current(),col.Name());
271 void OCCViewer::ObjectColor(int& r, int& g, int& b)
273 if (myAISContext.IsNull())
278 Handle_AIS_InteractiveObject Current ;
279 Quantity_Color ObjCol;
280 myAISContext->InitCurrent();
281 if (!myAISContext->MoreCurrent())
283 Current = myAISContext->Current();
284 if ( Current->HasColor () ) {
285 ObjCol = myAISContext->Color(myAISContext->Current());
286 Quantity_Parameter r1, r2, r3;
287 ObjCol.Values(r1, r2, r3, Quantity_TOC_RGB);
294 void OCCViewer::SetBackgroundColor(int r, int g, int b)
296 if (!myView.IsNull())
297 myView->SetBackgroundColor(Quantity_TOC_RGB,r/255.,g/255.,b/255.);
300 void OCCViewer::EraseObjects(void)
302 if (myAISContext.IsNull())
304 for(myAISContext->InitCurrent();myAISContext->MoreCurrent();myAISContext->NextCurrent())
305 myAISContext->Erase(myAISContext->Current(),Standard_True,Standard_False);
306 myAISContext->ClearCurrents();
309 float OCCViewer::GetVersion(void)
311 return (float)OCC_VERSION;
314 void OCCViewer::SetMaterial(int theMaterial)
316 if (myAISContext.IsNull())
318 for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent (); myAISContext->NextCurrent () )
319 myAISContext->SetMaterial( myAISContext->Current(), (Graphic3d_NameOfMaterial)theMaterial );
320 myAISContext->UpdateCurrentViewer();
323 void OCCViewer::SetTransparency(int theTrans)
325 if (myAISContext.IsNull())
327 for( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextSelected() )
328 myAISContext->SetTransparency( myAISContext->Current(), ((Standard_Real)theTrans) / 10.0 );
331 bool OCCViewer::ImportCsfdb(char* filename)
333 Standard_CString aFileName = (Standard_CString) filename;
334 if ( FSD_File::IsGoodFileType(aFileName) != Storage_VSOk )
337 static FSD_File fileDriver;
338 TCollection_AsciiString aName( aFileName );
339 if ( fileDriver.Open( aName, Storage_VSRead ) != Storage_VSOk )
342 Handle(ShapeSchema) schema = new ShapeSchema();
343 Handle(Storage_Data) data = schema->Read( fileDriver );
344 if ( data->ErrorStatus() != Storage_VSOk )
348 Handle(Storage_HSeqOfRoot) roots = data->Roots();
349 for ( int i = 1; i <= roots->Length() ; i++ )
351 Handle(Storage_Root) r = roots->Value( i );
352 Handle(Standard_Persistent) p = r->Object();
353 Handle(PTopoDS_HShape) aPShape = Handle(PTopoDS_HShape)::DownCast(p);
354 if ( !aPShape.IsNull() )
356 PTColStd_PersistentTransientMap aMap;
357 TopoDS_Shape aTShape;
358 MgtBRep::Translate( aPShape, aMap, aTShape, MgtBRep_WithTriangle );
359 myAISContext->Display(new AIS_Shape(aTShape));
366 bool OCCViewer::ImportIges(char* filename)
368 Standard_CString aFileName = (Standard_CString) filename;
369 IGESControl_Reader Reader;
370 int status = Reader.ReadFile( aFileName );
372 if ( status == IFSelect_RetDone )
374 Reader.TransferRoots();
375 TopoDS_Shape aShape = Reader.OneShape();
376 myAISContext->Display(new AIS_Shape(aShape));
379 myAISContext->UpdateCurrentViewer();
383 bool OCCViewer::ImportStep(char* filename)
385 Standard_CString aFileName = (Standard_CString) filename;
386 STEPControl_Reader aReader;
387 IFSelect_ReturnStatus status = aReader.ReadFile(aFileName);
388 if ( status == IFSelect_RetDone )
390 bool failsonly = false;
391 aReader.PrintCheckLoad( failsonly, IFSelect_ItemsByEntity );
393 int nbr = aReader.NbRootsForTransfer();
394 aReader.PrintCheckTransfer( failsonly, IFSelect_ItemsByEntity );
395 for ( Standard_Integer n = 1; n <= nbr; n++ )
397 Standard_Boolean ok = aReader.TransferRoot( n );
398 int nbs = aReader.NbShapes();
401 for ( int i = 1; i <= nbs; i++ )
403 TopoDS_Shape shape = aReader.Shape( i );
404 myAISContext->Display(new AIS_Shape(shape));
413 bool OCCViewer::ExportBRep(char* filename)
415 myAISContext->InitCurrent();
416 if (!myAISContext->MoreCurrent())
418 Handle_AIS_InteractiveObject anIO = myAISContext->Current();
419 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
420 return (bool)BRepTools::Write( anIS->Shape(), (Standard_CString)filename ); ;
424 bool OCCViewer::ExportIges(char* filename)
426 IGESControl_Controller::Init();
427 IGESControl_Writer writer( Interface_Static::CVal( "XSTEP.iges.unit" ),
428 Interface_Static::IVal( "XSTEP.iges.writebrep.mode" ) );
431 for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
433 Handle_AIS_InteractiveObject anIO = myAISContext->Current();
434 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
435 TopoDS_Shape shape = anIS->Shape();
436 writer.AddShape ( shape );
438 writer.ComputeModel();
439 return (bool)writer.Write( (Standard_CString)filename );
442 bool OCCViewer::ExpotStep(char* filename)
444 STEPControl_StepModelType type = STEPControl_AsIs;
445 IFSelect_ReturnStatus status;
446 STEPControl_Writer writer;
447 for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
449 Handle_AIS_InteractiveObject anIO = myAISContext->Current();
450 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
451 TopoDS_Shape shape = anIS->Shape();
452 status = writer.Transfer( shape , type );
453 if ( status != IFSelect_RetDone )
457 status = writer.Write( (Standard_CString)filename );
458 if ( status != IFSelect_RetDone )
463 bool OCCViewer::ExportStl(char* filename)
465 TopoDS_Compound comp;
466 BRep_Builder builder;
467 builder.MakeCompound( comp );
469 for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
471 Handle_AIS_InteractiveObject anIO = myAISContext->Current();
472 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
473 TopoDS_Shape shape = anIS->Shape();
474 if ( shape.IsNull() )
476 builder.Add( comp, shape );
479 StlAPI_Writer writer;
480 writer.Write( comp, (Standard_CString)filename );
484 bool OCCViewer::ExportVrml(char* filename)
487 BRep_Builder builder;
488 builder.MakeCompound( res );
490 for ( myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent() )
492 Handle_AIS_InteractiveObject anIO = myAISContext->Current();
493 Handle_AIS_Shape anIS=Handle_AIS_Shape::DownCast(anIO);
494 TopoDS_Shape shape = anIS->Shape();
495 if ( shape.IsNull() )
498 builder.Add( res, shape );
501 VrmlAPI_Writer writer;
502 writer.Write( res, (Standard_CString)filename );
507 bool OCCViewer::Dump(char *filename)
512 return (bool)myView->Dump(filename);
515 bool OCCViewer::IsObjectSelected(void)
517 if (myAISContext.IsNull())
519 myAISContext->InitCurrent();
520 return (bool)myAISContext->MoreCurrent();
523 int OCCViewer::DisplayMode(void)
525 if (myAISContext.IsNull())
528 bool OneOrMoreInShading=false;
529 bool OneOrMoreInWireframe=false;
530 for (myAISContext->InitCurrent(); myAISContext->MoreCurrent(); myAISContext->NextCurrent())
532 if ( myAISContext->IsDisplayed( myAISContext->Current(), 1 ) )
533 OneOrMoreInShading = true;
534 if ( myAISContext->IsDisplayed( myAISContext->Current(), 0 ) )
535 OneOrMoreInWireframe = true;
537 if (OneOrMoreInShading&&OneOrMoreInWireframe)
539 else if(OneOrMoreInShading)
541 else if (OneOrMoreInWireframe)
546 void OCCViewer::CreateNewView(void* wnd)
548 if (myAISContext.IsNull())
550 myView = myAISContext->CurrentViewer()->CreateView();
551 if (myGraphicDriver.IsNull())
553 Handle(Aspect_DisplayConnection) aDisplayConnection;
554 myGraphicDriver = Graphic3d::InitGraphicDriver (aDisplayConnection);
556 Handle(WNT_Window) aWNTWindow = new WNT_Window (reinterpret_cast<HWND> (wnd));
557 myView->SetWindow(aWNTWindow);
558 Standard_Integer w=100, h=100;
559 aWNTWindow->Size(w,h);
560 if (!aWNTWindow->IsMapped())
564 bool OCCViewer::SetAISContext(OCCViewer* Viewer)
566 this->myAISContext=Viewer->GetAISContext();
567 if (myAISContext.IsNull())
572 Handle_AIS_InteractiveContext OCCViewer::GetAISContext(void)
577 int OCCViewer::CharToInt(char symbol)
579 TCollection_AsciiString msg = symbol;
580 return msg.IntegerValue();