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