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