f5e8ecd1934ad6aff953911c54fc3c9b6e55006f
[occt.git] / src / STEPCAFControl / STEPCAFControl_Writer.cxx
1 // Created on: 2000-08-15
2 // Created by: Andrey BETENEV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 // CURRENT LIMITATIONS: 
17 // when val props and names assigned to instance of 
18 // component in assembly, it is in fact supposed that only one CDSR corresponds
19 // to such shape. This can be wrong and should be handled more carefully
20 // (analysis of SDRs which the CDSR links should be done)
21 // Names and validation props are supported for top-level shapes only
22
23 #include <BRep_Builder.hxx>
24 #include <HeaderSection_FileSchema.hxx>
25 #include <Interface_EntityIterator.hxx>
26 #include <Interface_Static.hxx>
27 #include <Message_Messenger.hxx>
28 #include <MoniTool_DataMapIteratorOfDataMapOfShapeTransient.hxx>
29 #include <OSD_Path.hxx>
30 #include <Quantity_TypeOfColor.hxx>
31 #include <StepAP214_Protocol.hxx>
32 #include <StepBasic_DerivedUnit.hxx>
33 #include <StepBasic_DerivedUnitElement.hxx>
34 #include <StepBasic_HArray1OfDerivedUnitElement.hxx>
35 #include <StepBasic_LengthMeasureWithUnit.hxx>
36 #include <StepBasic_MeasureValueMember.hxx>
37 #include <StepBasic_Product.hxx>
38 #include <StepBasic_ProductDefinition.hxx>
39 #include <StepBasic_ProductDefinitionFormation.hxx>
40 #include <StepBasic_ProductDefinitionRelationship.hxx>
41 #include <StepBasic_SiUnitAndLengthUnit.hxx>
42 #include <StepBasic_SiUnitAndMassUnit.hxx>
43 #include <STEPCAFControl_ActorWrite.hxx>
44 #include <STEPCAFControl_Controller.hxx>
45 #include <STEPCAFControl_DictionaryOfExternFile.hxx>
46 #include <STEPCAFControl_ExternFile.hxx>
47 #include <STEPCAFControl_IteratorOfDictionaryOfExternFile.hxx>
48 #include <STEPCAFControl_Writer.hxx>
49 #include <STEPConstruct.hxx>
50 #include <STEPConstruct_DataMapOfAsciiStringTransient.hxx>
51 #include <STEPConstruct_DataMapOfPointTransient.hxx>
52 #include <STEPConstruct_ExternRefs.hxx>
53 #include <STEPConstruct_Styles.hxx>
54 #include <STEPConstruct_ValidationProps.hxx>
55 #include <STEPControl_StepModelType.hxx>
56 #include <STEPControl_Writer.hxx>
57 #include <StepData_Logical.hxx>
58 #include <StepData_StepModel.hxx>
59 #include <StepDimTol_AngularityTolerance.hxx>
60 #include <StepDimTol_CircularRunoutTolerance.hxx>
61 #include <StepDimTol_CoaxialityTolerance.hxx>
62 #include <StepDimTol_ConcentricityTolerance.hxx>
63 #include <StepDimTol_CylindricityTolerance.hxx>
64 #include <StepDimTol_Datum.hxx>
65 #include <StepDimTol_DatumFeature.hxx>
66 #include <StepDimTol_DatumReference.hxx>
67 #include <StepDimTol_FlatnessTolerance.hxx>
68 #include <StepDimTol_GeometricToleranceWithDatumReference.hxx>
69 #include <StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol.hxx>
70 #include <StepDimTol_HArray1OfDatumReference.hxx>
71 #include <StepDimTol_LineProfileTolerance.hxx>
72 #include <StepDimTol_ModifiedGeometricTolerance.hxx>
73 #include <StepDimTol_ParallelismTolerance.hxx>
74 #include <StepDimTol_PerpendicularityTolerance.hxx>
75 #include <StepDimTol_PositionTolerance.hxx>
76 #include <StepDimTol_RoundnessTolerance.hxx>
77 #include <StepDimTol_StraightnessTolerance.hxx>
78 #include <StepDimTol_SurfaceProfileTolerance.hxx>
79 #include <StepDimTol_SymmetryTolerance.hxx>
80 #include <StepDimTol_TotalRunoutTolerance.hxx>
81 #include <StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext.hxx>
82 #include <StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx>
83 #include <StepGeom_Surface.hxx>
84 #include <StepRepr_DescriptiveRepresentationItem.hxx>
85 #include <StepRepr_HArray1OfRepresentationItem.hxx>
86 #include <StepRepr_MeasureRepresentationItem.hxx>
87 #include <StepRepr_NextAssemblyUsageOccurrence.hxx>
88 #include <StepRepr_ProductDefinitionShape.hxx>
89 #include <StepRepr_PropertyDefinition.hxx>
90 #include <StepRepr_Representation.hxx>
91 #include <StepRepr_RepresentationItem.hxx>
92 #include <StepRepr_ReprItemAndLengthMeasureWithUnit.hxx>
93 #include <StepRepr_ShapeAspect.hxx>
94 #include <StepRepr_ShapeAspectRelationship.hxx>
95 #include <StepRepr_SpecifiedHigherUsageOccurrence.hxx>
96 #include <StepRepr_ValueRange.hxx>
97 #include <StepShape_AdvancedFace.hxx>
98 #include <StepShape_ConnectedFaceSet.hxx>
99 #include <StepShape_ContextDependentShapeRepresentation.hxx>
100 #include <StepShape_DimensionalCharacteristicRepresentation.hxx>
101 #include <StepShape_DimensionalSize.hxx>
102 #include <StepShape_EdgeCurve.hxx>
103 #include <StepShape_EdgeLoop.hxx>
104 #include <StepShape_FaceBound.hxx>
105 #include <StepShape_OrientedEdge.hxx>
106 #include <StepShape_ShapeDefinitionRepresentation.hxx>
107 #include <StepShape_ShapeDimensionRepresentation.hxx>
108 #include <StepShape_ShapeRepresentation.hxx>
109 #include <StepVisual_CurveStyle.hxx>
110 #include <StepVisual_HArray1OfInvisibleItem.hxx>
111 #include <StepVisual_HArray1OfLayeredItem.hxx>
112 #include <StepVisual_HArray1OfPresentationStyleAssignment.hxx>
113 #include <StepVisual_HArray1OfPresentationStyleSelect.hxx>
114 #include <StepVisual_Invisibility.hxx>
115 #include <StepVisual_InvisibleItem.hxx>
116 #include <StepVisual_MechanicalDesignGeometricPresentationRepresentation.hxx>
117 #include <StepVisual_PointStyle.hxx>
118 #include <StepVisual_PresentationLayerAssignment.hxx>
119 #include <StepVisual_PresentationRepresentation.hxx>
120 #include <StepVisual_PresentationStyleAssignment.hxx>
121 #include <StepVisual_PresentationStyleByContext.hxx>
122 #include <StepVisual_StyledItem.hxx>
123 #include <StepVisual_SurfaceStyleUsage.hxx>
124 #include <TCollection_AsciiString.hxx>
125 #include <TCollection_HAsciiString.hxx>
126 #include <TColStd_HArray1OfReal.hxx>
127 #include <TColStd_HArray1OfTransient.hxx>
128 #include <TColStd_HSequenceOfTransient.hxx>
129 #include <TColStd_MapOfTransient.hxx>
130 #include <TDataStd_Name.hxx>
131 #include <TDataStd_TreeNode.hxx>
132 #include <TDataStd_UAttribute.hxx>
133 #include <TDF_AttributeSequence.hxx>
134 #include <TDF_ChildIterator.hxx>
135 #include <TDF_Label.hxx>
136 #include <TDF_LabelSequence.hxx>
137 #include <TDF_Tool.hxx>
138 #include <TDocStd_Document.hxx>
139 #include <TopoDS_Compound.hxx>
140 #include <TopoDS_Iterator.hxx>
141 #include <TopoDS_Shape.hxx>
142 #include <TopTools_MapOfShape.hxx>
143 #include <TopTools_SequenceOfShape.hxx>
144 #include <Transfer_ActorOfFinderProcess.hxx>
145 #include <Transfer_Binder.hxx>
146 #include <Transfer_FinderProcess.hxx>
147 #include <Transfer_TransientListBinder.hxx>
148 #include <TransferBRep.hxx>
149 #include <TransferBRep_ShapeMapper.hxx>
150 #include <XCAFDoc.hxx>
151 #include <XCAFDoc_Area.hxx>
152 #include <XCAFDoc_Centroid.hxx>
153 #include <XCAFDoc_ColorTool.hxx>
154 #include <XCAFDoc_Datum.hxx>
155 #include <XCAFDoc_DimTol.hxx>
156 #include <XCAFDoc_DimTolTool.hxx>
157 #include <XCAFDoc_DocumentTool.hxx>
158 #include <XCAFDoc_GraphNode.hxx>
159 #include <XCAFDoc_LayerTool.hxx>
160 #include <XCAFDoc_Material.hxx>
161 #include <XCAFDoc_MaterialTool.hxx>
162 #include <XCAFDoc_ShapeTool.hxx>
163 #include <XCAFDoc_Volume.hxx>
164 #include <XCAFPrs.hxx>
165 #include <XCAFPrs_DataMapIteratorOfDataMapOfStyleShape.hxx>
166 #include <XCAFPrs_DataMapOfShapeStyle.hxx>
167 #include <XCAFPrs_DataMapOfStyleShape.hxx>
168 #include <XCAFPrs_Style.hxx>
169 #include <XSControl_TransferWriter.hxx>
170 #include <XSControl_WorkSession.hxx>
171
172 // added by skl 15.01.2004 for D&GT writing
173 //#include <StepRepr_CompoundItemDefinition.hxx>
174 //#include <StepRepr_CompoundItemDefinitionMember.hxx>
175 // added by skl 12.02.2004 for writing materials
176 //=======================================================================
177 //function : GetLabelName
178 //purpose  : auxilary function: take name of label and append it to str
179 //=======================================================================
180 static Standard_Boolean GetLabelName (const TDF_Label &L, Handle(TCollection_HAsciiString) &str)
181 {
182   Handle(TDataStd_Name) N;
183   if ( ! L.FindAttribute ( TDataStd_Name::GetID(), N ) ) return Standard_False;
184   TCollection_ExtendedString name = N->Get();
185   if ( name.Length() <=0 ) return Standard_False;
186
187   // set name, converting it to Ascii and removing spaces
188   TCollection_AsciiString buf ( name, '?' );
189   buf.LeftAdjust();
190   buf.RightAdjust();
191   buf.ChangeAll(' ','_');
192   str->AssignCat ( buf.ToCString() );
193   return Standard_True;
194 }
195
196
197 //=======================================================================
198 //function : STEPCAFControl_Writer
199 //purpose  :
200 //=======================================================================
201
202 STEPCAFControl_Writer::STEPCAFControl_Writer () :
203        myColorMode( Standard_True ),
204        myNameMode ( Standard_True ),
205        myLayerMode( Standard_True ),
206        myPropsMode( Standard_True ),
207        mySHUOMode ( Standard_True ),
208        myDGTMode  ( Standard_True ),
209        myMatMode  ( Standard_True )
210 {
211   STEPCAFControl_Controller::Init();
212   Handle(XSControl_WorkSession) WS = new XSControl_WorkSession;
213   Init ( WS );
214 }
215
216
217 //=======================================================================
218 //function : STEPCAFControl_Writer
219 //purpose  :
220 //=======================================================================
221
222 STEPCAFControl_Writer::STEPCAFControl_Writer (const Handle(XSControl_WorkSession)& WS,
223                                               const Standard_Boolean scratch)
224 {
225   STEPCAFControl_Controller::Init();
226   Init ( WS, scratch );
227   myColorMode = Standard_True;
228   myNameMode = Standard_True;
229   myLayerMode = Standard_True;
230   myPropsMode = Standard_True;
231   mySHUOMode = Standard_True;
232 }
233
234
235 //=======================================================================
236 //function : Init
237 //purpose  :
238 //=======================================================================
239
240 void STEPCAFControl_Writer::Init (const Handle(XSControl_WorkSession)& WS,
241                                   const Standard_Boolean scratch)
242 {
243   WS->SelectNorm ( "STEP" );
244   myWriter.SetWS (WS,scratch);
245   myFiles = new STEPCAFControl_DictionaryOfExternFile;
246   myLabEF.Clear();
247   myLabels.Clear();
248 }
249
250
251 //=======================================================================
252 //function : Write
253 //purpose  :
254 //=======================================================================
255
256 IFSelect_ReturnStatus STEPCAFControl_Writer::Write (const Standard_CString filename)
257 {
258   IFSelect_ReturnStatus status = myWriter.Write ( filename );
259
260   // get directory name of the main file
261   OSD_Path mainfile ( filename );
262   mainfile.SetName ( "" );
263   mainfile.SetExtension ( "" );
264   TCollection_AsciiString dpath;
265   mainfile.SystemName ( dpath );
266
267   STEPCAFControl_IteratorOfDictionaryOfExternFile it ( myFiles );
268   for ( ; it.More(); it.Next() ) {
269     Handle(STEPCAFControl_ExternFile) EF = it.Value();
270     if ( EF->GetWriteStatus() != IFSelect_RetVoid ) continue;
271
272     // construct extern file name
273     TCollection_AsciiString fname = OSD_Path::AbsolutePath ( dpath, EF->GetName()->String() );
274     if ( fname.Length() <= 0 ) fname = EF->GetName()->String();
275 #ifdef OCCT_DEBUG
276     cout << "Writing external file: " << fname.ToCString() << endl;
277 #endif
278     
279     EF->SetWriteStatus ( EF->GetWS()->SendAll ( fname.ToCString() ) );
280   }
281
282   return status;
283 }
284
285
286 //=======================================================================
287 //function : Transfer
288 //purpose  :
289 //=======================================================================
290
291 Standard_Boolean STEPCAFControl_Writer::Transfer( const Handle(TDocStd_Document) &doc,
292                                                   const STEPControl_StepModelType mode,
293                                                   const Standard_CString multi )
294 {
295   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( doc->Main() );
296   if ( STool.IsNull() ) return Standard_False;
297
298   TDF_LabelSequence labels;
299   STool->GetFreeShapes ( labels );
300   return Transfer ( myWriter, labels, mode, multi );
301 }
302
303
304 //=======================================================================
305 //function : Transfer
306 //purpose  :
307 //=======================================================================
308
309 Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_Label& L,
310                                                   const STEPControl_StepModelType mode,
311                                                   const Standard_CString multi )
312 {
313   TDF_LabelSequence labels;
314   labels.Append ( L );
315   return Transfer ( myWriter, labels, mode, multi );
316 }
317
318 //=======================================================================
319 //function : Transfer
320 //purpose  :
321 //=======================================================================
322
323 Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_LabelSequence& labels,
324                                                   const STEPControl_StepModelType mode,
325                                                   const Standard_CString multi )
326 {
327   return Transfer( myWriter, labels, mode, multi );
328 }
329
330 //=======================================================================
331 //function : Perform
332 //purpose  :
333 //=======================================================================
334
335 Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc,
336                                                  const Standard_CString filename)
337 {
338   if ( ! Transfer ( doc ) ) return Standard_False;
339   return Write ( filename ) == IFSelect_RetDone;
340 }
341
342
343 //=======================================================================
344 //function : Perform
345 //purpose  :
346 //=======================================================================
347
348 Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc,
349                                                  const TCollection_AsciiString &filename)
350 {
351   if ( ! Transfer ( doc ) ) return Standard_False;
352   return Write ( filename.ToCString() ) == IFSelect_RetDone;
353 }
354
355
356 //=======================================================================
357 //function : ExternFiles
358 //purpose  :
359 //=======================================================================
360
361 const Handle(STEPCAFControl_DictionaryOfExternFile) &STEPCAFControl_Writer::ExternFiles () const
362 {
363   return myFiles;
364 }
365
366
367 //=======================================================================
368 //function : ExternFile
369 //purpose  :
370 //=======================================================================
371
372 Standard_Boolean STEPCAFControl_Writer::ExternFile (const TDF_Label &L,
373                                                     Handle(STEPCAFControl_ExternFile) &ef) const
374 {
375   ef.Nullify();
376   if ( ! myLabEF.IsBound ( L ) ) return Standard_False;
377   ef = myLabEF.Find ( L );
378   return Standard_True;
379 }
380
381
382 //=======================================================================
383 //function : ExternFile
384 //purpose  :
385 //=======================================================================
386
387 Standard_Boolean STEPCAFControl_Writer::ExternFile (const Standard_CString name,
388                                                     Handle(STEPCAFControl_ExternFile) &ef) const
389 {
390   ef.Nullify();
391   if ( ! myFiles.IsNull() || ! myFiles->HasItem ( name ) )
392     return Standard_False;
393   ef = myFiles->Item ( name );
394   return Standard_True;
395 }
396
397
398 //=======================================================================
399 //function : Writer
400 //purpose  :
401 //=======================================================================
402
403 STEPControl_Writer &STEPCAFControl_Writer::ChangeWriter ()
404 {
405   return myWriter;
406 }
407
408
409 //=======================================================================
410 //function : Writer
411 //purpose  :
412 //=======================================================================
413
414 const STEPControl_Writer &STEPCAFControl_Writer::Writer () const
415 {
416   return myWriter;
417 }
418
419
420 //=======================================================================
421 //function : Transfer
422 //purpose  :
423 //=======================================================================
424
425 Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
426                                                   const TDF_LabelSequence &labels,
427                                                   const STEPControl_StepModelType mode,
428                                                   const Standard_CString multi,
429                                                   const Standard_Boolean isExternFile)
430 {
431   if ( labels.Length() <=0 ) return Standard_False;
432
433   Handle(STEPCAFControl_ActorWrite) Actor =
434     Handle(STEPCAFControl_ActorWrite)::DownCast ( writer.WS()->NormAdaptor()->ActorWrite() );
435
436   // translate free top-level shapes of the DECAF document
437   Standard_Integer ap = Interface_Static::IVal ("write.step.schema");
438   TDF_LabelSequence sublabels;
439   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
440     TDF_Label L = labels.Value(i);
441     TopoDS_Shape dummy;
442     if ( myLabels.IsBound ( L ) ) continue; // already processed
443
444     TopoDS_Shape shape = XCAFDoc_ShapeTool::GetShape ( L );
445     if ( shape.IsNull() ) continue;
446     
447     // write shape either as a whole, or as multifile (with extern refs)
448     if ( ! multi  ) {
449       Actor->SetStdMode ( Standard_False );
450
451       TDF_LabelSequence comp;
452
453       //for case when only part of assemby structure should be written in the document
454       //if specified label is component of the assembly then
455       //in order to save location of this component in the high-level assembly
456       //and save name of high-level assembly it is necessary to represent structure of high-level assembly 
457       //as assembly with one component specified by current label. 
458       //For that compound containing only specified component is binded to the label of the high-level assembly.
459       //The such way full structure of high-level assembly was replaced on the assembly contaning one component.
460       if ( XCAFDoc_ShapeTool::IsComponent ( L ) )
461       {
462         TopoDS_Compound aComp;
463         BRep_Builder aB;
464         aB.MakeCompound(aComp);
465         aB.Add(aComp, shape);
466         shape = aComp; 
467         comp.Append(L);
468         TDF_Label ref;
469         if ( XCAFDoc_ShapeTool::GetReferredShape ( L, ref ) )
470         {
471           if(XCAFDoc_ShapeTool::IsAssembly ( ref))
472             XCAFDoc_ShapeTool::GetComponents ( ref, comp, Standard_True );
473         }
474         L = L.Father();
475       }
476       else
477       {
478         // fill sequence of (sub) shapes for which attributes should be written
479         // and set actor to handle assemblies in a proper way
480         if(XCAFDoc_ShapeTool::IsAssembly ( L ))
481           XCAFDoc_ShapeTool::GetComponents ( L, comp, Standard_True );
482       }
483       
484       for ( Standard_Integer k=1; k <= comp.Length(); k++ ) {
485         TDF_Label ref;
486         if ( ! XCAFDoc_ShapeTool::GetReferredShape ( comp(k), ref ) ) continue;
487         if ( ! myLabels.IsBound ( ref ) ) {
488           TopoDS_Shape refS = XCAFDoc_ShapeTool::GetShape ( ref );
489           myLabels.Bind ( ref, refS );
490           sublabels.Append ( ref );
491           if ( XCAFDoc_ShapeTool::IsAssembly ( ref ) )
492             Actor->RegisterAssembly ( refS );
493         }
494       }
495       myLabels.Bind ( L, shape );
496       sublabels.Append ( L );
497       if ( XCAFDoc_ShapeTool::IsAssembly ( L ) )
498         Actor->RegisterAssembly ( shape );
499
500       writer.Transfer(shape,mode,Standard_False);
501       Actor->SetStdMode ( Standard_True ); // restore default behaviour
502     }
503     else {
504       // translate final solids
505       TopoDS_Shape Sass = TransferExternFiles ( L, mode, sublabels, multi );
506
507       // translate main assembly structure
508 /*
509       if ( ap == 3 ) { // if AP203, switch to AP214
510         Interface_Static::SetCVal ("write.step.schema", "AP214DIS");
511         Handle(StepData_StepModel) model = 
512           Handle(StepData_StepModel)::DownCast ( writer.WS()->Model() );
513         if ( model->HasHeaderEntity(STANDARD_TYPE(HeaderSection_FileSchema)) ) {
514           Handle(HeaderSection_FileSchema) fs = 
515             Handle(HeaderSection_FileSchema)::DownCast ( model->HeaderEntity(STANDARD_TYPE(HeaderSection_FileSchema)) );
516           Handle(TCollection_HAsciiString) str = fs->SchemaIdentifiersValue ( 1 );
517           Handle(TCollection_HAsciiString) ap214 = new TCollection_HAsciiString ( "AUTOMOTIVE_DESIGN" );
518           if ( str->Search ( ap214 ) <0 ) {
519             str->Clear();
520             str->AssignCat ( ap214 );
521           }
522         }
523       }
524 */      
525       Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly");
526       Interface_Static::SetCVal ("write.step.assembly", "On");
527       writer.Transfer ( Sass, STEPControl_AsIs );
528       Interface_Static::SetIVal ("write.step.assembly", assemblymode);
529       Interface_Static::SetIVal ("write.step.schema", ap);
530     }
531   }
532
533   writer.WS()->ComputeGraph(Standard_True );// added by skl 03.11.2003 since we use
534                                             // writer.Transfer() wihtout compute graph
535
536   // write names
537   if ( GetNameMode() )
538     WriteNames ( writer.WS(), sublabels );
539
540   if ( !multi ) {
541     // write colors
542     if ( GetColorMode() )
543       WriteColors ( writer.WS(), sublabels );
544     
545     // write layers
546     if ( GetLayerMode() )
547       WriteLayers ( writer.WS(), sublabels );
548
549     // write SHUO entities
550     if ( GetSHUOMode() && !isExternFile ) 
551       // do not store SHUO for extern reference for the moment
552       WriteSHUOs (  writer.WS(), sublabels );
553     
554     // write G&DTs
555     if(GetDimTolMode())
556       WriteDGTs(writer.WS(),sublabels);
557
558     // write Materials
559     if(GetMaterialMode())
560       WriteMaterials(writer.WS(),sublabels);
561
562     // register all MDGPRs in model
563     MoniTool_DataMapIteratorOfDataMapOfShapeTransient anItr(myMapCompMDGPR);
564     for (; anItr.More(); anItr.Next()) {
565       Handle(Interface_InterfaceModel) Model = writer.WS()->Model();
566       Model->AddWithRefs( anItr.Value() );
567     }
568   }
569   
570   if ( multi ) { // external refs
571     WriteExternRefs ( writer.WS(), sublabels );
572   }
573
574   // write validation props
575 //  if ( multi && ap ==3 ) {
576 //      Interface_Static::SetCVal ("write.step.schema", "AP214DIS");
577 //  }
578   if ( GetPropsMode() ) 
579     WriteValProps ( writer.WS(), sublabels, multi );
580
581   Interface_Static::SetIVal ("write.step.schema", ap);
582
583   // refresh graph
584   writer.WS()->ComputeGraph ( Standard_True );
585
586   /* ================================
587     *  Write names for the sub-shapes
588     * ================================ */
589
590   if ( Interface_Static::IVal("write.stepcaf.subshapes.name") )
591   {
592     Handle(XSControl_TransferWriter) TW = this->ChangeWriter().WS()->TransferWriter();
593     Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
594
595     for ( int i = 1; i <= labels.Length(); i++ )
596     {
597       TDF_Label L = labels.Value(i);
598
599       for ( TDF_ChildIterator it(L, Standard_True); it.More(); it.Next() )
600       {
601         TDF_Label SubL = it.Value();
602
603         // Access name recorded in OCAF TDataStd_Name attribute
604         Handle(TCollection_HAsciiString) hSubName = new TCollection_HAsciiString;
605         if ( !GetLabelName(SubL, hSubName) )
606           continue;
607
608         // Access topological data
609         TopoDS_Shape SubS = XCAFDoc_ShapeTool::GetShape(SubL);
610         if ( SubS.IsNull() )
611           continue;
612
613         // Access the correspondent STEP Representation Item
614         Handle(StepRepr_RepresentationItem) RI;
615         Handle(TransferBRep_ShapeMapper) aShMapper = TransferBRep::ShapeMapper(FP, SubS);
616         if ( !FP->FindTypedTransient(aShMapper, STANDARD_TYPE(StepRepr_RepresentationItem), RI) )
617           continue;
618
619         // Record the name
620         RI->SetName(hSubName);
621       }
622     }
623   }
624
625   return Standard_True;
626 }
627
628
629 //=======================================================================
630 //function : TransferExternFiles
631 //purpose  :
632 //=======================================================================
633
634 TopoDS_Shape STEPCAFControl_Writer::TransferExternFiles (const TDF_Label &L,
635                                                          const STEPControl_StepModelType mode,
636                                                          TDF_LabelSequence &labels,
637                                                          const Standard_CString prefix)
638 {
639   // if label already translated, just return the shape
640   if ( myLabels.IsBound ( L ) ) {
641     return myLabels.Find ( L );
642   }
643
644   TopoDS_Compound C;
645   BRep_Builder B;
646   B.MakeCompound ( C );
647   //labels.Append ( L ); 
648   // if not assembly, write to separate file
649   if ( ! XCAFDoc_ShapeTool::IsAssembly ( L ) && !XCAFDoc_ShapeTool::IsComponent ( L )) {
650     labels.Append ( L );
651     // prepare for transfer
652     Handle(XSControl_WorkSession) newWS = new XSControl_WorkSession;
653     newWS->SelectNorm ( "STEP" );
654     STEPControl_Writer sw ( newWS, Standard_True );
655     TDF_LabelSequence Lseq;
656     Lseq.Append ( L );
657
658     // construct the name for extern file
659     Handle(TCollection_HAsciiString) basename = new TCollection_HAsciiString;
660     if ( prefix && prefix[0] ) basename->AssignCat ( prefix );
661     GetLabelName ( L, basename );
662     Handle(TCollection_HAsciiString) name = new TCollection_HAsciiString ( basename );
663     name->AssignCat ( ".stp" );
664     if ( myFiles->HasItem ( name->ToCString() ) ) { // avoid confusions
665       for ( Standard_Integer k=1; k < 32000; k++ ) {
666         name = new TCollection_HAsciiString ( basename );
667         name->AssignCat ( "_" );
668         name->AssignCat ( TCollection_AsciiString ( k ).ToCString() );
669         name->AssignCat ( ".stp" );
670         if ( ! myFiles->HasItem ( name->ToCString() ) ) break;
671       }
672     }
673
674     // translate and record extern file
675     Handle(STEPCAFControl_ExternFile) EF = new STEPCAFControl_ExternFile;
676     EF->SetWS ( newWS );
677     EF->SetName ( name );
678     EF->SetLabel ( L );
679     Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly");
680     Interface_Static::SetCVal ("write.step.assembly", "Off");
681     const Standard_CString multi = 0;
682     EF->SetTransferStatus ( Transfer ( sw, Lseq, mode, multi, Standard_True ) );
683     Interface_Static::SetIVal ("write.step.assembly", assemblymode);
684     myLabEF.Bind ( L, EF );
685     myFiles->SetItem ( name->ToCString(), EF );
686
687     // return empty compound as replacement for the shape
688     myLabels.Bind ( L, C );
689     return C;
690   }
691   TDF_LabelSequence comp;
692   TDF_Label aCurL = L;
693   //if specified shape is component then high-level assembly is considered
694   //to get valid structure with location
695   if ( XCAFDoc_ShapeTool::IsComponent ( L ) )
696   {
697     comp.Append(L);
698     aCurL = L.Father();
699   }
700   // else iterate on components add create structure of empty compounds
701   // representing the assembly
702   else if (XCAFDoc_ShapeTool::IsAssembly ( L ))
703     XCAFDoc_ShapeTool::GetComponents ( L, comp, Standard_False );
704
705   labels.Append ( aCurL );
706   for ( Standard_Integer k=1; k <= comp.Length(); k++ ) {
707     TDF_Label lab = comp(k);
708     TDF_Label ref;
709     if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, ref ) ) continue;
710     TopoDS_Shape Scomp = TransferExternFiles ( ref, mode, labels, prefix );
711     Scomp.Location ( XCAFDoc_ShapeTool::GetLocation ( lab ) );
712     B.Add ( C, Scomp );
713   }
714   myLabels.Bind ( aCurL, C );
715   return C;
716 }
717
718
719 //=======================================================================
720 //function : WriteExternRefs
721 //purpose  :
722 //=======================================================================
723
724 Standard_Boolean STEPCAFControl_Writer::WriteExternRefs (const Handle(XSControl_WorkSession) &WS,
725                                                          const TDF_LabelSequence &labels) const
726 {
727   if ( labels.Length() <=0 ) return Standard_False;
728
729   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
730   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
731   STEPConstruct_ExternRefs EFTool ( WS );
732   Standard_Integer schema = Interface_Static::IVal("write.step.schema");
733   for ( Standard_Integer k=1; k <= labels.Length(); k++ ) {
734     TDF_Label lab = labels(k);
735     if ( XCAFDoc_ShapeTool::IsAssembly ( lab ) ) continue; // skip assemblies
736
737     // get extern file
738     Handle(STEPCAFControl_ExternFile) EF;
739     if ( ! ExternFile ( lab, EF ) ) continue; // should never be
740
741     // find SDR
742     if ( ! myLabels.IsBound ( lab ) ) continue; // not recorded as translated, skip
743     TopoDS_Shape S = myLabels.Find ( lab );
744
745     Handle(StepShape_ShapeDefinitionRepresentation) SDR;
746     Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
747     if ( ! FP->FindTypedTransient ( mapper, STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation), SDR ) ) {
748 #ifdef OCCT_DEBUG
749       cout << "Warning: Cannot find SDR for " << S.TShape()->DynamicType()->Name() << endl;
750 #endif
751       continue;
752     }
753
754     // add extern ref
755     const Standard_CString format = (const Standard_CString) ( schema == 3 ? "STEP AP203" : "STEP AP214" );
756     // try to get PD from SDR
757     StepRepr_RepresentedDefinition RD = SDR->Definition();
758     Handle(StepRepr_PropertyDefinition) aPropDef = RD.PropertyDefinition();
759     if (aPropDef.IsNull()) {
760 #ifdef OCCT_DEBUG
761       cout << "Warning: STEPCAFControl_Writer::WriteExternRefs StepRepr_PropertyDefinition is null for " << S.TShape()->DynamicType()->Name() << endl;
762 #endif
763       continue;
764     }
765     StepRepr_CharacterizedDefinition CharDef = aPropDef->Definition();
766     Handle(StepBasic_ProductDefinition) PD = CharDef.ProductDefinition();
767     if (PD.IsNull()) {
768 #ifdef OCCT_DEBUG
769       cout << "Warning: STEPCAFControl_Writer::WriteExternRefs StepBasic_ProductDefinition is null for " << S.TShape()->DynamicType()->Name() << endl;
770 #endif
771       continue;
772     }
773     EFTool.AddExternRef ( EF->GetName()->ToCString(), PD, format );
774   }
775   EFTool.WriteExternRefs(schema);
776   return Standard_True;
777 }
778
779
780 //=======================================================================
781 //function : FindEntities
782 //purpose  : auxilary
783 //=======================================================================
784 static Standard_Integer FindEntities (const Handle(Transfer_FinderProcess) &FP,
785                                       const TopoDS_Shape &S,
786                                       TopLoc_Location &L,
787                                       TColStd_SequenceOfTransient &seqRI)
788 {
789   Handle(StepRepr_RepresentationItem) item = STEPConstruct::FindEntity ( FP, S, L );
790
791   if ( ! item.IsNull() ) {
792     seqRI.Append ( item );
793     return 1;
794   }
795       
796   // may be S was splited during shape processing
797   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
798   Handle(Transfer_Binder) bnd = FP->Find ( mapper );
799   if ( bnd.IsNull() ) return 0;
800   
801   Handle(Transfer_TransientListBinder) TransientListBinder =
802     //Handle(Transfer_TransientListBinder)::DownCast( bnd->Next(Standard_True) );
803     Handle(Transfer_TransientListBinder)::DownCast( bnd );
804   Standard_Integer nres=0;
805   if ( TransientListBinder.IsNull() && S.ShapeType() == TopAbs_COMPOUND) 
806   {
807     for ( TopoDS_Iterator it(S); it.More(); it.Next() ) {
808       Handle(StepRepr_RepresentationItem) aLocalItem = STEPConstruct::FindEntity ( FP, it.Value(), L );
809       if (aLocalItem.IsNull() ) continue;
810       nres++;
811       seqRI.Append (aLocalItem);
812     }
813   }
814   else
815   {
816     const Standard_Integer nb = TransientListBinder->NbTransients();
817     for (Standard_Integer i=1; i<=nb; i++) {
818       Handle(Standard_Transient) t = TransientListBinder->Transient(i);
819       item = Handle(StepRepr_RepresentationItem)::DownCast(t);
820       if ( item.IsNull() ) continue;
821       nres++;
822       seqRI.Append ( item );
823     }
824   }
825 /*  works but is obsolete: another approach
826   if (i<=nb) {
827     TopoDS_Shape comp = TransferBRep::ShapeResult(bnd);
828     if ( ! comp.IsNull() && comp.ShapeType() < S.ShapeType() ) {
829       for ( TopoDS_Iterator it(comp); it.More(); it.Next() ) {
830         MakeSTEPStyles(Styles, it.Value(), settings, STEPstyle, 
831                        Map, ( hasOwn ? &style : 0 ) );
832       }
833     }
834   }
835 */
836   return nres;
837 }
838
839
840 //=======================================================================
841 //function : getStyledItem
842 //purpose  : auxilary
843 //=======================================================================
844 static Standard_Boolean getStyledItem(const TopoDS_Shape& S,
845                                       const Handle(XCAFDoc_ShapeTool)& STool,
846                                       const STEPConstruct_Styles &Styles, 
847                                       Handle(StepVisual_StyledItem) &resSelItem,
848                                       const MoniTool_DataMapOfShapeTransient& myMapCompMDGPR)
849 {
850   TDF_Label aTopShL = STool->FindShape(S, Standard_False);
851   TopoDS_Shape aTopLevSh = STool->GetShape( aTopShL );
852   Standard_Boolean found = Standard_False;
853   if ( !aTopLevSh.IsNull() &&  myMapCompMDGPR.IsBound( aTopLevSh ) ) {
854     Handle(StepVisual_PresentationRepresentation) aMDGPR = 
855       Handle(StepVisual_PresentationRepresentation)::DownCast( myMapCompMDGPR.Find( aTopLevSh ) );
856     Handle(StepRepr_HArray1OfRepresentationItem) anSelItmHArr = aMDGPR->Items();
857     // search for PSA of Monifold solid
858     if ( !anSelItmHArr.IsNull() )
859     {
860       for (Standard_Integer si = 1; si <= anSelItmHArr->Length(); si++) {
861         Handle(StepVisual_StyledItem) aSelItm =
862           Handle(StepVisual_StyledItem)::DownCast(anSelItmHArr->Value(si));
863
864         if ( aSelItm.IsNull() ) 
865           continue;
866
867         // check that it is a stiled item for monifold solid brep
868         TopLoc_Location Loc;
869         TColStd_SequenceOfTransient aNewseqRI;
870         FindEntities ( Styles.FinderProcess(), aTopLevSh, Loc, aNewseqRI );
871         if ( aNewseqRI.Length() > 0 )
872         {
873           
874           Handle(StepRepr_RepresentationItem) anItem = aSelItm->Item();
875           Standard_Boolean isSameMonSolBR = Standard_False;
876           for (Standard_Integer mi = 1; mi <= aNewseqRI.Length(); mi++) {
877             if ( !anItem.IsNull() && anItem == aNewseqRI.Value( mi ) ) {
878               isSameMonSolBR = Standard_True;
879               break;
880             }
881           }
882           if (!isSameMonSolBR)
883             continue;
884         }
885         
886         
887         for (Standard_Integer jsi = 1; jsi <= aSelItm->NbStyles() && !found; jsi++) {
888           Handle(StepVisual_PresentationStyleAssignment) aFatherPSA =
889             Handle(StepVisual_PresentationStyleAssignment)::DownCast(aSelItm->StylesValue(jsi));
890           // check for PSA for top-level (not Presentation style by contex for NAUO)
891           if (aFatherPSA.IsNull() || aFatherPSA->IsKind(STANDARD_TYPE(StepVisual_PresentationStyleByContext)))
892             continue;
893           resSelItem = aSelItm;
894           found = Standard_True;
895         }
896       }
897     }
898   }
899   return found;
900 }
901
902
903 //=======================================================================
904 //function : setDefaultInstanceColor
905 //purpose  : auxilary
906 //=======================================================================
907 static Standard_Boolean setDefaultInstanceColor (const Handle(StepVisual_StyledItem) &aSelItm,
908                                                  Handle(StepVisual_PresentationStyleAssignment)& PSA)
909 {
910    Standard_Boolean found = Standard_False;
911   for (Standard_Integer jsi = 1; jsi <= aSelItm->NbStyles() && !found; jsi++) {
912     Handle(StepVisual_PresentationStyleAssignment) aFatherPSA =
913     Handle(StepVisual_PresentationStyleAssignment)::DownCast(aSelItm->StylesValue(jsi));
914   // check for PSA for top-level (not Presentation style by contex for NAUO)
915   if (aFatherPSA.IsNull() || aFatherPSA->IsKind(STANDARD_TYPE(StepVisual_PresentationStyleByContext))) 
916     return Standard_False;
917           
918   // get style select from father PSA
919   if (aFatherPSA->NbStyles() > 0) {
920     Handle(StepVisual_HArray1OfPresentationStyleSelect) aFatherStyles =
921       new StepVisual_HArray1OfPresentationStyleSelect(1, aFatherPSA->NbStyles());
922     for (Standard_Integer k = 1; k <= aFatherPSA->NbStyles(); k++) {
923       StepVisual_PresentationStyleSelect PSS;
924       StepVisual_PresentationStyleSelect olDPSS = aFatherPSA->StylesValue(k);
925       if (!olDPSS.PointStyle().IsNull())
926         PSS.SetValue (olDPSS.PointStyle());
927       else if (!olDPSS.CurveStyle().IsNull())
928         PSS.SetValue (olDPSS.CurveStyle());
929       else if (!olDPSS.SurfaceStyleUsage().IsNull())
930         PSS.SetValue (olDPSS.SurfaceStyleUsage());
931       else {
932         found = Standard_False;
933         break;
934       }
935       //aFatherStyles->SetValue( k, PSS );
936       aFatherStyles->SetValue( k, olDPSS );
937       found = Standard_True;
938     }
939             // init PSA of NAUO
940     if (found) {
941       PSA->Init( aFatherStyles );
942     }
943   }
944     
945   }
946   return found;
947 }
948
949
950 //=======================================================================
951 //function : MakeSTEPStyles
952 //purpose  : auxilary
953 //=======================================================================
954 static void MakeSTEPStyles (STEPConstruct_Styles &Styles,
955                             const TopoDS_Shape &S,
956                             const XCAFPrs_DataMapOfShapeStyle &settings,
957                             Handle(StepVisual_StyledItem) &override,
958                             TopTools_MapOfShape &Map,
959                             const MoniTool_DataMapOfShapeTransient& myMapCompMDGPR,
960                             STEPConstruct_DataMapOfAsciiStringTransient &DPDCs,
961                             STEPConstruct_DataMapOfPointTransient &ColRGBs,
962                             const Handle(XCAFDoc_ColorTool)& CTool,
963                             const XCAFPrs_Style *inherit = 0,
964                             const Standard_Boolean isComponent = Standard_False)
965 {
966   // skip already processed shapes
967   if ( ! Map.Add ( S ) ) return;
968
969   // check if shape has its own style (r inherits from ancestor)
970   XCAFPrs_Style style;
971   if ( inherit ) style = *inherit;
972   if ( settings.IsBound(S) ) {
973     XCAFPrs_Style own = settings.Find(S);
974     if ( !own.IsVisible() ) style.SetVisibility ( Standard_False );
975     if ( own.IsSetColorCurv() ) style.SetColorCurv ( own.GetColorCurv() );
976     if ( own.IsSetColorSurf() ) style.SetColorSurf ( own.GetColorSurf() );
977   }
978
979   // translate colors to STEP
980   Handle(StepVisual_Colour) surfColor, curvColor;
981   if ( style.IsSetColorSurf() )
982     surfColor = Styles.EncodeColor(style.GetColorSurf(),DPDCs,ColRGBs);
983   if ( style.IsSetColorCurv() )
984     curvColor = Styles.EncodeColor(style.GetColorCurv(),DPDCs,ColRGBs);
985   
986   Standard_Boolean hasOwn = ( ! surfColor.IsNull() || 
987                               ! curvColor.IsNull() ||
988                               ! style.IsVisible() );
989
990   // find target item and assign style to it
991   Handle(StepVisual_StyledItem) STEPstyle = override;
992   if ( hasOwn ) {
993     if ( S.ShapeType() != TopAbs_COMPOUND || isComponent ) { // skip compounds, let subshapes inherit its colors
994       TopLoc_Location L;
995       TColStd_SequenceOfTransient seqRI;
996       Standard_Integer nb = FindEntities ( Styles.FinderProcess(), S, L, seqRI );
997 #ifdef OCCT_DEBUG
998       if ( nb <=0 ) cout << "Warning: Cannot find RI for " << S.TShape()->DynamicType()->Name() << endl;
999 #endif
1000       //Get overridden style gka 10.06.03
1001       if ( isComponent && nb) 
1002         getStyledItem(S, CTool->ShapeTool(), Styles, override,myMapCompMDGPR);
1003        
1004            
1005       for ( Standard_Integer i=1; i <= nb; i++ ) {
1006         Handle(StepRepr_RepresentationItem) item = 
1007           Handle(StepRepr_RepresentationItem)::DownCast(seqRI(i));
1008         Handle(StepVisual_PresentationStyleAssignment) PSA;
1009         if ( style.IsVisible() || !surfColor.IsNull() || !curvColor.IsNull() ) {
1010           PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent );
1011         }
1012         else {
1013           // default white color
1014           surfColor = Styles.EncodeColor(Quantity_Color(1,1,1,Quantity_TOC_RGB),DPDCs,ColRGBs);
1015           PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent );
1016           if ( isComponent ) 
1017             setDefaultInstanceColor( override, PSA);
1018           
1019         } // end of component case
1020         
1021         STEPstyle = Styles.AddStyle ( item, PSA, override );
1022         hasOwn = Standard_False;
1023       }
1024     }
1025   }
1026
1027   // iterate on subshapes (except vertices :)
1028   if ( S.ShapeType() == TopAbs_EDGE ) return;
1029   if ( !isComponent ) // PTV 10.02.2003
1030     for ( TopoDS_Iterator it(S); it.More(); it.Next() ) {
1031       MakeSTEPStyles ( Styles, it.Value(), settings, STEPstyle,
1032                       Map, myMapCompMDGPR, DPDCs, ColRGBs, CTool,
1033                       ( hasOwn ? &style : 0 ) );
1034     }
1035 }
1036
1037 /*
1038 static Standard_Boolean getFatherColor (const TDF_Label& L,
1039                                         const Handle(XCAFDoc_ColorTool)& CTool,
1040                                         XCAFPrs_Style& style)
1041 {
1042   Standard_Boolean done = Standard_False;
1043   TopoDS_Shape aSh = CTool->ShapeTool()->GetShape( L );
1044   TDF_Label aFL = CTool->ShapeTool()->FindShape( aSh );
1045   if (aFL.IsNull() || aFL == L)
1046     return done;
1047   Quantity_Color C;
1048   if ( CTool->GetColor ( aFL, XCAFDoc_ColorGen, C ) ) {
1049     style.SetColorCurv ( C );
1050     style.SetColorSurf ( C );
1051     done = Standard_True;
1052   }
1053   if ( CTool->GetColor ( aFL, XCAFDoc_ColorSurf, C ) ) {
1054     style.SetColorSurf ( C );
1055     done = Standard_True;
1056   }
1057   if ( CTool->GetColor ( aFL, XCAFDoc_ColorCurv, C ) ) {
1058     style.SetColorCurv ( C );
1059     done = Standard_True;
1060   }
1061   
1062   return done;
1063 }
1064 */
1065
1066
1067 //=======================================================================
1068 //function : WriteColors
1069 //purpose  : 
1070 //=======================================================================
1071
1072 Standard_Boolean STEPCAFControl_Writer::WriteColors (const Handle(XSControl_WorkSession) &WS,
1073                                                      const TDF_LabelSequence &labels)
1074 {
1075   if ( labels.Length() <=0 ) return Standard_False;
1076
1077   // Iterate on shapes in the document
1078   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( labels(1) );
1079   if ( CTool.IsNull() ) return Standard_False;
1080
1081   STEPConstruct_Styles Styles ( WS );
1082   STEPConstruct_DataMapOfAsciiStringTransient DPDCs;
1083   STEPConstruct_DataMapOfPointTransient ColRGBs;
1084   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1085     TDF_Label L = labels.Value(i);
1086
1087     Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool( labels(1) );
1088     // Skip assemblies: colors assigned to assemblies and their instances
1089     // are not supported (it is not clear how to encode that in STEP)
1090     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1091 #ifdef OCCT_DEBUG
1092       cout << "Warning: Cannot write color  for Assembly" << endl;
1093       cout << "Info: Check for colors assigned to components in assembly" << endl;
1094 #endif
1095       // PTV 22.01.2003 Write color for instances.
1096       TDF_LabelSequence compLabels;
1097       if ( aSTool.IsNull() )
1098         continue;
1099       if (!aSTool->GetComponents(L, compLabels))
1100         continue;
1101       WriteColors(WS, compLabels);
1102       continue;
1103     }
1104     Styles.ClearStyles();
1105
1106     // get a target shape and try to find corresponding context
1107     // (all the colors set under that label will be put into that context)
1108     TopoDS_Shape S;
1109     if ( ! XCAFDoc_ShapeTool::GetShape ( L, S ) ) continue;
1110     Standard_Boolean isComponent = aSTool->IsComponent( L );
1111     TopoDS_Shape aTopSh = S;
1112     Handle(StepRepr_RepresentationContext) Context = Styles.FindContext ( S );
1113     if ( isComponent ) {
1114       TDF_Label aTopShL = aSTool->FindShape(S, Standard_False);
1115       if (aTopShL.IsNull())
1116         continue;
1117       aTopSh = aSTool->GetShape( aTopShL );
1118       Context = Styles.FindContext ( aTopSh );
1119     }
1120     if ( Context.IsNull() )
1121         continue;
1122     
1123     // collect settings set on that label
1124     XCAFPrs_DataMapOfShapeStyle settings;
1125     TDF_LabelSequence seq;
1126     seq.Append ( L );
1127     XCAFDoc_ShapeTool::GetSubShapes ( L, seq );
1128     Standard_Boolean isVisible = Standard_True;
1129     for ( Standard_Integer j = 1; j <= seq.Length(); j++ ) {
1130       TDF_Label lab = seq.Value(j);
1131       XCAFPrs_Style style;
1132       Quantity_Color C;
1133       if ( lab == L ) {
1134         // check for invisible status of object on label
1135         if ( !CTool->IsVisible( lab ) ) {
1136           isVisible = Standard_False;
1137           style.SetVisibility( Standard_False );
1138         }
1139       }
1140       if ( CTool->GetColor ( lab, XCAFDoc_ColorGen, C ) ) {
1141         style.SetColorCurv ( C );
1142         style.SetColorSurf ( C );
1143       }
1144       if ( CTool->GetColor ( lab, XCAFDoc_ColorSurf, C ) )
1145         style.SetColorSurf ( C );
1146       if ( CTool->GetColor ( lab, XCAFDoc_ColorCurv, C ) )
1147         style.SetColorCurv ( C );
1148       
1149       // commented, cause we are need to take reference from 
1150 //       if ( isComponent && lab == L && !isVisible)
1151 //         if ( !style.IsSetColorSurf() && !style.IsSetColorCurv() ) {
1152 //           getFatherColor ( L, CTool, style);
1153 //         }
1154       if ( ! style.IsSetColorCurv() && ! style.IsSetColorSurf() && isVisible ) continue;
1155
1156       TopoDS_Shape sub = XCAFDoc_ShapeTool::GetShape ( lab );
1157       settings.Bind ( sub, style );
1158     }
1159     
1160     if ( settings.Extent() <=0 ) continue;
1161
1162     // iterate on subshapes and create STEP styles
1163     Handle(StepVisual_StyledItem) override;
1164     TopTools_MapOfShape Map;
1165     
1166     MakeSTEPStyles(Styles,S,settings,override,Map,myMapCompMDGPR,DPDCs,ColRGBs,CTool,0,isComponent);
1167     
1168     // create MDGPR and record it in model
1169     Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation) aMDGPR;
1170
1171     if (!isComponent) {
1172       if ( myMapCompMDGPR.IsBound( aTopSh )) {
1173 #ifdef OCCT_DEBUG
1174         cerr << "Error: Current Top-Level shape have MDGPR already " << endl;
1175 #endif
1176       }
1177       Styles.CreateMDGPR ( Context, aMDGPR );
1178       if (!aMDGPR.IsNull())
1179         myMapCompMDGPR.Bind( aTopSh, aMDGPR );
1180     }
1181     else {
1182       // create SDR and add to model.
1183       Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
1184       Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
1185       Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
1186       Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1187       if ( FP->FindTypedTransient(mapper, 
1188                                   STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation),
1189                                   CDSR) ) {
1190         // create SDR for NAUO
1191         Handle(StepRepr_ProductDefinitionShape) nullPDS; // important to be NULL
1192         Styles.CreateNAUOSRD( Context, CDSR, nullPDS );
1193         
1194         // search for MDGPR of the component top-level shape
1195         if ( myMapCompMDGPR.IsBound( aTopSh )) {
1196           aMDGPR = Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation)::DownCast( myMapCompMDGPR.Find( aTopSh ) );
1197         } else {
1198           aMDGPR = new StepVisual_MechanicalDesignGeometricPresentationRepresentation;
1199           Handle(TCollection_HAsciiString) ReprName = new TCollection_HAsciiString ( "" );
1200           aMDGPR->SetName( ReprName );
1201           aMDGPR->SetContextOfItems( Context );
1202           myMapCompMDGPR.Bind ( aTopSh, aMDGPR );
1203         }
1204         Handle(StepRepr_HArray1OfRepresentationItem) oldItems = aMDGPR->Items();
1205         Standard_Integer oldLengthlen = 0;
1206         if (!oldItems.IsNull())
1207           oldLengthlen = oldItems->Length();
1208         const Standard_Integer nbIt = oldLengthlen + Styles.NbStyles();
1209         if(!nbIt)
1210           continue;
1211         Handle(StepRepr_HArray1OfRepresentationItem) newItems =
1212           new StepRepr_HArray1OfRepresentationItem(1, nbIt);
1213         Standard_Integer si;
1214         Standard_Integer el = 1;
1215         for ( si=1; si <= oldLengthlen; si++ )
1216           newItems->SetValue( el++, oldItems->Value( si ) );
1217         for ( si=1; si <= Styles.NbStyles(); si++ ) {
1218           newItems->SetValue( el++, Handle(StepRepr_RepresentationItem)::DownCast(Styles.Style(si)));
1219 //           WP->Model()->AddWithRefs ( Handle(StepRepr_RepresentationItem)::DownCast (Styles.Style(si)));
1220         }
1221        
1222         if (newItems->Length() > 0)
1223           aMDGPR->SetItems( newItems );
1224       } //end of work with CDSR
1225     }
1226     if ( !isVisible ) {
1227     // create invisibility item and refer for stiledItem
1228       Handle(StepVisual_Invisibility) Invsblt = new StepVisual_Invisibility();
1229       Handle(StepVisual_HArray1OfInvisibleItem) HInvsblItm = 
1230         new StepVisual_HArray1OfInvisibleItem (1,Styles.NbStyles());
1231       // put all style item into the harray
1232       for ( Standard_Integer si=1; si <= Styles.NbStyles(); si++ ) {
1233         Handle(StepRepr_RepresentationItem) styledItm =
1234           Handle(StepRepr_RepresentationItem)::DownCast(Styles.Style(si));
1235         StepVisual_InvisibleItem anInvItem;
1236         anInvItem.SetValue( styledItm );
1237         HInvsblItm->SetValue( si, anInvItem );
1238       }
1239       // set the invisibility of items
1240       Invsblt->Init( HInvsblItm );
1241       WS->Model()->AddWithRefs( Invsblt );
1242     }
1243   }
1244
1245   return Standard_True;
1246 }
1247
1248
1249 //=======================================================================
1250 //function : WriteNames
1251 //purpose  :
1252 //=======================================================================
1253
1254 Standard_Boolean STEPCAFControl_Writer::WriteNames (const Handle(XSControl_WorkSession) &WS,
1255                                                     const TDF_LabelSequence &labels) const
1256 {
1257   if ( labels.Length() <=0 ) return Standard_False;
1258
1259   // get working data
1260   Handle(Interface_InterfaceModel) Model = WS->Model();
1261   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
1262   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
1263 //  Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( labels(1) );
1264 //  if ( STool.IsNull() ) return Standard_False;
1265
1266   // Iterate on requested shapes
1267   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1268     TDF_Label L = labels.Value(i);
1269
1270     // get name
1271     Handle(TCollection_HAsciiString) hName = new TCollection_HAsciiString;
1272     if ( ! GetLabelName (L, hName) ) continue;
1273 //    Handle(TDataStd_Name) N;
1274 //    if ( ! L.FindAttribute ( TDataStd_Name::GetID(), N ) ) continue;
1275 //    TCollection_ExtendedString name = N->Get();
1276 //    if ( name.Length() <=0 ) continue;
1277
1278     // find target STEP entity for the current shape
1279 //    TopoDS_Shape S;
1280 //    if ( ! XCAFDoc_ShapeTool::GetShape ( L, S ) ) continue;
1281     if ( ! myLabels.IsBound ( L ) ) continue; // not recorded as translated, skip
1282     TopoDS_Shape S = myLabels.Find ( L );
1283
1284     Handle(StepShape_ShapeDefinitionRepresentation) SDR;
1285     Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
1286     if ( ! FP->FindTypedTransient ( mapper, STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation), SDR ) ) {
1287 #ifdef OCCT_DEBUG
1288       cout << "Warning: Cannot find SDR for " << S.TShape()->DynamicType()->Name() << endl;
1289 #endif
1290       continue;
1291     }
1292
1293     // set the name to the PRODUCT
1294     Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition();
1295     if ( PropD.IsNull() ) continue;
1296     Handle(StepBasic_ProductDefinition) PD = PropD->Definition().ProductDefinition();
1297     if ( PD.IsNull() ) continue;
1298     Handle(StepBasic_Product) Prod = PD->Formation()->OfProduct();
1299
1300     Prod->SetId ( hName );
1301     Prod->SetName ( hName );
1302
1303     // write names for components of assemblies
1304     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1305       TDF_LabelSequence seq;
1306       XCAFDoc_ShapeTool::GetComponents ( L, seq );
1307       for (Standard_Integer k=1; k <= seq.Length(); k++) {
1308         TDF_Label lab = seq(k);
1309
1310         // get shape with correct location
1311         TDF_Label Lref;
1312         if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, Lref ) || 
1313              ! myLabels.IsBound ( Lref ) ) continue;
1314         S = myLabels.Find ( Lref );
1315         S.Move ( XCAFDoc_ShapeTool::GetLocation ( lab ) );
1316         
1317         hName = new TCollection_HAsciiString;
1318         if ( ! GetLabelName (lab, hName) ) continue;
1319         
1320         // find the target CDSR corresponding to a shape
1321         mapper = TransferBRep::ShapeMapper ( FP, S );
1322         Handle(Transfer_Binder) binder = FP->Find ( mapper );
1323         Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1324         if ( ! FP->FindTypedTransient (mapper,STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation), CDSR) ) 
1325           continue;
1326         Handle(StepRepr_ProductDefinitionShape) PDS = CDSR->RepresentedProductRelation();
1327         Handle(StepBasic_ProductDefinitionRelationship) NAUO = PDS->Definition().ProductDefinitionRelationship();
1328         if ( ! NAUO.IsNull() ) NAUO->SetName ( hName );
1329       }
1330     }
1331   }
1332
1333   return Standard_True;
1334 }
1335
1336
1337 //=======================================================================
1338 //function : WritePropsForLabel
1339 //purpose  :
1340 //=======================================================================
1341 static Standard_Boolean WritePropsForLabel(const Handle(XSControl_WorkSession) &WS,
1342                                            const Handle(XCAFDoc_ShapeTool) &aSTool,
1343                                            const STEPCAFControl_DataMapOfLabelShape &myLabels,
1344                                            const TDF_Label &L,
1345                                            const Standard_CString multi)
1346 {
1347   if(L.IsNull()) return Standard_False;
1348
1349   STEPConstruct_ValidationProps Props ( WS );
1350
1351   TopoDS_Shape S = aSTool->GetShape(L);
1352   if(S.IsNull()) return Standard_False;
1353
1354   if ( ! multi || XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1355     // write area
1356     Handle(XCAFDoc_Area) A;
1357     L.FindAttribute ( XCAFDoc_Area::GetID(), A );
1358     if ( ! A.IsNull() ) {
1359       Props.AddArea ( S, A->Get() );
1360     }
1361     // write volume
1362     Handle(XCAFDoc_Volume) V;
1363     L.FindAttribute ( XCAFDoc_Volume::GetID(), V );
1364     if ( ! V.IsNull() ) {
1365       Props.AddVolume ( S, V->Get() );
1366     }
1367   }
1368   // write centroid
1369   Handle(XCAFDoc_Centroid) C;
1370   L.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1371   if ( ! C.IsNull() ) {
1372     Props.AddCentroid ( S, C->Get() );
1373   }
1374
1375   if( XCAFDoc_ShapeTool::IsCompound(L) || XCAFDoc_ShapeTool::IsAssembly(L) ) {
1376     if(L.HasChild()) {
1377       for(Standard_Integer ich=1; ich<=L.NbChildren(); ich++) {
1378         WritePropsForLabel(WS,aSTool,myLabels,L.FindChild(ich),multi);
1379       }
1380     }
1381   }
1382
1383   return Standard_True;
1384 }
1385
1386
1387 //=======================================================================
1388 //function : WriteValProps
1389 //purpose  :
1390 //=======================================================================
1391
1392 Standard_Boolean STEPCAFControl_Writer::WriteValProps (const Handle(XSControl_WorkSession) &WS,
1393                                                        const TDF_LabelSequence &labels,
1394                                                        const Standard_CString multi) const
1395 {
1396   if ( labels.Length() <=0 ) return Standard_False;
1397
1398   // get working data
1399 //  STEPConstruct_ValidationProps Props ( WS );
1400   Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool( labels(1) );
1401
1402   // Iterate on requested shapes
1403   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1404     TDF_Label L = labels.Value(i);
1405
1406     WritePropsForLabel(WS,aSTool,myLabels,L,multi);
1407 /*    
1408     // find target STEP entity for the current shape
1409     if ( ! myLabels.IsBound ( L ) ) continue; // not recorded as translated, skip
1410     TopoDS_Shape S = myLabels.Find ( L );
1411
1412     // write area and volume (except for components in multifile mode)
1413     if ( ! multi || XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1414       Handle(XCAFDoc_Area) A;
1415       L.FindAttribute ( XCAFDoc_Area::GetID(), A );
1416       if ( ! A.IsNull() ) Props.AddArea ( S, A->Get() );
1417
1418       Handle(XCAFDoc_Volume) V;
1419       L.FindAttribute ( XCAFDoc_Volume::GetID(), V );
1420       if ( ! V.IsNull() ) Props.AddVolume ( S, V->Get() );
1421     }
1422
1423     // write centroid
1424     Handle(XCAFDoc_Centroid) C;
1425     L.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1426     if ( ! C.IsNull() ) Props.AddCentroid ( S, C->Get() );
1427
1428     // write centroid for components of assemblies
1429     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1430       TDF_LabelSequence seq;
1431       XCAFDoc_ShapeTool::GetComponents ( L, seq );
1432       for (Standard_Integer k=1; k <= seq.Length(); k++) {
1433         TDF_Label lab = seq(k);
1434
1435         // get shape with correct location
1436         TDF_Label Lref;
1437         if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, Lref ) || 
1438              ! myLabels.IsBound ( Lref ) ) continue;
1439         TopLoc_Location Loc = XCAFDoc_ShapeTool::GetLocation ( lab );
1440         S = myLabels.Find ( Lref );
1441         S.Move ( Loc );
1442                 
1443         C.Nullify();
1444         lab.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1445         // if centroid is not assigned to an instance, 
1446         // use (shifted) centroid of original shape
1447         gp_Pnt center;
1448         if ( C.IsNull() ) {
1449           Lref.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1450           if ( C.IsNull() ) continue;
1451           center = C->Get().Transformed ( Loc.Transformation() );
1452         }
1453         else center = C->Get();
1454
1455         Props.AddCentroid ( S, center, Standard_True );
1456       }
1457     }
1458 */
1459   }
1460
1461   return Standard_True;
1462 }
1463
1464
1465 //=======================================================================
1466 //function : WriteLayers
1467 //purpose  : 
1468 //=======================================================================
1469
1470 Standard_Boolean STEPCAFControl_Writer::WriteLayers (const Handle(XSControl_WorkSession) &WS,
1471                                                      const TDF_LabelSequence  &labels ) const
1472 {
1473   
1474   if ( labels.Length() <=0 ) return Standard_False;
1475
1476   // get working data
1477   Handle(Interface_InterfaceModel) Model = WS->Model();
1478   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
1479   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
1480   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool( labels(1) );
1481   if (LTool.IsNull() ) return Standard_False;
1482
1483   TDF_LabelSequence LayerLS;
1484   LTool->GetLayerLabels(LayerLS);
1485   if ( LayerLS.Length() <=0 ) return Standard_False;
1486
1487   // Iterate on requested layers and for each layer take set of shapes.
1488   for ( Standard_Integer i=1; i <= LayerLS.Length(); i++ ) {
1489     TDF_Label L = LayerLS.Value(i);
1490     
1491     // get labels of shapes in that layer
1492     TDF_LabelSequence ShapeLs;
1493     LTool->GetShapesOfLayer(L, ShapeLs);
1494     if ( ShapeLs.Length() <=0 ) continue;
1495     
1496     // name of layer: if not set, is considered as being empty
1497     Handle(TCollection_HAsciiString) hName = new TCollection_HAsciiString;
1498     GetLabelName ( L, hName );
1499
1500     // Find target STEP entity for each shape and add to StepVisual_PresentationLayerAssignment items.
1501     TColStd_SequenceOfTransient seqRI;
1502     for ( Standard_Integer j=1; j <= ShapeLs.Length(); j++) {
1503       TDF_Label shLabel = ShapeLs.Value(j);
1504       if ( shLabel.IsNull() ) continue;
1505       
1506       // there is no way to assign layer to instance in STEP
1507       if ( XCAFDoc_ShapeTool::IsAssembly ( shLabel ) ||
1508            XCAFDoc_ShapeTool::IsReference ( shLabel ) )
1509         continue;
1510       
1511       // check that the shape is one of (uub)labels written during current transfer
1512       Standard_Integer k = 1;
1513       for ( ; k <= labels.Length(); k++ )
1514         if ( shLabel.IsDescendant ( labels(k) ) ) break;
1515       if ( k > labels.Length() ) continue;
1516
1517       // get target STEP entity
1518       TopoDS_Shape oneShape = XCAFDoc_ShapeTool::GetShape(shLabel);
1519       
1520       TopLoc_Location Loc;
1521       Standard_Integer nb = 
1522         FindEntities ( FP, oneShape, Loc, seqRI );
1523       if ( nb <=0 ) 
1524         FP->Messenger() << "Warning: Cannot find RI for " << oneShape.TShape()->DynamicType()->Name() << endl;
1525     }
1526     if ( seqRI.Length() <= 0 ) continue;
1527
1528     // analyze visibility
1529     Handle(StepVisual_PresentationLayerAssignment) StepLayerAs = new StepVisual_PresentationLayerAssignment;
1530     Handle(TCollection_HAsciiString) descr;
1531     Handle(TDataStd_UAttribute) aUAttr;
1532     Standard_Boolean isLinv = Standard_False;
1533     if (L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) {
1534       descr = new TCollection_HAsciiString ("invisible");
1535 #ifdef OCCT_DEBUG
1536       FP->Messenger() << "\tLayer \"" << hName->String().ToCString() << "\" is invisible"<<endl;
1537 #endif
1538       isLinv = Standard_True;
1539     }
1540     else descr = new TCollection_HAsciiString ("visible");
1541     
1542     // create layer entity
1543     Handle(StepVisual_HArray1OfLayeredItem) HArrayOfLItem = 
1544       new StepVisual_HArray1OfLayeredItem ( 1, seqRI.Length() );
1545     for (Standard_Integer i1 = 1; i1<=seqRI.Length(); i1++) {
1546       StepVisual_LayeredItem LI;
1547       LI.SetValue ( seqRI.Value(i1) );
1548       HArrayOfLItem->SetValue( i1, LI );
1549     }
1550     StepLayerAs->Init(hName, descr, HArrayOfLItem);
1551     Model->AddWithRefs( StepLayerAs );
1552     // PTV 23.01.2003 add the invisibility AFTER adding layer into the model.
1553     // add the invisibility for the layer
1554     if (isLinv) {
1555       // Invisibility Item for containig invisible layers.
1556       Handle(StepVisual_HArray1OfInvisibleItem) HInvsblItm = new StepVisual_HArray1OfInvisibleItem (1,1);
1557       StepVisual_InvisibleItem InvIt;
1558       InvIt.SetValue( StepLayerAs );
1559       HInvsblItm->SetValue( 1, InvIt);
1560       
1561       Handle(StepVisual_Invisibility) Invsblt = new StepVisual_Invisibility();
1562       Invsblt->Init( HInvsblItm );
1563       Model->AddWithRefs( Invsblt );
1564     }
1565   }
1566   return Standard_True;
1567 }
1568
1569
1570 //=======================================================================
1571 //function : getSHUOstyle
1572 //purpose  : auxilary
1573 //=======================================================================
1574 static Standard_Boolean getSHUOstyle(const TDF_Label& aSHUOlab,
1575                                      const Handle(XCAFDoc_ColorTool)& CTool,
1576                                      XCAFPrs_Style& SHUOstyle)
1577 {
1578   Quantity_Color C;
1579   if (!CTool->IsVisible( aSHUOlab ) )
1580     SHUOstyle.SetVisibility(Standard_False);
1581   else {
1582     if ( CTool->GetColor ( aSHUOlab, XCAFDoc_ColorGen, C ) ) {
1583       SHUOstyle.SetColorCurv ( C );
1584       SHUOstyle.SetColorSurf ( C );
1585     }
1586     if ( CTool->GetColor ( aSHUOlab, XCAFDoc_ColorSurf, C ) )
1587       SHUOstyle.SetColorSurf ( C );
1588     if ( CTool->GetColor ( aSHUOlab, XCAFDoc_ColorCurv, C ) )
1589       SHUOstyle.SetColorCurv ( C );
1590   }
1591   if ( !SHUOstyle.IsSetColorCurv() && 
1592       !SHUOstyle.IsSetColorSurf() &&
1593       SHUOstyle.IsVisible() )
1594     return Standard_False;
1595   return Standard_True;
1596 }
1597
1598
1599 //=======================================================================
1600 //function : getProDefinitionOfNAUO
1601 //purpose  : auxilary
1602 //=======================================================================
1603 static Standard_Boolean getProDefinitionOfNAUO(const Handle(XSControl_WorkSession)& WS,
1604                                                const TopoDS_Shape& theShape,
1605                                                Handle(StepBasic_ProductDefinition)& PD,
1606                                                Handle(StepRepr_NextAssemblyUsageOccurrence)& NAUO,
1607                                                Standard_Boolean IsRelating)
1608 {
1609   if ( theShape.IsNull() )
1610     return Standard_False;
1611   // get CDSR
1612   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
1613   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
1614   Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1615   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, theShape );
1616   if (!FP->FindTypedTransient(mapper, 
1617                               STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation),
1618                               CDSR))
1619     return Standard_False;
1620   // get PDS of NAUO
1621   Handle(StepRepr_ProductDefinitionShape) PDS = CDSR->RepresentedProductRelation();
1622   if (PDS.IsNull())
1623     return Standard_False;
1624   // get the NAUO entity
1625   Interface_Graph aGraph = WS->HGraph()->Graph();
1626   Interface_EntityIterator subs = aGraph.Shareds(PDS);
1627   for ( subs.Start(); subs.More(); subs.Next() ) {
1628     if (!subs.Value()->IsKind(STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence)))
1629       continue;
1630     NAUO = Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(subs.Value());
1631     break;
1632   }
1633   if ( NAUO.IsNull() )
1634     return Standard_False;
1635   // get Relatinf or Related product definition
1636   if ( !IsRelating )
1637     PD = NAUO->RelatedProductDefinition();
1638   else
1639     PD = NAUO->RelatingProductDefinition();
1640   if ( PD.IsNull() )
1641     return Standard_False;
1642   return Standard_True;
1643 }
1644
1645
1646 //=======================================================================
1647 //function : writeSHUO
1648 //purpose  : auxilary
1649 //=======================================================================
1650 static Standard_Boolean writeSHUO (const Handle(XCAFDoc_GraphNode)& theSHUO,
1651                                    const Handle(XCAFDoc_ShapeTool)& theSTool,
1652                                    const Handle(XSControl_WorkSession)& WS,
1653                                    Handle(StepRepr_SpecifiedHigherUsageOccurrence)& theTopSHUO,
1654                                    TopoDS_Shape& NAUOShape,
1655                                    Handle(StepBasic_ProductDefinition)& theRelatingPD,
1656                                    Standard_Boolean& isDeepest)
1657 {
1658   // set the ProductDefinitionRelationship descriptin information as empty strings.
1659   Handle(TCollection_HAsciiString) EmptyString = new TCollection_HAsciiString("");
1660   
1661   TDF_LabelSequence aNextUsageLabs;
1662   theSTool->GetSHUONextUsage( theSHUO->Label(), aNextUsageLabs );
1663   Handle(XCAFDoc_GraphNode) NuSHUO;
1664   if ( theTopSHUO.IsNull() ) {
1665     // the top SHUO
1666     if (aNextUsageLabs.Length() < 1)
1667       return Standard_False;
1668     theSTool->GetSHUO( aNextUsageLabs.Value(1), NuSHUO );
1669     if (NuSHUO.IsNull())
1670       return Standard_False;
1671     // get relating product definition
1672     TopoDS_Shape aTopCompShape = theSTool->GetShape( theSHUO->Label().Father() ); 
1673     Handle(StepRepr_NextAssemblyUsageOccurrence) UUNAUO;
1674     if (!getProDefinitionOfNAUO( WS, aTopCompShape,
1675                                  theRelatingPD, UUNAUO, Standard_True ))
1676       return Standard_False;
1677     // get related product definition
1678     TopoDS_Shape aNUShape = theSTool->GetShape( NuSHUO->Label().Father() );
1679     Handle(StepBasic_ProductDefinition) aRelatedPD;
1680     Handle(StepRepr_NextAssemblyUsageOccurrence) NUNAUO;
1681     if (!getProDefinitionOfNAUO( WS, aNUShape,
1682                                  aRelatedPD, NUNAUO, Standard_False ))
1683       return Standard_False;
1684     
1685     theTopSHUO = new StepRepr_SpecifiedHigherUsageOccurrence;
1686     // create deepest shuo EmptyString
1687     theTopSHUO->Init(/*id*/EmptyString, /*name*/EmptyString,
1688                      /*no description*/Standard_False,/*description*/EmptyString,
1689                      theRelatingPD, aRelatedPD,
1690                      /*no ACURefDesignator*/Standard_False,/*ACURefDesignator*/EmptyString,
1691                      /*upper_usage*/UUNAUO, /*next_usage*/NUNAUO);
1692     // write the other SHUO.
1693     if(!writeSHUO( NuSHUO, theSTool, WS, theTopSHUO, NAUOShape, theRelatingPD, isDeepest )) {
1694       theTopSHUO.Nullify();
1695       return Standard_False;
1696     }
1697     
1698     return Standard_True;
1699   }
1700 //   Handle(XCAFDoc_GraphNode) NuSHUO;
1701   if ( aNextUsageLabs.Length() > 0) {
1702     // store SHUO recursive
1703 #ifdef OCCT_DEBUG
1704     if ( aNextUsageLabs.Length() > 1 )
1705       cout << "Warning: store only one next_usage of current SHUO"  << endl;
1706 #endif    
1707     theSTool->GetSHUO( aNextUsageLabs.Value(1), NuSHUO );
1708     Handle(StepRepr_SpecifiedHigherUsageOccurrence) aNUEntSHUO =
1709       new StepRepr_SpecifiedHigherUsageOccurrence;
1710     if (!writeSHUO( NuSHUO, theSTool, WS, aNUEntSHUO, NAUOShape, theRelatingPD, isDeepest ))
1711       return Standard_False;
1712     
1713     // store the deepest SHUO to the dociment
1714     TopoDS_Shape aNUSh, aUUSh;
1715     aNUSh = theSTool->GetShape( NuSHUO->Label().Father() );
1716     aUUSh = theSTool->GetShape( theSHUO->Label().Father() );
1717     // get relating PD with upper_usage and related PD with next_usage
1718     Handle(StepBasic_ProductDefinition) nullPD;// no need to use,case have shared <theRelatingPD>
1719     Handle(StepBasic_ProductDefinition) aRelatedPD;
1720     Handle(StepRepr_NextAssemblyUsageOccurrence) UUNAUO, NUNAUO;
1721     if (!getProDefinitionOfNAUO( WS, aUUSh, nullPD, UUNAUO, Standard_True ) ||
1722         !getProDefinitionOfNAUO( WS, aNUSh, aRelatedPD, NUNAUO, Standard_False )) {
1723 #ifdef OCCT_DEBUG
1724       cout << "Warning: cannot get related or relating PD" << endl;
1725 #endif
1726       return Standard_False;
1727     }
1728     aNUEntSHUO->Init(/*id*/EmptyString, /*name*/EmptyString,
1729                      /*no description*/Standard_False,/*description*/EmptyString,
1730                      theRelatingPD, aRelatedPD,
1731                      /*no ACURefDesignator*/Standard_False,/*ACURefDesignator*/EmptyString,
1732                      /*upper_usage*/theTopSHUO, /*next_usage*/NUNAUO);
1733     if ( isDeepest ) {
1734       isDeepest = Standard_False;
1735     }
1736     WS->Model()->AddWithRefs ( aNUEntSHUO );
1737     return Standard_True;
1738   } // end of recurse storing
1739     
1740   // get shape 
1741   TDF_Label aShapeL = theSHUO->Label().Father();
1742   NAUOShape = theSTool->GetShape( aShapeL );
1743   // return to the deepest level from SHUO shape level
1744   // it is because SHUO is attribute on deep level and shape level.
1745   isDeepest = Standard_True;
1746   return Standard_True;
1747 }
1748
1749
1750 //=======================================================================
1751 //function : createSHUOStyledItem
1752 //purpose  : auxilary
1753 //=======================================================================
1754 static Standard_Boolean createSHUOStyledItem (const XCAFPrs_Style& style,
1755                                               const Handle(StepRepr_ProductDefinitionShape)& PDS,
1756                                               const Handle(XSControl_WorkSession) &WS,
1757                                               const TopoDS_Shape& Sh,
1758                                               const Handle(XCAFDoc_ShapeTool)& STool,
1759                                               MoniTool_DataMapOfShapeTransient& myMapCompMDGPR)
1760 {
1761   // create styled item for the indicated SHUO and store to the model
1762   STEPConstruct_Styles Styles( WS );
1763   // translate colors to STEP
1764   Handle(StepVisual_Colour) surfColor, curvColor;
1765   if ( style.IsSetColorSurf() )
1766     surfColor = Styles.EncodeColor ( style.GetColorSurf() );
1767   if ( style.IsSetColorCurv() )
1768     curvColor = Styles.EncodeColor ( style.GetColorCurv() );
1769   Standard_Boolean isComponent = Standard_True;// cause need to get PSBC
1770   Handle(StepRepr_RepresentationItem) item;
1771   // set default color for invisible SHUO.
1772   Standard_Boolean isSetDefaultColor = Standard_False;
1773   if (surfColor.IsNull() && curvColor.IsNull() && !style.IsVisible() ) {
1774     surfColor = Styles.EncodeColor ( Quantity_Color( 1, 1, 1, Quantity_TOC_RGB ) );
1775     isSetDefaultColor = Standard_True;
1776   }
1777   Handle(StepVisual_PresentationStyleAssignment) PSA =
1778     Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent );
1779   Handle(StepVisual_StyledItem) override; //null styled item
1780   
1781   // find the repr item of the shape
1782   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
1783   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
1784   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, Sh );
1785   Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1786   FP->FindTypedTransient(mapper, 
1787                          STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation),
1788                          CDSR);
1789   if ( CDSR.IsNull() )
1790     return Standard_False;
1791   // find context
1792   Handle(StepRepr_RepresentationContext) Context = Styles.FindContext( Sh );
1793   TopoDS_Shape aTopSh = Sh;
1794   if (Context.IsNull()) {
1795     TDF_Label aTopShL = STool->FindShape(Sh, Standard_False);
1796     if (aTopShL.IsNull())
1797       return Standard_False;
1798     aTopSh = STool->GetShape( aTopShL );
1799     Context = Styles.FindContext ( aTopSh );
1800   }
1801   if (Context.IsNull())
1802     return Standard_False;
1803   // get representation item of the shape
1804   TopLoc_Location L;
1805   TColStd_SequenceOfTransient seqRI;
1806   FindEntities ( FP, Sh, L, seqRI );
1807 #ifdef OCCT_DEBUG
1808   if ( seqRI.Length() <=0 ) 
1809     FP->Messenger() << "Warning: Cannot find RI for " << Sh.TShape()->DynamicType()->Name() << endl;
1810 #endif
1811   item = Handle(StepRepr_RepresentationItem)::DownCast(seqRI(1));
1812   //get overridden styled item
1813   getStyledItem(Sh,STool, Styles, override,myMapCompMDGPR);
1814   
1815   // get STEP STYLED ITEM
1816   Handle(StepVisual_StyledItem) STEPstyle = Styles.AddStyle ( item, PSA, override );
1817   // create SR, SDR and all necessary references between them and ST, PDS, PSBC, GRC
1818   Styles.CreateNAUOSRD( Context, CDSR, PDS );
1819   
1820   // add step styled item of SHUO to the model
1821   // do it by additing styled item to the MDGPR
1822   if ( !aTopSh.IsNull() &&  !myMapCompMDGPR.IsBound( aTopSh ) ) {
1823     // create MDGPR and record it in model
1824 #ifdef OCCT_DEBUG
1825     cout << "Warning: " << __FILE__ << ": Create new MDGPR for SHUO instance"  << endl;
1826 #endif
1827     Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation) aMDGPR;
1828     Styles.CreateMDGPR ( Context, aMDGPR );
1829     if (!aMDGPR.IsNull())
1830       myMapCompMDGPR.Bind( aTopSh, aMDGPR );
1831   }
1832   else if ( !aTopSh.IsNull() &&  myMapCompMDGPR.IsBound( aTopSh ) ) {
1833     // get MDGPR of the top-level shape
1834     Handle(StepVisual_PresentationRepresentation) aMDGPR = 
1835       Handle(StepVisual_PresentationRepresentation)::DownCast( myMapCompMDGPR.Find( aTopSh ) );
1836     // get old styled items to not lose it
1837     Handle(StepRepr_HArray1OfRepresentationItem) oldItems = aMDGPR->Items();
1838     Standard_Integer oldLengthlen = 0;
1839     if (!oldItems.IsNull())
1840       oldLengthlen = oldItems->Length();
1841     // create new array of styled items by an olds and new one
1842     Handle(StepRepr_HArray1OfRepresentationItem) newItems =
1843       new StepRepr_HArray1OfRepresentationItem(1, oldLengthlen + 1);
1844     Standard_Integer si;
1845     Standard_Integer el = 1;
1846     for ( si=1; si <= oldLengthlen; si++ )
1847       newItems->SetValue( el++, oldItems->Value( si ) );
1848     newItems->SetValue( el++, Handle(StepRepr_RepresentationItem)::DownCast(STEPstyle) );
1849     // init MDGPR be new array of styled items
1850     if (newItems->Length() > 0)
1851       aMDGPR->SetItems( newItems );
1852   }
1853   else {
1854     WS->Model()->AddWithRefs ( STEPstyle ); // add as root to the model, but it is not good
1855 #ifdef OCCT_DEBUG
1856     cout << "Warning: " << __FILE__ << ": adds styled item of SHUO as root, casue cannot find MDGPR" << endl;
1857 #endif
1858   }
1859   // create invisibility item for the styled item
1860   if ( !style.IsVisible() ) {
1861     if (isSetDefaultColor) {
1862       // try to set default color from top-level shape
1863       
1864       setDefaultInstanceColor(override, PSA);
1865     }
1866     // create invisibility item and refer for stiledItem
1867     Handle(StepVisual_Invisibility) Invsblt = new StepVisual_Invisibility();
1868     Handle(StepVisual_HArray1OfInvisibleItem) HInvsblItm = 
1869       new StepVisual_HArray1OfInvisibleItem (1,1);
1870     // put all style item into the harray
1871     StepVisual_InvisibleItem anInvItem;
1872     anInvItem.SetValue( STEPstyle );
1873     HInvsblItm->SetValue( 1, anInvItem );
1874     Invsblt->Init( HInvsblItm );
1875     WS->Model()->AddWithRefs( Invsblt );
1876   }
1877   
1878   return Standard_True;
1879 }
1880
1881
1882 //=======================================================================
1883 //function : WriteSHUOs
1884 //purpose  : 
1885 //=======================================================================
1886
1887 Standard_Boolean STEPCAFControl_Writer::WriteSHUOs (const Handle(XSControl_WorkSession) &WS,
1888                                                     const TDF_LabelSequence  &labels )
1889 {
1890   if ( labels.Length() <=0 ) return Standard_False;
1891
1892   // get working data
1893   Handle(Interface_InterfaceModel) Model = WS->Model();
1894   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
1895   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
1896   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( labels(1) );
1897   if (CTool.IsNull() )
1898     return Standard_False;
1899   // map of transfered SHUO
1900   TColStd_MapOfTransient aMapOfMainSHUO;
1901 //   TColStd_IndexedDataMapOfTransientTransient aIndxMapOfSHUOEnt;
1902   // Iterate on requested shapes
1903   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1904     TDF_Label L = labels.Value(i);
1905     if ( ! myLabels.IsBound ( L ) ) continue; // not recorded as translated, skip
1906 //     TopoDS_Shape S = myLabels.Find ( L );
1907     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1908       TDF_LabelSequence seq;
1909       XCAFDoc_ShapeTool::GetComponents ( L, seq );
1910       // iterates on components of assembly
1911       for (Standard_Integer k=1; k <= seq.Length(); k++) {
1912         TDF_Label lab = seq(k);
1913         TDF_AttributeSequence anAttrSeq;
1914         CTool->ShapeTool()->GetAllComponentSHUO( lab, anAttrSeq );
1915         // work with SHUO
1916         for (Standard_Integer j = 1; j <= anAttrSeq.Length(); j++) {
1917           Handle(XCAFDoc_GraphNode) aSHUO = 
1918             Handle(XCAFDoc_GraphNode)::DownCast(anAttrSeq.Value( j ));
1919           // take label of SHUO
1920           TDF_Label aSHUOlab = aSHUO->Label();
1921           TDF_LabelSequence aUpLabels;
1922           // check is it SHUO of upper_usage
1923           CTool->ShapeTool()->GetSHUOUpperUsage( aSHUOlab, aUpLabels );
1924           if ( aUpLabels.Length() > 0 )
1925             continue; // transfer only main SHUO
1926           if ( aMapOfMainSHUO.Contains( aSHUO ) )
1927             continue; // do not try to transfer SHUO twice
1928           aMapOfMainSHUO.Add( aSHUO );
1929           // check if it is styled SHUO
1930           XCAFPrs_Style SHUOstyle;
1931           if ( !getSHUOstyle ( aSHUOlab, CTool, SHUOstyle ) ) {
1932 #ifdef OCCT_DEBUG
1933             cout << "Warning: " << __FILE__ << ": do not store SHUO without any style to the STEP model" << endl;
1934 #endif
1935             continue;
1936           }
1937           // write SHUO to the model amd then add structure type.
1938           TopoDS_Shape NAUOShape; // shape of the deepest NAUO in the SHUO structure
1939           Standard_Boolean isDeepest = Standard_False;
1940           Handle(StepRepr_SpecifiedHigherUsageOccurrence) anEntOfSHUO;
1941           Handle(StepBasic_ProductDefinition) aRelatingPD;
1942           // create the top SHUO and all other.
1943           writeSHUO( aSHUO, CTool->ShapeTool(), WS, anEntOfSHUO, NAUOShape, aRelatingPD, isDeepest );
1944           if ( anEntOfSHUO.IsNull() || NAUOShape.IsNull() ) {
1945 #ifdef OCCT_DEBUG
1946             cout << "Warning: " << __FILE__ << ": Cannot store SHUO" << endl;
1947 #endif
1948             continue;
1949           }
1950           // create new Product Definition Shape for TOP SHUO
1951 #ifdef OCCT_DEBUG
1952             cout << "Info: " << __FILE__ << ": Create NEW PDS for current SHUO " << endl;
1953 #endif
1954           Handle(StepRepr_ProductDefinitionShape) PDS = new StepRepr_ProductDefinitionShape;
1955           Handle(TCollection_HAsciiString) aPDSname = new TCollection_HAsciiString("SHUO");
1956           Handle(TCollection_HAsciiString) descrStr = new TCollection_HAsciiString("");
1957           StepRepr_CharacterizedDefinition aCharDef;
1958           aCharDef.SetValue( anEntOfSHUO );
1959           PDS->Init( aPDSname, Standard_False, descrStr, aCharDef );
1960           
1961           // create styled item for SHUO and add to the model
1962           createSHUOStyledItem ( SHUOstyle, PDS, WS, NAUOShape, CTool->ShapeTool(), myMapCompMDGPR );
1963           
1964         } // end work with SHUO
1965       } // end of an assembly components
1966     } // end of IsAssembly case
1967     // nothing to do if it is not assembly
1968     continue;
1969   } // end of iterates on indicated labels
1970   return Standard_True;
1971 }
1972
1973
1974 //=======================================================================
1975 //function : FindPDSforDGT
1976 //purpose  : auxilary: find PDS for AdvancedFace or EdgeCurve for creation
1977 //                     needed ShapeAspect in D&GT structure
1978 //=======================================================================
1979 static Standard_Boolean FindPDSforDGT(const Interface_Graph &aGraph,
1980                                       const Handle(Standard_Transient) &ent,
1981                                       Handle(StepRepr_ProductDefinitionShape) &PDS,
1982                                       Handle(StepRepr_RepresentationContext) &RC,
1983                                       Handle(StepShape_AdvancedFace) &AF,
1984                                       Handle(StepShape_EdgeCurve) &EC)
1985 {
1986   if( !ent->IsKind(STANDARD_TYPE(StepShape_EdgeCurve)) && 
1987       !ent->IsKind(STANDARD_TYPE(StepShape_AdvancedFace)) ) 
1988     return Standard_False;
1989
1990   AF = Handle(StepShape_AdvancedFace)::DownCast(ent);
1991   if( ent->IsKind(STANDARD_TYPE(StepShape_EdgeCurve)) ) {
1992     EC = Handle(StepShape_EdgeCurve)::DownCast(ent);
1993     Interface_EntityIterator subs = aGraph.Sharings(EC);
1994     for(subs.Start(); subs.More() && AF.IsNull(); subs.Next()) {
1995       Handle(StepShape_OrientedEdge) OE = Handle(StepShape_OrientedEdge)::DownCast(subs.Value());
1996       if(OE.IsNull()) continue;
1997       Interface_EntityIterator subs1 = aGraph.Sharings(OE);
1998       for(subs1.Start(); subs1.More() && AF.IsNull(); subs1.Next()) {
1999         Handle(StepShape_EdgeLoop) EL = Handle(StepShape_EdgeLoop)::DownCast(subs1.Value());
2000         if(EL.IsNull()) continue;
2001         Interface_EntityIterator subs2 = aGraph.Sharings(EL);
2002         for(subs2.Start(); subs2.More() && AF.IsNull(); subs2.Next()) {
2003           Handle(StepShape_FaceBound) FB = Handle(StepShape_FaceBound)::DownCast(subs2.Value());
2004           if(FB.IsNull()) continue;
2005           Interface_EntityIterator subs3 = aGraph.Sharings(FB);
2006           for(subs3.Start(); subs3.More() && AF.IsNull(); subs3.Next()) {
2007             AF = Handle(StepShape_AdvancedFace)::DownCast(subs3.Value());
2008           }
2009         }
2010       }
2011     }
2012   }
2013   if(AF.IsNull()) return Standard_False;
2014
2015   Interface_EntityIterator subs = aGraph.Sharings(AF);
2016   for(subs.Start(); subs.More() && PDS.IsNull(); subs.Next()) {
2017     Handle(StepShape_ConnectedFaceSet) CFS =
2018       Handle(StepShape_ConnectedFaceSet)::DownCast(subs.Value());
2019     if(CFS.IsNull()) continue;
2020     Interface_EntityIterator subs1 = aGraph.Sharings(CFS);
2021     for(subs1.Start(); subs1.More() && PDS.IsNull(); subs1.Next()) {
2022       Handle(StepRepr_RepresentationItem) RI = 
2023         Handle(StepRepr_RepresentationItem)::DownCast(subs1.Value());
2024       if(RI.IsNull()) continue;
2025       Interface_EntityIterator subs2 = aGraph.Sharings(RI);
2026       for(subs2.Start(); subs2.More() && PDS.IsNull(); subs2.Next()) {
2027         Handle(StepShape_ShapeRepresentation) SR = 
2028           Handle(StepShape_ShapeRepresentation)::DownCast(subs2.Value());
2029         if(SR.IsNull()) continue;
2030         RC = SR->ContextOfItems();
2031         Interface_EntityIterator subs3 = aGraph.Sharings(SR);
2032         for(subs3.Start(); subs3.More() && PDS.IsNull(); subs3.Next()) {
2033           Handle(StepShape_ShapeDefinitionRepresentation) SDR = 
2034             Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs3.Value());
2035           if(SDR.IsNull()) continue;
2036           Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition();
2037           if(PropD.IsNull()) continue;
2038           PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(PropD);
2039         }
2040       }
2041     }
2042   }
2043   
2044   return Standard_True;
2045 }
2046
2047
2048 //=======================================================================
2049 //function : WriteDGTs
2050 //purpose  : 
2051 //=======================================================================
2052
2053 Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSession) &WS,
2054                                                    const TDF_LabelSequence  &labels ) const
2055 {
2056   
2057   if ( labels.Length() <=0 ) return Standard_False;
2058
2059   // get working data
2060   Handle(Interface_InterfaceModel) Model = WS->Model();
2061   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
2062   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
2063
2064   const Handle(Interface_HGraph) aHGraph = WS->HGraph();
2065   if(aHGraph.IsNull())
2066     return Standard_False;
2067
2068   Interface_Graph aGraph = aHGraph->Graph();
2069   Handle(XCAFDoc_DimTolTool) DGTTool = XCAFDoc_DocumentTool::DimTolTool( labels(1) );
2070   if(DGTTool.IsNull() ) return Standard_False;
2071
2072   TDF_LabelSequence DGTLabels;
2073   STEPConstruct_DataMapOfAsciiStringTransient DatumMap;
2074
2075   // write Datums
2076   DGTTool->GetDatumLabels(DGTLabels);
2077   if(DGTLabels.Length()<=0) return Standard_False;
2078   Standard_Integer i;
2079   for(i=1; i<=DGTLabels.Length(); i++) {
2080     TDF_Label DatumL = DGTLabels.Value(i);
2081     TDF_LabelSequence ShapeL;
2082     TDF_LabelSequence aNullSeq;
2083     if(!DGTTool->GetRefShapeLabel(DatumL,ShapeL,aNullSeq)) continue;
2084     // find target shape
2085     TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1));
2086     TopLoc_Location Loc;
2087     TColStd_SequenceOfTransient seqRI;
2088     FindEntities( FP, aShape, Loc, seqRI );
2089     if ( seqRI.Length() <= 0 ) {
2090       FP->Messenger() << "Warning: Cannot find RI for "<<aShape.TShape()->DynamicType()->Name()<<endl;
2091       continue;
2092     }
2093     Handle(StepRepr_ProductDefinitionShape) PDS;
2094     Handle(StepRepr_RepresentationContext) RC;
2095     Handle(Standard_Transient) ent = seqRI.Value(1);
2096     Handle(StepShape_AdvancedFace) AF;
2097     Handle(StepShape_EdgeCurve) EC;
2098     FindPDSforDGT(aGraph,ent,PDS,RC,AF,EC);
2099     if(PDS.IsNull()) continue;
2100     //cout<<"Model->Number(PDS)="<<Model->Number(PDS)<<endl;
2101     Handle(XCAFDoc_Datum) DatumAttr;
2102     if(!DatumL.FindAttribute(XCAFDoc_Datum::GetID(),DatumAttr)) continue;
2103     Handle(TCollection_HAsciiString) aName = DatumAttr->GetName();
2104     Handle(TCollection_HAsciiString) aDescription = DatumAttr->GetDescription();
2105     Handle(TCollection_HAsciiString) anIdentification = DatumAttr->GetIdentification();
2106     Handle(StepDimTol_DatumFeature) DF = new StepDimTol_DatumFeature;
2107     Handle(StepDimTol_Datum) aDatum = new StepDimTol_Datum;
2108     DF->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue);
2109     Model->AddWithRefs(DF);
2110     aDatum->Init(aName, new TCollection_HAsciiString, PDS, StepData_LFalse, anIdentification);
2111     Model->AddWithRefs(aDatum);
2112     Handle(StepRepr_ShapeAspectRelationship) SAR = new StepRepr_ShapeAspectRelationship;
2113     SAR->SetName(aName);
2114     SAR->SetRelatingShapeAspect(DF);
2115     SAR->SetRelatedShapeAspect(aDatum);
2116     Model->AddWithRefs(SAR);
2117     // write chain for DatumFeature
2118     StepRepr_CharacterizedDefinition CD;
2119     CD.SetValue(DF);
2120     Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition;
2121     PropD->Init(aName,Standard_True,aDescription,CD);
2122     Model->AddWithRefs(PropD);
2123     StepRepr_RepresentedDefinition RD;
2124     RD.SetValue(PropD);
2125     Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation;
2126     Handle(StepRepr_HArray1OfRepresentationItem) HARI =
2127       new StepRepr_HArray1OfRepresentationItem(1,1);
2128     HARI->SetValue(1,AF);
2129     SR->Init(aName,HARI,RC);
2130     Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation;
2131     SDR->Init(RD,SR);
2132     Model->AddWithRefs(SDR);
2133     // write chain for Datum 
2134     StepRepr_CharacterizedDefinition CD1;
2135     CD1.SetValue(aDatum);
2136     Handle(StepRepr_PropertyDefinition) PropD1 = new StepRepr_PropertyDefinition;
2137     PropD1->Init(aName,Standard_True,aDescription,CD1);
2138     Model->AddWithRefs(PropD1);
2139     StepRepr_RepresentedDefinition RD1;
2140     RD1.SetValue(PropD1);
2141     Handle(StepShape_ShapeRepresentation) SR1 = new StepShape_ShapeRepresentation;
2142     Handle(StepRepr_HArray1OfRepresentationItem) HARI1 =
2143       new StepRepr_HArray1OfRepresentationItem(1,1);
2144     HARI1->SetValue(1,AF->FaceGeometry());
2145     SR1->Init(aName,HARI1,RC);
2146     Model->AddWithRefs(SR1);
2147     Handle(StepShape_ShapeDefinitionRepresentation) SDR1 = new StepShape_ShapeDefinitionRepresentation;
2148     SDR1->Init(RD1,SR1);
2149     Model->AddWithRefs(SDR1);
2150     // add created Datum into Map
2151     TCollection_AsciiString stmp(aName->ToCString());
2152     stmp.AssignCat(aDescription->ToCString());
2153     stmp.AssignCat(anIdentification->ToCString());
2154     DatumMap.Bind(stmp,aDatum);
2155   }
2156
2157   // write Tolerances and Dimensions
2158   DGTLabels.Clear();
2159   DGTTool->GetDimTolLabels(DGTLabels);
2160   if(DGTLabels.Length()<=0) return Standard_False;
2161   for(i=1; i<=DGTLabels.Length(); i++) {
2162     TDF_Label DimTolL = DGTLabels.Value(i);
2163     TDF_LabelSequence ShapeL;
2164     TDF_LabelSequence aNullSeq;
2165     if(!DGTTool->GetRefShapeLabel(DimTolL,ShapeL,aNullSeq)) continue;
2166     // find target shape
2167     TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1));
2168     TopLoc_Location Loc;
2169     TColStd_SequenceOfTransient seqRI;
2170     FindEntities( FP, aShape, Loc, seqRI );
2171     if ( seqRI.Length() <= 0 ) {
2172       FP->Messenger() << "Warning: Cannot find RI for "<<aShape.TShape()->DynamicType()->Name()<<endl;
2173       continue;
2174     }
2175     Handle(StepRepr_ProductDefinitionShape) PDS;
2176     Handle(StepRepr_RepresentationContext) RC;
2177     Handle(Standard_Transient) ent = seqRI.Value(1);
2178     Handle(StepShape_AdvancedFace) AF;
2179     Handle(StepShape_EdgeCurve) EC;
2180     FindPDSforDGT(aGraph,ent,PDS,RC,AF,EC);
2181     if(PDS.IsNull()) continue;
2182     //cout<<"Model->Number(PDS)="<<Model->Number(PDS)<<endl;
2183
2184     Handle(XCAFDoc_DimTol) DimTolAttr;
2185     if(!DimTolL.FindAttribute(XCAFDoc_DimTol::GetID(),DimTolAttr)) continue;
2186     Standard_Integer kind = DimTolAttr->GetKind();
2187     Handle(TColStd_HArray1OfReal) aVal = DimTolAttr->GetVal();
2188     Handle(TCollection_HAsciiString) aName = DimTolAttr->GetName();
2189     Handle(TCollection_HAsciiString) aDescription = DimTolAttr->GetDescription();
2190
2191     // common part of writing D&GT entities
2192     StepRepr_CharacterizedDefinition CD;
2193     Handle(StepRepr_ShapeAspect) SA = new StepRepr_ShapeAspect;
2194     SA->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue);
2195     Model->AddWithRefs(SA);
2196     CD.SetValue(SA);
2197     Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition;
2198     PropD->Init(aName,Standard_True,aDescription,CD);
2199     Model->AddWithRefs(PropD);
2200     StepRepr_RepresentedDefinition RD;
2201     RD.SetValue(PropD);
2202     Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation;
2203     Handle(StepRepr_HArray1OfRepresentationItem) HARI =
2204       new StepRepr_HArray1OfRepresentationItem(1,1);
2205     if(kind<20) 
2206       HARI->SetValue(1,EC);
2207     else
2208       HARI->SetValue(1,AF);
2209     SR->Init(aName,HARI,RC);
2210     Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation;
2211     SDR->Init(RD,SR);
2212     Model->AddWithRefs(SDR);
2213     // define aUnit for creation LengthMeasureWithUnit (common for all)
2214     StepBasic_Unit aUnit;
2215     Handle(StepBasic_SiUnitAndLengthUnit) SLU;
2216     Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) Ctx =
2217       Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(RC);
2218     if(!Ctx.IsNull()) {
2219       for(Standard_Integer j=1; j<=Ctx->NbUnits(); j++) {
2220         if(Ctx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit))) {
2221           SLU = Handle(StepBasic_SiUnitAndLengthUnit)::DownCast(Ctx->UnitsValue(j));
2222           break;
2223         }
2224       }
2225     }
2226     if(SLU.IsNull()) {
2227       Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) Ctx1 =
2228         Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(RC);
2229       if(!Ctx1.IsNull()) {
2230         for(Standard_Integer j=1; j<=Ctx1->NbUnits(); j++) {
2231           if(Ctx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit))) {
2232             SLU = Handle(StepBasic_SiUnitAndLengthUnit)::DownCast(Ctx1->UnitsValue(j));
2233             break;
2234           }
2235         }
2236       }
2237     }
2238     if(SLU.IsNull()) {
2239       SLU = new StepBasic_SiUnitAndLengthUnit;
2240     }
2241     aUnit.SetValue(SLU);
2242
2243     // specific part of writing D&GT entities
2244     if(kind<20) { //dimension
2245       Handle(StepShape_DimensionalSize) DimSize = new StepShape_DimensionalSize;
2246       DimSize->Init(SA,aDescription);
2247       Model->AddWithRefs(DimSize);
2248       if(aVal->Length()>1) {
2249         // create MeasureWithUnits
2250         Handle(StepBasic_MeasureValueMember) MVM1 = new StepBasic_MeasureValueMember;
2251         MVM1->SetName("POSITIVE_LENGTH_MEASURE");
2252         MVM1->SetReal(aVal->Value(1));
2253         Handle(StepBasic_MeasureWithUnit) MWU1 = new StepBasic_MeasureWithUnit;
2254         MWU1->Init(MVM1,aUnit);
2255         Handle(StepBasic_MeasureValueMember) MVM2 = new StepBasic_MeasureValueMember;
2256         MVM2->SetName("POSITIVE_LENGTH_MEASURE");
2257         MVM2->SetReal(aVal->Value(2));
2258         Handle(StepBasic_MeasureWithUnit) MWU2 = new StepBasic_MeasureWithUnit;
2259         MWU2->Init(MVM2,aUnit);
2260         Handle(StepRepr_RepresentationItem) RI1 = new StepRepr_RepresentationItem;
2261         RI1->Init(new TCollection_HAsciiString("lower limit"));
2262         Handle(StepRepr_RepresentationItem) RI2 = new StepRepr_RepresentationItem;
2263         RI2->Init(new TCollection_HAsciiString("upper limit"));
2264         Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) RILMU1 =
2265           new StepRepr_ReprItemAndLengthMeasureWithUnit;
2266         RILMU1->Init(MWU1,RI1);
2267         Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) RILMU2 =
2268           new StepRepr_ReprItemAndLengthMeasureWithUnit;
2269         RILMU2->Init(MWU2,RI2);
2270         Model->AddWithRefs(RILMU1);
2271         Model->AddWithRefs(RILMU2);
2272         //Handle(StepRepr_CompoundItemDefinitionMember) CIDM =
2273         //  new StepRepr_CompoundItemDefinitionMember;
2274         //Handle(TColStd_HArray1OfTransient) ArrTr = new TColStd_HArray1OfTransient(1,2);
2275         //ArrTr->SetValue(1,RILMU1);
2276         //ArrTr->SetValue(2,RILMU2);
2277         //CIDM->SetArrTransient(ArrTr);
2278         //CIDM->SetName("SET_REPRESENTATION_ITEM");
2279         //StepRepr_CompoundItemDefinition CID;
2280         //CID.SetValue(CIDM);
2281         Handle(StepRepr_HArray1OfRepresentationItem) HARIVR =
2282           new StepRepr_HArray1OfRepresentationItem(1,2);
2283         HARIVR->SetValue(1,RILMU1);
2284         HARIVR->SetValue(2,RILMU2);
2285         Handle(StepRepr_ValueRange) VR = new StepRepr_ValueRange;
2286         //VR->Init(aName,CID);
2287         VR->Init(aName,HARIVR);
2288         Model->AddEntity(VR);
2289         Handle(StepShape_ShapeDimensionRepresentation) SDimR =
2290           new StepShape_ShapeDimensionRepresentation;
2291         Handle(StepRepr_HArray1OfRepresentationItem) aHARI =
2292           new StepRepr_HArray1OfRepresentationItem(1,1);
2293         aHARI->SetValue(1,VR);
2294         SDimR->Init(aName,aHARI,RC);
2295         Model->AddWithRefs(SDimR);
2296         Handle(StepShape_DimensionalCharacteristicRepresentation) DimCharR =
2297           new StepShape_DimensionalCharacteristicRepresentation;
2298         StepShape_DimensionalCharacteristic DimChar;
2299         DimChar.SetValue(DimSize);
2300         DimCharR->Init(DimChar,SDimR);
2301         Model->AddEntity(DimCharR);
2302       }
2303     }
2304     else if(kind<50) { //tolerance
2305       if(kind<35) { // tolerance with datum system
2306         TDF_LabelSequence DatumLabels;
2307         DGTTool->GetDatumOfTolerLabels(DimTolL,DatumLabels);
2308         Standard_Integer NbDR = DatumLabels.Length();
2309         Handle(StepDimTol_HArray1OfDatumReference) HADR = new StepDimTol_HArray1OfDatumReference(1,NbDR);
2310         for(Standard_Integer j=1; j<=NbDR; j++) {
2311           Handle(XCAFDoc_Datum) DatumAttr;
2312           TDF_Label DatumL = DatumLabels.Value(j);
2313           if(!DatumL.FindAttribute(XCAFDoc_Datum::GetID(),DatumAttr)) continue;
2314           Handle(TCollection_HAsciiString) aNameD = DatumAttr->GetName();
2315           Handle(TCollection_HAsciiString) aDescriptionD = DatumAttr->GetDescription();
2316           Handle(TCollection_HAsciiString) anIdentificationD = DatumAttr->GetIdentification();
2317           TCollection_AsciiString stmp(aNameD->ToCString());
2318           stmp.AssignCat(aDescriptionD->ToCString());
2319           stmp.AssignCat(anIdentificationD->ToCString());
2320           if(DatumMap.IsBound(stmp)) {
2321             Handle(StepDimTol_Datum) aDatum = 
2322               Handle(StepDimTol_Datum)::DownCast(DatumMap.Find(stmp));
2323             Handle(StepDimTol_DatumReference) DR = new StepDimTol_DatumReference;
2324             DR->Init(j,aDatum);
2325             Model->AddWithRefs(DR);
2326             HADR->SetValue(j,DR);
2327           }
2328         }
2329         // create LengthMeasureWithUnit
2330         Handle(StepBasic_MeasureValueMember) MVM = new StepBasic_MeasureValueMember;
2331         MVM->SetName("LENGTH_MEASURE");
2332         MVM->SetReal(aVal->Value(1));
2333         Handle(StepBasic_LengthMeasureWithUnit) LMWU = new StepBasic_LengthMeasureWithUnit;
2334         LMWU->Init(MVM,aUnit);
2335         // create tolerance by it's type
2336         if(kind<24) {
2337           Handle(StepDimTol_GeometricToleranceWithDatumReference) GTWDR =
2338             new StepDimTol_GeometricToleranceWithDatumReference;
2339           GTWDR->SetDatumSystem(HADR);
2340           Handle(StepDimTol_ModifiedGeometricTolerance) MGT =
2341             new StepDimTol_ModifiedGeometricTolerance;
2342           if(kind==21) MGT->SetModifier(StepDimTol_MaximumMaterialCondition);
2343           else if(kind==22) MGT->SetModifier(StepDimTol_LeastMaterialCondition);
2344           else if(kind==23) MGT->SetModifier(StepDimTol_RegardlessOfFeatureSize);
2345           Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol) GTComplex =
2346             new StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol;
2347           GTComplex->Init(aName,aDescription,LMWU,SA,GTWDR,MGT);
2348           Model->AddWithRefs(GTComplex);
2349         }
2350         else if(kind==24) {
2351           Handle(StepDimTol_AngularityTolerance) aToler =
2352             new StepDimTol_AngularityTolerance;
2353           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2354           Model->AddWithRefs(aToler);
2355         }
2356         else if(kind==25) {
2357           Handle(StepDimTol_CircularRunoutTolerance) aToler =
2358             new StepDimTol_CircularRunoutTolerance;
2359           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2360           Model->AddWithRefs(aToler);
2361         }
2362         else if(kind==26) {
2363           Handle(StepDimTol_CoaxialityTolerance) aToler =
2364             new StepDimTol_CoaxialityTolerance;
2365           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2366           Model->AddWithRefs(aToler);
2367         }
2368         else if(kind==27) {
2369           Handle(StepDimTol_ConcentricityTolerance) aToler =
2370             new StepDimTol_ConcentricityTolerance;
2371           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2372           Model->AddWithRefs(aToler);
2373         }
2374         else if(kind==28) {
2375           Handle(StepDimTol_ParallelismTolerance) aToler =
2376             new StepDimTol_ParallelismTolerance;
2377           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2378           Model->AddWithRefs(aToler);
2379         }
2380         else if(kind==29) {
2381           Handle(StepDimTol_PerpendicularityTolerance) aToler =
2382             new StepDimTol_PerpendicularityTolerance;
2383           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2384           Model->AddWithRefs(aToler);
2385         }
2386         else if(kind==30) {
2387           Handle(StepDimTol_SymmetryTolerance) aToler =
2388             new StepDimTol_SymmetryTolerance;
2389           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2390           Model->AddWithRefs(aToler);
2391         }
2392         else if(kind==31) {
2393           Handle(StepDimTol_TotalRunoutTolerance) aToler =
2394             new StepDimTol_TotalRunoutTolerance;
2395           aToler->Init(aName,aDescription,LMWU,SA,HADR);
2396           Model->AddWithRefs(aToler);
2397         }
2398       }
2399     }
2400   }
2401
2402   return Standard_True;
2403 }
2404
2405
2406 //=======================================================================
2407 //function : FindPDSforRI
2408 //purpose  : auxilary: 
2409 //=======================================================================
2410 static Standard_Boolean FindPDSforRI(const Interface_Graph &aGraph,
2411                                      const Handle(Standard_Transient) &ent,
2412                                      Handle(StepRepr_ProductDefinitionShape) &PDS,
2413                                      Handle(StepRepr_RepresentationContext) &RC)
2414 {
2415   if(!ent->IsKind(STANDARD_TYPE(StepRepr_RepresentationItem))) return Standard_False;
2416   Interface_EntityIterator subs = aGraph.Sharings(ent);
2417   for(subs.Start(); subs.More() && PDS.IsNull(); subs.Next()) {
2418     Handle(StepShape_ShapeRepresentation) SR = 
2419       Handle(StepShape_ShapeRepresentation)::DownCast(subs.Value());
2420     if(SR.IsNull()) continue;
2421     RC = SR->ContextOfItems();
2422     Interface_EntityIterator subs1 = aGraph.Sharings(SR);
2423     for(subs1.Start(); subs1.More() && PDS.IsNull(); subs1.Next()) {
2424       Handle(StepShape_ShapeDefinitionRepresentation) SDR = 
2425         Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs1.Value());
2426       if(SDR.IsNull()) continue;
2427       Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition();
2428       if(PropD.IsNull()) continue;
2429       PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(PropD);
2430     }
2431   }
2432   return Standard_True;
2433 }
2434
2435
2436 //=======================================================================
2437 //function : WriteMaterials
2438 //purpose  : 
2439 //=======================================================================
2440
2441 Standard_Boolean STEPCAFControl_Writer::WriteMaterials (const Handle(XSControl_WorkSession) &WS,
2442                                                         const TDF_LabelSequence  &labels ) const
2443 {
2444   
2445   if ( labels.Length() <=0 ) return Standard_False;
2446
2447   // get working data
2448   Handle(Interface_InterfaceModel) Model = WS->Model();
2449   Handle(XSControl_TransferWriter) TW = WS->TransferWriter();
2450   Handle(Transfer_FinderProcess) FP = TW->FinderProcess();
2451
2452   const Handle(Interface_HGraph) aHGraph = WS->HGraph();
2453   if(aHGraph.IsNull())
2454     return Standard_False;
2455
2456   Interface_Graph aGraph = WS->HGraph()->Graph();
2457   Handle(XCAFDoc_ShapeTool) ShTool = XCAFDoc_DocumentTool::ShapeTool( labels(1) );
2458   if(ShTool.IsNull() ) return Standard_False;
2459   Handle(XCAFDoc_MaterialTool) MatTool = XCAFDoc_DocumentTool::MaterialTool( labels(1) );
2460   if(MatTool.IsNull() ) return Standard_False;
2461
2462   STEPConstruct_DataMapOfAsciiStringTransient MapDRI,MapMRI;
2463   TDF_LabelSequence TopLabels;
2464   ShTool->GetShapes(TopLabels);
2465   for(Standard_Integer i=1; i<=TopLabels.Length(); i++) {
2466     TDF_Label ShL = TopLabels.Value(i);
2467     Handle(TDataStd_TreeNode) Node;
2468     if( ShL.FindAttribute(XCAFDoc::MaterialRefGUID(),Node) && Node->HasFather() ) {
2469       // find PDS for current shape
2470       TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShL);
2471       TopLoc_Location Loc;
2472       TColStd_SequenceOfTransient seqRI;
2473       FindEntities( FP, aShape, Loc, seqRI );
2474       if(seqRI.Length()<=0) continue;
2475       Handle(StepRepr_ProductDefinitionShape) PDS;
2476       Handle(StepRepr_RepresentationContext) RC;
2477       Handle(Standard_Transient) ent = seqRI.Value(1);
2478       FindPDSforRI(aGraph,ent,PDS,RC);
2479       if(PDS.IsNull()) continue;
2480       Handle(StepBasic_ProductDefinition) aProdDef = 
2481         PDS->Definition().ProductDefinition();
2482       if(aProdDef.IsNull())
2483         continue;
2484       // write material entities
2485       TDF_Label MatL = Node->Father()->Label();
2486       Handle(TCollection_HAsciiString) aName;
2487       Handle(TCollection_HAsciiString) aDescription;
2488       Standard_Real aDensity;
2489       Handle(TCollection_HAsciiString) aDensName;
2490       Handle(TCollection_HAsciiString) aDensValType;
2491       Handle(StepRepr_Representation) RepDRI;
2492       Handle(StepRepr_Representation) RepMRI;
2493       if(MatTool->GetMaterial(MatL,aName,aDescription,aDensity,aDensName,aDensValType)) {
2494         if(aName->Length()==0) continue;
2495         TCollection_AsciiString aKey(aName->ToCString());
2496         if(MapDRI.IsBound(aKey)) {
2497           RepDRI = Handle(StepRepr_Representation)::DownCast(MapDRI.Find(aKey));
2498           if(MapMRI.IsBound(aKey)) {
2499             RepMRI = Handle(StepRepr_Representation)::DownCast(MapMRI.Find(aKey));
2500           }
2501         }
2502         else {
2503           // write DRI
2504           Handle(StepRepr_DescriptiveRepresentationItem) DRI = new StepRepr_DescriptiveRepresentationItem;
2505           DRI->Init(aName,aDescription);
2506           Handle(StepRepr_HArray1OfRepresentationItem) HARI = new StepRepr_HArray1OfRepresentationItem(1,1);
2507           HARI->SetValue(1,DRI);
2508           RepDRI = new StepRepr_Representation();
2509           RepDRI->Init(new TCollection_HAsciiString("material name"),HARI,RC);
2510           Model->AddWithRefs(RepDRI);
2511           // write MRI
2512           if( aDensity > 0 ) {
2513             // mass
2514             Handle(StepBasic_SiUnitAndMassUnit) SMU = new StepBasic_SiUnitAndMassUnit;
2515             SMU->SetName(StepBasic_sunGram);
2516             Handle(StepBasic_DerivedUnitElement) DUE1 = new StepBasic_DerivedUnitElement;
2517             DUE1->Init(SMU,3.0);
2518             // length
2519             Handle(StepBasic_SiUnitAndLengthUnit) SLU = new StepBasic_SiUnitAndLengthUnit;
2520             SLU->Init(Standard_True,StepBasic_spCenti,StepBasic_sunMetre);
2521             Handle(StepBasic_DerivedUnitElement) DUE2 = new StepBasic_DerivedUnitElement;
2522             DUE2->Init(SLU,2.0);
2523             // other
2524             Handle(StepBasic_HArray1OfDerivedUnitElement) HADUE = new StepBasic_HArray1OfDerivedUnitElement(1,2);
2525             HADUE->SetValue(1,DUE1);
2526             HADUE->SetValue(2,DUE2);
2527             Handle(StepBasic_DerivedUnit) DU = new StepBasic_DerivedUnit;
2528             DU->Init(HADUE);
2529             Model->AddWithRefs(DU);
2530             StepBasic_Unit aUnit;
2531             aUnit.SetValue(DU);
2532             Handle(StepBasic_MeasureValueMember) MVM = new StepBasic_MeasureValueMember;
2533             MVM->SetName(aDensValType->ToCString());
2534             MVM->SetReal(aDensity);
2535             Handle(StepRepr_MeasureRepresentationItem) MRI = new StepRepr_MeasureRepresentationItem;
2536             MRI->Init(aDensName,MVM,aUnit);
2537             HARI = new StepRepr_HArray1OfRepresentationItem(1,1);
2538             HARI->SetValue(1,MRI);
2539             RepMRI = new StepRepr_Representation();
2540             RepMRI->Init(new TCollection_HAsciiString("density"),HARI,RC);
2541             Model->AddWithRefs(RepMRI);
2542           }
2543           //WriteNewMaterial(Model,aName,aDescription,aDensity,aDensName,aDensValType,RC,RepDRI,RepMRI);
2544           MapDRI.Bind(aKey,RepDRI);
2545           if ( !RepMRI.IsNull() ) MapMRI.Bind (aKey, RepMRI);
2546         }
2547       }
2548       
2549       if( !RepDRI.IsNull() )
2550       {
2551         StepRepr_CharacterizedDefinition CD1;
2552         CD1.SetValue(aProdDef);
2553         Handle(StepRepr_PropertyDefinition) PropD1 = new StepRepr_PropertyDefinition;
2554         PropD1->Init(new TCollection_HAsciiString("material property"),Standard_True,
2555           new TCollection_HAsciiString("material name"),CD1);
2556         Model->AddWithRefs(PropD1);
2557         StepRepr_RepresentedDefinition RD1;
2558         RD1.SetValue(PropD1);
2559         Handle(StepRepr_PropertyDefinitionRepresentation) PDR1 =
2560           new StepRepr_PropertyDefinitionRepresentation;
2561         PDR1->Init(RD1,RepDRI);
2562         Model->AddWithRefs(PDR1);
2563
2564         if( !RepMRI.IsNull() )
2565         {
2566           StepRepr_CharacterizedDefinition CD2;
2567           CD2.SetValue (aProdDef);
2568           Handle (StepRepr_PropertyDefinition) PropD2 = new StepRepr_PropertyDefinition;
2569           PropD2->Init (new TCollection_HAsciiString ("material property"), Standard_True,
2570             new TCollection_HAsciiString ("density"), CD2);
2571           Model->AddWithRefs (PropD2);
2572           StepRepr_RepresentedDefinition RD2;
2573           RD2.SetValue (PropD2);
2574           Handle (StepRepr_PropertyDefinitionRepresentation) PDR2 =
2575             new StepRepr_PropertyDefinitionRepresentation;
2576           PDR2->Init (RD2, RepMRI);
2577           Model->AddWithRefs (PDR2);
2578         }
2579       }
2580     }
2581   }
2582
2583   return Standard_True;
2584 }
2585
2586
2587 //=======================================================================
2588 //function : SetColorMode
2589 //purpose  : 
2590 //=======================================================================
2591
2592 void STEPCAFControl_Writer::SetColorMode (const Standard_Boolean colormode)
2593 {
2594   myColorMode = colormode;
2595 }
2596
2597
2598 //=======================================================================
2599 //function : GetColorMode
2600 //purpose  : 
2601 //=======================================================================
2602
2603 Standard_Boolean STEPCAFControl_Writer::GetColorMode () const
2604 {
2605   return myColorMode;
2606 }
2607
2608
2609 //=======================================================================
2610 //function : SetNameMode
2611 //purpose  : 
2612 //=======================================================================
2613
2614 void STEPCAFControl_Writer::SetNameMode (const Standard_Boolean namemode)
2615 {
2616   myNameMode = namemode;
2617 }
2618
2619
2620 //=======================================================================
2621 //function : GetNameMode
2622 //purpose  : 
2623 //=======================================================================
2624
2625 Standard_Boolean STEPCAFControl_Writer::GetNameMode () const
2626 {
2627   return myNameMode;
2628 }
2629
2630
2631 //=======================================================================
2632 //function : SetLayerMode
2633 //purpose  : 
2634 //=======================================================================
2635
2636 void STEPCAFControl_Writer::SetLayerMode (const Standard_Boolean layermode)
2637 {
2638   myLayerMode = layermode;
2639 }
2640
2641
2642 //=======================================================================
2643 //function : GetLayerMode
2644 //purpose  : 
2645 //=======================================================================
2646
2647 Standard_Boolean STEPCAFControl_Writer::GetLayerMode () const
2648 {
2649   return myLayerMode;
2650 }
2651
2652
2653 //=======================================================================
2654 //function : SetPropsMode
2655 //purpose  : 
2656 //=======================================================================
2657
2658 void STEPCAFControl_Writer::SetPropsMode (const Standard_Boolean propsmode)
2659 {
2660   myPropsMode = propsmode;
2661 }
2662
2663
2664 //=======================================================================
2665 //function : GetPropsMode
2666 //purpose  : 
2667 //=======================================================================
2668
2669 Standard_Boolean STEPCAFControl_Writer::GetPropsMode () const
2670 {
2671   return myPropsMode;
2672 }
2673
2674
2675 //=======================================================================
2676 //function : SetSHUOMode
2677 //purpose  : 
2678 //=======================================================================
2679
2680 void STEPCAFControl_Writer::SetSHUOMode (const Standard_Boolean mode)
2681 {
2682   mySHUOMode = mode;
2683 }
2684
2685
2686 //=======================================================================
2687 //function : GetSHUOMode
2688 //purpose  : 
2689 //=======================================================================
2690
2691 Standard_Boolean STEPCAFControl_Writer::GetSHUOMode () const
2692 {
2693   return mySHUOMode;
2694 }
2695
2696
2697 //=======================================================================
2698 //function : SetDimTolMode
2699 //purpose  : 
2700 //=======================================================================
2701
2702 void STEPCAFControl_Writer::SetDimTolMode(const Standard_Boolean dimtolmode)
2703 {
2704   myDGTMode = dimtolmode;
2705 }
2706
2707
2708 //=======================================================================
2709 //function : GetDimTolMode
2710 //purpose  : 
2711 //=======================================================================
2712
2713 Standard_Boolean STEPCAFControl_Writer::GetDimTolMode() const
2714 {
2715   return myDGTMode;
2716 }
2717
2718
2719 //=======================================================================
2720 //function : SetMaterialMode
2721 //purpose  : 
2722 //=======================================================================
2723
2724 void STEPCAFControl_Writer::SetMaterialMode(const Standard_Boolean matmode)
2725 {
2726   myMatMode = matmode;
2727 }
2728
2729
2730 //=======================================================================
2731 //function : GetMaterialMode
2732 //purpose  : 
2733 //=======================================================================
2734
2735 Standard_Boolean STEPCAFControl_Writer::GetMaterialMode() const
2736 {
2737   return myMatMode;
2738 }