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