]>
Commit | Line | Data |
---|---|---|
7fd59977 | 1 | // ImportExport.cpp: implementation of the CImportExport class. |
2 | // | |
3 | ////////////////////////////////////////////////////////////////////// | |
4 | ||
5 | #include "stdafx.h" | |
6 | #include "ImportExport.h" | |
5c1f974e | 7 | #include <OCC_App.h> |
7fd59977 | 8 | |
7fd59977 | 9 | #include "SaveSTEPDlg.h" |
10 | ||
11 | #include "TColStd_SequenceOfAsciiString.hxx" | |
12 | #include "TColStd_SequenceOfExtendedString.hxx" | |
13 | #include "OSD_Timer.hxx" | |
14 | ||
15 | #include "IGESControl_Reader.hxx" | |
16 | #include "STEPControl_Controller.hxx" | |
17 | ||
18 | #include <BRepAlgo.hxx> | |
7fd59977 | 19 | #include <IGESControl_Controller.hxx> |
20 | #include <IGESControl_Writer.hxx> | |
21 | #include <Interface_Static.hxx> | |
22 | #include <STEPControl_Reader.hxx> | |
23 | #include <Geom_Curve.hxx> | |
24 | #include <STEPControl_Writer.hxx> | |
25 | #include <TopoDS_Compound.hxx> | |
26 | #include <Geom_Line.hxx> | |
27 | #include <StlAPI_Writer.hxx> | |
28 | #include <VrmlAPI_Writer.hxx> | |
29 | #include <VrmlData_Scene.hxx> | |
30 | #include <VrmlData_ShapeConvert.hxx> | |
31 | #include <VrmlData_Appearance.hxx> | |
32 | #include <VrmlData_Material.hxx> | |
33 | #include <VrmlData_Group.hxx> | |
34 | #include <VrmlData_ListOfNode.hxx> | |
35 | #include <VrmlData_ShapeNode.hxx> | |
36 | ||
37 | #include <XSControl_WorkSession.hxx> | |
38 | #include <STEPConstruct_Styles.hxx> | |
39 | #include <TColStd_HSequenceOfTransient.hxx> | |
40 | #include <STEPConstruct.hxx> | |
41 | #include <StepVisual_StyledItem.hxx> | |
42 | ||
43 | #ifdef _DEBUG | |
44 | #undef THIS_FILE | |
45 | static char THIS_FILE[]=__FILE__; | |
46 | //#define new DEBUG_NEW | |
47 | #endif | |
48 | ||
49 | ////////////////////////////////////////////////////////////////////// | |
50 | // Construction/Destruction | |
51 | ////////////////////////////////////////////////////////////////////// | |
52 | ||
53 | Handle(TopTools_HSequenceOfShape) CImportExport::BuildSequenceFromContext(const Handle(AIS_InteractiveContext)& anInteractiveContext, | |
54 | Handle(Quantity_HArray1OfColor)& anArrayOfColors, | |
55 | Handle(TColStd_HArray1OfReal)& anArrayOfTransparencies) | |
56 | { | |
57 | Handle(TopTools_HSequenceOfShape) aSequence; | |
58 | Standard_Integer nb = anInteractiveContext->NbCurrents(), i = 1; | |
59 | if (!nb) | |
60 | return aSequence; | |
61 | ||
62 | aSequence = new TopTools_HSequenceOfShape(); | |
63 | anArrayOfColors = new Quantity_HArray1OfColor(1, nb); | |
64 | anArrayOfTransparencies = new TColStd_HArray1OfReal (1, nb); | |
65 | ||
66 | Handle(AIS_InteractiveObject) picked; | |
67 | for(anInteractiveContext->InitCurrent();anInteractiveContext->MoreCurrent();anInteractiveContext->NextCurrent()) | |
68 | { | |
69 | picked = anInteractiveContext->Current(); | |
70 | if (anInteractiveContext->Current()->IsKind(STANDARD_TYPE(AIS_Shape))) | |
71 | { | |
72 | Handle(AIS_Shape) aisShape = Handle(AIS_Shape)::DownCast(picked); | |
73 | TopoDS_Shape aShape = aisShape->Shape(); | |
74 | aSequence->Append(aShape); | |
75 | ||
76 | Quantity_Color color; | |
77 | aisShape->Color(color); | |
78 | anArrayOfColors->SetValue(i, color); | |
79 | ||
80 | Standard_Real transparency = aisShape->Transparency(); | |
81 | anArrayOfTransparencies->SetValue(i, transparency); | |
82 | ||
83 | i++; | |
84 | } | |
85 | } | |
86 | return aSequence; | |
87 | } | |
88 | ||
89 | //====================================================================== | |
90 | //= = | |
91 | //= BREP = | |
92 | //= = | |
93 | //====================================================================== | |
94 | ||
92efcf78 | 95 | int CImportExport::ReadBREP (const Handle(AIS_InteractiveContext)& anInteractiveContext) |
7fd59977 | 96 | { |
576f8b11 | 97 | Handle(TopTools_HSequenceOfShape) aSequence = CImportExport::ReadBREP(); |
7fd59977 | 98 | if(aSequence->IsEmpty()) |
99 | return 1; | |
92efcf78 | 100 | Handle(AIS_Shape) aShape; |
7fd59977 | 101 | for(int i=1;i<= aSequence->Length();i++){ |
102 | aShape = new AIS_Shape(aSequence->Value(i)); | |
103 | anInteractiveContext->SetDisplayMode(aShape, 1, Standard_False); | |
104 | anInteractiveContext->Display(aShape, Standard_False); | |
105 | anInteractiveContext->SetCurrentObject(aShape, Standard_False); | |
106 | } | |
107 | return 0; | |
108 | } | |
109 | ||
576f8b11 | 110 | Handle(TopTools_HSequenceOfShape) CImportExport::ReadBREP() |
7fd59977 | 111 | { |
112 | CFileDialog dlg(TRUE, | |
5c573e69 | 113 | NULL, |
114 | NULL, | |
115 | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, | |
576f8b11 | 116 | L"BREP Files (*.brep , *.rle)|*.brep; *.BREP; *.rle; *.RLE; |All Files (*.*)|*.*||", |
5c573e69 | 117 | NULL ); |
7fd59977 | 118 | |
576f8b11 | 119 | CString CASROOTValue; |
120 | CASROOTValue.GetEnvironmentVariable (L"CASROOT"); | |
5c573e69 | 121 | CString initdir = (CASROOTValue + "\\..\\data\\occ"); |
7fd59977 | 122 | |
5c573e69 | 123 | dlg.m_ofn.lpstrInitialDir = initdir; |
7fd59977 | 124 | |
125 | Handle(TopTools_HSequenceOfShape) aSequence= new TopTools_HSequenceOfShape(); | |
126 | ||
127 | if (dlg.DoModal() == IDOK) | |
128 | { | |
5c573e69 | 129 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); |
130 | CString filename = dlg.GetPathName(); | |
7fd59977 | 131 | TopoDS_Shape aShape; |
576f8b11 | 132 | Standard_Boolean result = ReadBREP (filename, aShape); |
5c573e69 | 133 | if (result) |
7fd59977 | 134 | { |
5c573e69 | 135 | if (!BRepAlgo::IsValid(aShape)) |
576f8b11 | 136 | MessageBoxW (AfxGetMainWnd()->m_hWnd, L"Warning: The shape is not valid!", L"Cascade Warning", MB_ICONWARNING); |
5c573e69 | 137 | |
138 | aSequence->Append(aShape); | |
7fd59977 | 139 | } |
140 | else | |
576f8b11 | 141 | MessageBoxW (AfxGetMainWnd()->m_hWnd, L"Error: The file was not read", L"Cascade Error", MB_ICONERROR); |
7fd59977 | 142 | |
5c573e69 | 143 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
7fd59977 | 144 | } |
145 | ||
146 | return aSequence; | |
147 | } | |
148 | //---------------------------------------------------------------------- | |
149 | ||
576f8b11 | 150 | Standard_Boolean CImportExport::ReadBREP(CString aFileName, |
7fd59977 | 151 | TopoDS_Shape& aShape) |
152 | { | |
576f8b11 | 153 | aShape.Nullify(); |
154 | ||
155 | std::filebuf aFileBuf; | |
156 | std::istream aStream (&aFileBuf); | |
157 | if (!aFileBuf.open (aFileName, ios::in)) | |
158 | { | |
159 | return Standard_False; | |
160 | } | |
161 | ||
162 | BRep_Builder aBuilder; | |
163 | BRepTools::Read (aShape, aStream, aBuilder); | |
164 | return !aShape.IsNull(); | |
7fd59977 | 165 | } |
166 | ||
92efcf78 | 167 | void CImportExport::SaveBREP(const Handle(AIS_InteractiveContext)& anInteractiveContext) |
7fd59977 | 168 | { |
169 | anInteractiveContext->InitCurrent(); | |
170 | if (anInteractiveContext->NbCurrents() == 0){ | |
576f8b11 | 171 | AfxMessageBox (L"No shape selected for export!"); |
7fd59977 | 172 | return; |
173 | } | |
174 | Handle(TopTools_HSequenceOfShape) aHSequenceOfShape; | |
175 | Handle(Quantity_HArray1OfColor) anArrayOfColors; | |
176 | Handle(TColStd_HArray1OfReal) anArrayOfTransparencies; | |
177 | aHSequenceOfShape = BuildSequenceFromContext(anInteractiveContext, anArrayOfColors, anArrayOfTransparencies); | |
178 | int aLength = aHSequenceOfShape->Length(); | |
179 | if (aLength == 1){ | |
180 | TopoDS_Shape RES = aHSequenceOfShape->Value(1); | |
181 | CImportExport::SaveBREP(RES); | |
182 | } else { | |
183 | TopoDS_Compound RES; | |
184 | BRep_Builder MKCP; | |
185 | MKCP.MakeCompound(RES); | |
186 | for (Standard_Integer i=1;i<=aLength;i++) | |
187 | { | |
188 | TopoDS_Shape aShape= aHSequenceOfShape->Value(i); | |
189 | if ( aShape.IsNull() ) | |
190 | { | |
191 | continue; | |
192 | } | |
193 | MKCP.Add(RES, aShape); | |
194 | } | |
195 | CImportExport::SaveBREP(RES); | |
196 | } | |
197 | } | |
198 | ||
199 | Standard_Boolean CImportExport::SaveBREP(const TopoDS_Shape& aShape) | |
200 | { | |
576f8b11 | 201 | CFileDialog dlg (FALSE, L"*.brep",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, |
202 | L"BREP Files (*.brep)|*.brep;|BREP Files (*.BREP)|*.BREP;||", NULL); | |
7fd59977 | 203 | |
576f8b11 | 204 | CString CASROOTValue; |
205 | CASROOTValue.GetEnvironmentVariable (L"CASROOT"); | |
7fd59977 | 206 | CString initdir = (CASROOTValue + "\\..\\data\\occ"); |
207 | ||
208 | dlg.m_ofn.lpstrInitialDir = initdir; | |
209 | ||
210 | Standard_Boolean result = Standard_False; | |
211 | if (dlg.DoModal() == IDOK) | |
212 | { | |
213 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
214 | CString filename = dlg.GetPathName(); | |
576f8b11 | 215 | result = SaveBREP (filename, aShape); |
7fd59977 | 216 | if (!result) |
576f8b11 | 217 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, |
218 | L"Error : The shape or shapes were not saved.", | |
219 | L"CasCade Error", MB_ICONERROR); | |
7fd59977 | 220 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
221 | } | |
222 | return result; | |
223 | } | |
224 | ||
225 | //---------------------------------------------------------------------------------------- | |
576f8b11 | 226 | Standard_Boolean CImportExport::SaveBREP (CString aFileName, |
227 | const TopoDS_Shape& aShape) | |
7fd59977 | 228 | { |
576f8b11 | 229 | std::filebuf aFileBuf; |
230 | std::ostream aStream (&aFileBuf); | |
231 | if (!aFileBuf.open (aFileName, ios::out)) | |
232 | { | |
233 | return Standard_False; | |
234 | } | |
235 | ||
236 | BRepTools::Write (aShape, aStream); | |
237 | return Standard_True; | |
7fd59977 | 238 | } |
239 | ||
7fd59977 | 240 | //====================================================================== |
241 | //= = | |
242 | //= IGES = | |
243 | //= = | |
244 | //====================================================================== | |
245 | ||
246 | ||
247 | ||
248 | void CImportExport::ReadIGES(const Handle(AIS_InteractiveContext)& anInteractiveContext) | |
249 | { | |
250 | Handle(TopTools_HSequenceOfShape) aSequence = CImportExport::ReadIGES(); | |
251 | for(int i=1;i<= aSequence->Length();i++) | |
252 | anInteractiveContext->Display(new AIS_Shape(aSequence->Value(i))); | |
253 | ||
254 | } | |
255 | ||
256 | Handle(TopTools_HSequenceOfShape) CImportExport::ReadIGES()// not by reference --> the sequence is created here !! | |
257 | { | |
258 | CFileDialog dlg(TRUE, | |
259 | NULL, | |
260 | NULL, | |
261 | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, | |
576f8b11 | 262 | L"IGES Files (*.iges , *.igs)|*.iges; *.igs|All Files (*.*)|*.*||", |
7fd59977 | 263 | NULL ); |
264 | ||
576f8b11 | 265 | CString CASROOTValue; |
266 | CASROOTValue.GetEnvironmentVariable (L"CASROOT"); | |
7fd59977 | 267 | CString initdir = (CASROOTValue + "\\..\\data\\iges"); |
268 | ||
269 | dlg.m_ofn.lpstrInitialDir = initdir; | |
270 | ||
271 | Handle(TopTools_HSequenceOfShape) aSequence = new TopTools_HSequenceOfShape(); | |
272 | if (dlg.DoModal() == IDOK) | |
273 | { | |
274 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
576f8b11 | 275 | TCollection_ExtendedString aFileNameW ((Standard_ExtString )(const wchar_t* )dlg.GetPathName()); |
276 | TCollection_AsciiString aFileName (aFileNameW, '?'); | |
277 | Standard_Integer status = ReadIGES (aFileName.ToCString(), aSequence); | |
278 | if (status != IFSelect_RetDone) | |
7fd59977 | 279 | { |
576f8b11 | 280 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Error : The file is not read", L"CasCade Error", MB_ICONERROR); |
281 | } | |
282 | ||
7fd59977 | 283 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
284 | } | |
285 | return aSequence; | |
286 | } | |
287 | //---------------------------------------------------------------------- | |
288 | ||
289 | Standard_Integer CImportExport::ReadIGES(const Standard_CString& aFileName, | |
290 | Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
291 | { | |
292 | ||
293 | IGESControl_Reader Reader; | |
294 | ||
295 | Standard_Integer status = Reader.ReadFile(aFileName); | |
296 | ||
297 | if (status != IFSelect_RetDone) return status; | |
298 | Reader.TransferRoots(); | |
299 | TopoDS_Shape aShape = Reader.OneShape(); | |
300 | aHSequenceOfShape->Append(aShape); | |
301 | ||
302 | return status; | |
303 | } | |
304 | //---------------------------------------------------------------------- | |
305 | ||
306 | void CImportExport::SaveIGES(const Handle(AIS_InteractiveContext)& anInteractiveContext) | |
307 | { | |
308 | anInteractiveContext->InitCurrent(); | |
309 | if (anInteractiveContext->NbCurrents() == 0){ | |
576f8b11 | 310 | AfxMessageBox (L"No shape selected for export!"); |
7fd59977 | 311 | return; |
312 | } | |
313 | Handle(Quantity_HArray1OfColor) anArrayOfColors; | |
314 | Handle(TColStd_HArray1OfReal) anArrayOfTransparencies; | |
315 | CImportExport::SaveIGES(BuildSequenceFromContext(anInteractiveContext, anArrayOfColors, anArrayOfTransparencies)); | |
316 | } | |
317 | ||
318 | Standard_Boolean CImportExport::SaveIGES(const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
319 | { | |
320 | if (aHSequenceOfShape->Length() == 0) | |
321 | { | |
576f8b11 | 322 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"No Shape in the HSequence!!", L"CasCade Warning", MB_ICONWARNING); |
7fd59977 | 323 | return Standard_False; |
324 | } | |
325 | ||
576f8b11 | 326 | CFileDialog dlg(FALSE, L"*.iges",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, |
327 | L"IGES Files (*.iges )|*.iges;|IGES Files (*.igs )| *.igs;||", NULL); | |
7fd59977 | 328 | |
576f8b11 | 329 | CString CASROOTValue; |
330 | CASROOTValue.GetEnvironmentVariable (L"CASROOT"); | |
7fd59977 | 331 | CString initdir = (CASROOTValue + "\\..\\data\\iges"); |
332 | ||
333 | dlg.m_ofn.lpstrInitialDir = initdir; | |
334 | ||
335 | Standard_Boolean result=Standard_False; | |
336 | if (dlg.DoModal() == IDOK) | |
337 | { | |
338 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
7fd59977 | 339 | |
576f8b11 | 340 | TCollection_ExtendedString aFileNameW ((Standard_ExtString )(const wchar_t* )dlg.GetPathName()); |
341 | TCollection_AsciiString aFileName (aFileNameW, '?'); | |
7fd59977 | 342 | |
576f8b11 | 343 | result = SaveIGES (aFileName.ToCString(), aHSequenceOfShape); |
7fd59977 | 344 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
345 | } | |
346 | return result; | |
347 | } | |
348 | //---------------------------------------------------------------------- | |
349 | ||
350 | Standard_Boolean CImportExport::SaveIGES(const Standard_CString& aFileName, | |
351 | const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
352 | { | |
353 | ||
354 | IGESControl_Controller::Init(); | |
355 | IGESControl_Writer ICW (Interface_Static::CVal("XSTEP.iges.unit"), | |
356 | Interface_Static::IVal("XSTEP.iges.writebrep.mode")); | |
357 | ||
358 | for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++) | |
359 | ICW.AddShape (aHSequenceOfShape->Value(i)); | |
360 | ||
361 | ICW.ComputeModel(); | |
362 | Standard_Boolean result = ICW.Write(aFileName ); | |
363 | return result; | |
364 | } | |
365 | ||
366 | //====================================================================== | |
367 | ||
368 | //====================================================================== | |
369 | //= = | |
370 | //= STEP = | |
371 | //= = | |
372 | //====================================================================== | |
373 | ||
374 | void CImportExport::ReadSTEP(const Handle(AIS_InteractiveContext)& anInteractiveContext) | |
375 | { | |
376 | Handle(TopTools_HSequenceOfShape) aSequence = CImportExport::ReadSTEP(); | |
377 | if (!aSequence.IsNull()) { | |
378 | for(int i=1;i<= aSequence->Length();i++) | |
379 | anInteractiveContext->Display(new AIS_Shape(aSequence->Value(i)), Standard_False); | |
380 | } | |
381 | } | |
382 | ||
383 | Handle(TopTools_HSequenceOfShape) CImportExport::ReadSTEP()// not by reference --> the sequence is created here !! | |
384 | { | |
385 | CFileDialog dlg(TRUE, | |
386 | NULL, | |
387 | NULL, | |
388 | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, | |
576f8b11 | 389 | L"STEP Files (*.stp;*.step)|*.stp; *.step|All Files (*.*)|*.*||", |
7fd59977 | 390 | NULL ); |
391 | ||
576f8b11 | 392 | CString CASROOTValue; |
393 | CASROOTValue.GetEnvironmentVariable(L"CASROOT"); | |
7fd59977 | 394 | CString initdir = (CASROOTValue + "\\..\\data\\step"); |
395 | ||
396 | dlg.m_ofn.lpstrInitialDir = initdir; | |
397 | ||
398 | Handle(TopTools_HSequenceOfShape) aSequence= new TopTools_HSequenceOfShape(); | |
399 | if (dlg.DoModal() == IDOK) | |
400 | { | |
401 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
576f8b11 | 402 | TCollection_ExtendedString aFileNameW ((Standard_ExtString )(const wchar_t* )dlg.GetPathName()); |
403 | TCollection_AsciiString aFileName (aFileNameW, '?'); | |
404 | IFSelect_ReturnStatus ReturnStatus = ReadSTEP (aFileName.ToCString(), aSequence); | |
7fd59977 | 405 | switch (ReturnStatus) |
406 | { | |
407 | case IFSelect_RetError : | |
576f8b11 | 408 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Not a valid Step file", L"ERROR", MB_ICONWARNING); |
7fd59977 | 409 | break; |
410 | case IFSelect_RetFail : | |
576f8b11 | 411 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Reading has failed", L"ERROR", MB_ICONWARNING); |
7fd59977 | 412 | break; |
413 | case IFSelect_RetVoid : | |
576f8b11 | 414 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Nothing to transfer", L"ERROR", MB_ICONWARNING); |
7fd59977 | 415 | break; |
416 | } | |
417 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); | |
418 | } | |
419 | return aSequence; | |
420 | } | |
421 | ||
422 | IFSelect_ReturnStatus CImportExport::ReadSTEP(const Standard_CString& aFileName, | |
423 | Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
424 | { | |
425 | aHSequenceOfShape->Clear(); | |
426 | ||
427 | // create additional log file | |
428 | STEPControl_Reader aReader; | |
429 | IFSelect_ReturnStatus status = aReader.ReadFile(aFileName); | |
430 | if (status != IFSelect_RetDone) | |
431 | return status; | |
432 | ||
433 | aReader.WS()->MapReader()->SetTraceLevel(2); // increase default trace level | |
434 | ||
435 | Standard_Boolean failsonly = Standard_False; | |
436 | aReader.PrintCheckLoad(failsonly, IFSelect_ItemsByEntity); | |
437 | ||
438 | // Root transfers | |
439 | Standard_Integer nbr = aReader.NbRootsForTransfer(); | |
440 | aReader.PrintCheckTransfer (failsonly, IFSelect_ItemsByEntity); | |
441 | for ( Standard_Integer n = 1; n<=nbr; n++) { | |
5c573e69 | 442 | /*Standard_Boolean ok =*/ aReader.TransferRoot(n); |
7fd59977 | 443 | } |
444 | ||
445 | // Collecting resulting entities | |
446 | Standard_Integer nbs = aReader.NbShapes(); | |
447 | if (nbs == 0) { | |
448 | return IFSelect_RetVoid; | |
449 | } | |
450 | for (Standard_Integer i=1; i<=nbs; i++) { | |
451 | aHSequenceOfShape->Append(aReader.Shape(i)); | |
452 | } | |
453 | ||
454 | return status; | |
455 | } | |
456 | ||
457 | ||
458 | //---------------------------------------------------------------------- | |
459 | void CImportExport::SaveSTEP(const Handle(AIS_InteractiveContext)& anInteractiveContext) | |
460 | { | |
461 | anInteractiveContext->InitCurrent(); | |
462 | if (anInteractiveContext->NbCurrents() == 0){ | |
576f8b11 | 463 | AfxMessageBox (L"No shape selected for export!"); |
7fd59977 | 464 | return; |
465 | } | |
466 | Handle(Quantity_HArray1OfColor) anArrayOfColors; | |
467 | Handle(TColStd_HArray1OfReal) anArrayOfTransparencies; | |
468 | CImportExport::SaveSTEP(BuildSequenceFromContext(anInteractiveContext, anArrayOfColors, anArrayOfTransparencies)); | |
469 | } | |
470 | ||
471 | // Return True if no error | |
472 | Standard_Boolean TestFacetedBrep(const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
473 | { | |
474 | Standard_Boolean OneErrorFound = Standard_False; | |
475 | for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++) | |
476 | { | |
477 | TopoDS_Shape aShape= aHSequenceOfShape->Value(i); | |
478 | ||
479 | TopExp_Explorer Ex(aShape,TopAbs_FACE); | |
480 | while (Ex.More() && !OneErrorFound) | |
481 | { | |
482 | // Get the Geom_Surface outside the TopoDS_Face | |
483 | Handle(Geom_Surface) aSurface = BRep_Tool::Surface(TopoDS::Face(Ex.Current())); | |
484 | // check if it is a plane. | |
485 | if (!aSurface->IsKind(STANDARD_TYPE(Geom_Plane))) | |
486 | OneErrorFound=Standard_True; | |
487 | Ex.Next(); | |
488 | } | |
489 | TopExp_Explorer Ex2(aShape,TopAbs_EDGE); | |
490 | while (Ex2.More() && !OneErrorFound) | |
491 | { | |
492 | // Get the Geom_Curve outside the TopoDS_Face | |
493 | Standard_Real FirstDummy,LastDummy; | |
494 | Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(Ex2.Current()),FirstDummy,LastDummy); | |
495 | // check if it is a line. | |
496 | if (!aCurve->IsKind(STANDARD_TYPE(Geom_Line))) | |
497 | OneErrorFound=Standard_True; | |
498 | Ex2.Next(); | |
499 | } | |
500 | } | |
501 | return !OneErrorFound; | |
502 | } | |
503 | ||
504 | IFSelect_ReturnStatus CImportExport::SaveSTEP(const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
505 | { | |
506 | if (aHSequenceOfShape->Length() == 0) | |
507 | { | |
576f8b11 | 508 | MessageBox (AfxGetApp()->m_pMainWnd->m_hWnd, L"No Shape in the HSequence!!", L"CasCade Warning", MB_ICONWARNING); |
7fd59977 | 509 | return IFSelect_RetError; |
510 | } | |
511 | ||
5c573e69 | 512 | IFSelect_ReturnStatus status = IFSelect_RetVoid; |
7fd59977 | 513 | |
514 | CFileSaveSTEPDialog aDlg(NULL); | |
515 | ||
4084fb64 | 516 | aDlg.m_Cc1ModelType = STEPControl_AsIs; |
7fd59977 | 517 | |
518 | if (aDlg.DoModal() == IDOK) { | |
519 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
576f8b11 | 520 | TCollection_ExtendedString aFileNameW ((Standard_ExtString )(const wchar_t* )aDlg.GetPathName()); |
521 | TCollection_AsciiString aFileName (aFileNameW, '?'); | |
7fd59977 | 522 | |
523 | STEPControl_StepModelType selection = aDlg.m_Cc1ModelType; | |
524 | ||
525 | if(selection == STEPControl_FacetedBrep) | |
526 | ||
527 | if (!TestFacetedBrep(aHSequenceOfShape)) | |
528 | { | |
576f8b11 | 529 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"At least one shape doesn't contain facetes", L"CasCade Warning", MB_ICONWARNING); |
7fd59977 | 530 | return IFSelect_RetError; |
531 | } | |
532 | ||
533 | ||
576f8b11 | 534 | status = SaveSTEP (aFileName.ToCString(), aHSequenceOfShape, selection); |
7fd59977 | 535 | switch (status) |
536 | { | |
537 | case IFSelect_RetError: | |
576f8b11 | 538 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Incorrect Data", L"ERROR", MB_ICONWARNING); |
7fd59977 | 539 | break; |
540 | case IFSelect_RetFail: | |
576f8b11 | 541 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Writing has failed", L"ERROR", MB_ICONWARNING); |
7fd59977 | 542 | break; |
543 | case IFSelect_RetVoid: | |
576f8b11 | 544 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"Nothing to transfer", L"ERROR", MB_ICONWARNING); |
7fd59977 | 545 | break; |
546 | } | |
547 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); | |
548 | } | |
549 | return status; | |
550 | } | |
551 | //---------------------------------------------------------------------------------------- | |
552 | IFSelect_ReturnStatus CImportExport::SaveSTEP(const Standard_CString& aFileName, | |
553 | const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape, | |
554 | ||
555 | const STEPControl_StepModelType aValue /* =TopoDSToCc1Act_ManifoldSolidBrep */ ) | |
556 | ||
557 | { | |
558 | // CREATE THE WRITER | |
559 | ||
560 | STEPControl_Writer aWriter; | |
561 | ||
562 | IFSelect_ReturnStatus status; | |
563 | for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++) | |
564 | { | |
565 | status = aWriter.Transfer(aHSequenceOfShape->Value(i), aValue); | |
566 | if ( status != IFSelect_RetDone ) return status; | |
567 | } | |
568 | status = aWriter.Write(aFileName); | |
569 | return status; | |
570 | } | |
571 | ||
572 | ||
573 | ||
574 | //====================================================================== | |
575 | //= = | |
576 | //= STL = | |
577 | //= = | |
578 | //====================================================================== | |
579 | ||
580 | void CImportExport::SaveSTL(const Handle(AIS_InteractiveContext)& anInteractiveContext) | |
581 | { | |
582 | anInteractiveContext->InitCurrent(); | |
583 | if (anInteractiveContext->NbCurrents() == 0){ | |
576f8b11 | 584 | AfxMessageBox (L"No shape selected for export!"); |
7fd59977 | 585 | return; |
586 | } | |
587 | Handle(Quantity_HArray1OfColor) anArrayOfColors; | |
588 | Handle(TColStd_HArray1OfReal) anArrayOfTransparencies; | |
589 | CImportExport::SaveSTL(BuildSequenceFromContext(anInteractiveContext, anArrayOfColors, anArrayOfTransparencies)); | |
590 | } | |
591 | ||
592 | Standard_Boolean CImportExport::SaveSTL(const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape) | |
593 | { | |
576f8b11 | 594 | CFileDialog dlg(FALSE, L"*.stl", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, |
595 | L"stl Files (*.stl)|*.stl;|STL Files (*.STL)|*.STL;||", NULL); | |
7fd59977 | 596 | |
576f8b11 | 597 | CString CASROOTValue; |
598 | CASROOTValue.GetEnvironmentVariable(L"CASROOT"); | |
7fd59977 | 599 | CString initdir = (CASROOTValue + "\\..\\data\\stl"); |
600 | ||
601 | dlg.m_ofn.lpstrInitialDir = initdir; | |
602 | ||
576f8b11 | 603 | Standard_Boolean result = Standard_False; |
7fd59977 | 604 | |
605 | if (dlg.DoModal() == IDOK) { | |
606 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
576f8b11 | 607 | TCollection_ExtendedString aFileNameW ((Standard_ExtString )(const wchar_t* )dlg.GetPathName()); |
608 | TCollection_AsciiString aFileName (aFileNameW, '?'); | |
7fd59977 | 609 | TCollection_AsciiString Message; |
576f8b11 | 610 | result = SaveSTL (aFileName.ToCString(), aHSequenceOfShape, Message); |
611 | CString aMsg (Message.ToCString()); | |
612 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, aMsg, result ? L"CasCade" : L"CasCade Error", result ? MB_OK : MB_ICONERROR); | |
7fd59977 | 613 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
614 | } | |
615 | return result; | |
616 | } | |
617 | ||
618 | Standard_Boolean CImportExport::SaveSTL(const Standard_CString& aFileName, | |
619 | const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape, | |
620 | TCollection_AsciiString& ReturnMessage) | |
621 | { | |
622 | Standard_Boolean ReturnValue = Standard_True; | |
623 | if (aHSequenceOfShape->Length() == 0) | |
624 | { | |
576f8b11 | 625 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"No Shape in the HSequence!!", L"CasCade Warning", MB_ICONWARNING); |
7fd59977 | 626 | return Standard_False; |
627 | } | |
628 | ||
7fd59977 | 629 | ReturnMessage += "The Object have be saved in the file "; |
630 | ReturnMessage += aFileName; | |
631 | ReturnMessage += "\n with the names : "; | |
632 | ||
633 | TopoDS_Compound RES; | |
634 | BRep_Builder MKCP; | |
635 | MKCP.MakeCompound(RES); | |
636 | ||
637 | for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++) | |
638 | { | |
639 | TopoDS_Shape aShape= aHSequenceOfShape->Value(i); | |
640 | TCollection_AsciiString anObjectName("anObjectName_"); | |
641 | anObjectName += i; | |
642 | ReturnMessage += anObjectName; | |
643 | ReturnMessage += " \n"; | |
644 | ||
645 | if ( aShape.IsNull() ) | |
646 | { | |
647 | ReturnMessage += " Error : Invalid shape \n"; | |
648 | ReturnValue = Standard_False; | |
649 | continue; | |
650 | } | |
651 | ||
652 | MKCP.Add(RES, aShape); | |
653 | } | |
654 | ||
655 | StlAPI_Writer myStlWriter; | |
656 | myStlWriter.Write(RES, aFileName); | |
657 | ||
658 | return ReturnValue; | |
659 | } | |
660 | ||
661 | ||
662 | //====================================================================== | |
663 | //= = | |
664 | //= VRML = | |
665 | //= = | |
666 | //====================================================================== | |
667 | ||
668 | void CImportExport::SaveVRML(const Handle(AIS_InteractiveContext)& anInteractiveContext) | |
669 | { | |
670 | anInteractiveContext->InitCurrent(); | |
671 | if (anInteractiveContext->NbCurrents() == 0){ | |
576f8b11 | 672 | AfxMessageBox (L"No shape selected for export!"); |
7fd59977 | 673 | return; |
674 | } | |
675 | Handle(Quantity_HArray1OfColor) anArrayOfColors; | |
676 | Handle(TColStd_HArray1OfReal) anArrayOfTransparencies; | |
677 | CImportExport::SaveVRML(BuildSequenceFromContext(anInteractiveContext, anArrayOfColors, anArrayOfTransparencies), | |
678 | anArrayOfColors, anArrayOfTransparencies); | |
679 | } | |
680 | ||
681 | Standard_Boolean CImportExport::SaveVRML(const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape, | |
682 | const Handle(Quantity_HArray1OfColor)& anArrayOfColors, | |
683 | const Handle(TColStd_HArray1OfReal)& anArrayOfTransparencies) | |
684 | { | |
576f8b11 | 685 | CFileDialog dlg(FALSE, L"*.vrml", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, |
686 | L"vrml Files (*.vrml)|*.vrml;|vrm Files (*.vrm)|*.vrm;||", NULL); | |
7fd59977 | 687 | |
576f8b11 | 688 | CString CASROOTValue; |
689 | CASROOTValue.GetEnvironmentVariable(L"CASROOT"); | |
7fd59977 | 690 | CString initdir = (CASROOTValue + "\\..\\data\\vrml"); |
691 | ||
692 | dlg.m_ofn.lpstrInitialDir = initdir; | |
693 | ||
576f8b11 | 694 | Standard_Boolean result = Standard_False; |
7fd59977 | 695 | |
696 | if (dlg.DoModal() == IDOK) { | |
697 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT)); | |
576f8b11 | 698 | TCollection_ExtendedString aFileNameW ((Standard_ExtString )(const wchar_t* )dlg.GetPathName()); |
699 | TCollection_AsciiString aFileName (aFileNameW, '?'); | |
7fd59977 | 700 | TCollection_AsciiString Message; |
576f8b11 | 701 | result = SaveVRML (aFileName.ToCString(), aHSequenceOfShape, anArrayOfColors, anArrayOfTransparencies, Message); |
702 | CString aMsg (Message.ToCString()); | |
703 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, aMsg, result ? L"CasCade" : L"CasCade Error", result ? MB_OK : MB_ICONERROR); | |
7fd59977 | 704 | SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); |
705 | } | |
706 | return result; | |
707 | } | |
708 | ||
709 | Standard_Boolean CImportExport::SaveVRML(const Standard_CString& aFileName, | |
710 | const Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape, | |
711 | const Handle(Quantity_HArray1OfColor)& anArrayOfColors, | |
712 | const Handle(TColStd_HArray1OfReal)& anArrayOfTransparencies, | |
713 | TCollection_AsciiString& ReturnMessage) | |
714 | { | |
715 | Standard_Boolean ReturnValue = Standard_True; | |
716 | if (aHSequenceOfShape->Length() == 0) | |
717 | { | |
576f8b11 | 718 | MessageBoxW (AfxGetApp()->m_pMainWnd->m_hWnd, L"No Shape in the HSequence!!", L"CasCade Warning", MB_ICONWARNING); |
7fd59977 | 719 | return Standard_False; |
720 | } | |
721 | ||
7fd59977 | 722 | ReturnMessage += "The Object has been saved in the file "; |
723 | ReturnMessage += aFileName; | |
724 | ReturnMessage += "\n with the names : "; | |
725 | ||
726 | // VRML scene. | |
727 | VrmlData_Scene scene; | |
728 | VrmlData_ShapeConvert converter(scene/*, 0.001*/); // from mm to meters | |
729 | Standard_Integer iShape = 1; // Counter of shapes | |
730 | ||
e0280ce9 | 731 | for (int i = 1; i <= aHSequenceOfShape->Length(); i++) |
732 | { | |
7fd59977 | 733 | // Shape |
e0280ce9 | 734 | TopoDS_Shape shape = aHSequenceOfShape->Value(i); |
735 | if (shape.IsNull()) | |
736 | { | |
737 | ReturnMessage += " Error : Invalid shape \n"; | |
738 | ReturnValue = Standard_False; | |
739 | continue; | |
7fd59977 | 740 | } |
741 | ||
742 | // Color | |
743 | Quantity_Color color; // yellow | |
744 | if (!anArrayOfColors.IsNull()) | |
745 | color = anArrayOfColors->Value(i); | |
746 | ||
747 | // Transparency | |
748 | Standard_Real transparency = 0.0; | |
749 | if (!anArrayOfTransparencies.IsNull()) | |
750 | transparency = anArrayOfTransparencies->Value(i); | |
751 | ||
752 | // Give a name to the shape. | |
753 | TCollection_AsciiString name("Shape"); | |
754 | name += TCollection_AsciiString(iShape++); | |
755 | converter.AddShape(shape, name.ToCString()); | |
756 | ReturnMessage += name; | |
757 | ReturnMessage += '\n'; | |
758 | ||
759 | // Check presence of faces in the shape. | |
760 | TopExp_Explorer expl(shape, TopAbs_FACE); | |
761 | if (expl.More()) | |
762 | converter.Convert(true, false, 0.01); // faces only | |
763 | else | |
764 | converter.Convert(false, true, 0.01); // edges only | |
765 | ||
766 | // Name of the color & transparency. | |
767 | // It will be uniquely saved in VRML file. | |
768 | TCollection_AsciiString cname = Quantity_Color::StringName(color.Name()); | |
769 | cname += transparency; | |
770 | ||
771 | // Make the appearance (VRML attribute) | |
772 | Handle(VrmlData_Appearance) appearance = Handle(VrmlData_Appearance)::DownCast(scene.FindNode(cname.ToCString())); | |
773 | if (appearance.IsNull()) | |
774 | { | |
775 | // Not found ... create a new one. | |
776 | Handle(VrmlData_Material) material = new VrmlData_Material(scene, cname.ToCString(), 0.2, 0.2, transparency); | |
777 | material->SetDiffuseColor(color); | |
778 | material->SetEmissiveColor(color); | |
779 | material->SetSpecularColor(color); | |
780 | scene.AddNode(material, false); | |
781 | appearance = new VrmlData_Appearance(scene, cname.ToCString()); | |
782 | appearance->SetMaterial(material); | |
783 | scene.AddNode(appearance, false); | |
784 | } | |
785 | ||
786 | // Apply the material to the shape of entity. | |
787 | Handle(VrmlData_Group) group = Handle(VrmlData_Group)::DownCast(scene.FindNode(name.ToCString())); | |
788 | if (!group.IsNull()) | |
789 | { | |
790 | VrmlData_ListOfNode::Iterator itr = group->NodeIterator(); | |
791 | for (; itr.More(); itr.Next()) | |
792 | { | |
793 | Handle(VrmlData_Node) node = itr.Value(); | |
794 | if (node->DynamicType() == STANDARD_TYPE(VrmlData_ShapeNode)) | |
795 | { | |
e0280ce9 | 796 | Handle(VrmlData_ShapeNode) aShape = Handle(VrmlData_ShapeNode)::DownCast(node); |
797 | aShape->SetAppearance(appearance); | |
7fd59977 | 798 | } |
799 | else if (itr.Value()->DynamicType() == STANDARD_TYPE(VrmlData_Group)) | |
800 | { | |
801 | Handle(VrmlData_Group) groupc = Handle(VrmlData_Group)::DownCast(itr.Value()); | |
802 | VrmlData_ListOfNode::Iterator itrc = groupc->NodeIterator(); | |
803 | for (; itrc.More(); itrc.Next()) | |
804 | { | |
805 | Handle(VrmlData_Node) nodec = itrc.Value(); | |
806 | if (nodec->DynamicType() == STANDARD_TYPE(VrmlData_ShapeNode)) | |
807 | { | |
808 | Handle(VrmlData_ShapeNode) shapec = Handle(VrmlData_ShapeNode)::DownCast(nodec); | |
809 | shapec->SetAppearance(appearance); | |
810 | } | |
811 | } // for of group nodes... | |
812 | } // if (it is a shape node... | |
813 | } // for of group nodes... | |
814 | } // if (!group.IsNull... | |
815 | } // iterator of shapes | |
816 | ||
817 | // Call VRML writer | |
818 | ofstream writer(aFileName); | |
819 | writer<<scene; | |
820 | writer.close(); | |
821 | ||
822 | /* Old approach to store shapes in VRML (without color & transparency). | |
823 | TopoDS_Compound RES; | |
824 | BRep_Builder MKCP; | |
825 | MKCP.MakeCompound(RES); | |
826 | ||
827 | for (Standard_Integer i=1;i<=aHSequenceOfShape->Length();i++) | |
828 | { | |
829 | TopoDS_Shape aShape= aHSequenceOfShape->Value(i); | |
830 | TCollection_AsciiString anObjectName("anObjectName_"); | |
831 | anObjectName += i; | |
832 | ReturnMessage += anObjectName; | |
833 | ReturnMessage += " \n"; | |
834 | ||
835 | if ( aShape.IsNull() ) | |
836 | { | |
837 | ReturnMessage += " Error : Invalid shape \n"; | |
838 | ReturnValue = Standard_False; | |
839 | continue; | |
840 | } | |
841 | ||
842 | MKCP.Add(RES, aShape); | |
843 | } | |
844 | ||
845 | VrmlAPI_Writer myVrmlWriter; | |
846 | myVrmlWriter.Write(RES, aFileName); | |
847 | */ | |
848 | ||
849 | return ReturnValue; | |
850 | } | |
851 | ||
852 | ||
853 | ||
854 |