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