0027349: XtControl_Reader is not thread-safe
[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 <GeomToStep_MakeCartesianPoint.hxx>
25 #include <HeaderSection_FileSchema.hxx>
26 #include <Interface_EntityIterator.hxx>
27 #include <Interface_Static.hxx>
28 #include <Message_Messenger.hxx>
29 #include <MoniTool_DataMapIteratorOfDataMapOfShapeTransient.hxx>
30 #include <NCollection_Vector.hxx>
31 #include <OSD_Path.hxx>
32 #include <Quantity_TypeOfColor.hxx>
33 #include <StepAP214_Protocol.hxx>
34 #include <StepAP242_DraughtingModelItemAssociation.hxx>
35 #include <StepAP242_GeometricItemSpecificUsage.hxx>
36 #include <StepBasic_DerivedUnit.hxx>
37 #include <StepBasic_DerivedUnitElement.hxx>
38 #include <StepBasic_HArray1OfDerivedUnitElement.hxx>
39 #include <StepBasic_LengthMeasureWithUnit.hxx>
40 #include <StepBasic_MeasureValueMember.hxx>
41 #include <StepBasic_Product.hxx>
42 #include <StepBasic_ProductDefinition.hxx>
43 #include <StepBasic_ProductDefinitionFormation.hxx>
44 #include <StepBasic_ProductDefinitionRelationship.hxx>
45 #include <StepBasic_SiUnitAndLengthUnit.hxx>
46 #include <StepBasic_SiUnitAndMassUnit.hxx>
47 #include <StepBasic_SiUnitAndPlaneAngleUnit.hxx>
48 #include <STEPCAFControl_ActorWrite.hxx>
49 #include <STEPCAFControl_Controller.hxx>
50 #include <STEPCAFControl_DictionaryOfExternFile.hxx>
51 #include <STEPCAFControl_ExternFile.hxx>
52 #include <STEPCAFControl_IteratorOfDictionaryOfExternFile.hxx>
53 #include <STEPCAFControl_Writer.hxx>
54 #include <STEPConstruct.hxx>
55 #include <STEPConstruct_DataMapOfAsciiStringTransient.hxx>
56 #include <STEPConstruct_DataMapOfPointTransient.hxx>
57 #include <STEPConstruct_ExternRefs.hxx>
58 #include <STEPCAFControl_GDTProperty.hxx>
59 #include <STEPConstruct_Styles.hxx>
60 #include <STEPConstruct_ValidationProps.hxx>
61 #include <STEPControl_StepModelType.hxx>
62 #include <STEPControl_Writer.hxx>
63 #include <StepData_Logical.hxx>
64 #include <StepData_StepModel.hxx>
65 #include <StepDimTol_AngularityTolerance.hxx>
66 #include <StepDimTol_CircularRunoutTolerance.hxx>
67 #include <StepDimTol_CoaxialityTolerance.hxx>
68 #include <StepDimTol_ConcentricityTolerance.hxx>
69 #include <StepDimTol_CylindricityTolerance.hxx>
70 #include <StepDimTol_Datum.hxx>
71 #include <StepDimTol_DatumFeature.hxx>
72 #include <StepDimTol_DatumReference.hxx>
73 #include <StepDimTol_DatumReferenceElement.hxx>
74 #include <StepDimTol_DatumSystem.hxx>
75 #include <StepDimTol_DatumSystemOrReference.hxx>
76 #include <StepDimTol_DatumTarget.hxx>
77 #include <StepDimTol_FlatnessTolerance.hxx>
78 #include <StepDimTol_GeometricToleranceType.hxx>
79 #include <StepDimTol_GeometricToleranceWithDatumReference.hxx>
80 #include <StepDimTol_GeometricToleranceWithModifiers.hxx>
81 #include <StepDimTol_GeoTolAndGeoTolWthDatRef.hxx>
82 #include <StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol.hxx>
83 #include <StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod.hxx>
84 #include <StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol.hxx>
85 #include <StepDimTol_GeoTolAndGeoTolWthMaxTol.hxx>
86 #include <StepDimTol_GeoTolAndGeoTolWthMod.hxx>
87 #include <StepDimTol_HArray1OfDatumReference.hxx>
88 #include <StepDimTol_HArray1OfDatumReferenceElement.hxx>
89 #include <StepDimTol_HArray1OfDatumReferenceModifier.hxx>
90 #include <StepDimTol_HArray1OfDatumSystemOrReference.hxx>
91 #include <StepDimTol_LineProfileTolerance.hxx>
92 #include <StepDimTol_ModifiedGeometricTolerance.hxx>
93 #include <StepDimTol_ParallelismTolerance.hxx>
94 #include <StepDimTol_PerpendicularityTolerance.hxx>
95 #include <StepDimTol_PlacedDatumTargetFeature.hxx>
96 #include <StepDimTol_PositionTolerance.hxx>
97 #include <StepDimTol_RoundnessTolerance.hxx>
98 #include <StepDimTol_RunoutZoneDefinition.hxx>
99 #include <StepDimTol_RunoutZoneOrientation.hxx>
100 #include <StepDimTol_StraightnessTolerance.hxx>
101 #include <StepDimTol_SurfaceProfileTolerance.hxx>
102 #include <StepDimTol_SymmetryTolerance.hxx>
103 #include <StepDimTol_ToleranceZone.hxx>
104 #include <StepDimTol_ToleranceZoneForm.hxx>
105 #include <StepDimTol_TotalRunoutTolerance.hxx>
106 #include <StepGeom_Axis2Placement3d.hxx>
107 #include <StepGeom_CartesianPoint.hxx>
108 #include <StepGeom_Direction.hxx>
109 #include <StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext.hxx>
110 #include <StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx>
111 #include <StepGeom_Plane.hxx>
112 #include <StepGeom_Surface.hxx>
113 #include <StepRepr_CompGroupShAspAndCompShAspAndDatumFeatAndShAsp.hxx>
114 #include <StepRepr_CompositeShapeAspect.hxx>
115 #include <StepRepr_DescriptiveRepresentationItem.hxx>
116 #include <StepRepr_FeatureForDatumTargetRelationship.hxx>
117 #include <StepRepr_HArray1OfRepresentationItem.hxx>
118 #include <StepRepr_MeasureRepresentationItem.hxx>
119 #include <StepRepr_NextAssemblyUsageOccurrence.hxx>
120 #include <StepRepr_ProductDefinitionShape.hxx>
121 #include <StepRepr_PropertyDefinition.hxx>
122 #include <StepRepr_RepresentedDefinition.hxx>
123 #include <StepRepr_Representation.hxx>
124 #include <StepRepr_RepresentationItem.hxx>
125 #include <StepRepr_ReprItemAndLengthMeasureWithUnit.hxx>
126 #include <StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI.hxx>
127 #include <StepRepr_ReprItemAndPlaneAngleMeasureWithUnit.hxx>
128 #include <StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI.hxx>
129 #include <StepRepr_ShapeAspect.hxx>
130 #include <StepRepr_ShapeAspectRelationship.hxx>
131 #include <StepRepr_SpecifiedHigherUsageOccurrence.hxx>
132 #include <StepRepr_ValueRange.hxx>
133 #include <StepShape_AdvancedFace.hxx>
134 #include <StepShape_AngleRelator.hxx>
135 #include <StepShape_AngularLocation.hxx>
136 #include <StepShape_AngularSize.hxx>
137 #include <StepShape_ConnectedFaceSet.hxx>
138 #include <StepShape_ContextDependentShapeRepresentation.hxx>
139 #include <StepShape_DimensionalCharacteristic.hxx>
140 #include <StepShape_DimensionalCharacteristicRepresentation.hxx>
141 #include <StepShape_DimensionalLocation.hxx>
142 #include <StepShape_DimensionalLocationWithPath.hxx>
143 #include <StepShape_DimensionalSize.hxx>
144 #include <StepShape_DimensionalSizeWithPath.hxx>
145 #include <StepShape_EdgeCurve.hxx>
146 #include <StepShape_EdgeLoop.hxx>
147 #include <StepShape_FaceBound.hxx>
148 #include <StepShape_LimitsAndFits.hxx>
149 #include <StepShape_OrientedEdge.hxx>
150 #include <StepShape_PlusMinusTolerance.hxx>
151 #include <StepShape_QualifiedRepresentationItem.hxx>
152 #include <StepShape_ShapeDefinitionRepresentation.hxx>
153 #include <StepShape_ShapeDimensionRepresentation.hxx>
154 #include <StepShape_ShapeRepresentation.hxx>
155 #include <StepShape_ShapeRepresentationWithParameters.hxx>
156 #include <StepShape_ToleranceValue.hxx>
157 #include <StepShape_TypeQualifier.hxx>
158 #include <StepShape_ValueFormatTypeQualifier.hxx>
159 #include <StepVisual_AnnotationPlane.hxx>
160 #include <StepVisual_CurveStyle.hxx>
161 #include <StepVisual_DraughtingCallout.hxx>
162 #include <StepVisual_DraughtingModel.hxx>
163 #include <StepVisual_HArray1OfInvisibleItem.hxx>
164 #include <StepVisual_HArray1OfLayeredItem.hxx>
165 #include <StepVisual_HArray1OfPresentationStyleAssignment.hxx>
166 #include <StepVisual_HArray1OfPresentationStyleSelect.hxx>
167 #include <StepVisual_Invisibility.hxx>
168 #include <StepVisual_InvisibleItem.hxx>
169 #include <StepVisual_MechanicalDesignGeometricPresentationRepresentation.hxx>
170 #include <StepVisual_NullStyleMember.hxx>
171 #include <StepVisual_PointStyle.hxx>
172 #include <StepVisual_PresentationLayerAssignment.hxx>
173 #include <StepVisual_PresentationRepresentation.hxx>
174 #include <StepVisual_PresentationStyleAssignment.hxx>
175 #include <StepVisual_PresentationStyleByContext.hxx>
176 #include <StepVisual_StyledItem.hxx>
177 #include <StepVisual_SurfaceStyleUsage.hxx>
178 #include <StepVisual_TessellatedAnnotationOccurrence.hxx>
179 #include <StepVisual_TessellatedGeometricSet.hxx>
180 #include <TCollection_AsciiString.hxx>
181 #include <TCollection_HAsciiString.hxx>
182 #include <TColStd_HArray1OfReal.hxx>
183 #include <TColStd_HArray1OfTransient.hxx>
184 #include <TColStd_HSequenceOfTransient.hxx>
185 #include <TColStd_MapOfAsciiString.hxx>
186 #include <TColStd_MapOfTransient.hxx>
187 #include <TDataStd_Name.hxx>
188 #include <TDataStd_TreeNode.hxx>
189 #include <TDataStd_UAttribute.hxx>
190 #include <TDF_AttributeSequence.hxx>
191 #include <TDF_ChildIterator.hxx>
192 #include <TDF_Label.hxx>
193 #include <TDF_LabelSequence.hxx>
194 #include <TDF_Tool.hxx>
195 #include <TDocStd_Document.hxx>
196 #include <TopoDS_Compound.hxx>
197 #include <TopoDS_Iterator.hxx>
198 #include <TopoDS_Shape.hxx>
199 #include <TopTools_MapOfShape.hxx>
200 #include <TopTools_SequenceOfShape.hxx>
201 #include <Transfer_ActorOfFinderProcess.hxx>
202 #include <Transfer_Binder.hxx>
203 #include <Transfer_FinderProcess.hxx>
204 #include <Transfer_TransientListBinder.hxx>
205 #include <TransferBRep.hxx>
206 #include <TransferBRep_ShapeMapper.hxx>
207 #include <XCAFDimTolObjects_DatumObject.hxx>
208 #include <XCAFDimTolObjects_DimensionFormVariance.hxx>
209 #include <XCAFDimTolObjects_DimensionGrade.hxx>
210 #include <XCAFDimTolObjects_DimensionObject.hxx>
211 #include <XCAFDimTolObjects_DimensionModif.hxx>
212 #include <XCAFDimTolObjects_DimensionModifiersSequence.hxx>
213 #include <XCAFDimTolObjects_DimensionQualifier.hxx>
214 #include <XCAFDimTolObjects_GeomToleranceObject.hxx>
215 #include <XCAFDoc.hxx>
216 #include <XCAFDoc_Area.hxx>
217 #include <XCAFDoc_Centroid.hxx>
218 #include <XCAFDoc_ColorTool.hxx>
219 #include <XCAFDoc_Datum.hxx>
220 #include <XCAFDoc_Dimension.hxx>
221 #include <XCAFDoc_DimTol.hxx>
222 #include <XCAFDoc_DimTolTool.hxx>
223 #include <XCAFDoc_DocumentTool.hxx>
224 #include <XCAFDoc_GeomTolerance.hxx>
225 #include <XCAFDoc_GraphNode.hxx>
226 #include <XCAFDoc_LayerTool.hxx>
227 #include <XCAFDoc_Material.hxx>
228 #include <XCAFDoc_MaterialTool.hxx>
229 #include <XCAFDoc_ShapeTool.hxx>
230 #include <XCAFDoc_Volume.hxx>
231 #include <XCAFPrs.hxx>
232 #include <XCAFPrs_DataMapIteratorOfDataMapOfStyleShape.hxx>
233 #include <XCAFPrs_DataMapOfShapeStyle.hxx>
234 #include <XCAFPrs_DataMapOfStyleShape.hxx>
235 #include <XCAFPrs_Style.hxx>
236 #include <XSControl_TransferWriter.hxx>
237 #include <XSControl_WorkSession.hxx>
238
239 static NCollection_Vector<Handle(StepVisual_AnnotationPlane)> gdtAnnotationPlanes;
240 static Handle(StepVisual_DraughtingModel) gdtPresentationDM;
241 static Handle(StepVisual_HArray1OfPresentationStyleAssignment) gdtPrsCurveStyle;
242
243 // added by skl 15.01.2004 for D&GT writing
244 //#include <StepRepr_CompoundItemDefinition.hxx>
245 //#include <StepRepr_CompoundItemDefinitionMember.hxx>
246 // added by skl 12.02.2004 for writing materials
247 //=======================================================================
248 //function : GetLabelName
249 //purpose  : auxilary function: take name of label and append it to str
250 //=======================================================================
251 static Standard_Boolean GetLabelName (const TDF_Label &L, Handle(TCollection_HAsciiString) &str)
252 {
253   Handle(TDataStd_Name) N;
254   if ( ! L.FindAttribute ( TDataStd_Name::GetID(), N ) ) return Standard_False;
255   TCollection_ExtendedString name = N->Get();
256   if ( name.Length() <=0 ) return Standard_False;
257
258   // set name, converting it to Ascii and removing spaces
259   TCollection_AsciiString buf ( name, '?' );
260   buf.LeftAdjust();
261   buf.RightAdjust();
262   buf.ChangeAll(' ','_');
263   str->AssignCat ( buf.ToCString() );
264   return Standard_True;
265 }
266
267
268 //=======================================================================
269 //function : STEPCAFControl_Writer
270 //purpose  :
271 //=======================================================================
272
273 STEPCAFControl_Writer::STEPCAFControl_Writer () :
274        myColorMode( Standard_True ),
275        myNameMode ( Standard_True ),
276        myLayerMode( Standard_True ),
277        myPropsMode( Standard_True ),
278        mySHUOMode ( Standard_True ),
279        myDGTMode  ( Standard_True ),
280        myMatMode  ( Standard_True )
281 {
282   STEPCAFControl_Controller::Init();
283   Handle(XSControl_WorkSession) WS = new XSControl_WorkSession;
284   Init ( WS );
285 }
286
287
288 //=======================================================================
289 //function : STEPCAFControl_Writer
290 //purpose  :
291 //=======================================================================
292
293 STEPCAFControl_Writer::STEPCAFControl_Writer (const Handle(XSControl_WorkSession)& WS,
294                                               const Standard_Boolean scratch)
295 {
296   STEPCAFControl_Controller::Init();
297   Init ( WS, scratch );
298   myColorMode = Standard_True;
299   myNameMode = Standard_True;
300   myLayerMode = Standard_True;
301   myPropsMode = Standard_True;
302   mySHUOMode = Standard_True;
303 }
304
305
306 //=======================================================================
307 //function : Init
308 //purpose  :
309 //=======================================================================
310
311 void STEPCAFControl_Writer::Init (const Handle(XSControl_WorkSession)& WS,
312                                   const Standard_Boolean scratch)
313 {
314   WS->SelectNorm ( "STEP" );
315   myWriter.SetWS (WS,scratch);
316   myFiles = new STEPCAFControl_DictionaryOfExternFile;
317   myLabEF.Clear();
318   myLabels.Clear();
319 }
320
321
322 //=======================================================================
323 //function : Write
324 //purpose  :
325 //=======================================================================
326
327 IFSelect_ReturnStatus STEPCAFControl_Writer::Write (const Standard_CString filename)
328 {
329   IFSelect_ReturnStatus status = myWriter.Write ( filename );
330
331   // get directory name of the main file
332   OSD_Path mainfile ( filename );
333   mainfile.SetName ( "" );
334   mainfile.SetExtension ( "" );
335   TCollection_AsciiString dpath;
336   mainfile.SystemName ( dpath );
337
338   STEPCAFControl_IteratorOfDictionaryOfExternFile it ( myFiles );
339   for ( ; it.More(); it.Next() ) {
340     Handle(STEPCAFControl_ExternFile) EF = it.Value();
341     if ( EF->GetWriteStatus() != IFSelect_RetVoid ) continue;
342
343     // construct extern file name
344     TCollection_AsciiString fname = OSD_Path::AbsolutePath ( dpath, EF->GetName()->String() );
345     if ( fname.Length() <= 0 ) fname = EF->GetName()->String();
346 #ifdef OCCT_DEBUG
347     cout << "Writing external file: " << fname.ToCString() << endl;
348 #endif
349     
350     EF->SetWriteStatus ( EF->GetWS()->SendAll ( fname.ToCString() ) );
351   }
352
353   return status;
354 }
355
356
357 //=======================================================================
358 //function : Transfer
359 //purpose  :
360 //=======================================================================
361
362 Standard_Boolean STEPCAFControl_Writer::Transfer( const Handle(TDocStd_Document) &doc,
363                                                   const STEPControl_StepModelType mode,
364                                                   const Standard_CString multi )
365 {
366   Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( doc->Main() );
367   if ( STool.IsNull() ) return Standard_False;
368
369   TDF_LabelSequence labels;
370   STool->GetFreeShapes ( labels );
371   return Transfer ( myWriter, labels, mode, multi );
372 }
373
374
375 //=======================================================================
376 //function : Transfer
377 //purpose  :
378 //=======================================================================
379
380 Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_Label& L,
381                                                   const STEPControl_StepModelType mode,
382                                                   const Standard_CString multi )
383 {
384   TDF_LabelSequence labels;
385   labels.Append ( L );
386   return Transfer ( myWriter, labels, mode, multi );
387 }
388
389 //=======================================================================
390 //function : Transfer
391 //purpose  :
392 //=======================================================================
393
394 Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_LabelSequence& labels,
395                                                   const STEPControl_StepModelType mode,
396                                                   const Standard_CString multi )
397 {
398   return Transfer( myWriter, labels, mode, multi );
399 }
400
401 //=======================================================================
402 //function : Perform
403 //purpose  :
404 //=======================================================================
405
406 Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc,
407                                                  const Standard_CString filename)
408 {
409   if ( ! Transfer ( doc ) ) return Standard_False;
410   return Write ( filename ) == IFSelect_RetDone;
411 }
412
413
414 //=======================================================================
415 //function : Perform
416 //purpose  :
417 //=======================================================================
418
419 Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc,
420                                                  const TCollection_AsciiString &filename)
421 {
422   if ( ! Transfer ( doc ) ) return Standard_False;
423   return Write ( filename.ToCString() ) == IFSelect_RetDone;
424 }
425
426
427 //=======================================================================
428 //function : ExternFiles
429 //purpose  :
430 //=======================================================================
431
432 const Handle(STEPCAFControl_DictionaryOfExternFile) &STEPCAFControl_Writer::ExternFiles () const
433 {
434   return myFiles;
435 }
436
437
438 //=======================================================================
439 //function : ExternFile
440 //purpose  :
441 //=======================================================================
442
443 Standard_Boolean STEPCAFControl_Writer::ExternFile (const TDF_Label &L,
444                                                     Handle(STEPCAFControl_ExternFile) &ef) const
445 {
446   ef.Nullify();
447   if ( ! myLabEF.IsBound ( L ) ) return Standard_False;
448   ef = myLabEF.Find ( L );
449   return Standard_True;
450 }
451
452
453 //=======================================================================
454 //function : ExternFile
455 //purpose  :
456 //=======================================================================
457
458 Standard_Boolean STEPCAFControl_Writer::ExternFile (const Standard_CString name,
459                                                     Handle(STEPCAFControl_ExternFile) &ef) const
460 {
461   ef.Nullify();
462   if ( ! myFiles.IsNull() || ! myFiles->HasItem ( name ) )
463     return Standard_False;
464   ef = myFiles->Item ( name );
465   return Standard_True;
466 }
467
468
469 //=======================================================================
470 //function : Writer
471 //purpose  :
472 //=======================================================================
473
474 STEPControl_Writer &STEPCAFControl_Writer::ChangeWriter ()
475 {
476   return myWriter;
477 }
478
479
480 //=======================================================================
481 //function : Writer
482 //purpose  :
483 //=======================================================================
484
485 const STEPControl_Writer &STEPCAFControl_Writer::Writer () const
486 {
487   return myWriter;
488 }
489
490
491 //=======================================================================
492 //function : Transfer
493 //purpose  :
494 //=======================================================================
495
496 Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer,
497                                                   const TDF_LabelSequence &labels,
498                                                   const STEPControl_StepModelType mode,
499                                                   const Standard_CString multi,
500                                                   const Standard_Boolean isExternFile)
501 {
502   if ( labels.Length() <=0 ) return Standard_False;
503
504   Handle(STEPCAFControl_ActorWrite) Actor =
505     Handle(STEPCAFControl_ActorWrite)::DownCast ( writer.WS()->NormAdaptor()->ActorWrite() );
506
507   // translate free top-level shapes of the DECAF document
508   Standard_Integer ap = Interface_Static::IVal ("write.step.schema");
509   TDF_LabelSequence sublabels;
510   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
511     TDF_Label L = labels.Value(i);
512     TopoDS_Shape dummy;
513     if ( myLabels.IsBound ( L ) ) continue; // already processed
514
515     TopoDS_Shape shape = XCAFDoc_ShapeTool::GetShape ( L );
516     if ( shape.IsNull() ) continue;
517     
518     // write shape either as a whole, or as multifile (with extern refs)
519     if ( ! multi  ) {
520       Actor->SetStdMode ( Standard_False );
521
522       TDF_LabelSequence comp;
523
524       //for case when only part of assemby structure should be written in the document
525       //if specified label is component of the assembly then
526       //in order to save location of this component in the high-level assembly
527       //and save name of high-level assembly it is necessary to represent structure of high-level assembly 
528       //as assembly with one component specified by current label. 
529       //For that compound containing only specified component is binded to the label of the high-level assembly.
530       //The such way full structure of high-level assembly was replaced on the assembly contaning one component.
531       if ( XCAFDoc_ShapeTool::IsComponent ( L ) )
532       {
533         TopoDS_Compound aComp;
534         BRep_Builder aB;
535         aB.MakeCompound(aComp);
536         aB.Add(aComp, shape);
537         shape = aComp; 
538         comp.Append(L);
539         TDF_Label ref;
540         if ( XCAFDoc_ShapeTool::GetReferredShape ( L, ref ) )
541         {
542           if(XCAFDoc_ShapeTool::IsAssembly ( ref))
543             XCAFDoc_ShapeTool::GetComponents ( ref, comp, Standard_True );
544         }
545         L = L.Father();
546       }
547       else
548       {
549         // fill sequence of (sub) shapes for which attributes should be written
550         // and set actor to handle assemblies in a proper way
551         if(XCAFDoc_ShapeTool::IsAssembly ( L ))
552           XCAFDoc_ShapeTool::GetComponents ( L, comp, Standard_True );
553       }
554       
555       for ( Standard_Integer k=1; k <= comp.Length(); k++ ) {
556         TDF_Label ref;
557         if ( ! XCAFDoc_ShapeTool::GetReferredShape ( comp(k), ref ) ) continue;
558         if ( ! myLabels.IsBound ( ref ) ) {
559           TopoDS_Shape refS = XCAFDoc_ShapeTool::GetShape ( ref );
560           myLabels.Bind ( ref, refS );
561           sublabels.Append ( ref );
562           if ( XCAFDoc_ShapeTool::IsAssembly ( ref ) )
563             Actor->RegisterAssembly ( refS );
564         }
565       }
566       myLabels.Bind ( L, shape );
567       sublabels.Append ( L );
568       if ( XCAFDoc_ShapeTool::IsAssembly ( L ) )
569         Actor->RegisterAssembly ( shape );
570
571       writer.Transfer(shape,mode,Standard_False);
572       Actor->SetStdMode ( Standard_True ); // restore default behaviour
573     }
574     else {
575       // translate final solids
576       TopoDS_Shape Sass = TransferExternFiles ( L, mode, sublabels, multi );
577
578       // translate main assembly structure
579 /*
580       if ( ap == 3 ) { // if AP203, switch to AP214
581         Interface_Static::SetCVal ("write.step.schema", "AP214DIS");
582         Handle(StepData_StepModel) model = 
583           Handle(StepData_StepModel)::DownCast ( writer.WS()->Model() );
584         if ( model->HasHeaderEntity(STANDARD_TYPE(HeaderSection_FileSchema)) ) {
585           Handle(HeaderSection_FileSchema) fs = 
586             Handle(HeaderSection_FileSchema)::DownCast ( model->HeaderEntity(STANDARD_TYPE(HeaderSection_FileSchema)) );
587           Handle(TCollection_HAsciiString) str = fs->SchemaIdentifiersValue ( 1 );
588           Handle(TCollection_HAsciiString) ap214 = new TCollection_HAsciiString ( "AUTOMOTIVE_DESIGN" );
589           if ( str->Search ( ap214 ) <0 ) {
590             str->Clear();
591             str->AssignCat ( ap214 );
592           }
593         }
594       }
595 */      
596       Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly");
597       Interface_Static::SetCVal ("write.step.assembly", "On");
598       writer.Transfer ( Sass, STEPControl_AsIs );
599       Interface_Static::SetIVal ("write.step.assembly", assemblymode);
600       Interface_Static::SetIVal ("write.step.schema", ap);
601     }
602   }
603
604   writer.WS()->ComputeGraph(Standard_True );// added by skl 03.11.2003 since we use
605                                             // writer.Transfer() wihtout compute graph
606
607   // write names
608   if ( GetNameMode() )
609     WriteNames ( writer.WS(), sublabels );
610
611   if ( !multi ) {
612     // write colors
613     if ( GetColorMode() )
614       WriteColors ( writer.WS(), sublabels );
615     
616     // write layers
617     if ( GetLayerMode() )
618       WriteLayers ( writer.WS(), sublabels );
619
620     // write SHUO entities
621     if ( GetSHUOMode() && !isExternFile ) 
622       // do not store SHUO for extern reference for the moment
623       WriteSHUOs (  writer.WS(), sublabels );
624     
625     // write G&DTs
626     if(GetDimTolMode()) {
627       if (ap == 5) {
628         WriteDGTsAP242(writer.WS(), sublabels);
629       }
630       else {
631         WriteDGTs(writer.WS(), sublabels);
632       }
633     }
634
635     // write Materials
636     if(GetMaterialMode())
637       WriteMaterials(writer.WS(),sublabels);
638
639     // register all MDGPRs in model
640     const Handle(Interface_InterfaceModel) &Model = writer.WS()->Model();
641     MoniTool_DataMapIteratorOfDataMapOfShapeTransient anItr(myMapCompMDGPR);
642     for (; anItr.More(); anItr.Next())
643       Model->AddWithRefs( anItr.Value() );
644   }
645   
646   if ( multi ) { // external refs
647     WriteExternRefs ( writer.WS(), sublabels );
648   }
649
650   // write validation props
651 //  if ( multi && ap ==3 ) {
652 //      Interface_Static::SetCVal ("write.step.schema", "AP214DIS");
653 //  }
654   if ( GetPropsMode() ) 
655     WriteValProps ( writer.WS(), sublabels, multi );
656
657   Interface_Static::SetIVal ("write.step.schema", ap);
658
659   // refresh graph
660   writer.WS()->ComputeGraph ( Standard_True );
661
662   /* ================================
663     *  Write names for the sub-shapes
664     * ================================ */
665
666   if ( Interface_Static::IVal("write.stepcaf.subshapes.name") )
667   {
668     const Handle(XSControl_TransferWriter) &TW = this->ChangeWriter().WS()->TransferWriter();
669     const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
670
671     for ( int i = 1; i <= labels.Length(); i++ )
672     {
673       TDF_Label L = labels.Value(i);
674
675       for ( TDF_ChildIterator it(L, Standard_True); it.More(); it.Next() )
676       {
677         TDF_Label SubL = it.Value();
678
679         // Access name recorded in OCAF TDataStd_Name attribute
680         Handle(TCollection_HAsciiString) hSubName = new TCollection_HAsciiString;
681         if ( !GetLabelName(SubL, hSubName) )
682           continue;
683
684         // Access topological data
685         TopoDS_Shape SubS = XCAFDoc_ShapeTool::GetShape(SubL);
686         if ( SubS.IsNull() )
687           continue;
688
689         // Access the correspondent STEP Representation Item
690         Handle(StepRepr_RepresentationItem) RI;
691         Handle(TransferBRep_ShapeMapper) aShMapper = TransferBRep::ShapeMapper(FP, SubS);
692         if ( !FP->FindTypedTransient(aShMapper, STANDARD_TYPE(StepRepr_RepresentationItem), RI) )
693           continue;
694
695         // Record the name
696         RI->SetName(hSubName);
697       }
698     }
699   }
700
701   return Standard_True;
702 }
703
704
705 //=======================================================================
706 //function : TransferExternFiles
707 //purpose  :
708 //=======================================================================
709
710 TopoDS_Shape STEPCAFControl_Writer::TransferExternFiles (const TDF_Label &L,
711                                                          const STEPControl_StepModelType mode,
712                                                          TDF_LabelSequence &labels,
713                                                          const Standard_CString prefix)
714 {
715   // if label already translated, just return the shape
716   if ( myLabels.IsBound ( L ) ) {
717     return myLabels.Find ( L );
718   }
719
720   TopoDS_Compound C;
721   BRep_Builder B;
722   B.MakeCompound ( C );
723   //labels.Append ( L ); 
724   // if not assembly, write to separate file
725   if ( ! XCAFDoc_ShapeTool::IsAssembly ( L ) && !XCAFDoc_ShapeTool::IsComponent ( L )) {
726     labels.Append ( L );
727     // prepare for transfer
728     Handle(XSControl_WorkSession) newWS = new XSControl_WorkSession;
729     newWS->SelectNorm ( "STEP" );
730     STEPControl_Writer sw ( newWS, Standard_True );
731     TDF_LabelSequence Lseq;
732     Lseq.Append ( L );
733
734     // construct the name for extern file
735     Handle(TCollection_HAsciiString) basename = new TCollection_HAsciiString;
736     if ( prefix && prefix[0] ) basename->AssignCat ( prefix );
737     GetLabelName ( L, basename );
738     Handle(TCollection_HAsciiString) name = new TCollection_HAsciiString ( basename );
739     name->AssignCat ( ".stp" );
740     if ( myFiles->HasItem ( name->ToCString() ) ) { // avoid confusions
741       for ( Standard_Integer k=1; k < 32000; k++ ) {
742         name = new TCollection_HAsciiString ( basename );
743         name->AssignCat ( "_" );
744         name->AssignCat ( TCollection_AsciiString ( k ).ToCString() );
745         name->AssignCat ( ".stp" );
746         if ( ! myFiles->HasItem ( name->ToCString() ) ) break;
747       }
748     }
749
750     // translate and record extern file
751     Handle(STEPCAFControl_ExternFile) EF = new STEPCAFControl_ExternFile;
752     EF->SetWS ( newWS );
753     EF->SetName ( name );
754     EF->SetLabel ( L );
755     Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly");
756     Interface_Static::SetCVal ("write.step.assembly", "Off");
757     const Standard_CString multi = 0;
758     EF->SetTransferStatus ( Transfer ( sw, Lseq, mode, multi, Standard_True ) );
759     Interface_Static::SetIVal ("write.step.assembly", assemblymode);
760     myLabEF.Bind ( L, EF );
761     myFiles->SetItem ( name->ToCString(), EF );
762
763     // return empty compound as replacement for the shape
764     myLabels.Bind ( L, C );
765     return C;
766   }
767   TDF_LabelSequence comp;
768   TDF_Label aCurL = L;
769   //if specified shape is component then high-level assembly is considered
770   //to get valid structure with location
771   if ( XCAFDoc_ShapeTool::IsComponent ( L ) )
772   {
773     comp.Append(L);
774     aCurL = L.Father();
775   }
776   // else iterate on components add create structure of empty compounds
777   // representing the assembly
778   else if (XCAFDoc_ShapeTool::IsAssembly ( L ))
779     XCAFDoc_ShapeTool::GetComponents ( L, comp, Standard_False );
780
781   labels.Append ( aCurL );
782   for ( Standard_Integer k=1; k <= comp.Length(); k++ ) {
783     TDF_Label lab = comp(k);
784     TDF_Label ref;
785     if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, ref ) ) continue;
786     TopoDS_Shape Scomp = TransferExternFiles ( ref, mode, labels, prefix );
787     Scomp.Location ( XCAFDoc_ShapeTool::GetLocation ( lab ) );
788     B.Add ( C, Scomp );
789   }
790   myLabels.Bind ( aCurL, C );
791   return C;
792 }
793
794
795 //=======================================================================
796 //function : WriteExternRefs
797 //purpose  :
798 //=======================================================================
799
800 Standard_Boolean STEPCAFControl_Writer::WriteExternRefs (const Handle(XSControl_WorkSession) &WS,
801                                                          const TDF_LabelSequence &labels) const
802 {
803   if ( labels.Length() <=0 ) return Standard_False;
804
805   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
806   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
807   STEPConstruct_ExternRefs EFTool ( WS );
808   Standard_Integer schema = Interface_Static::IVal("write.step.schema");
809   for ( Standard_Integer k=1; k <= labels.Length(); k++ ) {
810     TDF_Label lab = labels(k);
811     if ( XCAFDoc_ShapeTool::IsAssembly ( lab ) ) continue; // skip assemblies
812
813     // get extern file
814     Handle(STEPCAFControl_ExternFile) EF;
815     if ( ! ExternFile ( lab, EF ) ) continue; // should never be
816
817     // find SDR
818     if ( ! myLabels.IsBound ( lab ) ) continue; // not recorded as translated, skip
819     TopoDS_Shape S = myLabels.Find ( lab );
820
821     Handle(StepShape_ShapeDefinitionRepresentation) SDR;
822     Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
823     if ( ! FP->FindTypedTransient ( mapper, STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation), SDR ) ) {
824 #ifdef OCCT_DEBUG
825       cout << "Warning: Cannot find SDR for " << S.TShape()->DynamicType()->Name() << endl;
826 #endif
827       continue;
828     }
829
830     // add extern ref
831     const Standard_CString format = (const Standard_CString) ( schema == 3 ? "STEP AP203" : "STEP AP214" );
832     // try to get PD from SDR
833     StepRepr_RepresentedDefinition RD = SDR->Definition();
834     Handle(StepRepr_PropertyDefinition) aPropDef = RD.PropertyDefinition();
835     if (aPropDef.IsNull()) {
836 #ifdef OCCT_DEBUG
837       cout << "Warning: STEPCAFControl_Writer::WriteExternRefs StepRepr_PropertyDefinition is null for " << S.TShape()->DynamicType()->Name() << endl;
838 #endif
839       continue;
840     }
841     StepRepr_CharacterizedDefinition CharDef = aPropDef->Definition();
842     Handle(StepBasic_ProductDefinition) PD = CharDef.ProductDefinition();
843     if (PD.IsNull()) {
844 #ifdef OCCT_DEBUG
845       cout << "Warning: STEPCAFControl_Writer::WriteExternRefs StepBasic_ProductDefinition is null for " << S.TShape()->DynamicType()->Name() << endl;
846 #endif
847       continue;
848     }
849     EFTool.AddExternRef ( EF->GetName()->ToCString(), PD, format );
850   }
851   EFTool.WriteExternRefs(schema);
852   return Standard_True;
853 }
854
855
856 //=======================================================================
857 //function : FindEntities
858 //purpose  : auxilary
859 //=======================================================================
860 static Standard_Integer FindEntities (const Handle(Transfer_FinderProcess) &FP,
861                                       const TopoDS_Shape &S,
862                                       TopLoc_Location &L,
863                                       TColStd_SequenceOfTransient &seqRI)
864 {
865   Handle(StepRepr_RepresentationItem) item = STEPConstruct::FindEntity ( FP, S, L );
866
867   if ( ! item.IsNull() ) {
868     seqRI.Append ( item );
869     return 1;
870   }
871       
872   // may be S was splited during shape processing
873   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
874   Handle(Transfer_Binder) bnd = FP->Find ( mapper );
875   if ( bnd.IsNull() ) return 0;
876   
877   Handle(Transfer_TransientListBinder) TransientListBinder =
878     //Handle(Transfer_TransientListBinder)::DownCast( bnd->Next(Standard_True) );
879     Handle(Transfer_TransientListBinder)::DownCast( bnd );
880   Standard_Integer nres=0;
881   if ( TransientListBinder.IsNull() && S.ShapeType() == TopAbs_COMPOUND) 
882   {
883     for ( TopoDS_Iterator it(S); it.More(); it.Next() ) {
884       Handle(StepRepr_RepresentationItem) aLocalItem = STEPConstruct::FindEntity ( FP, it.Value(), L );
885       if (aLocalItem.IsNull() ) continue;
886       nres++;
887       seqRI.Append (aLocalItem);
888     }
889   }
890   else
891   {
892     const Standard_Integer nb = TransientListBinder->NbTransients();
893     for (Standard_Integer i=1; i<=nb; i++) {
894       Handle(Standard_Transient) t = TransientListBinder->Transient(i);
895       item = Handle(StepRepr_RepresentationItem)::DownCast(t);
896       if ( item.IsNull() ) continue;
897       nres++;
898       seqRI.Append ( item );
899     }
900   }
901 /*  works but is obsolete: another approach
902   if (i<=nb) {
903     TopoDS_Shape comp = TransferBRep::ShapeResult(bnd);
904     if ( ! comp.IsNull() && comp.ShapeType() < S.ShapeType() ) {
905       for ( TopoDS_Iterator it(comp); it.More(); it.Next() ) {
906         MakeSTEPStyles(Styles, it.Value(), settings, STEPstyle, 
907                        Map, ( hasOwn ? &style : 0 ) );
908       }
909     }
910   }
911 */
912   return nres;
913 }
914
915
916 //=======================================================================
917 //function : getStyledItem
918 //purpose  : auxilary
919 //=======================================================================
920 static Standard_Boolean getStyledItem(const TopoDS_Shape& S,
921                                       const Handle(XCAFDoc_ShapeTool)& STool,
922                                       const STEPConstruct_Styles &Styles, 
923                                       Handle(StepVisual_StyledItem) &resSelItem,
924                                       const MoniTool_DataMapOfShapeTransient& myMapCompMDGPR)
925 {
926   TDF_Label aTopShL = STool->FindShape(S, Standard_False);
927   TopoDS_Shape aTopLevSh = STool->GetShape( aTopShL );
928   Standard_Boolean found = Standard_False;
929   if ( !aTopLevSh.IsNull() &&  myMapCompMDGPR.IsBound( aTopLevSh ) ) {
930     Handle(StepVisual_PresentationRepresentation) aMDGPR = 
931       Handle(StepVisual_PresentationRepresentation)::DownCast( myMapCompMDGPR.Find( aTopLevSh ) );
932     Handle(StepRepr_HArray1OfRepresentationItem) anSelItmHArr = aMDGPR->Items();
933     // search for PSA of Monifold solid
934     if ( !anSelItmHArr.IsNull() )
935     {
936       for (Standard_Integer si = 1; si <= anSelItmHArr->Length(); si++) {
937         Handle(StepVisual_StyledItem) aSelItm =
938           Handle(StepVisual_StyledItem)::DownCast(anSelItmHArr->Value(si));
939
940         if ( aSelItm.IsNull() ) 
941           continue;
942
943         // check that it is a stiled item for monifold solid brep
944         TopLoc_Location Loc;
945         TColStd_SequenceOfTransient aNewseqRI;
946         FindEntities ( Styles.FinderProcess(), aTopLevSh, Loc, aNewseqRI );
947         if ( aNewseqRI.Length() > 0 )
948         {
949           
950           Handle(StepRepr_RepresentationItem) anItem = aSelItm->Item();
951           Standard_Boolean isSameMonSolBR = Standard_False;
952           for (Standard_Integer mi = 1; mi <= aNewseqRI.Length(); mi++) {
953             if ( !anItem.IsNull() && anItem == aNewseqRI.Value( mi ) ) {
954               isSameMonSolBR = Standard_True;
955               break;
956             }
957           }
958           if (!isSameMonSolBR)
959             continue;
960         }
961         
962         
963         for (Standard_Integer jsi = 1; jsi <= aSelItm->NbStyles() && !found; jsi++) {
964           Handle(StepVisual_PresentationStyleAssignment) aFatherPSA = aSelItm->StylesValue(jsi);
965           // check for PSA for top-level (not Presentation style by contex for NAUO)
966           if (aFatherPSA.IsNull() || aFatherPSA->IsKind(STANDARD_TYPE(StepVisual_PresentationStyleByContext)))
967             continue;
968           resSelItem = aSelItm;
969           found = Standard_True;
970         }
971       }
972     }
973   }
974   return found;
975 }
976
977
978 //=======================================================================
979 //function : setDefaultInstanceColor
980 //purpose  : auxilary
981 //=======================================================================
982 static Standard_Boolean setDefaultInstanceColor (const Handle(StepVisual_StyledItem) &aSelItm,
983                                                  Handle(StepVisual_PresentationStyleAssignment)& PSA)
984 {
985    Standard_Boolean found = Standard_False;
986   for (Standard_Integer jsi = 1; jsi <= aSelItm->NbStyles() && !found; jsi++) {
987     Handle(StepVisual_PresentationStyleAssignment) aFatherPSA = aSelItm->StylesValue(jsi);
988   // check for PSA for top-level (not Presentation style by contex for NAUO)
989   if (aFatherPSA.IsNull() || aFatherPSA->IsKind(STANDARD_TYPE(StepVisual_PresentationStyleByContext))) 
990     return Standard_False;
991           
992   // get style select from father PSA
993   if (aFatherPSA->NbStyles() > 0) {
994     Handle(StepVisual_HArray1OfPresentationStyleSelect) aFatherStyles =
995       new StepVisual_HArray1OfPresentationStyleSelect(1, aFatherPSA->NbStyles());
996     for (Standard_Integer k = 1; k <= aFatherPSA->NbStyles(); k++) {
997       StepVisual_PresentationStyleSelect PSS;
998       StepVisual_PresentationStyleSelect olDPSS = aFatherPSA->StylesValue(k);
999       if (!olDPSS.PointStyle().IsNull())
1000         PSS.SetValue (olDPSS.PointStyle());
1001       else if (!olDPSS.CurveStyle().IsNull())
1002         PSS.SetValue (olDPSS.CurveStyle());
1003       else if (!olDPSS.SurfaceStyleUsage().IsNull())
1004         PSS.SetValue (olDPSS.SurfaceStyleUsage());
1005       else {
1006         found = Standard_False;
1007         break;
1008       }
1009       //aFatherStyles->SetValue( k, PSS );
1010       aFatherStyles->SetValue( k, olDPSS );
1011       found = Standard_True;
1012     }
1013             // init PSA of NAUO
1014     if (found) {
1015       PSA->Init( aFatherStyles );
1016     }
1017   }
1018     
1019   }
1020   return found;
1021 }
1022
1023
1024 //=======================================================================
1025 //function : MakeSTEPStyles
1026 //purpose  : auxilary
1027 //=======================================================================
1028 static void MakeSTEPStyles (STEPConstruct_Styles &Styles,
1029                             const TopoDS_Shape &S,
1030                             const XCAFPrs_DataMapOfShapeStyle &settings,
1031                             Handle(StepVisual_StyledItem) &override,
1032                             TopTools_MapOfShape &Map,
1033                             const MoniTool_DataMapOfShapeTransient& myMapCompMDGPR,
1034                             STEPConstruct_DataMapOfAsciiStringTransient &DPDCs,
1035                             STEPConstruct_DataMapOfPointTransient &ColRGBs,
1036                             const Handle(XCAFDoc_ColorTool)& CTool,
1037                             const XCAFPrs_Style *inherit = 0,
1038                             const Standard_Boolean isComponent = Standard_False)
1039 {
1040   // skip already processed shapes
1041   if ( ! Map.Add ( S ) ) return;
1042
1043   // check if shape has its own style (r inherits from ancestor)
1044   XCAFPrs_Style style;
1045   if ( inherit ) style = *inherit;
1046   if ( settings.IsBound(S) ) {
1047     XCAFPrs_Style own = settings.Find(S);
1048     if ( !own.IsVisible() ) style.SetVisibility ( Standard_False );
1049     if ( own.IsSetColorCurv() ) style.SetColorCurv ( own.GetColorCurv() );
1050     if ( own.IsSetColorSurf() ) style.SetColorSurf ( own.GetColorSurf() );
1051   }
1052
1053   // translate colors to STEP
1054   Handle(StepVisual_Colour) surfColor, curvColor;
1055   if ( style.IsSetColorSurf() )
1056     surfColor = Styles.EncodeColor(style.GetColorSurf(),DPDCs,ColRGBs);
1057   if ( style.IsSetColorCurv() )
1058     curvColor = Styles.EncodeColor(style.GetColorCurv(),DPDCs,ColRGBs);
1059   
1060   Standard_Boolean hasOwn = ( ! surfColor.IsNull() || 
1061                               ! curvColor.IsNull() ||
1062                               ! style.IsVisible() );
1063
1064   // find target item and assign style to it
1065   Handle(StepVisual_StyledItem) STEPstyle = override;
1066   if ( hasOwn ) {
1067     if ( S.ShapeType() != TopAbs_COMPOUND || isComponent ) { // skip compounds, let subshapes inherit its colors
1068       TopLoc_Location L;
1069       TColStd_SequenceOfTransient seqRI;
1070       Standard_Integer nb = FindEntities ( Styles.FinderProcess(), S, L, seqRI );
1071 #ifdef OCCT_DEBUG
1072       if ( nb <=0 ) cout << "Warning: Cannot find RI for " << S.TShape()->DynamicType()->Name() << endl;
1073 #endif
1074       //Get overridden style gka 10.06.03
1075       if ( isComponent && nb) 
1076         getStyledItem(S, CTool->ShapeTool(), Styles, override,myMapCompMDGPR);
1077        
1078            
1079       for ( Standard_Integer i=1; i <= nb; i++ ) {
1080         Handle(StepRepr_RepresentationItem) item = 
1081           Handle(StepRepr_RepresentationItem)::DownCast(seqRI(i));
1082         Handle(StepVisual_PresentationStyleAssignment) PSA;
1083         if ( style.IsVisible() || !surfColor.IsNull() || !curvColor.IsNull() ) {
1084           PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent );
1085         }
1086         else {
1087           // default white color
1088           surfColor = Styles.EncodeColor(Quantity_Color(1,1,1,Quantity_TOC_RGB),DPDCs,ColRGBs);
1089           PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent );
1090           if ( isComponent ) 
1091             setDefaultInstanceColor( override, PSA);
1092           
1093         } // end of component case
1094         
1095         STEPstyle = Styles.AddStyle ( item, PSA, override );
1096         hasOwn = Standard_False;
1097       }
1098     }
1099   }
1100
1101   // iterate on subshapes (except vertices :)
1102   if ( S.ShapeType() == TopAbs_EDGE ) return;
1103   if ( !isComponent ) // PTV 10.02.2003
1104     for ( TopoDS_Iterator it(S); it.More(); it.Next() ) {
1105       MakeSTEPStyles ( Styles, it.Value(), settings, STEPstyle,
1106                       Map, myMapCompMDGPR, DPDCs, ColRGBs, CTool,
1107                       ( hasOwn ? &style : 0 ) );
1108     }
1109 }
1110
1111 /*
1112 static Standard_Boolean getFatherColor (const TDF_Label& L,
1113                                         const Handle(XCAFDoc_ColorTool)& CTool,
1114                                         XCAFPrs_Style& style)
1115 {
1116   Standard_Boolean done = Standard_False;
1117   TopoDS_Shape aSh = CTool->ShapeTool()->GetShape( L );
1118   TDF_Label aFL = CTool->ShapeTool()->FindShape( aSh );
1119   if (aFL.IsNull() || aFL == L)
1120     return done;
1121   Quantity_Color C;
1122   if ( CTool->GetColor ( aFL, XCAFDoc_ColorGen, C ) ) {
1123     style.SetColorCurv ( C );
1124     style.SetColorSurf ( C );
1125     done = Standard_True;
1126   }
1127   if ( CTool->GetColor ( aFL, XCAFDoc_ColorSurf, C ) ) {
1128     style.SetColorSurf ( C );
1129     done = Standard_True;
1130   }
1131   if ( CTool->GetColor ( aFL, XCAFDoc_ColorCurv, C ) ) {
1132     style.SetColorCurv ( C );
1133     done = Standard_True;
1134   }
1135   
1136   return done;
1137 }
1138 */
1139
1140
1141 //=======================================================================
1142 //function : WriteColors
1143 //purpose  : 
1144 //=======================================================================
1145
1146 Standard_Boolean STEPCAFControl_Writer::WriteColors (const Handle(XSControl_WorkSession) &WS,
1147                                                      const TDF_LabelSequence &labels)
1148 {
1149   if ( labels.Length() <=0 ) return Standard_False;
1150
1151   // Iterate on shapes in the document
1152   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( labels(1) );
1153   if ( CTool.IsNull() ) return Standard_False;
1154
1155   STEPConstruct_Styles Styles ( WS );
1156   STEPConstruct_DataMapOfAsciiStringTransient DPDCs;
1157   STEPConstruct_DataMapOfPointTransient ColRGBs;
1158   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1159     TDF_Label L = labels.Value(i);
1160
1161     Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool( labels(1) );
1162     // Skip assemblies: colors assigned to assemblies and their instances
1163     // are not supported (it is not clear how to encode that in STEP)
1164     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1165 #ifdef OCCT_DEBUG
1166       cout << "Warning: Cannot write color  for Assembly" << endl;
1167       cout << "Info: Check for colors assigned to components in assembly" << endl;
1168 #endif
1169       // PTV 22.01.2003 Write color for instances.
1170       TDF_LabelSequence compLabels;
1171       if ( aSTool.IsNull() )
1172         continue;
1173       if (!aSTool->GetComponents(L, compLabels))
1174         continue;
1175       WriteColors(WS, compLabels);
1176       continue;
1177     }
1178     Styles.ClearStyles();
1179
1180     // get a target shape and try to find corresponding context
1181     // (all the colors set under that label will be put into that context)
1182     TopoDS_Shape S;
1183     if ( ! XCAFDoc_ShapeTool::GetShape ( L, S ) ) continue;
1184     Standard_Boolean isComponent = aSTool->IsComponent( L );
1185     TopoDS_Shape aTopSh = S;
1186     Handle(StepRepr_RepresentationContext) Context = Styles.FindContext ( S );
1187     if ( isComponent ) {
1188       TDF_Label aTopShL = aSTool->FindShape(S, Standard_False);
1189       if (aTopShL.IsNull())
1190         continue;
1191       aTopSh = aSTool->GetShape( aTopShL );
1192       Context = Styles.FindContext ( aTopSh );
1193     }
1194     if ( Context.IsNull() )
1195         continue;
1196     
1197     // collect settings set on that label
1198     XCAFPrs_DataMapOfShapeStyle settings;
1199     TDF_LabelSequence seq;
1200     seq.Append ( L );
1201     XCAFDoc_ShapeTool::GetSubShapes ( L, seq );
1202     Standard_Boolean isVisible = Standard_True;
1203     for ( Standard_Integer j = 1; j <= seq.Length(); j++ ) {
1204       TDF_Label lab = seq.Value(j);
1205       XCAFPrs_Style style;
1206       Quantity_Color C;
1207       if ( lab == L ) {
1208         // check for invisible status of object on label
1209         if ( !CTool->IsVisible( lab ) ) {
1210           isVisible = Standard_False;
1211           style.SetVisibility( Standard_False );
1212         }
1213       }
1214       if ( CTool->GetColor ( lab, XCAFDoc_ColorGen, C ) ) {
1215         style.SetColorCurv ( C );
1216         style.SetColorSurf ( C );
1217       }
1218       if ( CTool->GetColor ( lab, XCAFDoc_ColorSurf, C ) )
1219         style.SetColorSurf ( C );
1220       if ( CTool->GetColor ( lab, XCAFDoc_ColorCurv, C ) )
1221         style.SetColorCurv ( C );
1222       
1223       // commented, cause we are need to take reference from 
1224 //       if ( isComponent && lab == L && !isVisible)
1225 //         if ( !style.IsSetColorSurf() && !style.IsSetColorCurv() ) {
1226 //           getFatherColor ( L, CTool, style);
1227 //         }
1228       if ( ! style.IsSetColorCurv() && ! style.IsSetColorSurf() && isVisible ) continue;
1229
1230       TopoDS_Shape sub = XCAFDoc_ShapeTool::GetShape ( lab );
1231       settings.Bind ( sub, style );
1232     }
1233     
1234     if ( settings.Extent() <=0 ) continue;
1235
1236     // iterate on subshapes and create STEP styles
1237     Handle(StepVisual_StyledItem) override;
1238     TopTools_MapOfShape Map;
1239     
1240     MakeSTEPStyles(Styles,S,settings,override,Map,myMapCompMDGPR,DPDCs,ColRGBs,CTool,0,isComponent);
1241     
1242     // create MDGPR and record it in model
1243     Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation) aMDGPR;
1244
1245     if (!isComponent) {
1246       if ( myMapCompMDGPR.IsBound( aTopSh )) {
1247 #ifdef OCCT_DEBUG
1248         cerr << "Error: Current Top-Level shape have MDGPR already " << endl;
1249 #endif
1250       }
1251       Styles.CreateMDGPR ( Context, aMDGPR );
1252       if (!aMDGPR.IsNull())
1253         myMapCompMDGPR.Bind( aTopSh, aMDGPR );
1254     }
1255     else {
1256       // create SDR and add to model.
1257       const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
1258       const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
1259       Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
1260       Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1261       if ( FP->FindTypedTransient(mapper, 
1262                                   STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation),
1263                                   CDSR) ) {
1264         // create SDR for NAUO
1265         Handle(StepRepr_ProductDefinitionShape) nullPDS; // important to be NULL
1266         Styles.CreateNAUOSRD( Context, CDSR, nullPDS );
1267         
1268         // search for MDGPR of the component top-level shape
1269         if ( myMapCompMDGPR.IsBound( aTopSh )) {
1270           aMDGPR = Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation)::DownCast( myMapCompMDGPR.Find( aTopSh ) );
1271         } else {
1272           aMDGPR = new StepVisual_MechanicalDesignGeometricPresentationRepresentation;
1273           Handle(TCollection_HAsciiString) ReprName = new TCollection_HAsciiString ( "" );
1274           aMDGPR->SetName( ReprName );
1275           aMDGPR->SetContextOfItems( Context );
1276           myMapCompMDGPR.Bind ( aTopSh, aMDGPR );
1277         }
1278         Handle(StepRepr_HArray1OfRepresentationItem) oldItems = aMDGPR->Items();
1279         Standard_Integer oldLengthlen = 0;
1280         if (!oldItems.IsNull())
1281           oldLengthlen = oldItems->Length();
1282         const Standard_Integer nbIt = oldLengthlen + Styles.NbStyles();
1283         if(!nbIt)
1284           continue;
1285         Handle(StepRepr_HArray1OfRepresentationItem) newItems =
1286           new StepRepr_HArray1OfRepresentationItem(1, nbIt);
1287         Standard_Integer si;
1288         Standard_Integer el = 1;
1289         for ( si=1; si <= oldLengthlen; si++ )
1290           newItems->SetValue( el++, oldItems->Value( si ) );
1291         for ( si=1; si <= Styles.NbStyles(); si++ ) {
1292           newItems->SetValue( el++, Styles.Style(si));
1293         }
1294        
1295         if (newItems->Length() > 0)
1296           aMDGPR->SetItems( newItems );
1297       } //end of work with CDSR
1298     }
1299     if ( !isVisible ) {
1300     // create invisibility item and refer for stiledItem
1301       Handle(StepVisual_Invisibility) Invsblt = new StepVisual_Invisibility();
1302       Handle(StepVisual_HArray1OfInvisibleItem) HInvsblItm = 
1303         new StepVisual_HArray1OfInvisibleItem (1,Styles.NbStyles());
1304       // put all style item into the harray
1305       for ( Standard_Integer si=1; si <= Styles.NbStyles(); si++ ) {
1306         Handle(StepRepr_RepresentationItem) styledItm = Styles.Style(si);
1307         StepVisual_InvisibleItem anInvItem;
1308         anInvItem.SetValue( styledItm );
1309         HInvsblItm->SetValue( si, anInvItem );
1310       }
1311       // set the invisibility of items
1312       Invsblt->Init( HInvsblItm );
1313       WS->Model()->AddWithRefs( Invsblt );
1314     }
1315   }
1316
1317   return Standard_True;
1318 }
1319
1320
1321 //=======================================================================
1322 //function : WriteNames
1323 //purpose  :
1324 //=======================================================================
1325
1326 Standard_Boolean STEPCAFControl_Writer::WriteNames (const Handle(XSControl_WorkSession) &WS,
1327                                                     const TDF_LabelSequence &labels) const
1328 {
1329   if ( labels.Length() <=0 ) return Standard_False;
1330
1331   // get working data
1332   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
1333   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
1334
1335   // Iterate on requested shapes
1336   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1337     TDF_Label L = labels.Value(i);
1338
1339     // get name
1340     Handle(TCollection_HAsciiString) hName = new TCollection_HAsciiString;
1341     if ( ! GetLabelName (L, hName) ) continue;
1342 //    Handle(TDataStd_Name) N;
1343 //    if ( ! L.FindAttribute ( TDataStd_Name::GetID(), N ) ) continue;
1344 //    TCollection_ExtendedString name = N->Get();
1345 //    if ( name.Length() <=0 ) continue;
1346
1347     // find target STEP entity for the current shape
1348 //    TopoDS_Shape S;
1349 //    if ( ! XCAFDoc_ShapeTool::GetShape ( L, S ) ) continue;
1350     if ( ! myLabels.IsBound ( L ) ) continue; // not recorded as translated, skip
1351     TopoDS_Shape S = myLabels.Find ( L );
1352
1353     Handle(StepShape_ShapeDefinitionRepresentation) SDR;
1354     Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, S );
1355     if ( ! FP->FindTypedTransient ( mapper, STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation), SDR ) ) {
1356 #ifdef OCCT_DEBUG
1357       cout << "Warning: Cannot find SDR for " << S.TShape()->DynamicType()->Name() << endl;
1358 #endif
1359       continue;
1360     }
1361
1362     // set the name to the PRODUCT
1363     Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition();
1364     if ( PropD.IsNull() ) continue;
1365     Handle(StepBasic_ProductDefinition) PD = PropD->Definition().ProductDefinition();
1366     if ( PD.IsNull() ) continue;
1367     Handle(StepBasic_Product) Prod = PD->Formation()->OfProduct();
1368
1369     Prod->SetId ( hName );
1370     Prod->SetName ( hName );
1371
1372     // write names for components of assemblies
1373     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1374       TDF_LabelSequence seq;
1375       XCAFDoc_ShapeTool::GetComponents ( L, seq );
1376       for (Standard_Integer k=1; k <= seq.Length(); k++) {
1377         TDF_Label lab = seq(k);
1378
1379         // get shape with correct location
1380         TDF_Label Lref;
1381         if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, Lref ) || 
1382              ! myLabels.IsBound ( Lref ) ) continue;
1383         S = myLabels.Find ( Lref );
1384         S.Move ( XCAFDoc_ShapeTool::GetLocation ( lab ) );
1385         
1386         hName = new TCollection_HAsciiString;
1387         if ( ! GetLabelName (lab, hName) ) continue;
1388         
1389         // find the target CDSR corresponding to a shape
1390         mapper = TransferBRep::ShapeMapper ( FP, S );
1391         Handle(Transfer_Binder) binder = FP->Find ( mapper );
1392         Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1393         if ( ! FP->FindTypedTransient (mapper,STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation), CDSR) ) 
1394           continue;
1395         Handle(StepRepr_ProductDefinitionShape) PDS = CDSR->RepresentedProductRelation();
1396         Handle(StepBasic_ProductDefinitionRelationship) NAUO = PDS->Definition().ProductDefinitionRelationship();
1397         if ( ! NAUO.IsNull() ) NAUO->SetName ( hName );
1398       }
1399     }
1400   }
1401
1402   return Standard_True;
1403 }
1404
1405
1406 //=======================================================================
1407 //function : WritePropsForLabel
1408 //purpose  :
1409 //=======================================================================
1410 static Standard_Boolean WritePropsForLabel(const Handle(XSControl_WorkSession) &WS,
1411                                            const Handle(XCAFDoc_ShapeTool) &aSTool,
1412                                            const STEPCAFControl_DataMapOfLabelShape &myLabels,
1413                                            const TDF_Label &L,
1414                                            const Standard_CString multi)
1415 {
1416   if(L.IsNull()) return Standard_False;
1417
1418   STEPConstruct_ValidationProps Props ( WS );
1419
1420   TopoDS_Shape S = aSTool->GetShape(L);
1421   if(S.IsNull()) return Standard_False;
1422
1423   if ( ! multi || XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1424     // write area
1425     Handle(XCAFDoc_Area) A;
1426     L.FindAttribute ( XCAFDoc_Area::GetID(), A );
1427     if ( ! A.IsNull() ) {
1428       Props.AddArea ( S, A->Get() );
1429     }
1430     // write volume
1431     Handle(XCAFDoc_Volume) V;
1432     L.FindAttribute ( XCAFDoc_Volume::GetID(), V );
1433     if ( ! V.IsNull() ) {
1434       Props.AddVolume ( S, V->Get() );
1435     }
1436   }
1437   // write centroid
1438   Handle(XCAFDoc_Centroid) C;
1439   L.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1440   if ( ! C.IsNull() ) {
1441     Props.AddCentroid ( S, C->Get() );
1442   }
1443
1444   if( XCAFDoc_ShapeTool::IsCompound(L) || XCAFDoc_ShapeTool::IsAssembly(L) ) {
1445     if(L.HasChild()) {
1446       for(Standard_Integer ich=1; ich<=L.NbChildren(); ich++) {
1447         WritePropsForLabel(WS,aSTool,myLabels,L.FindChild(ich),multi);
1448       }
1449     }
1450   }
1451
1452   return Standard_True;
1453 }
1454
1455
1456 //=======================================================================
1457 //function : WriteValProps
1458 //purpose  :
1459 //=======================================================================
1460
1461 Standard_Boolean STEPCAFControl_Writer::WriteValProps (const Handle(XSControl_WorkSession) &WS,
1462                                                        const TDF_LabelSequence &labels,
1463                                                        const Standard_CString multi) const
1464 {
1465   if ( labels.Length() <=0 ) return Standard_False;
1466
1467   // get working data
1468 //  STEPConstruct_ValidationProps Props ( WS );
1469   Handle(XCAFDoc_ShapeTool) aSTool = XCAFDoc_DocumentTool::ShapeTool( labels(1) );
1470
1471   // Iterate on requested shapes
1472   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1473     TDF_Label L = labels.Value(i);
1474
1475     WritePropsForLabel(WS,aSTool,myLabels,L,multi);
1476 /*    
1477     // find target STEP entity for the current shape
1478     if ( ! myLabels.IsBound ( L ) ) continue; // not recorded as translated, skip
1479     TopoDS_Shape S = myLabels.Find ( L );
1480
1481     // write area and volume (except for components in multifile mode)
1482     if ( ! multi || XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1483       Handle(XCAFDoc_Area) A;
1484       L.FindAttribute ( XCAFDoc_Area::GetID(), A );
1485       if ( ! A.IsNull() ) Props.AddArea ( S, A->Get() );
1486
1487       Handle(XCAFDoc_Volume) V;
1488       L.FindAttribute ( XCAFDoc_Volume::GetID(), V );
1489       if ( ! V.IsNull() ) Props.AddVolume ( S, V->Get() );
1490     }
1491
1492     // write centroid
1493     Handle(XCAFDoc_Centroid) C;
1494     L.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1495     if ( ! C.IsNull() ) Props.AddCentroid ( S, C->Get() );
1496
1497     // write centroid for components of assemblies
1498     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1499       TDF_LabelSequence seq;
1500       XCAFDoc_ShapeTool::GetComponents ( L, seq );
1501       for (Standard_Integer k=1; k <= seq.Length(); k++) {
1502         TDF_Label lab = seq(k);
1503
1504         // get shape with correct location
1505         TDF_Label Lref;
1506         if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, Lref ) || 
1507              ! myLabels.IsBound ( Lref ) ) continue;
1508         TopLoc_Location Loc = XCAFDoc_ShapeTool::GetLocation ( lab );
1509         S = myLabels.Find ( Lref );
1510         S.Move ( Loc );
1511                 
1512         C.Nullify();
1513         lab.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1514         // if centroid is not assigned to an instance, 
1515         // use (shifted) centroid of original shape
1516         gp_Pnt center;
1517         if ( C.IsNull() ) {
1518           Lref.FindAttribute ( XCAFDoc_Centroid::GetID(), C );
1519           if ( C.IsNull() ) continue;
1520           center = C->Get().Transformed ( Loc.Transformation() );
1521         }
1522         else center = C->Get();
1523
1524         Props.AddCentroid ( S, center, Standard_True );
1525       }
1526     }
1527 */
1528   }
1529
1530   return Standard_True;
1531 }
1532
1533
1534 //=======================================================================
1535 //function : WriteLayers
1536 //purpose  : 
1537 //=======================================================================
1538
1539 Standard_Boolean STEPCAFControl_Writer::WriteLayers (const Handle(XSControl_WorkSession) &WS,
1540                                                      const TDF_LabelSequence  &labels ) const
1541 {
1542   
1543   if ( labels.Length() <=0 ) return Standard_False;
1544
1545   // get working data
1546   const Handle(Interface_InterfaceModel) &Model = WS->Model();
1547   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
1548   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
1549   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool( labels(1) );
1550   if (LTool.IsNull() ) return Standard_False;
1551
1552   TDF_LabelSequence LayerLS;
1553   LTool->GetLayerLabels(LayerLS);
1554   if ( LayerLS.Length() <=0 ) return Standard_False;
1555
1556   // Iterate on requested layers and for each layer take set of shapes.
1557   for ( Standard_Integer i=1; i <= LayerLS.Length(); i++ ) {
1558     TDF_Label L = LayerLS.Value(i);
1559     
1560     // get labels of shapes in that layer
1561     TDF_LabelSequence ShapeLs;
1562     LTool->GetShapesOfLayer(L, ShapeLs);
1563     if ( ShapeLs.Length() <=0 ) continue;
1564     
1565     // name of layer: if not set, is considered as being empty
1566     Handle(TCollection_HAsciiString) hName = new TCollection_HAsciiString;
1567     GetLabelName ( L, hName );
1568
1569     // Find target STEP entity for each shape and add to StepVisual_PresentationLayerAssignment items.
1570     TColStd_SequenceOfTransient seqRI;
1571     for ( Standard_Integer j=1; j <= ShapeLs.Length(); j++) {
1572       TDF_Label shLabel = ShapeLs.Value(j);
1573       if ( shLabel.IsNull() ) continue;
1574       
1575       // there is no way to assign layer to instance in STEP
1576       if ( XCAFDoc_ShapeTool::IsAssembly ( shLabel ) ||
1577            XCAFDoc_ShapeTool::IsReference ( shLabel ) )
1578         continue;
1579       
1580       // check that the shape is one of (uub)labels written during current transfer
1581       Standard_Integer k = 1;
1582       for ( ; k <= labels.Length(); k++ )
1583         if ( shLabel.IsDescendant ( labels(k) ) ) break;
1584       if ( k > labels.Length() ) continue;
1585
1586       // get target STEP entity
1587       TopoDS_Shape oneShape = XCAFDoc_ShapeTool::GetShape(shLabel);
1588       
1589       TopLoc_Location Loc;
1590       Standard_Integer nb = 
1591         FindEntities ( FP, oneShape, Loc, seqRI );
1592       if ( nb <=0 ) 
1593         FP->Messenger() << "Warning: Cannot find RI for " << oneShape.TShape()->DynamicType()->Name() << endl;
1594     }
1595     if ( seqRI.Length() <= 0 ) continue;
1596
1597     // analyze visibility
1598     Handle(StepVisual_PresentationLayerAssignment) StepLayerAs = new StepVisual_PresentationLayerAssignment;
1599     Handle(TCollection_HAsciiString) descr;
1600     Handle(TDataStd_UAttribute) aUAttr;
1601     Standard_Boolean isLinv = Standard_False;
1602     if (L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) {
1603       descr = new TCollection_HAsciiString ("invisible");
1604 #ifdef OCCT_DEBUG
1605       FP->Messenger() << "\tLayer \"" << hName->String().ToCString() << "\" is invisible"<<endl;
1606 #endif
1607       isLinv = Standard_True;
1608     }
1609     else descr = new TCollection_HAsciiString ("visible");
1610     
1611     // create layer entity
1612     Handle(StepVisual_HArray1OfLayeredItem) HArrayOfLItem = 
1613       new StepVisual_HArray1OfLayeredItem ( 1, seqRI.Length() );
1614     for (Standard_Integer i1 = 1; i1<=seqRI.Length(); i1++) {
1615       StepVisual_LayeredItem LI;
1616       LI.SetValue ( seqRI.Value(i1) );
1617       HArrayOfLItem->SetValue( i1, LI );
1618     }
1619     StepLayerAs->Init(hName, descr, HArrayOfLItem);
1620     Model->AddWithRefs( StepLayerAs );
1621     // PTV 23.01.2003 add the invisibility AFTER adding layer into the model.
1622     // add the invisibility for the layer
1623     if (isLinv) {
1624       // Invisibility Item for containig invisible layers.
1625       Handle(StepVisual_HArray1OfInvisibleItem) HInvsblItm = new StepVisual_HArray1OfInvisibleItem (1,1);
1626       StepVisual_InvisibleItem InvIt;
1627       InvIt.SetValue( StepLayerAs );
1628       HInvsblItm->SetValue( 1, InvIt);
1629       
1630       Handle(StepVisual_Invisibility) Invsblt = new StepVisual_Invisibility();
1631       Invsblt->Init( HInvsblItm );
1632       Model->AddWithRefs( Invsblt );
1633     }
1634   }
1635   return Standard_True;
1636 }
1637
1638
1639 //=======================================================================
1640 //function : getSHUOstyle
1641 //purpose  : auxilary
1642 //=======================================================================
1643 static Standard_Boolean getSHUOstyle(const TDF_Label& aSHUOlab,
1644                                      const Handle(XCAFDoc_ColorTool)& CTool,
1645                                      XCAFPrs_Style& SHUOstyle)
1646 {
1647   Quantity_Color C;
1648   if (!CTool->IsVisible( aSHUOlab ) )
1649     SHUOstyle.SetVisibility(Standard_False);
1650   else {
1651     if ( CTool->GetColor ( aSHUOlab, XCAFDoc_ColorGen, C ) ) {
1652       SHUOstyle.SetColorCurv ( C );
1653       SHUOstyle.SetColorSurf ( C );
1654     }
1655     if ( CTool->GetColor ( aSHUOlab, XCAFDoc_ColorSurf, C ) )
1656       SHUOstyle.SetColorSurf ( C );
1657     if ( CTool->GetColor ( aSHUOlab, XCAFDoc_ColorCurv, C ) )
1658       SHUOstyle.SetColorCurv ( C );
1659   }
1660   if ( !SHUOstyle.IsSetColorCurv() && 
1661       !SHUOstyle.IsSetColorSurf() &&
1662       SHUOstyle.IsVisible() )
1663     return Standard_False;
1664   return Standard_True;
1665 }
1666
1667
1668 //=======================================================================
1669 //function : getProDefinitionOfNAUO
1670 //purpose  : auxilary
1671 //=======================================================================
1672 static Standard_Boolean getProDefinitionOfNAUO(const Handle(XSControl_WorkSession)& WS,
1673                                                const TopoDS_Shape& theShape,
1674                                                Handle(StepBasic_ProductDefinition)& PD,
1675                                                Handle(StepRepr_NextAssemblyUsageOccurrence)& NAUO,
1676                                                Standard_Boolean IsRelating)
1677 {
1678   if ( theShape.IsNull() )
1679     return Standard_False;
1680   // get CDSR
1681   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
1682   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
1683   Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1684   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, theShape );
1685   if (!FP->FindTypedTransient(mapper, 
1686                               STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation),
1687                               CDSR))
1688     return Standard_False;
1689   // get PDS of NAUO
1690   Handle(StepRepr_ProductDefinitionShape) PDS = CDSR->RepresentedProductRelation();
1691   if (PDS.IsNull())
1692     return Standard_False;
1693   // get the NAUO entity
1694   Interface_Graph aGraph = WS->HGraph()->Graph();
1695   Interface_EntityIterator subs = aGraph.Shareds(PDS);
1696   for ( subs.Start(); subs.More(); subs.Next() ) {
1697     if (!subs.Value()->IsKind(STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence)))
1698       continue;
1699     NAUO = Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(subs.Value());
1700     break;
1701   }
1702   if ( NAUO.IsNull() )
1703     return Standard_False;
1704   // get Relatinf or Related product definition
1705   if ( !IsRelating )
1706     PD = NAUO->RelatedProductDefinition();
1707   else
1708     PD = NAUO->RelatingProductDefinition();
1709   if ( PD.IsNull() )
1710     return Standard_False;
1711   return Standard_True;
1712 }
1713
1714
1715 //=======================================================================
1716 //function : writeSHUO
1717 //purpose  : auxilary
1718 //=======================================================================
1719 static Standard_Boolean writeSHUO (const Handle(XCAFDoc_GraphNode)& theSHUO,
1720                                    const Handle(XCAFDoc_ShapeTool)& theSTool,
1721                                    const Handle(XSControl_WorkSession)& WS,
1722                                    Handle(StepRepr_SpecifiedHigherUsageOccurrence)& theTopSHUO,
1723                                    TopoDS_Shape& NAUOShape,
1724                                    Handle(StepBasic_ProductDefinition)& theRelatingPD,
1725                                    Standard_Boolean& isDeepest)
1726 {
1727   // set the ProductDefinitionRelationship descriptin information as empty strings.
1728   Handle(TCollection_HAsciiString) EmptyString = new TCollection_HAsciiString("");
1729   
1730   TDF_LabelSequence aNextUsageLabs;
1731   theSTool->GetSHUONextUsage( theSHUO->Label(), aNextUsageLabs );
1732   Handle(XCAFDoc_GraphNode) NuSHUO;
1733   if ( theTopSHUO.IsNull() ) {
1734     // the top SHUO
1735     if (aNextUsageLabs.Length() < 1)
1736       return Standard_False;
1737     theSTool->GetSHUO( aNextUsageLabs.Value(1), NuSHUO );
1738     if (NuSHUO.IsNull())
1739       return Standard_False;
1740     // get relating product definition
1741     TopoDS_Shape aTopCompShape = theSTool->GetShape( theSHUO->Label().Father() ); 
1742     Handle(StepRepr_NextAssemblyUsageOccurrence) UUNAUO;
1743     if (!getProDefinitionOfNAUO( WS, aTopCompShape,
1744                                  theRelatingPD, UUNAUO, Standard_True ))
1745       return Standard_False;
1746     // get related product definition
1747     TopoDS_Shape aNUShape = theSTool->GetShape( NuSHUO->Label().Father() );
1748     Handle(StepBasic_ProductDefinition) aRelatedPD;
1749     Handle(StepRepr_NextAssemblyUsageOccurrence) NUNAUO;
1750     if (!getProDefinitionOfNAUO( WS, aNUShape,
1751                                  aRelatedPD, NUNAUO, Standard_False ))
1752       return Standard_False;
1753     
1754     theTopSHUO = new StepRepr_SpecifiedHigherUsageOccurrence;
1755     // create deepest shuo EmptyString
1756     theTopSHUO->Init(/*id*/EmptyString, /*name*/EmptyString,
1757                      /*no description*/Standard_False,/*description*/EmptyString,
1758                      theRelatingPD, aRelatedPD,
1759                      /*no ACURefDesignator*/Standard_False,/*ACURefDesignator*/EmptyString,
1760                      /*upper_usage*/UUNAUO, /*next_usage*/NUNAUO);
1761     // write the other SHUO.
1762     if(!writeSHUO( NuSHUO, theSTool, WS, theTopSHUO, NAUOShape, theRelatingPD, isDeepest )) {
1763       theTopSHUO.Nullify();
1764       return Standard_False;
1765     }
1766     
1767     return Standard_True;
1768   }
1769 //   Handle(XCAFDoc_GraphNode) NuSHUO;
1770   if ( aNextUsageLabs.Length() > 0) {
1771     // store SHUO recursive
1772 #ifdef OCCT_DEBUG
1773     if ( aNextUsageLabs.Length() > 1 )
1774       cout << "Warning: store only one next_usage of current SHUO"  << endl;
1775 #endif    
1776     theSTool->GetSHUO( aNextUsageLabs.Value(1), NuSHUO );
1777     Handle(StepRepr_SpecifiedHigherUsageOccurrence) aNUEntSHUO =
1778       new StepRepr_SpecifiedHigherUsageOccurrence;
1779     if (!writeSHUO( NuSHUO, theSTool, WS, aNUEntSHUO, NAUOShape, theRelatingPD, isDeepest ))
1780       return Standard_False;
1781     
1782     // store the deepest SHUO to the dociment
1783     TopoDS_Shape aNUSh, aUUSh;
1784     aNUSh = theSTool->GetShape( NuSHUO->Label().Father() );
1785     aUUSh = theSTool->GetShape( theSHUO->Label().Father() );
1786     // get relating PD with upper_usage and related PD with next_usage
1787     Handle(StepBasic_ProductDefinition) nullPD;// no need to use,case have shared <theRelatingPD>
1788     Handle(StepBasic_ProductDefinition) aRelatedPD;
1789     Handle(StepRepr_NextAssemblyUsageOccurrence) UUNAUO, NUNAUO;
1790     if (!getProDefinitionOfNAUO( WS, aUUSh, nullPD, UUNAUO, Standard_True ) ||
1791         !getProDefinitionOfNAUO( WS, aNUSh, aRelatedPD, NUNAUO, Standard_False )) {
1792 #ifdef OCCT_DEBUG
1793       cout << "Warning: cannot get related or relating PD" << endl;
1794 #endif
1795       return Standard_False;
1796     }
1797     aNUEntSHUO->Init(/*id*/EmptyString, /*name*/EmptyString,
1798                      /*no description*/Standard_False,/*description*/EmptyString,
1799                      theRelatingPD, aRelatedPD,
1800                      /*no ACURefDesignator*/Standard_False,/*ACURefDesignator*/EmptyString,
1801                      /*upper_usage*/theTopSHUO, /*next_usage*/NUNAUO);
1802     if ( isDeepest ) {
1803       isDeepest = Standard_False;
1804     }
1805     WS->Model()->AddWithRefs ( aNUEntSHUO );
1806     return Standard_True;
1807   } // end of recurse storing
1808     
1809   // get shape 
1810   TDF_Label aShapeL = theSHUO->Label().Father();
1811   NAUOShape = theSTool->GetShape( aShapeL );
1812   // return to the deepest level from SHUO shape level
1813   // it is because SHUO is attribute on deep level and shape level.
1814   isDeepest = Standard_True;
1815   return Standard_True;
1816 }
1817
1818
1819 //=======================================================================
1820 //function : createSHUOStyledItem
1821 //purpose  : auxilary
1822 //=======================================================================
1823 static Standard_Boolean createSHUOStyledItem (const XCAFPrs_Style& style,
1824                                               const Handle(StepRepr_ProductDefinitionShape)& PDS,
1825                                               const Handle(XSControl_WorkSession) &WS,
1826                                               const TopoDS_Shape& Sh,
1827                                               const Handle(XCAFDoc_ShapeTool)& STool,
1828                                               MoniTool_DataMapOfShapeTransient& myMapCompMDGPR)
1829 {
1830   // create styled item for the indicated SHUO and store to the model
1831   STEPConstruct_Styles Styles( WS );
1832   // translate colors to STEP
1833   Handle(StepVisual_Colour) surfColor, curvColor;
1834   if ( style.IsSetColorSurf() )
1835     surfColor = Styles.EncodeColor ( style.GetColorSurf() );
1836   if ( style.IsSetColorCurv() )
1837     curvColor = Styles.EncodeColor ( style.GetColorCurv() );
1838   Standard_Boolean isComponent = Standard_True;// cause need to get PSBC
1839   Handle(StepRepr_RepresentationItem) item;
1840   // set default color for invisible SHUO.
1841   Standard_Boolean isSetDefaultColor = Standard_False;
1842   if (surfColor.IsNull() && curvColor.IsNull() && !style.IsVisible() ) {
1843     surfColor = Styles.EncodeColor ( Quantity_Color( 1, 1, 1, Quantity_TOC_RGB ) );
1844     isSetDefaultColor = Standard_True;
1845   }
1846   Handle(StepVisual_PresentationStyleAssignment) PSA =
1847     Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent );
1848   Handle(StepVisual_StyledItem) override; //null styled item
1849   
1850   // find the repr item of the shape
1851   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
1852   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
1853   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FP, Sh );
1854   Handle(StepShape_ContextDependentShapeRepresentation) CDSR;
1855   FP->FindTypedTransient(mapper, 
1856                          STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation),
1857                          CDSR);
1858   if ( CDSR.IsNull() )
1859     return Standard_False;
1860   // find context
1861   Handle(StepRepr_RepresentationContext) Context = Styles.FindContext( Sh );
1862   TopoDS_Shape aTopSh = Sh;
1863   if (Context.IsNull()) {
1864     TDF_Label aTopShL = STool->FindShape(Sh, Standard_False);
1865     if (aTopShL.IsNull())
1866       return Standard_False;
1867     aTopSh = STool->GetShape( aTopShL );
1868     Context = Styles.FindContext ( aTopSh );
1869   }
1870   if (Context.IsNull())
1871     return Standard_False;
1872   // get representation item of the shape
1873   TopLoc_Location L;
1874   TColStd_SequenceOfTransient seqRI;
1875   FindEntities ( FP, Sh, L, seqRI );
1876 #ifdef OCCT_DEBUG
1877   if ( seqRI.Length() <=0 ) 
1878     FP->Messenger() << "Warning: Cannot find RI for " << Sh.TShape()->DynamicType()->Name() << endl;
1879 #endif
1880   item = Handle(StepRepr_RepresentationItem)::DownCast(seqRI(1));
1881   //get overridden styled item
1882   getStyledItem(Sh,STool, Styles, override,myMapCompMDGPR);
1883   
1884   // get STEP STYLED ITEM
1885   Handle(StepVisual_StyledItem) STEPstyle = Styles.AddStyle ( item, PSA, override );
1886   // create SR, SDR and all necessary references between them and ST, PDS, PSBC, GRC
1887   Styles.CreateNAUOSRD( Context, CDSR, PDS );
1888   
1889   // add step styled item of SHUO to the model
1890   // do it by additing styled item to the MDGPR
1891   if ( !aTopSh.IsNull() &&  !myMapCompMDGPR.IsBound( aTopSh ) ) {
1892     // create MDGPR and record it in model
1893 #ifdef OCCT_DEBUG
1894     cout << "Warning: " << __FILE__ << ": Create new MDGPR for SHUO instance"  << endl;
1895 #endif
1896     Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation) aMDGPR;
1897     Styles.CreateMDGPR ( Context, aMDGPR );
1898     if (!aMDGPR.IsNull())
1899       myMapCompMDGPR.Bind( aTopSh, aMDGPR );
1900   }
1901   else if ( !aTopSh.IsNull() &&  myMapCompMDGPR.IsBound( aTopSh ) ) {
1902     // get MDGPR of the top-level shape
1903     Handle(StepVisual_PresentationRepresentation) aMDGPR = 
1904       Handle(StepVisual_PresentationRepresentation)::DownCast( myMapCompMDGPR.Find( aTopSh ) );
1905     // get old styled items to not lose it
1906     Handle(StepRepr_HArray1OfRepresentationItem) oldItems = aMDGPR->Items();
1907     Standard_Integer oldLengthlen = 0;
1908     if (!oldItems.IsNull())
1909       oldLengthlen = oldItems->Length();
1910     // create new array of styled items by an olds and new one
1911     Handle(StepRepr_HArray1OfRepresentationItem) newItems =
1912       new StepRepr_HArray1OfRepresentationItem(1, oldLengthlen + 1);
1913     Standard_Integer si;
1914     Standard_Integer el = 1;
1915     for ( si=1; si <= oldLengthlen; si++ )
1916       newItems->SetValue( el++, oldItems->Value( si ) );
1917     newItems->SetValue (el++, STEPstyle);
1918     // init MDGPR be new array of styled items
1919     if (newItems->Length() > 0)
1920       aMDGPR->SetItems( newItems );
1921   }
1922   else {
1923     WS->Model()->AddWithRefs ( STEPstyle ); // add as root to the model, but it is not good
1924 #ifdef OCCT_DEBUG
1925     cout << "Warning: " << __FILE__ << ": adds styled item of SHUO as root, casue cannot find MDGPR" << endl;
1926 #endif
1927   }
1928   // create invisibility item for the styled item
1929   if ( !style.IsVisible() ) {
1930     if (isSetDefaultColor) {
1931       // try to set default color from top-level shape
1932       
1933       setDefaultInstanceColor(override, PSA);
1934     }
1935     // create invisibility item and refer for stiledItem
1936     Handle(StepVisual_Invisibility) Invsblt = new StepVisual_Invisibility();
1937     Handle(StepVisual_HArray1OfInvisibleItem) HInvsblItm = 
1938       new StepVisual_HArray1OfInvisibleItem (1,1);
1939     // put all style item into the harray
1940     StepVisual_InvisibleItem anInvItem;
1941     anInvItem.SetValue( STEPstyle );
1942     HInvsblItm->SetValue( 1, anInvItem );
1943     Invsblt->Init( HInvsblItm );
1944     WS->Model()->AddWithRefs( Invsblt );
1945   }
1946   
1947   return Standard_True;
1948 }
1949
1950
1951 //=======================================================================
1952 //function : WriteSHUOs
1953 //purpose  : 
1954 //=======================================================================
1955
1956 Standard_Boolean STEPCAFControl_Writer::WriteSHUOs (const Handle(XSControl_WorkSession) &WS,
1957                                                     const TDF_LabelSequence  &labels )
1958 {
1959   if ( labels.Length() <=0 ) return Standard_False;
1960
1961   // get working data
1962   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( labels(1) );
1963   if (CTool.IsNull() )
1964     return Standard_False;
1965   // map of transfered SHUO
1966   TColStd_MapOfTransient aMapOfMainSHUO;
1967   // Iterate on requested shapes
1968   for ( Standard_Integer i=1; i <= labels.Length(); i++ ) {
1969     TDF_Label L = labels.Value(i);
1970     if ( ! myLabels.IsBound ( L ) ) continue; // not recorded as translated, skip
1971     if ( XCAFDoc_ShapeTool::IsAssembly ( L ) ) {
1972       TDF_LabelSequence seq;
1973       XCAFDoc_ShapeTool::GetComponents ( L, seq );
1974       // iterates on components of assembly
1975       for (Standard_Integer k=1; k <= seq.Length(); k++) {
1976         TDF_Label lab = seq(k);
1977         TDF_AttributeSequence anAttrSeq;
1978         CTool->ShapeTool()->GetAllComponentSHUO( lab, anAttrSeq );
1979         // work with SHUO
1980         for (Standard_Integer j = 1; j <= anAttrSeq.Length(); j++) {
1981           Handle(XCAFDoc_GraphNode) aSHUO = 
1982             Handle(XCAFDoc_GraphNode)::DownCast(anAttrSeq.Value( j ));
1983           // take label of SHUO
1984           TDF_Label aSHUOlab = aSHUO->Label();
1985           TDF_LabelSequence aUpLabels;
1986           // check is it SHUO of upper_usage
1987           CTool->ShapeTool()->GetSHUOUpperUsage( aSHUOlab, aUpLabels );
1988           if ( aUpLabels.Length() > 0 )
1989             continue; // transfer only main SHUO
1990           if ( aMapOfMainSHUO.Contains( aSHUO ) )
1991             continue; // do not try to transfer SHUO twice
1992           aMapOfMainSHUO.Add( aSHUO );
1993           // check if it is styled SHUO
1994           XCAFPrs_Style SHUOstyle;
1995           if ( !getSHUOstyle ( aSHUOlab, CTool, SHUOstyle ) ) {
1996 #ifdef OCCT_DEBUG
1997             cout << "Warning: " << __FILE__ << ": do not store SHUO without any style to the STEP model" << endl;
1998 #endif
1999             continue;
2000           }
2001           // write SHUO to the model amd then add structure type.
2002           TopoDS_Shape NAUOShape; // shape of the deepest NAUO in the SHUO structure
2003           Standard_Boolean isDeepest = Standard_False;
2004           Handle(StepRepr_SpecifiedHigherUsageOccurrence) anEntOfSHUO;
2005           Handle(StepBasic_ProductDefinition) aRelatingPD;
2006           // create the top SHUO and all other.
2007           writeSHUO( aSHUO, CTool->ShapeTool(), WS, anEntOfSHUO, NAUOShape, aRelatingPD, isDeepest );
2008           if ( anEntOfSHUO.IsNull() || NAUOShape.IsNull() ) {
2009 #ifdef OCCT_DEBUG
2010             cout << "Warning: " << __FILE__ << ": Cannot store SHUO" << endl;
2011 #endif
2012             continue;
2013           }
2014           // create new Product Definition Shape for TOP SHUO
2015 #ifdef OCCT_DEBUG
2016             cout << "Info: " << __FILE__ << ": Create NEW PDS for current SHUO " << endl;
2017 #endif
2018           Handle(StepRepr_ProductDefinitionShape) PDS = new StepRepr_ProductDefinitionShape;
2019           Handle(TCollection_HAsciiString) aPDSname = new TCollection_HAsciiString("SHUO");
2020           Handle(TCollection_HAsciiString) descrStr = new TCollection_HAsciiString("");
2021           StepRepr_CharacterizedDefinition aCharDef;
2022           aCharDef.SetValue( anEntOfSHUO );
2023           PDS->Init( aPDSname, Standard_False, descrStr, aCharDef );
2024           
2025           // create styled item for SHUO and add to the model
2026           createSHUOStyledItem ( SHUOstyle, PDS, WS, NAUOShape, CTool->ShapeTool(), myMapCompMDGPR );
2027           
2028         } // end work with SHUO
2029       } // end of an assembly components
2030     } // end of IsAssembly case
2031     // nothing to do if it is not assembly
2032     continue;
2033   } // end of iterates on indicated labels
2034   return Standard_True;
2035 }
2036
2037
2038 //=======================================================================
2039 //function : FindPDSforDGT
2040 //purpose  : auxilary: find PDS for AdvancedFace or EdgeCurve for creation
2041 //                     needed ShapeAspect in D&GT structure
2042 //=======================================================================
2043 static Standard_Boolean FindPDSforDGT(const Interface_Graph &aGraph,
2044                                       const Handle(Standard_Transient) &ent,
2045                                       Handle(StepRepr_ProductDefinitionShape) &PDS,
2046                                       Handle(StepRepr_RepresentationContext) &RC,
2047                                       Handle(StepShape_AdvancedFace) &AF,
2048                                       Handle(StepShape_EdgeCurve) &EC)
2049 {
2050   if( !ent->IsKind(STANDARD_TYPE(StepShape_EdgeCurve)) && 
2051       !ent->IsKind(STANDARD_TYPE(StepShape_AdvancedFace)) ) 
2052     return Standard_False;
2053
2054   AF = Handle(StepShape_AdvancedFace)::DownCast(ent);
2055   if( ent->IsKind(STANDARD_TYPE(StepShape_EdgeCurve)) ) {
2056     EC = Handle(StepShape_EdgeCurve)::DownCast(ent);
2057     Interface_EntityIterator subs = aGraph.Sharings(EC);
2058     for(subs.Start(); subs.More() && AF.IsNull(); subs.Next()) {
2059       Handle(StepShape_OrientedEdge) OE = Handle(StepShape_OrientedEdge)::DownCast(subs.Value());
2060       if(OE.IsNull()) continue;
2061       Interface_EntityIterator subs1 = aGraph.Sharings(OE);
2062       for(subs1.Start(); subs1.More() && AF.IsNull(); subs1.Next()) {
2063         Handle(StepShape_EdgeLoop) EL = Handle(StepShape_EdgeLoop)::DownCast(subs1.Value());
2064         if(EL.IsNull()) continue;
2065         Interface_EntityIterator subs2 = aGraph.Sharings(EL);
2066         for(subs2.Start(); subs2.More() && AF.IsNull(); subs2.Next()) {
2067           Handle(StepShape_FaceBound) FB = Handle(StepShape_FaceBound)::DownCast(subs2.Value());
2068           if(FB.IsNull()) continue;
2069           Interface_EntityIterator subs3 = aGraph.Sharings(FB);
2070           for(subs3.Start(); subs3.More() && AF.IsNull(); subs3.Next()) {
2071             AF = Handle(StepShape_AdvancedFace)::DownCast(subs3.Value());
2072           }
2073         }
2074       }
2075     }
2076   }
2077   if(AF.IsNull()) return Standard_False;
2078
2079   Interface_EntityIterator subs = aGraph.Sharings(AF);
2080   for(subs.Start(); subs.More() && PDS.IsNull(); subs.Next()) {
2081     Handle(StepShape_ConnectedFaceSet) CFS =
2082       Handle(StepShape_ConnectedFaceSet)::DownCast(subs.Value());
2083     if(CFS.IsNull()) continue;
2084     Interface_EntityIterator subs1 = aGraph.Sharings(CFS);
2085     for(subs1.Start(); subs1.More() && PDS.IsNull(); subs1.Next()) {
2086       Handle(StepRepr_RepresentationItem) RI = 
2087         Handle(StepRepr_RepresentationItem)::DownCast(subs1.Value());
2088       if(RI.IsNull()) continue;
2089       Interface_EntityIterator subs2 = aGraph.Sharings(RI);
2090       for(subs2.Start(); subs2.More() && PDS.IsNull(); subs2.Next()) {
2091         Handle(StepShape_ShapeRepresentation) SR = 
2092           Handle(StepShape_ShapeRepresentation)::DownCast(subs2.Value());
2093         if(SR.IsNull()) continue;
2094         RC = SR->ContextOfItems();
2095         Interface_EntityIterator subs3 = aGraph.Sharings(SR);
2096         for(subs3.Start(); subs3.More() && PDS.IsNull(); subs3.Next()) {
2097           Handle(StepShape_ShapeDefinitionRepresentation) SDR = 
2098             Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(subs3.Value());
2099           if(SDR.IsNull()) continue;
2100           Handle(StepRepr_PropertyDefinition) PropD = SDR->Definition().PropertyDefinition();
2101           if(PropD.IsNull()) continue;
2102           PDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(PropD);
2103         }
2104       }
2105     }
2106   }
2107   
2108   return Standard_True;
2109 }
2110
2111 //=======================================================================
2112 //function : GetUnit
2113 //purpose  : auxiliary
2114 //=======================================================================
2115
2116 static StepBasic_Unit GetUnit(const Handle(StepRepr_RepresentationContext)& theRC,
2117                               const Standard_Boolean isAngle = Standard_False)
2118 {
2119   StepBasic_Unit aUnit;
2120   if (isAngle) {
2121     Handle(StepBasic_SiUnitAndPlaneAngleUnit) aSiPAU;
2122     Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) aCtx =
2123       Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(theRC);
2124     if(!aCtx.IsNull()) {
2125       for(Standard_Integer j = 1; j <= aCtx->NbUnits(); j++) {
2126         if(aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndPlaneAngleUnit))) {
2127           aSiPAU = Handle(StepBasic_SiUnitAndPlaneAngleUnit)::DownCast(aCtx->UnitsValue(j));
2128           break;
2129         }
2130       }
2131     }
2132     if(aSiPAU.IsNull()) {
2133       Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) aCtx1 =
2134         Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(theRC);
2135       if(!aCtx1.IsNull()) {
2136         for(Standard_Integer j = 1; j <= aCtx1->NbUnits(); j++) {
2137           if(aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndPlaneAngleUnit))) {
2138             aSiPAU = Handle(StepBasic_SiUnitAndPlaneAngleUnit)::DownCast(aCtx1->UnitsValue(j));
2139             break;
2140           }
2141         }
2142       }
2143     }
2144     if(aSiPAU.IsNull())
2145       aSiPAU = new StepBasic_SiUnitAndPlaneAngleUnit;
2146     aUnit.SetValue(aSiPAU);
2147   }
2148   else {
2149     Handle(StepBasic_SiUnitAndLengthUnit) aSiLU;
2150     Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext) aCtx =
2151       Handle(StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext)::DownCast(theRC);
2152     if(!aCtx.IsNull()) {
2153       for(Standard_Integer j = 1; j <= aCtx->NbUnits(); j++) {
2154         if(aCtx->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit))) {
2155           aSiLU = Handle(StepBasic_SiUnitAndLengthUnit)::DownCast(aCtx->UnitsValue(j));
2156           break;
2157         }
2158       }
2159     }
2160     if(aSiLU.IsNull()) {
2161       Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx) aCtx1 =
2162         Handle(StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx)::DownCast(theRC);
2163       if(!aCtx1.IsNull()) {
2164         for(Standard_Integer j = 1; j <= aCtx1->NbUnits(); j++) {
2165           if(aCtx1->UnitsValue(j)->IsKind(STANDARD_TYPE(StepBasic_SiUnitAndLengthUnit))) {
2166             aSiLU = Handle(StepBasic_SiUnitAndLengthUnit)::DownCast(aCtx1->UnitsValue(j));
2167             break;
2168           }
2169         }
2170       }
2171     }
2172     if(aSiLU.IsNull())
2173       aSiLU = new StepBasic_SiUnitAndLengthUnit;
2174     aUnit.SetValue(aSiLU);
2175   }
2176   return aUnit;
2177 }
2178
2179 //=======================================================================
2180 //function : CreateDimValue
2181 //purpose  : auxiliary
2182 //======================================================================
2183 static Handle(StepRepr_ReprItemAndMeasureWithUnit) CreateDimValue(const Standard_Real theValue,
2184                                                                   const StepBasic_Unit theUnit,
2185                                                                   const Handle(TCollection_HAsciiString)& theName,
2186                                                                   const Standard_CString theMeasureName,
2187                                                                   const Standard_Boolean isAngle,
2188                                                                   const Standard_Boolean isQualified = Standard_False,
2189                                                                   const Handle(StepShape_QualifiedRepresentationItem)& theQRI = NULL)
2190 {
2191   Handle(StepRepr_RepresentationItem) aReprItem = new StepRepr_RepresentationItem();
2192   aReprItem->Init(new TCollection_HAsciiString(theName));
2193   Handle(StepBasic_MeasureWithUnit) aMWU = new StepBasic_MeasureWithUnit();
2194   Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember();
2195   aValueMember->SetName(theMeasureName);
2196   aValueMember->SetReal(theValue);
2197   aMWU->Init(aValueMember, theUnit);
2198   if (isQualified) {
2199     if (isAngle) {
2200       // Angle & with qualifiers
2201       Handle(StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI) anItem = 
2202         new StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI();
2203       anItem->Init(aMWU, aReprItem, theQRI);
2204       return anItem;
2205     }
2206     else {
2207       // Length & with qualifiers
2208       Handle(StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI) anItem = 
2209         new StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI();
2210       anItem->Init(aMWU, aReprItem, theQRI);
2211       return anItem;
2212     }
2213   }
2214   else {
2215     if (isAngle) {
2216       // Angle & without qualifiers
2217       Handle(StepRepr_ReprItemAndPlaneAngleMeasureWithUnit) anItem = 
2218         new StepRepr_ReprItemAndPlaneAngleMeasureWithUnit();
2219       anItem->Init(aMWU, aReprItem);
2220       return anItem;
2221     }
2222     else {
2223       // Length & without qualifiers
2224       Handle(StepRepr_ReprItemAndLengthMeasureWithUnit) anItem = 
2225         new StepRepr_ReprItemAndLengthMeasureWithUnit();
2226       anItem->Init(aMWU, aReprItem);
2227       return anItem;
2228     }
2229   }
2230 }
2231
2232 //=======================================================================
2233 //function : WriteShapeAspect
2234 //purpose  : auxiliary (write Shape_Aspect entity for given shape)
2235 //=======================================================================
2236
2237 static Handle(StepRepr_ShapeAspect) WriteShapeAspect (const Handle(XSControl_WorkSession) &WS,
2238                                                       const TDF_Label theLabel,
2239                                                       const TopoDS_Shape theShape,
2240                                                       Handle(StepRepr_RepresentationContext)& theRC,
2241                                                       Handle(StepAP242_GeometricItemSpecificUsage)& theGISU)
2242 {
2243   // Get working data
2244   const Handle(Interface_InterfaceModel) &Model = WS->Model();
2245   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
2246   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
2247   const Handle(Interface_HGraph) aHGraph = WS->HGraph();
2248   if (aHGraph.IsNull())
2249     return NULL;
2250   Interface_Graph aGraph = aHGraph->Graph();
2251
2252   TopLoc_Location aLoc;
2253   TColStd_SequenceOfTransient aSeqRI;
2254   FindEntities( FP, theShape, aLoc, aSeqRI );
2255   if ( aSeqRI.Length() <= 0 ) {
2256     FP->Messenger() << "Warning: Cannot find RI for "<<theShape.TShape()->DynamicType()->Name()<<endl;
2257     return NULL;
2258   }
2259
2260   Handle(StepRepr_ProductDefinitionShape) aPDS;
2261   Handle(StepRepr_RepresentationContext) aRC;
2262   Handle(Standard_Transient) anEnt = aSeqRI.Value(1);
2263   Handle(StepShape_AdvancedFace) anAF;
2264   Handle(StepShape_EdgeCurve) anEC;
2265   FindPDSforDGT(aGraph, anEnt, aPDS, aRC, anAF, anEC);
2266   if(aPDS.IsNull()) 
2267     return NULL;
2268
2269   theRC = aRC;
2270   // Shape_Aspect
2271   Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString();
2272   Handle(TDataStd_Name) aNameAttr;
2273   if (theLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) {
2274     aName = new TCollection_HAsciiString(TCollection_AsciiString(aNameAttr->Get(), '?'));
2275     Standard_Integer aFirstSpace = aName->Search(" ");
2276     if (aFirstSpace != -1)
2277       aName = aName->SubString(aFirstSpace + 1, aName->Length());
2278     else
2279       aName = new TCollection_HAsciiString();
2280   }
2281   Handle(TCollection_HAsciiString) aDescription = new TCollection_HAsciiString();
2282   Handle(StepRepr_ShapeAspect) aSA = new StepRepr_ShapeAspect;
2283   aSA->Init(aName, aDescription, aPDS, StepData_LTrue);
2284
2285   // Geometric_Item_Specific_Usage
2286   Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage();
2287   StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition;
2288   aDefinition.SetValue(aSA);
2289   Handle(StepRepr_HArray1OfRepresentationItem) anReprItems = new StepRepr_HArray1OfRepresentationItem(1, 1);
2290   Handle(StepRepr_RepresentationItem) anIdentifiedItem = Handle(StepRepr_RepresentationItem)::DownCast(anEnt);
2291   anReprItems->SetValue(1, anIdentifiedItem);
2292   Interface_EntityIterator subs = aGraph.Sharings(aPDS);
2293   Handle(StepShape_ShapeDefinitionRepresentation) aSDR;
2294   for (subs.Start(); subs.More() && aSDR.IsNull(); subs.Next()) {
2295     Handle(Standard_Transient) anEntity = subs.Value();
2296     aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(anEntity);
2297   }
2298   if (aSDR.IsNull())
2299     return NULL;
2300
2301   // Set entities to model
2302   aGISU->Init(aName, aDescription, aDefinition, aSDR->UsedRepresentation(), anReprItems);
2303   Model->AddWithRefs(aSA);
2304   Model->AddWithRefs(aGISU);
2305   theGISU = aGISU;
2306   return aSA;
2307 }
2308
2309 //=======================================================================
2310 //function : WritePresentation
2311 //purpose  : auxiliary (write annotation plane and presentation)
2312 //======================================================================
2313 static void WritePresentation(const Handle(XSControl_WorkSession) &WS,
2314                               const TopoDS_Shape thePresentation,
2315                               const gp_Ax2 theAnnotationPlane,
2316                               const gp_Pnt theTextPosition,
2317                               const Handle(Standard_Transient) theDimension)
2318 {
2319   if (thePresentation.IsNull())
2320     return;
2321   // Get working data
2322   const Handle(Interface_InterfaceModel) &aModel = WS->Model();
2323
2324   // Presentation
2325   Handle(StepVisual_TessellatedGeometricSet) aGeomSet = STEPCAFControl_GDTProperty::GetTessellation(thePresentation);
2326   Handle(StepVisual_TessellatedAnnotationOccurrence) aTAO = new StepVisual_TessellatedAnnotationOccurrence();
2327   aTAO->Init(new TCollection_HAsciiString(), gdtPrsCurveStyle, aGeomSet);
2328   StepVisual_DraughtingCalloutElement aDCElement;
2329   aDCElement.SetValue(aTAO);
2330   Handle(StepVisual_HArray1OfDraughtingCalloutElement) aTAOs = new StepVisual_HArray1OfDraughtingCalloutElement(1, 1);
2331   aTAOs->SetValue(1, aDCElement);
2332   Handle(StepVisual_DraughtingCallout) aDCallout = new StepVisual_DraughtingCallout();
2333   aDCallout->Init(new TCollection_HAsciiString(), aTAOs);
2334   Handle(StepRepr_HArray1OfRepresentationItem) aDCsForDMIA = new StepRepr_HArray1OfRepresentationItem(1, 1);
2335   aDCsForDMIA->SetValue(1, aDCallout);
2336   StepAP242_ItemIdentifiedRepresentationUsageDefinition aDimension;
2337   aDimension.SetValue(theDimension);
2338   Handle(StepAP242_DraughtingModelItemAssociation) aDMIA =
2339     new StepAP242_DraughtingModelItemAssociation();
2340   aDMIA->Init(new TCollection_HAsciiString("PMI representation to presentation link"),
2341       new TCollection_HAsciiString(), aDimension, gdtPresentationDM, aDCsForDMIA);
2342   aModel->AddWithRefs(aDMIA);
2343
2344   // Annotation plane
2345   // Presentation Style
2346   Handle(StepVisual_NullStyleMember) aNullStyle = new StepVisual_NullStyleMember();
2347   aNullStyle->SetEnumText(0, ".NULL.");
2348   StepVisual_PresentationStyleSelect aStyleItem;
2349   aStyleItem.SetValue(aNullStyle);
2350   Handle(StepVisual_HArray1OfPresentationStyleSelect) aStyles = new StepVisual_HArray1OfPresentationStyleSelect(1, 1);
2351   aStyles->SetValue(1, aStyleItem);
2352   Handle(StepVisual_PresentationStyleAssignment) aPrsStyle = new StepVisual_PresentationStyleAssignment();
2353   aPrsStyle->Init(aStyles);
2354   Handle(StepVisual_HArray1OfPresentationStyleAssignment) aPrsStyles = 
2355     new StepVisual_HArray1OfPresentationStyleAssignment(1, 1);
2356   aPrsStyles->SetValue(1, aPrsStyle);
2357   // Plane
2358   Handle(StepGeom_Plane) aPlane = new StepGeom_Plane();
2359   Handle(StepGeom_Axis2Placement3d) anAxis = STEPCAFControl_GDTProperty::GetAxis2Placement3D(theAnnotationPlane);
2360   // Set text position to plane origin
2361   Handle(StepGeom_CartesianPoint) aTextPos = new StepGeom_CartesianPoint();
2362   Handle(TColStd_HArray1OfReal) aCoords = new TColStd_HArray1OfReal(1, 3);
2363   for (Standard_Integer i = 1; i <= 3; i++)
2364     aCoords->SetValue(i, theTextPosition.Coord(i));
2365   aTextPos->Init(new TCollection_HAsciiString(), aCoords);
2366   anAxis->SetLocation(aTextPos);
2367   aPlane->Init(new TCollection_HAsciiString(), anAxis);
2368   // Annotation plane element
2369   StepVisual_AnnotationPlaneElement aPlaneElement;
2370   aPlaneElement.SetValue(aDCallout);
2371   Handle(StepVisual_HArray1OfAnnotationPlaneElement) aDCsForAnnPln = new StepVisual_HArray1OfAnnotationPlaneElement(1, 1);
2372   aDCsForAnnPln->SetValue(1, aPlaneElement);
2373   // Init AnnotationPlane entity
2374   Handle(StepVisual_AnnotationPlane) anAnnPlane = new StepVisual_AnnotationPlane();
2375   anAnnPlane->Init(new TCollection_HAsciiString(), aPrsStyles, aPlane, aDCsForAnnPln);
2376   gdtAnnotationPlanes.Append(anAnnPlane);
2377   aModel->AddWithRefs(anAnnPlane);
2378 }
2379
2380 //=======================================================================
2381 //function : WriteDatumAP242
2382 //purpose  : auxiliary (write Datum entity for given shape or write all 
2383 //           necessary entities and link them to already written datum 
2384 //           in case of multiple features association)
2385 //=======================================================================
2386 static Handle(StepDimTol_Datum) WriteDatumAP242(const Handle(XSControl_WorkSession) &WS,
2387                                                 const TDF_Label theShapeL,
2388                                                 const TDF_Label theDatumL,
2389                                                 const Standard_Boolean isFirstDTarget,
2390                                                 const Handle(StepDimTol_Datum) theWrittenDatum)
2391 {
2392   // Get working data
2393   const Handle(Interface_InterfaceModel) &Model = WS->Model();
2394   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
2395   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
2396   const Handle(Interface_HGraph) aHGraph = WS->HGraph();
2397   if (aHGraph.IsNull())
2398     return NULL;
2399   Interface_Graph aGraph = aHGraph->Graph();
2400
2401   Handle(StepRepr_ShapeAspect) aSA;
2402   Handle(StepAP242_GeometricItemSpecificUsage) aGISU;
2403   // Link with datum feature
2404   Handle(StepRepr_ProductDefinitionShape) aPDS;
2405   Handle(StepRepr_RepresentationContext) aRC;
2406   Handle(Standard_Transient) anEnt;
2407   Handle(StepShape_AdvancedFace) anAF;
2408   Handle(StepShape_EdgeCurve) anEC;
2409   TopoDS_Shape aShape;
2410   TopLoc_Location aLoc;
2411   TColStd_SequenceOfTransient aSeqRI;
2412
2413   aShape = XCAFDoc_ShapeTool::GetShape(theShapeL);
2414   FindEntities( FP, aShape, aLoc, aSeqRI );
2415   if ( aSeqRI.Length() <= 0 ) {
2416     FP->Messenger() << "Warning: Cannot find RI for "<<aShape.TShape()->DynamicType()->Name()<<endl;
2417     return NULL;
2418   }
2419   anEnt = aSeqRI.Value(1);
2420   FindPDSforDGT(aGraph, anEnt, aPDS, aRC, anAF, anEC);
2421   if (aPDS.IsNull()) 
2422     return NULL;
2423
2424   aSA = WriteShapeAspect(WS, theDatumL, aShape, aRC, aGISU);
2425   if (aSA.IsNull())
2426     return NULL;
2427   Standard_Integer aSANum = Model->Number(aSA);
2428   Standard_Integer aGISUNum = Model->Number(aGISU);
2429   // Find if datum has datum targets and get common datum attributes
2430   Handle(XCAFDoc_Datum) aDatumAttr;
2431   if (!theDatumL.FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr)) 
2432     return NULL;
2433   Handle(XCAFDimTolObjects_DatumObject) anObject = aDatumAttr->GetObject();
2434   if (anObject.IsNull())
2435     return NULL;
2436   Standard_Boolean isSimpleDatum = !anObject->IsDatumTarget();
2437   Handle(TCollection_HAsciiString) anIdentifier = anObject->GetName();
2438   Handle(TCollection_HAsciiString) aTargetId = (anObject->GetDatumTargetNumber() == 0 ? 
2439     new TCollection_HAsciiString() : new TCollection_HAsciiString(anObject->GetDatumTargetNumber()));
2440
2441   // If datum type is area, but there is no area in object, write as simple datum
2442   if (anObject->GetDatumTargetType() == XCAFDimTolObjects_DatumTargetType_Area &&
2443     anObject->GetDatumTarget().IsNull())
2444     isSimpleDatum = Standard_True;
2445
2446   // Simple datum
2447   if (isSimpleDatum) {
2448     Handle(StepDimTol_DatumFeature) aDF = new StepDimTol_DatumFeature();
2449     aDF->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aSA->OfShape(), aSA->ProductDefinitional());
2450     Model->ReplaceEntity(aSANum, aDF);
2451     aSA = aDF;
2452     StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition;
2453     aDefinition.SetValue(aDF);
2454     aGISU->SetDefinition(aDefinition);
2455     Model->ReplaceEntity(aGISUNum, aGISU);
2456   }
2457   // Datum with datum targets
2458   else {
2459     XCAFDimTolObjects_DatumTargetType aDatumType = anObject->GetDatumTargetType();
2460     Handle(StepDimTol_DatumTarget) aDatumTarget;
2461     // Note: the given way to write such datum type may be incorrect (too little information)
2462     if (aDatumType == XCAFDimTolObjects_DatumTargetType_Area) {
2463       TopoDS_Shape aDTShape = anObject->GetDatumTarget();
2464       Handle(StepAP242_GeometricItemSpecificUsage) anAreaGISU;
2465       Handle(StepRepr_ShapeAspect) anAreaSA = WriteShapeAspect(WS, theDatumL, aDTShape, aRC, anAreaGISU);
2466       aSANum = Model->Number(anAreaSA);
2467       aGISUNum = Model->Number(anAreaGISU);
2468       Handle(StepDimTol_DatumTarget) aDT = new StepDimTol_DatumTarget();
2469       aDT->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString("area"), anAreaSA->OfShape(),
2470         anAreaSA->ProductDefinitional(), aTargetId);
2471       Model->ReplaceEntity(aSANum, aDT);
2472       StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition;
2473       aDefinition.SetValue(aDT);
2474       anAreaGISU->SetDefinition(aDefinition);
2475       Model->ReplaceEntity(aGISUNum, anAreaGISU);
2476   }
2477     else {
2478       Handle(StepDimTol_PlacedDatumTargetFeature) aPDTF = new StepDimTol_PlacedDatumTargetFeature();
2479       aPDTF->Init(new TCollection_HAsciiString(), STEPCAFControl_GDTProperty::GetDatumTargetName(aDatumType),
2480         aPDS, StepData_LTrue, aTargetId);
2481       Model->AddWithRefs(aPDTF);
2482       aDatumTarget = aPDTF;
2483       // Datum targets
2484       Handle(StepRepr_PropertyDefinition) aPD = new StepRepr_PropertyDefinition();
2485       StepRepr_CharacterizedDefinition aCDefinition;
2486       aCDefinition.SetValue(aPDTF);
2487       aPD->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCDefinition);
2488       Handle(StepShape_ShapeRepresentationWithParameters) aSRWP = new StepShape_ShapeRepresentationWithParameters();
2489       // Common for all datum targets
2490       StepBasic_Unit aUnit = GetUnit(aRC);
2491       gp_Ax2 aDTAxis = anObject->GetDatumTargetAxis();
2492       Handle(StepGeom_Axis2Placement3d) anA2P3D = 
2493         STEPCAFControl_GDTProperty::GetAxis2Placement3D(aDTAxis);
2494       anA2P3D->SetName(new TCollection_HAsciiString("orientation"));
2495       Handle(StepRepr_HArray1OfRepresentationItem) anItems;
2496       // Process each datum target type
2497       if (aDatumType == XCAFDimTolObjects_DatumTargetType_Point) {
2498         anItems = new StepRepr_HArray1OfRepresentationItem(1, 1);
2499       }
2500       else  {
2501         Handle(TCollection_HAsciiString) aTargetValueName;
2502         if (aDatumType == XCAFDimTolObjects_DatumTargetType_Line) {
2503           anItems = new StepRepr_HArray1OfRepresentationItem(1, 2);
2504           aTargetValueName = new TCollection_HAsciiString("target length");
2505         }
2506         else if (aDatumType == XCAFDimTolObjects_DatumTargetType_Rectangle) {
2507           anItems = new StepRepr_HArray1OfRepresentationItem(1, 3);
2508           aTargetValueName = new TCollection_HAsciiString("target length");
2509           // Additional value
2510           Handle(StepRepr_ReprItemAndMeasureWithUnit) aTargetValue = CreateDimValue(anObject->GetDatumTargetWidth(),
2511             aUnit, new TCollection_HAsciiString("target width"), "POSITIVE_LENGTH_MEASURE", Standard_False);
2512           anItems->SetValue(2, aTargetValue);
2513           Model->AddWithRefs(aTargetValue);
2514         }
2515         else if (aDatumType == XCAFDimTolObjects_DatumTargetType_Circle) {
2516           anItems = new StepRepr_HArray1OfRepresentationItem(1, 2);
2517           aTargetValueName = new TCollection_HAsciiString("target diameter");
2518         }
2519         // Value
2520         Handle(StepRepr_ReprItemAndMeasureWithUnit) aTargetValue= CreateDimValue(anObject->GetDatumTargetLength(),
2521           aUnit, aTargetValueName, "POSITIVE_LENGTH_MEASURE", Standard_False);
2522         anItems->SetValue(1, aTargetValue);
2523         Model->AddWithRefs(aTargetValue);
2524       }
2525       anItems->SetValue(anItems->Length(), anA2P3D);
2526       aSRWP->Init(new TCollection_HAsciiString(), anItems, aRC);
2527   
2528       // Create and write auxiliary entities
2529       Handle (StepShape_ShapeDefinitionRepresentation) aSDR = new StepShape_ShapeDefinitionRepresentation();
2530       StepRepr_RepresentedDefinition aRDefinition;
2531       aRDefinition.SetValue(aPD);
2532       aSDR->Init(aRDefinition, aSRWP);
2533       Model->AddWithRefs(aPD);
2534       Model->AddWithRefs(aSRWP);
2535       Model->AddWithRefs(aSDR);
2536     }
2537     // Link datum target to datum feature
2538     Handle(StepRepr_FeatureForDatumTargetRelationship) aFFDTR = new StepRepr_FeatureForDatumTargetRelationship();
2539     aFFDTR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aDatumTarget, aSA);
2540     Model->AddWithRefs(aFFDTR);
2541     aSA = aDatumTarget;
2542   }
2543
2544   // Datum
2545   Handle(StepDimTol_Datum) aDatum = theWrittenDatum;
2546   if (isFirstDTarget) {
2547     aDatum = new StepDimTol_Datum();
2548     aDatum->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aPDS, StepData_LTrue, anIdentifier);
2549     Model->AddWithRefs(aDatum);
2550   }
2551
2552   // Shape_Aspect_Relationship
2553   Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship();
2554   aSAR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aSA, aDatum);
2555   Model->AddWithRefs(aSAR);
2556
2557   // Auxiliary entities
2558   // Property_Definition
2559   Handle(StepRepr_PropertyDefinition) aPD = new StepRepr_PropertyDefinition();
2560   Handle(TCollection_HAsciiString) aPDName = new TCollection_HAsciiString("Datum Feature Symbol ");
2561   aPDName = aPDName->Cat(anIdentifier)->Cat(aTargetId);
2562   StepRepr_CharacterizedDefinition aCD;
2563   aCD.SetValue(aSA);
2564   aPD->Init(aPDName, Standard_False, NULL, aCD);
2565   Model->AddWithRefs(aPD);
2566   // Shape_Representation
2567   Handle(StepShape_ShapeRepresentation) aShapeRepr = new StepShape_ShapeRepresentation();
2568   aShapeRepr->Init(aPDName, aGISU->IdentifiedItem(), aRC);
2569   Model->AddWithRefs(aShapeRepr);
2570   // Shape_Definition_Representation
2571   Handle (StepShape_ShapeDefinitionRepresentation) aSDR = new StepShape_ShapeDefinitionRepresentation();
2572   StepRepr_RepresentedDefinition aRDefinition;
2573   aRDefinition.SetValue(aPD);
2574   aSDR->Init(aRDefinition, aShapeRepr);
2575   Model->AddWithRefs(aSDR);
2576
2577   //Annotation plane and Presentation
2578   WritePresentation(WS, anObject->GetPresentation(), anObject->GetPlane(), anObject->GetPointTextAttach(), aSA);
2579
2580   return aDatum;
2581 }
2582
2583 //=======================================================================
2584 //function : WriteDimValues
2585 //purpose  : auxiliary (write all data for given dimension: values, 
2586 //           qualifiers, modifiers, orientation and tolerance class)
2587 //======================================================================
2588 static void WriteDimValues(const Handle(XSControl_WorkSession) &WS,
2589                            const Handle(XCAFDimTolObjects_DimensionObject) theObject,
2590                            const Handle(StepRepr_RepresentationContext) theRC,
2591                            const StepShape_DimensionalCharacteristic theDimension)
2592 {
2593   // Get working data
2594   const Handle(Interface_InterfaceModel) &aModel = WS->Model();
2595   XCAFDimTolObjects_DimensionModifiersSequence aModifiers = theObject->GetModifiers();
2596   Handle(Standard_Transient) aDim = theDimension.Value();
2597   Standard_Boolean isAngle = aDim->IsKind(STANDARD_TYPE(StepShape_AngularLocation)) ||
2598                              aDim->IsKind(STANDARD_TYPE(StepShape_AngularSize));
2599
2600   // Unit
2601   StepBasic_Unit aUnit = GetUnit(theRC, isAngle);
2602   Standard_CString aMeasureName;
2603   if (isAngle)
2604     aMeasureName = "POSITIVE_PLANE_ANGLE_MEASURE";
2605   else
2606     aMeasureName = "POSITIVE_LENGTH_MEASURE";
2607
2608   // Values
2609   Handle(StepRepr_HArray1OfRepresentationItem) aValues;
2610   Standard_Integer aNbItems = 1, aValIt = 1;
2611   if (theObject->IsDimWithRange())
2612     aNbItems += 2;
2613   if (aModifiers.Length() > 0)
2614     aNbItems++;
2615   if (theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented)
2616     aNbItems++;
2617   aNbItems += theObject->NbDescriptions();
2618   aValues = new StepRepr_HArray1OfRepresentationItem(1, aNbItems);
2619
2620   // Nominal value
2621   Standard_Real aNominal = theObject->GetValue();
2622   Standard_Integer aLeftNbDigits, aRightNbDigits;
2623   theObject->GetNbOfDecimalPlaces(aLeftNbDigits, aRightNbDigits);
2624   Standard_Integer aNbQualifiers = 0;
2625   if (theObject->HasQualifier() && !isAngle)
2626     aNbQualifiers++;
2627   if (aLeftNbDigits > 0 || aRightNbDigits > 0)
2628     aNbQualifiers++;
2629   // With qualifiers
2630   if (aNbQualifiers > 0) {
2631     Handle(StepShape_QualifiedRepresentationItem) aQRI = new StepShape_QualifiedRepresentationItem();
2632     Handle(StepShape_HArray1OfValueQualifier) aQualifiers = new StepShape_HArray1OfValueQualifier(1, aNbQualifiers);
2633     // Type qualifier
2634     if (theObject->HasQualifier() && !isAngle) {
2635       StepShape_ValueQualifier anItem;
2636       Handle(StepShape_TypeQualifier) aType = new StepShape_TypeQualifier();
2637       XCAFDimTolObjects_DimensionQualifier aQualifier = theObject->GetQualifier();
2638       aType->Init(STEPCAFControl_GDTProperty::GetDimQualifierName(aQualifier));
2639       aModel->AddWithRefs(aType);
2640       anItem.SetValue(aType);
2641       aQualifiers->SetValue(1, anItem);
2642     }
2643     // Number of decimal places
2644     if (aLeftNbDigits > 0 || aRightNbDigits > 0) {
2645       StepShape_ValueQualifier anItem;
2646       Handle(StepShape_ValueFormatTypeQualifier) aType = new StepShape_ValueFormatTypeQualifier();
2647       Handle(TCollection_HAsciiString) aFormatType = new TCollection_HAsciiString("NR2 ");
2648       aFormatType->AssignCat(new TCollection_HAsciiString(aLeftNbDigits));
2649       aFormatType->AssignCat(new TCollection_HAsciiString("."));
2650       aFormatType->AssignCat(new TCollection_HAsciiString(aRightNbDigits));
2651       aType->Init(aFormatType);
2652       aModel->AddWithRefs(aType);
2653       anItem.SetValue(aType);
2654       aQualifiers->SetValue(aNbQualifiers, anItem);
2655     }
2656     // Set qualifiers
2657     aQRI->SetQualifiers(aQualifiers);
2658     Handle(StepRepr_ReprItemAndMeasureWithUnit) anItem = CreateDimValue(aNominal, aUnit,
2659       new TCollection_HAsciiString("nominal value"), aMeasureName, isAngle, Standard_True, aQRI);
2660     aValues->SetValue(aValIt, anItem);
2661     aValIt++;
2662   }
2663   // Without qualifiers
2664   else {
2665     Handle(StepRepr_ReprItemAndMeasureWithUnit) anItem = CreateDimValue(aNominal, aUnit,
2666       new TCollection_HAsciiString("nominal value"), aMeasureName, isAngle);
2667     aValues->SetValue(aValIt, anItem);
2668     aValIt++;
2669   }
2670
2671   // Ranges
2672   if (theObject->IsDimWithRange()) {
2673     Handle(StepRepr_ReprItemAndMeasureWithUnit) aLowerItem = CreateDimValue(theObject->GetLowerBound(), aUnit,
2674       new TCollection_HAsciiString("lower limit"), aMeasureName, isAngle);
2675     Handle(StepRepr_ReprItemAndMeasureWithUnit) anUpperItem = CreateDimValue(theObject->GetUpperBound(), aUnit,
2676       new TCollection_HAsciiString("upper limit"), aMeasureName, isAngle);
2677     aValues->SetValue(aValIt, aLowerItem);
2678     aValIt++;
2679     aValues->SetValue(aValIt, anUpperItem);
2680     aValIt++;
2681   }
2682
2683   // Modifiers
2684   if (aModifiers.Length() > 0) {
2685     Handle(StepRepr_CompoundRepresentationItem) aCompoundRI = new StepRepr_CompoundRepresentationItem();
2686     Handle (StepRepr_HArray1OfRepresentationItem) aModifItems = 
2687       new StepRepr_HArray1OfRepresentationItem(1, aModifiers.Length());
2688     for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) {
2689       XCAFDimTolObjects_DimensionModif aModif = aModifiers.Value(i);
2690       Handle(StepRepr_DescriptiveRepresentationItem) aModifItem = 
2691         new StepRepr_DescriptiveRepresentationItem();
2692       aModifItem->Init(new TCollection_HAsciiString(), STEPCAFControl_GDTProperty::GetDimModifierName(aModif));
2693       aModel->AddWithRefs(aModifItem);
2694       aModifItems->SetValue(i, aModifItem);
2695     }
2696     aCompoundRI->Init(new TCollection_HAsciiString(), aModifItems);
2697     aValues->SetValue(aValIt, aCompoundRI);
2698     aValIt++;
2699   }
2700
2701   // Orientation
2702   if (theObject->GetType() == XCAFDimTolObjects_DimensionType_Location_Oriented) {
2703     Handle(StepGeom_Axis2Placement3d) anOrientation = new StepGeom_Axis2Placement3d();
2704     gp_Dir aDir;
2705     theObject->GetDirection(aDir);
2706     GeomToStep_MakeCartesianPoint MkPoint(theObject->GetPoints()->Value(1));
2707     Handle(StepGeom_CartesianPoint) aLoc = MkPoint.Value();
2708     Handle(StepGeom_Direction) anAxis = new StepGeom_Direction();
2709     Handle(TColStd_HArray1OfReal) aCoords = new TColStd_HArray1OfReal(1, 3);
2710     aCoords->SetValue(1, aDir.X());
2711     aCoords->SetValue(2, aDir.Y());
2712     aCoords->SetValue(3, aDir.Z());
2713     anAxis->Init(new TCollection_HAsciiString(), aCoords);
2714     anOrientation->Init(new TCollection_HAsciiString("orientation"), aLoc, Standard_True, anAxis, Standard_False, NULL);
2715     aValues->SetValue(aValIt, anOrientation);
2716     aValIt++;
2717   }
2718
2719   // Descriptions
2720   if (theObject->HasDescriptions()) {
2721     for (Standard_Integer i = 0; i < theObject->NbDescriptions(); i++) {
2722       Handle(StepRepr_DescriptiveRepresentationItem) aDRI = new StepRepr_DescriptiveRepresentationItem();
2723       aDRI->Init(theObject->GetDescriptionName(i), theObject->GetDescription(i));
2724       aValues->SetValue(aValIt, aDRI);
2725       aValIt++;
2726     }
2727   }
2728
2729   for (Standard_Integer i = 1; i <= aValues->Length(); i++)
2730     aModel->AddWithRefs(aValues->Value(i));
2731
2732   // Create resulting Shape_Dimension_Representation
2733   Handle(StepShape_ShapeDimensionRepresentation) aSDR = new StepShape_ShapeDimensionRepresentation();
2734   aSDR->Init(new TCollection_HAsciiString(), aValues, theRC);
2735   aModel->AddWithRefs(aSDR);
2736   Handle(StepShape_DimensionalCharacteristicRepresentation) aDCR = new StepShape_DimensionalCharacteristicRepresentation();
2737   aDCR->Init(theDimension, aSDR);
2738   aModel->AddWithRefs(aDCR);
2739
2740   // Plus_Minus_Tolerance
2741   if (theObject->IsDimWithPlusMinusTolerance()) {
2742     Handle(TCollection_HAsciiString) aDummyName = new TCollection_HAsciiString(aMeasureName);
2743     aDummyName = aDummyName->SubString(9, aDummyName->Length()); //delete "POSITIVE_"
2744     aMeasureName = aDummyName->ToCString();
2745     Standard_Real aLowerTolValue = -theObject->GetLowerTolValue(),
2746                   anUpperTolValue = theObject->GetUpperTolValue();
2747     // Upper
2748     Handle(StepBasic_MeasureWithUnit) anUpperMWU = new StepBasic_MeasureWithUnit();
2749     Handle(StepBasic_MeasureValueMember) anUpperValue = new StepBasic_MeasureValueMember();
2750     anUpperValue->SetName(aMeasureName);
2751     anUpperValue->SetReal(anUpperTolValue);
2752     anUpperMWU->Init(anUpperValue, aUnit);
2753     aModel->AddWithRefs(anUpperMWU);
2754     // Lower
2755     Handle(StepBasic_MeasureWithUnit) aLowerMWU = new StepBasic_MeasureWithUnit();
2756     Handle(StepBasic_MeasureValueMember) aLowerValue = new StepBasic_MeasureValueMember();
2757     aLowerValue->SetName(aMeasureName);
2758     aLowerValue->SetReal(aLowerTolValue);
2759     aLowerMWU->Init(aLowerValue, aUnit);
2760     aModel->AddWithRefs(aLowerMWU);
2761     // Tolerance
2762     Handle(StepShape_ToleranceValue) aTolValue = new StepShape_ToleranceValue();
2763     aTolValue->Init(aLowerMWU, anUpperMWU);
2764     aModel->AddWithRefs(aTolValue);
2765     StepShape_ToleranceMethodDefinition aMethod;
2766     aMethod.SetValue(aTolValue);
2767     Handle(StepShape_PlusMinusTolerance) aPlusMinusTol = new StepShape_PlusMinusTolerance();
2768     aPlusMinusTol->Init(aMethod, theDimension);
2769     aModel->AddWithRefs(aPlusMinusTol);
2770   }
2771   // Tolerance class
2772   if (theObject->IsDimWithClassOfTolerance()) {
2773     Standard_Boolean isHole;
2774     XCAFDimTolObjects_DimensionFormVariance aFormVariance;
2775     XCAFDimTolObjects_DimensionGrade aGrade;
2776     if (!theObject->GetClassOfTolerance(isHole, aFormVariance, aGrade))
2777       return;
2778     Handle(StepShape_LimitsAndFits) aLAF = STEPCAFControl_GDTProperty::GetLimitsAndFits(isHole, aFormVariance, aGrade);
2779     aModel->AddWithRefs(aLAF);
2780     StepShape_ToleranceMethodDefinition aMethod;
2781     aMethod.SetValue(aLAF);
2782     Handle(StepShape_PlusMinusTolerance) aPlusMinusTol = new StepShape_PlusMinusTolerance();
2783     aPlusMinusTol->Init(aMethod, theDimension);
2784     aModel->AddWithRefs(aPlusMinusTol);
2785   }
2786 }
2787
2788 //=======================================================================
2789 //function : WriteDatumSystem
2790 //purpose  : auxiliary (write Write datum system for given
2791 //           geometric_tolerance)
2792 //======================================================================
2793 static Handle(StepDimTol_HArray1OfDatumSystemOrReference) WriteDatumSystem(const Handle(XSControl_WorkSession) &WS,
2794                                                                            const TDF_Label theGeomTolL,
2795                                                                            const TDF_LabelSequence theDatumSeq,
2796                                                                            const STEPConstruct_DataMapOfAsciiStringTransient theDatumMap,
2797                                                                            const Handle(StepRepr_RepresentationContext)& theRC)
2798 {
2799   // Get working data
2800   const Handle(Interface_InterfaceModel) &Model = WS->Model();
2801   const Handle(Interface_HGraph) aHGraph = WS->HGraph();
2802   if (aHGraph.IsNull())
2803     return NULL;
2804   Interface_Graph aGraph = aHGraph->Graph();
2805   Handle(XCAFDoc_GeomTolerance) aGTAttr;
2806   if (!theGeomTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGTAttr)) 
2807     return NULL;
2808   Handle(XCAFDimTolObjects_GeomToleranceObject) anObject = aGTAttr->GetObject();
2809   if (anObject.IsNull())
2810     return NULL;
2811
2812   // Unit
2813   StepBasic_Unit aUnit = GetUnit(theRC);
2814
2815   XCAFDimTolObjects_DatumObjectSequence aDatums;
2816   Standard_Integer aMaxDatumNum = 0;
2817   for (Standard_Integer i = 1; i <= theDatumSeq.Length(); i++) {
2818     Handle(XCAFDoc_Datum) aDatumAttr;
2819     if (!theDatumSeq.Value(i).FindAttribute(XCAFDoc_Datum::GetID(), aDatumAttr)) 
2820       continue;
2821     Handle(XCAFDimTolObjects_DatumObject) aDatumObj = aDatumAttr->GetObject();
2822     if (aDatumObj.IsNull())
2823       continue;
2824     aDatums.Append(aDatumObj);
2825     aMaxDatumNum = Max(aMaxDatumNum, aDatumObj->GetPosition());
2826   }
2827
2828   Handle(StepDimTol_HArray1OfDatumReferenceCompartment) aConstituents =
2829     new StepDimTol_HArray1OfDatumReferenceCompartment(1, aMaxDatumNum);
2830   // Auxiliary datum to initialize attributes in Datum_System
2831   Handle(StepDimTol_Datum) aFirstDatum;
2832   Standard_Integer aConstituentsNum = 0;
2833   for (Standard_Integer i = 1; i <= aMaxDatumNum; i++) {
2834     // Collect datums with i-th position
2835     XCAFDimTolObjects_DatumObjectSequence aDatumSeqPos;
2836     for (Standard_Integer j = 1; j <= aDatums.Length(); j++)
2837       if (aDatums.Value(j)->GetPosition() == i)
2838         aDatumSeqPos.Append(aDatums.Value(j));
2839     if (aDatumSeqPos.Length() < 1)
2840       continue;
2841
2842     aConstituentsNum++;
2843     // Initialize Datum_Reference_Compartment
2844     StepDimTol_DatumOrCommonDatum aDatumRef;
2845     Handle(StepDimTol_DatumReferenceCompartment) aCompartment =
2846       new StepDimTol_DatumReferenceCompartment();
2847     Handle(StepDimTol_HArray1OfDatumReferenceModifier) aModifiers;
2848     if (aDatumSeqPos.Length() == 1) {
2849       // Datum entity
2850       Handle(Standard_Transient) aFDValue;
2851       if (theDatumMap.Find(aDatumSeqPos.Value(1)->GetName()->String(), aFDValue))
2852         aFirstDatum = Handle(StepDimTol_Datum)::DownCast (aFDValue);
2853       aDatumRef.SetValue(aFirstDatum);
2854       // Modifiers
2855       XCAFDimTolObjects_DatumModifiersSequence aSimpleModifiers = aDatumSeqPos.Value(1)->GetModifiers();
2856       XCAFDimTolObjects_DatumModifWithValue aModifWithVal;
2857       Standard_Real aValue = 0;
2858       aDatumSeqPos.Value(1)->GetModifierWithValue(aModifWithVal, aValue);
2859       aModifiers = STEPCAFControl_GDTProperty::GetDatumRefModifiers(aSimpleModifiers, aModifWithVal, aValue, aUnit);
2860       // Add Datum_Reference_Modifier_With_Value
2861       if (!aModifiers.IsNull()) {
2862         Handle(StepDimTol_DatumReferenceModifierWithValue) aDRMWV = 
2863           aModifiers->Value(aModifiers->Length()).DatumReferenceModifierWithValue();
2864         if (!aDRMWV.IsNull()) {
2865           Model->AddWithRefs(aDRMWV);
2866         }
2867       }
2868     }
2869     else {
2870       Handle(StepDimTol_HArray1OfDatumReferenceElement) aCommonDatumList = new StepDimTol_HArray1OfDatumReferenceElement(1, aDatumSeqPos.Length());
2871       for (Standard_Integer j = 1; j <= aDatumSeqPos.Length(); j++) {
2872         // Datum entity
2873         Handle(StepDimTol_Datum) aDatum;
2874         Handle(Standard_Transient) aDValue;
2875         if (theDatumMap.Find(aDatumSeqPos.Value(j)->GetName()->String(), aDValue))
2876           aDatum = Handle(StepDimTol_Datum)::DownCast (aDValue);
2877         StepDimTol_DatumOrCommonDatum anElemDatumRef;
2878         anElemDatumRef.SetValue(aDatum);
2879         if (aFirstDatum.IsNull())
2880           aFirstDatum = aDatum;
2881         // Modifiers
2882         XCAFDimTolObjects_DatumModifiersSequence aSimpleModifiers = aDatumSeqPos.Value(j)->GetModifiers();
2883         XCAFDimTolObjects_DatumModifWithValue aModifWithVal;
2884         Standard_Real aValue = 0;
2885         aDatumSeqPos.Value(j)->GetModifierWithValue(aModifWithVal, aValue);
2886         Handle(StepDimTol_HArray1OfDatumReferenceModifier) anElemModifiers =
2887           STEPCAFControl_GDTProperty::GetDatumRefModifiers(aSimpleModifiers, aModifWithVal, aValue, aUnit);
2888         // Add Datum_Reference_Modifier_With_Value
2889         if (!anElemModifiers.IsNull()) {
2890           Handle(StepDimTol_DatumReferenceModifierWithValue) aDRMWV = 
2891             anElemModifiers->Value(aModifiers->Length()).DatumReferenceModifierWithValue();
2892           if (!aDRMWV.IsNull()) {
2893             Model->AddWithRefs(aDRMWV);
2894           }
2895         }
2896         // Datum_Reference_Element
2897         Handle(StepDimTol_DatumReferenceElement) anElement = new StepDimTol_DatumReferenceElement();
2898         anElement->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aDatum->OfShape(),
2899           aDatum->ProductDefinitional(), anElemDatumRef, !anElemModifiers.IsNull(), anElemModifiers);
2900         Model->AddWithRefs(anElement);
2901         aCommonDatumList->SetValue(j, anElement);
2902       }
2903       aDatumRef.SetValue(aCommonDatumList);
2904     }
2905     aCompartment->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aFirstDatum->OfShape(),
2906       aFirstDatum->ProductDefinitional(), aDatumRef, !aModifiers.IsNull(), aModifiers);
2907     Model->AddWithRefs(aCompartment);
2908     aConstituents->SetValue(aConstituentsNum, aCompartment);
2909   }
2910   // Remove null elements from aConstituents
2911   Standard_Integer aNbConstituents = 0;
2912   for (Standard_Integer i = 1; i <= aConstituents->Length(); i++)
2913     if (!aConstituents->Value(i).IsNull())
2914       aNbConstituents++;
2915   Handle(StepDimTol_HArray1OfDatumReferenceCompartment) aResConstituents =
2916     new StepDimTol_HArray1OfDatumReferenceCompartment(1, aNbConstituents);
2917   Standard_Integer aConstituentsIt = 0;
2918   for (Standard_Integer i = 1; i <= aConstituents->Length(); i++)
2919     if (!aConstituents->Value(i).IsNull()) {
2920       aConstituentsIt++;
2921       aResConstituents->SetValue(aConstituentsIt, aConstituents->Value(i));
2922     }
2923
2924   Handle(StepDimTol_HArray1OfDatumSystemOrReference) aDatumSystem;
2925   Handle(StepDimTol_DatumSystem) aDS = new StepDimTol_DatumSystem();
2926   aDS->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(), aFirstDatum->OfShape(),
2927     aFirstDatum->ProductDefinitional(), aResConstituents);
2928   Model->AddWithRefs(aDS);
2929   StepDimTol_DatumSystemOrReference anArrayValue;
2930   anArrayValue.SetValue(aDS);
2931   aDatumSystem = new StepDimTol_HArray1OfDatumSystemOrReference(1, 1);
2932   aDatumSystem->SetValue(1, anArrayValue);
2933
2934   // Axis
2935   if (anObject->HasAxis()) {
2936     Handle(StepGeom_Axis2Placement3d) anAxis =
2937       STEPCAFControl_GDTProperty::GetAxis2Placement3D(anObject->GetAxis());
2938     anAxis->SetName(new TCollection_HAsciiString("orientation"));
2939     Handle(StepAP242_GeometricItemSpecificUsage) aGISU = new StepAP242_GeometricItemSpecificUsage();
2940     StepAP242_ItemIdentifiedRepresentationUsageDefinition aDefinition;
2941     aDefinition.SetValue(aDS);
2942     Handle(StepRepr_HArray1OfRepresentationItem) anReprItems = new StepRepr_HArray1OfRepresentationItem(1, 1);
2943     Handle(StepRepr_RepresentationItem) anIdentifiedItem = anAxis;
2944     anReprItems->SetValue(1, anIdentifiedItem);
2945     Interface_EntityIterator subs = aGraph.Sharings(aFirstDatum->OfShape());
2946     Handle(StepShape_ShapeDefinitionRepresentation) aSDR;
2947     for (subs.Start(); subs.More() && aSDR.IsNull(); subs.Next()) {
2948       Handle(Standard_Transient) anEntity = subs.Value();
2949       aSDR = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(anEntity);
2950     }
2951     if (aSDR.IsNull())
2952       return aDatumSystem;
2953     
2954     aGISU->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(),
2955       aDefinition, aSDR->UsedRepresentation(), anReprItems);
2956     Model->AddWithRefs(anAxis);
2957     Model->AddWithRefs(aGISU);
2958   }
2959
2960   return aDatumSystem;
2961 }
2962
2963 //=======================================================================
2964 //function : WriteToleranceZone
2965 //purpose  : auxiliary (write tolerace zones)
2966 //=======================================================================
2967 static void WriteToleranceZone (const Handle(XSControl_WorkSession) &WS,
2968                                 const Handle(XCAFDimTolObjects_GeomToleranceObject)& theObject,
2969                                 const Handle(StepDimTol_GeometricTolerance)& theEntity,
2970                                 const Handle(StepRepr_RepresentationContext)& theRC)
2971 {
2972   // Get working data
2973   const Handle(Interface_InterfaceModel) &Model = WS->Model();
2974   if (theEntity.IsNull() || theObject.IsNull())
2975     return;
2976
2977   // Return if there is no tolerance zones
2978   if (theObject->GetTypeOfValue() == XCAFDimTolObjects_GeomToleranceTypeValue_None &&
2979       theObject->GetZoneModifier() != XCAFDimTolObjects_GeomToleranceZoneModif_Runout)
2980     return;
2981
2982   // Create Tolerance_Zone
2983   Handle(StepDimTol_ToleranceZoneForm) aForm = new StepDimTol_ToleranceZoneForm();
2984   Model->AddWithRefs(aForm);
2985   aForm->Init(STEPCAFControl_GDTProperty::GetTolValueType(theObject->GetTypeOfValue()));
2986   Handle(StepDimTol_HArray1OfToleranceZoneTarget) aZoneTargetArray = new StepDimTol_HArray1OfToleranceZoneTarget(1, 1);
2987   StepDimTol_ToleranceZoneTarget aTarget;
2988   aTarget.SetValue(theEntity);
2989   aZoneTargetArray->SetValue(1, aTarget);
2990   Handle(StepDimTol_ToleranceZone) aZone = new StepDimTol_ToleranceZone();
2991   aZone->Init(new TCollection_HAsciiString(), new TCollection_HAsciiString(),
2992     theEntity->TolerancedShapeAspect().ShapeAspect()->OfShape(), StepData_LFalse,
2993     aZoneTargetArray, aForm);
2994   Model->AddWithRefs(aZone);
2995
2996   // Runout_Tolerance_Zone
2997   Handle(StepBasic_PlaneAngleMeasureWithUnit) aPAMWU = new StepBasic_PlaneAngleMeasureWithUnit();
2998   Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember();
2999   aValueMember->SetName("PLANE_ANGLE_MEASURE");
3000   aValueMember->SetReal(theObject->GetValueOfZoneModifier());
3001   aPAMWU->Init(aValueMember, GetUnit(theRC, Standard_True));
3002   Handle(StepDimTol_RunoutZoneOrientation) anOrientation = new StepDimTol_RunoutZoneOrientation();
3003   anOrientation->Init(aPAMWU);
3004   Handle(StepDimTol_RunoutZoneDefinition) aDefinition = new StepDimTol_RunoutZoneDefinition();
3005   aDefinition->Init(aZone, NULL, anOrientation);
3006   Model->AddWithRefs(aDefinition);
3007   Model->AddWithRefs(anOrientation);
3008   Model->AddWithRefs(aPAMWU);
3009 }
3010
3011 //=======================================================================
3012 //function : WriteGeomTolerance
3013 //purpose  : auxiliary (write Geometric_Tolerance entity for given shapes,
3014 //           label and datum system)
3015 //======================================================================
3016 static void WriteGeomTolerance (const Handle(XSControl_WorkSession) &WS,
3017                                 const TDF_LabelSequence theShapeSeqL,
3018                                 const TDF_Label theGeomTolL,
3019                                 const Handle(StepDimTol_HArray1OfDatumSystemOrReference)& theDatumSystem,
3020                                 const Handle(StepRepr_RepresentationContext)& theRC)
3021 {
3022   // Get working data
3023   const Handle(Interface_InterfaceModel) &Model = WS->Model();
3024   Handle(XCAFDoc_GeomTolerance) aGTAttr;
3025   if (!theGeomTolL.FindAttribute(XCAFDoc_GeomTolerance::GetID(), aGTAttr)) 
3026     return;
3027   Handle(XCAFDimTolObjects_GeomToleranceObject) anObject = aGTAttr->GetObject();
3028   if (anObject.IsNull())
3029     return;
3030
3031   // Value
3032   Handle(StepBasic_LengthMeasureWithUnit) aLMWU = new StepBasic_LengthMeasureWithUnit();
3033   StepBasic_Unit aUnit = GetUnit(theRC);
3034   Handle(StepBasic_MeasureValueMember) aValueMember = new StepBasic_MeasureValueMember();
3035   aValueMember->SetName("LENGTH_MEASURE");
3036   aValueMember->SetReal(anObject->GetValue());
3037   aLMWU->Init(aValueMember, aUnit);
3038   Model->AddWithRefs(aLMWU);
3039
3040   // Geometric_Tolerance target
3041   Handle(StepRepr_ShapeAspect) aMainSA;
3042   Handle(StepRepr_RepresentationContext) dummyRC;
3043   Handle(StepAP242_GeometricItemSpecificUsage) dummyGISU;
3044   if (theShapeSeqL.Length() == 1) {
3045     TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theShapeSeqL.Value(1));
3046     aMainSA = WriteShapeAspect(WS, theGeomTolL, aShape, dummyRC, dummyGISU);
3047     Model->AddWithRefs(aMainSA);
3048   }
3049   else {
3050     Handle(StepRepr_CompositeShapeAspect) aCSA;
3051     for (Standard_Integer i = 1; i <= theShapeSeqL.Length(); i++) {
3052       TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(theShapeSeqL.Value(i));
3053       Handle(StepRepr_ShapeAspect) aSA = WriteShapeAspect(WS, theGeomTolL, aShape, dummyRC, dummyGISU);
3054       if (aSA.IsNull())
3055         continue;
3056       if (aCSA.IsNull()) {
3057         aCSA = new StepRepr_CompositeShapeAspect();
3058         aCSA->Init(aSA->Name(), aSA->Description(), aSA->OfShape(), aSA->ProductDefinitional());
3059         Model->AddWithRefs(aCSA);
3060       }
3061       Handle(StepRepr_ShapeAspectRelationship) aSAR = new StepRepr_ShapeAspectRelationship();
3062       aSAR->Init(new TCollection_HAsciiString(), Standard_False, NULL, aCSA, aSA);
3063       Model->AddWithRefs(aSAR);
3064     }
3065     aMainSA = aCSA;
3066   }
3067   StepDimTol_GeometricToleranceTarget aGTTarget;
3068   aGTTarget.SetValue(aMainSA);
3069
3070   Standard_Boolean isWithModif = Standard_False,
3071                    isWithDatRef = Standard_False,
3072                    isWithMaxTol = Standard_False;
3073   // Modifiers
3074   // Simple modifiers
3075   XCAFDimTolObjects_GeomToleranceModifiersSequence aModifiers = anObject->GetModifiers();
3076   Handle(StepDimTol_HArray1OfGeometricToleranceModifier) aModifArray;
3077   Handle(StepBasic_LengthMeasureWithUnit) aMaxLMWU;
3078   Standard_Integer aModifNb = aModifiers.Length();
3079   if (anObject->GetMaterialRequirementModifier() != XCAFDimTolObjects_GeomToleranceMatReqModif_None)
3080       aModifNb++;
3081   for (Standard_Integer i = 1; i < aModifiers.Length(); i++)
3082     if (aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Around ||
3083         aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Over)
3084         aModifNb--;
3085   if (aModifNb > 0) {
3086     isWithModif = Standard_True;
3087     aModifArray = new StepDimTol_HArray1OfGeometricToleranceModifier(1, aModifNb);
3088     Standard_Integer k = 1;
3089     for (Standard_Integer i = 1; i <= aModifiers.Length(); i++) {
3090       if (aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Around ||
3091         aModifiers.Value(i) == XCAFDimTolObjects_GeomToleranceModif_All_Over)
3092         continue;
3093       StepDimTol_GeometricToleranceModifier aModif = 
3094         STEPCAFControl_GDTProperty::GetGeomToleranceModifier(aModifiers.Value(i));
3095       aModifArray->SetValue(k, aModif);
3096       k++;
3097     }
3098     if (anObject->GetMaterialRequirementModifier() == XCAFDimTolObjects_GeomToleranceMatReqModif_L) {
3099       aModifArray->SetValue(aModifNb, StepDimTol_GTMLeastMaterialRequirement);
3100     }
3101     else if (anObject->GetMaterialRequirementModifier() == XCAFDimTolObjects_GeomToleranceMatReqModif_M) {
3102       aModifArray->SetValue(aModifNb, StepDimTol_GTMMaximumMaterialRequirement);
3103     }
3104     // Modifier with value
3105     if (anObject->GetMaxValueModifier() != 0) {
3106       isWithMaxTol = Standard_True;
3107       aMaxLMWU = new StepBasic_LengthMeasureWithUnit();
3108       Handle(StepBasic_MeasureValueMember) aModifierValueMember = new StepBasic_MeasureValueMember();
3109       aModifierValueMember->SetName("LENGTH_MEASURE");
3110       aModifierValueMember->SetReal(anObject->GetMaxValueModifier());
3111       aMaxLMWU->Init(aModifierValueMember, aUnit);
3112       Model->AddWithRefs(aMaxLMWU);
3113     }
3114   }
3115
3116   // Datum Reference
3117   isWithDatRef = !theDatumSystem.IsNull();
3118
3119   // Collect all attributes
3120   Handle(TCollection_HAsciiString) aName = new TCollection_HAsciiString(),
3121                                   aDescription = new TCollection_HAsciiString();
3122   Handle(StepDimTol_GeometricToleranceWithDatumReference) aGTWDR = 
3123     new StepDimTol_GeometricToleranceWithDatumReference();
3124   aGTWDR->SetDatumSystem(theDatumSystem);
3125   Handle(StepDimTol_GeometricToleranceWithModifiers) aGTWM = 
3126     new StepDimTol_GeometricToleranceWithModifiers();
3127   aGTWM->SetModifiers(aModifArray);
3128   StepDimTol_GeometricToleranceType aType = 
3129     STEPCAFControl_GDTProperty::GetGeomToleranceType(anObject->GetType());
3130
3131   // Init and write necessary subtype of Geometric_Tolerance entity
3132   Handle(StepDimTol_GeometricTolerance) aGeomTol;
3133   if (isWithModif) {
3134     if (isWithMaxTol) {
3135       if (isWithDatRef) {
3136         // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference & 
3137         //Geometric_Tolerance_With_Maximum_Tolerance & Geometric_Tolerance_With_Modifiers
3138         Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol) aResult =
3139           new StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol();
3140         aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aGTWM, aMaxLMWU, aType);
3141         aGeomTol = aResult;
3142       }
3143       else {
3144         // Geometric_Tolerance & Geometric_Tolerance_With_Maximum_Tolerance & Geometric_Tolerance_With_Modifiers
3145         Handle(StepDimTol_GeoTolAndGeoTolWthMaxTol) aResult =
3146           new StepDimTol_GeoTolAndGeoTolWthMaxTol();
3147         aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWM, aMaxLMWU, aType);
3148         aGeomTol = aResult;
3149       }
3150     }
3151     else {
3152       if (isWithDatRef) {
3153         // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference & Geometric_Tolerance_With_Modifiers
3154         Handle(StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod) aResult =
3155           new StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod();
3156         aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aGTWM, aType);
3157         aGeomTol = aResult;
3158       }
3159       else {
3160         // Geometric_Tolerance & Geometric_Tolerance_With_Modifiers
3161         Handle(StepDimTol_GeoTolAndGeoTolWthMod) aResult =
3162           new StepDimTol_GeoTolAndGeoTolWthMod();
3163         aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWM, aType);
3164         aGeomTol = aResult;
3165       }
3166     }
3167   }
3168   else {
3169     if (isWithDatRef) {
3170       // Geometric_Tolerance & Geometric_Tolerance_With_Datum_Reference
3171       Handle(StepDimTol_GeoTolAndGeoTolWthDatRef) aResult =
3172           new StepDimTol_GeoTolAndGeoTolWthDatRef();
3173         aResult->Init(aName, aDescription, aLMWU, aGTTarget, aGTWDR, aType);
3174         aGeomTol = aResult;
3175     }
3176     else {
3177       // Geometric_Tolerance
3178       Handle(StepDimTol_GeometricTolerance) aResult = 
3179         STEPCAFControl_GDTProperty::GetGeomTolerance(anObject->GetType());
3180       if (!aResult.IsNull()) {
3181         aResult->Init(aName, aDescription, aLMWU, aGTTarget);
3182         aGeomTol = aResult;
3183       }
3184     }
3185   }
3186   Model->AddWithRefs(aGeomTol);
3187   WriteToleranceZone(WS, anObject, aGeomTol, theRC);
3188   //Annotation plane and Presentation
3189   WritePresentation(WS, anObject->GetPresentation(), anObject->GetPlane(), anObject->GetPointTextAttach(), aGeomTol);
3190 }
3191
3192 //=======================================================================
3193 //function : WriteDGTs
3194 //purpose  : 
3195 //=======================================================================
3196 Standard_Boolean STEPCAFControl_Writer::WriteDGTs (const Handle(XSControl_WorkSession) &WS,
3197                                                    const TDF_LabelSequence  &labels ) const
3198 {
3199   
3200   if ( labels.Length() <=0 ) return Standard_False;
3201   
3202   // get working data
3203   const Handle(Interface_InterfaceModel) &Model = WS->Model();
3204   const Handle(XSControl_TransferWriter) &TW = WS->TransferWriter();
3205   const Handle(Transfer_FinderProcess) &FP = TW->FinderProcess();
3206
3207   const Handle(Interface_HGraph) aHGraph = WS->HGraph();
3208   if(aHGraph.IsNull())
3209     return Standard_False;
3210
3211   Interface_Graph aGraph = aHGraph->Graph();
3212   Handle(XCAFDoc_DimTolTool) DGTTool = XCAFDoc_DocumentTool::DimTolTool( labels(1) );
3213   if(DGTTool.IsNull() ) return Standard_False;
3214
3215   TDF_LabelSequence DGTLabels;
3216
3217   STEPConstruct_DataMapOfAsciiStringTransient DatumMap;
3218
3219   // write Datums
3220   DGTLabels.Clear();
3221   DGTTool->GetDatumLabels(DGTLabels);
3222   if(DGTLabels.Length()<=0) return Standard_False;
3223   Standard_Integer i;
3224   for(i=1; i<=DGTLabels.Length(); i++) {
3225     TDF_Label DatumL = DGTLabels.Value(i);
3226     TDF_LabelSequence ShapeL;
3227     TDF_LabelSequence aNullSeq;
3228     if(!DGTTool->GetRefShapeLabel(DatumL,ShapeL,aNullSeq)) continue;
3229     // find target shape
3230     TopoDS_Shape aShape = XCAFDoc_ShapeTool::GetShape(ShapeL.Value(1));
3231     TopLoc_Location Loc;
3232     TColStd_SequenceOfTransient seqRI;
3233     FindEntities( FP, aShape, Loc, seqRI );
3234     if ( seqRI.Length() <= 0 ) {
3235       FP->Messenger() << "Warning: Cannot find RI for "<<aShape.TShape()->DynamicType()->Name()<<endl;
3236       continue;
3237     }
3238     Handle(StepRepr_ProductDefinitionShape) PDS;
3239     Handle(StepRepr_RepresentationContext) RC;
3240     Handle(Standard_Transient) ent = seqRI.Value(1);
3241     Handle(StepShape_AdvancedFace) AF;
3242     Handle(StepShape_EdgeCurve) EC;
3243     FindPDSforDGT(aGraph,ent,PDS,RC,AF,EC);
3244     if(PDS.IsNull()) continue;
3245     //cout<<"Model->Number(PDS)="<<Model->Number(PDS)<<endl;
3246     Handle(XCAFDoc_Datum) DatumAttr;
3247     if(!DatumL.FindAttribute(XCAFDoc_Datum::GetID(),DatumAttr)) continue;
3248     Handle(TCollection_HAsciiString) aName = DatumAttr->GetName();
3249     Handle(TCollection_HAsciiString) aDescription = DatumAttr->GetDescription();
3250     Handle(TCollection_HAsciiString) anIdentification = DatumAttr->GetIdentification();
3251     Handle(StepDimTol_DatumFeature) DF = new StepDimTol_DatumFeature;
3252     Handle(StepDimTol_Datum) aDatum = new StepDimTol_Datum;
3253     DF->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue);
3254     Model->AddWithRefs(DF);
3255     aDatum->Init(aName, new TCollection_HAsciiString, PDS, StepData_LFalse, anIdentification);
3256     Model->AddWithRefs(aDatum);
3257     Handle(StepRepr_ShapeAspectRelationship) SAR = new StepRepr_ShapeAspectRelationship;
3258     SAR->SetName(aName);
3259     SAR->SetRelatingShapeAspect(DF);
3260     SAR->SetRelatedShapeAspect(aDatum);
3261     Model->AddWithRefs(SAR);
3262     // write chain for DatumFeature
3263     StepRepr_CharacterizedDefinition CD;
3264     CD.SetValue(DF);
3265     Handle(StepRepr_PropertyDefinition) PropD = new StepRepr_PropertyDefinition;
3266     PropD->Init(aName,Standard_True,aDescription,CD);
3267     Model->AddWithRefs(PropD);
3268     StepRepr_RepresentedDefinition RD;
3269     RD.SetValue(PropD);
3270     Handle(StepShape_ShapeRepresentation) SR = new StepShape_ShapeRepresentation;
3271     Handle(StepRepr_HArray1OfRepresentationItem) HARI =
3272       new StepRepr_HArray1OfRepresentationItem(1,1);
3273     HARI->SetValue(1,AF);
3274     SR->Init(aName,HARI,RC);
3275     Handle(StepShape_ShapeDefinitionRepresentation) SDR = new StepShape_ShapeDefinitionRepresentation;
3276     SDR->Init(RD,SR);
3277     Model->AddWithRefs(SDR);
3278     // write chain for Datum 
3279     StepRepr_CharacterizedDefinition CD1;
3280     CD1.SetValue(aDatum);
3281     Handle(StepRepr_PropertyDefinition) PropD1 = new StepRepr_PropertyDefinition;
3282     PropD1->Init(aName,Standard_True,aDescription,CD1);
3283     Model->AddWithRefs(PropD1);
3284     StepRepr_RepresentedDefinition RD1;
3285     RD1.SetValue(PropD1);
3286     Handle(StepShape_ShapeRepresentation) SR1 = new StepShape_ShapeRepresentation;
3287     Handle(StepRepr_HArray1OfRepresentationItem) HARI1 =
3288       new StepRepr_HArray1OfRepresentationItem(1,1);
3289     HARI1->SetValue(1,AF->FaceGeometry());
3290     SR1->Init(aName,HARI1,RC);
3291     Model->AddWithRefs(SR1);
3292     Handle(StepShape_ShapeDefinitionRepresentation) SDR1 = new StepShape_ShapeDefinitionRepresentation;
3293     SDR1->Init(RD1,SR1);
3294     Model->AddWithRefs(SDR1);
3295     // add created Datum into Map
3296     TCollection_AsciiString stmp(aName->ToCString());
3297     stmp.AssignCat(aDescription->ToCString());
3298     stmp.AssignCat(anIdentification->ToCString());
3299     DatumMap.Bind(stmp,aDatum);
3300   }
3301
3302   // write Tolerances and Dimensions
3303   DGTLabels.Clear();
3304   DGTTool->GetDimTolLabels(DGTLabels);
3305   if(DGTLabels.Length()<=0) return Standard_False;
3306   for(i=1; i<=DGTLabels.Length(); i++) {
3307     TDF_Label DimTolL = DGTLabels.Value(i);
3308     TDF_LabelSequence ShapeL;