0029528: Visualization, TKOpenGl - allow defining sRGB textures
[occt.git] / src / STEPConstruct / STEPConstruct_Styles.cxx
1 // Created on: 1999-09-10
2 // Created by: Andrey BETENEV
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <APIHeaderSection_MakeHeader.hxx>
19 #include <gp_Pnt.hxx>
20 #include <Interface_EntityIterator.hxx>
21 #include <Interface_Graph.hxx>
22 #include <Interface_InterfaceModel.hxx>
23 #include <Interface_Static.hxx>
24 #include <Quantity_Color.hxx>
25 #include <StepBasic_MeasureValueMember.hxx>
26 #include <STEPConstruct.hxx>
27 #include <STEPConstruct_Styles.hxx>
28 #include <StepData_StepModel.hxx>
29 #include <StepGeom_GeometricRepresentationItem.hxx>
30 #include <StepRepr_HArray1OfRepresentationItem.hxx>
31 #include <StepRepr_ItemDefinedTransformation.hxx>
32 #include <StepRepr_ProductDefinitionShape.hxx>
33 #include <StepRepr_Representation.hxx>
34 #include <StepRepr_RepresentationContext.hxx>
35 #include <StepRepr_RepresentationItem.hxx>
36 #include <StepRepr_RepresentationRelationshipWithTransformation.hxx>
37 #include <StepRepr_ShapeRepresentationRelationship.hxx>
38 #include <StepRepr_Transformation.hxx>
39 #include <StepShape_ContextDependentShapeRepresentation.hxx>
40 #include <StepShape_ShapeDefinitionRepresentation.hxx>
41 #include <StepShape_ShapeRepresentation.hxx>
42 #include <StepVisual_Colour.hxx>
43 #include <StepVisual_ColourRgb.hxx>
44 #include <StepVisual_CurveStyle.hxx>
45 #include <StepVisual_DraughtingModel.hxx>
46 #include <StepVisual_DraughtingPreDefinedColour.hxx>
47 #include <StepVisual_DraughtingPreDefinedCurveFont.hxx>
48 #include <StepVisual_FillAreaStyle.hxx>
49 #include <StepVisual_FillAreaStyleColour.hxx>
50 #include <StepVisual_FillStyleSelect.hxx>
51 #include <StepVisual_HArray1OfFillStyleSelect.hxx>
52 #include <StepVisual_HArray1OfPresentationStyleAssignment.hxx>
53 #include <StepVisual_HArray1OfPresentationStyleSelect.hxx>
54 #include <StepVisual_HArray1OfSurfaceStyleElementSelect.hxx>
55 #include <StepVisual_Invisibility.hxx>
56 #include <StepVisual_InvisibleItem.hxx>
57 #include <StepVisual_MechanicalDesignGeometricPresentationRepresentation.hxx>
58 #include <StepVisual_OverRidingStyledItem.hxx>
59 #include <StepVisual_PreDefinedColour.hxx>
60 #include <StepVisual_PreDefinedItem.hxx>
61 #include <StepVisual_PresentationStyleAssignment.hxx>
62 #include <StepVisual_PresentationStyleByContext.hxx>
63 #include <StepVisual_PresentationStyleSelect.hxx>
64 #include <StepVisual_StyledItem.hxx>
65 #include <StepVisual_SurfaceSideStyle.hxx>
66 #include <StepVisual_SurfaceStyleBoundary.hxx>
67 #include <StepVisual_SurfaceStyleElementSelect.hxx>
68 #include <StepVisual_SurfaceStyleFillArea.hxx>
69 #include <StepVisual_SurfaceStyleUsage.hxx>
70 #include <TCollection_HAsciiString.hxx>
71 #include <TColStd_HSequenceOfTransient.hxx>
72 #include <TopoDS_Shape.hxx>
73 #include <Transfer_Binder.hxx>
74 #include <TransferBRep.hxx>
75 #include <TransferBRep_ShapeMapper.hxx>
76 #include <XSControl_TransferReader.hxx>
77 #include <XSControl_TransferWriter.hxx>
78 #include <XSControl_WorkSession.hxx>
79
80 //=======================================================================
81 //function : STEPConstruct_Styles
82 //purpose  : 
83 //=======================================================================
84 STEPConstruct_Styles::STEPConstruct_Styles () 
85 {
86 }
87      
88
89 //=======================================================================
90 //function : STEPConstruct_Styles
91 //purpose  : 
92 //=======================================================================
93
94 STEPConstruct_Styles::STEPConstruct_Styles (const Handle(XSControl_WorkSession) &WS)
95      : STEPConstruct_Tool ( WS )
96 {
97 }
98
99
100 //=======================================================================
101 //function : Init
102 //purpose  : 
103 //=======================================================================
104
105 Standard_Boolean STEPConstruct_Styles::Init (const Handle(XSControl_WorkSession) &WS)
106 {
107   myMapOfStyles.Clear();
108   myStyles.Clear();
109   myPSA.Clear();
110   return SetWS ( WS );
111 }
112
113
114 //=======================================================================
115 //function : NbStyles
116 //purpose  : 
117 //=======================================================================
118
119 Standard_Integer STEPConstruct_Styles::NbStyles () const
120 {
121   return myStyles.Extent();
122 }
123
124
125 //=======================================================================
126 //function : Style
127 //purpose  : 
128 //=======================================================================
129
130 Handle(StepVisual_StyledItem) STEPConstruct_Styles::Style (const Standard_Integer i) const
131 {
132   return Handle(StepVisual_StyledItem)::DownCast ( myStyles.FindKey(i) );
133 }
134
135
136 //=======================================================================
137 //function : ClearStyles
138 //purpose  : 
139 //=======================================================================
140
141 void STEPConstruct_Styles::ClearStyles () 
142 {
143   myStyles.Clear();
144   myPSA.Clear();
145 }
146
147
148 //=======================================================================
149 //function : AddStyle
150 //purpose  : 
151 //=======================================================================
152
153 void STEPConstruct_Styles::AddStyle (const Handle(StepVisual_StyledItem) &style)
154 {
155   myStyles.Add ( style );
156 }
157
158   
159 //=======================================================================
160 //function : AddStyle
161 //purpose  : 
162 //=======================================================================
163
164 Handle(StepVisual_StyledItem) STEPConstruct_Styles::AddStyle (const Handle(StepRepr_RepresentationItem) &item,
165                                                               const Handle(StepVisual_PresentationStyleAssignment) &PSA,
166                                                               const Handle(StepVisual_StyledItem) &Override)
167 {
168   Handle(StepVisual_StyledItem) Style;
169   
170   Handle(StepVisual_HArray1OfPresentationStyleAssignment) Styles = 
171     new StepVisual_HArray1OfPresentationStyleAssignment ( 1, 1 );
172   Styles->SetValue ( 1, PSA );
173   
174   if ( Override.IsNull() ) {
175     Handle(TCollection_HAsciiString) StyName = new TCollection_HAsciiString ( "color" );
176     Style = new StepVisual_StyledItem;
177     Style->Init ( StyName, Styles, item );
178   }
179   else {
180     Handle(TCollection_HAsciiString) StyName = new TCollection_HAsciiString ( "overriding color" );
181     Handle(StepVisual_OverRidingStyledItem) OStyle = new StepVisual_OverRidingStyledItem;
182     OStyle->Init ( StyName, Styles, item, Override );
183     Style = OStyle;
184   }
185   
186   myStyles.Add ( Style );
187   // for future using
188   myPSA.Append( PSA );
189   
190   return Style;
191 }
192
193
194 //=======================================================================
195 //function : AddStyle
196 //purpose  : 
197 //=======================================================================
198
199 Handle(StepVisual_StyledItem) STEPConstruct_Styles::AddStyle (const TopoDS_Shape &Shape,
200                                                               const Handle(StepVisual_PresentationStyleAssignment) &PSA,
201                                                               const Handle(StepVisual_StyledItem) &Override)
202 {
203   Handle(StepRepr_RepresentationItem) item = STEPConstruct::FindEntity ( FinderProcess(), Shape );
204   Handle(StepVisual_StyledItem) Style;
205   if ( ! item.IsNull() ) Style = AddStyle ( item, PSA, Override );
206   return Style;
207 }
208
209
210 //=======================================================================
211 //function : CreateMDGPR
212 //purpose  : 
213 //=======================================================================
214
215 Standard_Boolean STEPConstruct_Styles::CreateMDGPR (const Handle(StepRepr_RepresentationContext) &Context,
216                                                     Handle(StepVisual_MechanicalDesignGeometricPresentationRepresentation)& Repr)
217 {
218   if ( myStyles.Extent() <1 ) return Standard_False;
219   
220   // create MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION
221   Handle(StepRepr_HArray1OfRepresentationItem) elems = 
222     new StepRepr_HArray1OfRepresentationItem ( 1, myStyles.Extent() );
223   for ( Standard_Integer i=1; i <= myStyles.Extent(); i++ ) 
224     elems->SetValue ( i, Handle(StepRepr_RepresentationItem)::DownCast ( myStyles.FindKey(i) ) );
225   // create new MDGPR
226   Repr = new StepVisual_MechanicalDesignGeometricPresentationRepresentation;
227   Handle(TCollection_HAsciiString) ReprName = new TCollection_HAsciiString ( "" );
228   Repr->Init ( ReprName, elems, Context );
229
230   // record Repr in order to have it written to the file
231 //   Model()->AddWithRefs ( Repr ); add into the model upper
232
233   // for AP203, add subschema name
234   if ( Interface_Static::IVal("write.step.schema") ==3 ) {
235     APIHeaderSection_MakeHeader mkHdr ( Handle(StepData_StepModel)::DownCast ( Model() ) );
236     Handle(TCollection_HAsciiString) subSchema = 
237       new TCollection_HAsciiString ( "SHAPE_APPEARANCE_LAYER_MIM" );
238     mkHdr.AddSchemaIdentifier ( subSchema );
239   }
240   
241   return Standard_True;
242 }
243
244
245 //=======================================================================
246 //function : CreateNAUOSRD
247 //purpose  : 
248 //=======================================================================
249
250 Standard_Boolean STEPConstruct_Styles::CreateNAUOSRD (const Handle(StepRepr_RepresentationContext) &Context,
251                                                       const Handle(StepShape_ContextDependentShapeRepresentation)& CDSR,
252                                                       const Handle(StepRepr_ProductDefinitionShape)& initPDS)
253 {
254   Handle(StepShape_ShapeDefinitionRepresentation) aSDR =
255     new StepShape_ShapeDefinitionRepresentation;
256   Handle(StepShape_ShapeRepresentation) aSR =
257     new StepShape_ShapeRepresentation;
258   Handle(TCollection_HAsciiString) ReprName = new TCollection_HAsciiString ( "" );
259   // element for axis 2 placement
260   Handle(StepRepr_HArray1OfRepresentationItem) elems = 
261     new StepRepr_HArray1OfRepresentationItem ( 1, 1 );
262   // get PDS
263   Handle(StepRepr_ProductDefinitionShape) aPDS;
264   if ( initPDS.IsNull() )
265     aPDS = CDSR->RepresentedProductRelation();
266   else
267     aPDS = initPDS; // for SHUO
268   Handle(StepRepr_ShapeRepresentationRelationship) aRepRelationShip = CDSR->RepresentationRelation();
269   Handle(StepRepr_RepresentationRelationshipWithTransformation) aRRwTRSF =
270     Handle(StepRepr_RepresentationRelationshipWithTransformation)::DownCast(aRepRelationShip);
271   StepRepr_Transformation SetReprTRSF;
272   if (!aRRwTRSF.IsNull())
273     SetReprTRSF = aRRwTRSF->TransformationOperator();
274   else
275     return Standard_False;
276   // take Item defined transformation
277   Handle(StepRepr_ItemDefinedTransformation) anItDT = SetReprTRSF.ItemDefinedTransformation();
278   elems->SetValue( 1, anItDT->TransformItem2() );
279   // init Shape representation.
280   aSR->Init ( ReprName, elems, Context );
281   // register reference between PresentationStyleByContext and ShapeRepresentation
282   for (Standard_Integer psbci = 1; psbci <= myPSA.Length(); psbci++) {
283     Handle(StepVisual_PresentationStyleByContext) PSA =
284       Handle(StepVisual_PresentationStyleByContext)::DownCast(myPSA.Value(psbci));
285     if (PSA.IsNull())
286       continue;
287     // register the reference
288     StepVisual_StyleContextSelect aStyleCntxSlct;
289     aStyleCntxSlct.SetValue( aSR );
290     PSA->SetStyleContext( aStyleCntxSlct );
291   }
292   
293   StepRepr_RepresentedDefinition aPDSselect;
294   aPDSselect.SetValue(aPDS);
295   aSDR->Init( aPDSselect, aSR );
296   Model()->AddWithRefs ( aSDR );
297   
298   return Standard_True;
299 }
300
301
302 //=======================================================================
303 //function : FindContext
304 //purpose  : 
305 //=======================================================================
306
307 Handle(StepRepr_RepresentationContext) STEPConstruct_Styles::FindContext (const TopoDS_Shape &Shape) const
308 {
309   // find context of items
310   Handle(StepRepr_RepresentationContext) Context;
311   Handle(TransferBRep_ShapeMapper) mapper = TransferBRep::ShapeMapper ( FinderProcess(), Shape );
312   Handle(StepShape_ShapeRepresentation) sr;
313   if ( FinderProcess()->FindTypedTransient (mapper,STANDARD_TYPE(StepShape_ShapeRepresentation), sr) ) {
314 #ifdef OCCT_DEBUG
315 //    std::cout << "Context of " << Shape.TShape()->DynamicType()->Name() << ": SR found: " << sr->DynamicType()->Name() << std::endl;
316 #endif
317     Context = sr->ContextOfItems();
318   }
319   else {
320     Handle(StepGeom_GeometricRepresentationItem) item;
321     if ( FinderProcess()->FindTypedTransient (mapper,STANDARD_TYPE(StepGeom_GeometricRepresentationItem), item) ) {
322 #ifdef OCCT_DEBUG
323 //      std::cout << "Context of " << Shape.TShape()->DynamicType()->Name() << ": GeomRepItem found: " << item->DynamicType()->Name() << std::endl;
324 #endif
325       Interface_EntityIterator subs = Graph().Sharings(item);
326       for (subs.Start(); Context.IsNull() && subs.More(); subs.Next()) {
327 #ifdef OCCT_DEBUG
328 //      std::cout << "Parsing back refs: found " << subs.Value()->DynamicType()->Name() << std::endl;
329 #endif
330         if ( ! subs.Value()->IsKind(STANDARD_TYPE(StepShape_ShapeRepresentation)) ) continue;
331         sr = Handle(StepShape_ShapeRepresentation)::DownCast ( subs.Value() );
332         Context = sr->ContextOfItems();
333       }
334     }
335   }
336 #ifdef OCCT_DEBUG
337   if ( Context.IsNull() ) {
338     std::cout << Shape.TShape()->DynamicType()->Name() << ": Cannot find context" << std::endl;
339   }
340 #endif
341
342   return Context;
343 }
344
345
346 //=======================================================================
347 //function : LoadStyles
348 //purpose  : 
349 //=======================================================================
350
351 Standard_Boolean STEPConstruct_Styles::LoadStyles ()
352 {
353   myStyles.Clear();
354   myPSA.Clear();
355   
356   // find all MDGPRs and DMs and collect all defined styles in myStyles
357   Handle(Interface_InterfaceModel) model = Model();
358   Standard_Integer nb = model->NbEntities();
359   Handle(Standard_Type) tMDGPR = STANDARD_TYPE(StepVisual_MechanicalDesignGeometricPresentationRepresentation);
360   Handle(Standard_Type) tDM = STANDARD_TYPE(StepVisual_DraughtingModel);
361   Handle(Standard_Type) tSI = STANDARD_TYPE(StepVisual_StyledItem);
362   for (Standard_Integer i = 1; i <= nb; i ++)
363   {
364     Handle(Standard_Transient) enti = model->Value(i);
365     if ( enti->DynamicType() == tMDGPR || enti->DynamicType() == tDM )
366     {
367       Handle(StepRepr_Representation) container = Handle(StepRepr_Representation)::DownCast ( enti );
368
369       Standard_Integer nbi = container->NbItems();
370       for ( Standard_Integer j=1; j <= nbi; j++ )
371       {
372         Handle(StepVisual_StyledItem) style = 
373           Handle(StepVisual_StyledItem)::DownCast ( container->ItemsValue(j) );
374         if ( style.IsNull() ) continue;
375         myStyles.Add ( style );
376       }
377     }
378     else if (enti->DynamicType() == tSI)
379     {
380       Handle(StepVisual_StyledItem) aStyledItem = Handle(StepVisual_StyledItem)::DownCast (enti);
381       if (!myStyles.Contains (aStyledItem))
382       {
383         myStyles.Add (aStyledItem);
384       }
385     }
386   }
387   return !myStyles.IsEmpty();
388 }
389
390
391 //=======================================================================
392 //function : LoadInvisStyles
393 //purpose  : 
394 //=======================================================================
395
396 Standard_Boolean STEPConstruct_Styles::LoadInvisStyles (Handle(TColStd_HSequenceOfTransient)& theInvStyles) const
397 {
398   Handle(Interface_InterfaceModel) model = Model();
399   Standard_Integer nb = model->NbEntities();
400   Handle(Standard_Type) tInvisibility = STANDARD_TYPE(StepVisual_Invisibility);
401   // serach for invisibility
402   for (Standard_Integer i = 1; i <= nb; i ++) {
403     Handle(Standard_Transient) enti = model->Value(i);
404     if ( enti->DynamicType() != tInvisibility )
405       continue;
406     // search for styled items
407     Handle(StepVisual_Invisibility) container = Handle(StepVisual_Invisibility)::DownCast ( enti );
408     Standard_Integer nbi = container->NbInvisibleItems();
409     for ( Standard_Integer j=1; j <= nbi; j++ ) {
410       StepVisual_InvisibleItem anInvItem = container->InvisibleItemsValue(j);
411       Handle(StepVisual_StyledItem) style = anInvItem.StyledItem();
412       if ( style.IsNull() ) 
413         continue;
414       // collect the invisible styled items
415       if ( theInvStyles.IsNull() )
416         theInvStyles = new TColStd_HSequenceOfTransient;
417       theInvStyles->Append( style );
418     }
419   }
420   return ( !theInvStyles.IsNull() && (theInvStyles->Length() > 0) );
421 }
422
423
424 //=======================================================================
425 //function : MakeColorPSA
426 //purpose  : 
427 //=======================================================================
428
429 Handle(StepVisual_PresentationStyleAssignment) STEPConstruct_Styles::MakeColorPSA (const Handle(StepRepr_RepresentationItem) &/*item*/,
430                                                                                    const Handle(StepVisual_Colour) &SurfCol, 
431                                                                                    const Handle(StepVisual_Colour) &CurveCol,
432                                                                                    const Standard_Boolean isForNAUO) const
433 {  
434   Handle(StepVisual_PresentationStyleAssignment) PSA;
435   TColStd_SequenceOfTransient items;
436   
437   // surface color
438   if ( ! SurfCol.IsNull() ) {
439     Handle(TCollection_HAsciiString) FASCName = new TCollection_HAsciiString ( "" );
440     Handle(StepVisual_FillAreaStyleColour) FASC = new StepVisual_FillAreaStyleColour;
441     FASC->Init ( FASCName, SurfCol );
442   
443     StepVisual_FillStyleSelect FSS;
444     FSS.SetValue ( FASC );
445   
446     Handle(StepVisual_HArray1OfFillStyleSelect) FASSs = new StepVisual_HArray1OfFillStyleSelect ( 1, 1 );
447     FASSs->SetValue ( 1, FSS );
448   
449     Handle(TCollection_HAsciiString) FASName = new TCollection_HAsciiString ( "" );
450     Handle(StepVisual_FillAreaStyle) FAS = new StepVisual_FillAreaStyle;
451     FAS->Init ( FASName, FASSs );
452
453     Handle(StepVisual_SurfaceStyleFillArea) SSFA = new StepVisual_SurfaceStyleFillArea;
454     SSFA->Init ( FAS );
455     
456     StepVisual_SurfaceStyleElementSelect SES;
457     SES.SetValue ( SSFA );
458   
459     Handle(StepVisual_HArray1OfSurfaceStyleElementSelect) SSESs = 
460       new StepVisual_HArray1OfSurfaceStyleElementSelect ( 1, 1 );
461     SSESs->SetValue ( 1, SES );
462   
463     Handle(TCollection_HAsciiString) SSSName = new TCollection_HAsciiString ( "" );
464     Handle(StepVisual_SurfaceSideStyle) SSS = new StepVisual_SurfaceSideStyle;
465     SSS->Init ( SSSName, SSESs );
466   
467     Handle(StepVisual_SurfaceStyleUsage) SSU = new StepVisual_SurfaceStyleUsage;
468     SSU->Init ( StepVisual_ssBoth, SSS );
469     
470     items.Append ( SSU );
471   }
472   
473   // curve color
474   if ( ! CurveCol.IsNull() ) {
475     Handle(TCollection_HAsciiString) fontName = new TCollection_HAsciiString("continuous");
476     Handle(StepVisual_DraughtingPreDefinedCurveFont) SDPDCF = new StepVisual_DraughtingPreDefinedCurveFont;
477     SDPDCF->Init(fontName);
478   
479     Handle(StepBasic_MeasureValueMember) Val = new StepBasic_MeasureValueMember;
480     Val->SetReal ( 0.1 );
481     Val->SetName ( "POSITIVE_LENGTH_MEASURE");
482     
483     StepVisual_CurveStyleFontSelect SCSFS;
484     SCSFS.SetValue(SDPDCF);
485     
486     StepBasic_SizeSelect SSSelect;
487     SSSelect.SetValue(Val);
488   
489     Handle(TCollection_HAsciiString) SCSName = new TCollection_HAsciiString ( "" );
490     Handle(StepVisual_CurveStyle) SCS = new StepVisual_CurveStyle;
491     SCS->Init(SCSName,SCSFS,SSSelect,CurveCol);
492
493     items.Append ( SCS );
494   }
495   
496   if ( items.Length() <1 ) {
497 #ifdef OCCT_DEBUG
498     std::cout << "Error: no color is supplied" << std::endl;
499 #endif
500     return PSA;
501   }
502   
503   // general part
504   Handle(StepVisual_HArray1OfPresentationStyleSelect) PSSs = 
505     new StepVisual_HArray1OfPresentationStyleSelect ( 1, items.Length() );
506   for ( Standard_Integer i=1; i <= items.Length(); i++ ) {
507     StepVisual_PresentationStyleSelect PSS;
508     PSS.SetValue ( items.Value(i) );
509     PSSs->SetValue ( i, PSS );
510   }
511   if (!isForNAUO)
512     PSA = new StepVisual_PresentationStyleAssignment;
513   else 
514     PSA = new StepVisual_PresentationStyleByContext;
515   PSA->Init ( PSSs );
516   
517   return PSA;
518 }
519
520
521 //=======================================================================
522 //function : GetColorPSA
523 //purpose  : 
524 //=======================================================================
525
526 Handle(StepVisual_PresentationStyleAssignment) STEPConstruct_Styles::GetColorPSA (const Handle(StepRepr_RepresentationItem) &item,
527                                                                                   const Handle(StepVisual_Colour) &Col) 
528 {
529   // if this color already was processed, just use the same PSA, else create new and add it to map
530   Handle(StepVisual_PresentationStyleAssignment) PSA;
531   if ( myMapOfStyles.Contains(Col) ) {
532     PSA = Handle(StepVisual_PresentationStyleAssignment)::
533       DownCast(myMapOfStyles.FindFromKey(Col));
534   }
535   else {
536     PSA = MakeColorPSA ( item, Col, Col );
537     myMapOfStyles.Add(Col,PSA);
538   }
539   return PSA;
540 }
541   
542
543 //=======================================================================
544 //function : GetColors
545 //purpose  : 
546 //=======================================================================
547
548 Standard_Boolean STEPConstruct_Styles::GetColors (const Handle(StepVisual_StyledItem) &style,
549                                                   Handle(StepVisual_Colour) &SurfCol,
550                                                   Handle(StepVisual_Colour) &BoundCol,
551                                                   Handle(StepVisual_Colour) &CurveCol,
552                                                   Standard_Boolean& IsComponent) const
553 {
554   SurfCol.Nullify();
555   BoundCol.Nullify();
556   CurveCol.Nullify();
557     
558   // parse on styles
559   for(Standard_Integer j=1; j<=style->NbStyles(); j++ ) {
560     Handle(StepVisual_PresentationStyleAssignment) PSA = style->StylesValue ( j );
561     if(PSA.IsNull() || PSA->Styles().IsNull()) continue;
562     IsComponent = Standard_True;
563     
564     for(Standard_Integer k=1; k<=PSA->NbStyles(); k++ ) {
565       StepVisual_PresentationStyleSelect PSS = PSA->StylesValue(k);
566
567       // try surface_style_usage
568       Handle(StepVisual_SurfaceStyleUsage) SSU = PSS.SurfaceStyleUsage();
569       if( !SSU.IsNull() ) {
570         Handle(StepVisual_SurfaceSideStyle) SSS = SSU->Style();
571         for(Standard_Integer l=1; l<=SSS->NbStyles(); l++ ) {
572           StepVisual_SurfaceStyleElementSelect SSES = SSS->StylesValue(l);
573           // try fill color
574           Handle(StepVisual_SurfaceStyleFillArea) SSFA = SSES.SurfaceStyleFillArea();
575           if ( !SSFA.IsNull() ) {
576             Handle(StepVisual_FillAreaStyle) FAS = SSFA->FillArea();
577       if (FAS.IsNull())
578         continue;
579             for ( Standard_Integer m=1; m <= FAS->NbFillStyles(); m++ ) {
580               StepVisual_FillStyleSelect FSS = FAS->FillStylesValue ( m );
581               Handle(StepVisual_FillAreaStyleColour) FASC = FSS.FillAreaStyleColour();
582               if ( SurfCol.IsNull() || SSU->Side() != StepVisual_ssNegative ) //abv 30 Mar 00: trj3_s1-pe.stp
583                 SurfCol = FASC->FillColour();
584             }
585             continue;
586           }
587           // try boundary color
588           Handle(StepVisual_SurfaceStyleBoundary) SSB = SSES.SurfaceStyleBoundary();
589           if(!SSB.IsNull()) {
590             Handle(StepVisual_CurveStyle) CS = SSB->StyleOfBoundary();
591             if ( ! CS.IsNull() ) BoundCol = CS->CurveColour();
592             continue;
593           }
594         }
595         continue;
596       }
597       
598       // try curve_style
599       Handle(StepVisual_CurveStyle) CS = PSS.CurveStyle();
600       if ( ! CS.IsNull() ) CurveCol = CS->CurveColour();
601     }
602   }
603   return ! SurfCol.IsNull() || ! BoundCol.IsNull() || ! CurveCol.IsNull();
604 }
605
606
607 //=======================================================================
608 //function : EncodeColor
609 //purpose  : 
610 //=======================================================================
611
612 Handle(StepVisual_Colour) STEPConstruct_Styles::EncodeColor(const Quantity_Color &C)
613 {
614   // detect if color corresponds to one of pre-defined colors
615   Standard_CString cName = 0;
616   if      ( C == Quantity_Color(Quantity_NOC_GREEN) )    cName = "green";
617   else if ( C == Quantity_Color(Quantity_NOC_RED) )      cName = "red";
618   else if ( C == Quantity_Color(Quantity_NOC_BLUE1) )    cName = "blue";
619   else if ( C == Quantity_Color(Quantity_NOC_YELLOW) )   cName = "yellow";
620   else if ( C == Quantity_Color(Quantity_NOC_MAGENTA1) ) cName = "magenta";
621   else if ( C == Quantity_Color(Quantity_NOC_CYAN1) )    cName = "cyan";
622   else if ( C == Quantity_Color(Quantity_NOC_BLACK) )    cName = "black";
623   else if ( C == Quantity_Color(Quantity_NOC_WHITE) )    cName = "white";
624   
625   if ( cName ) {
626     Handle(StepVisual_DraughtingPreDefinedColour) ColPr = new StepVisual_DraughtingPreDefinedColour;
627     Handle(StepVisual_PreDefinedItem) preDef = new StepVisual_PreDefinedItem;
628     preDef->Init(new TCollection_HAsciiString(cName));
629     ColPr->SetPreDefinedItem(preDef);
630     return ColPr;
631   }
632   else {
633     Handle(TCollection_HAsciiString) ColName = new TCollection_HAsciiString ( "" );
634     Handle(StepVisual_ColourRgb) ColRGB = new StepVisual_ColourRgb;
635     NCollection_Vec3<Standard_Real> aColor_sRGB;
636     C.Values (aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b(), Quantity_TOC_sRGB);
637     ColRGB->Init ( ColName, aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b() );
638     return ColRGB;
639   }
640 }
641
642
643 //=======================================================================
644 //function : EncodeColor
645 //purpose  : 
646 //=======================================================================
647
648 Handle(StepVisual_Colour) STEPConstruct_Styles::EncodeColor
649        (const Quantity_Color &C,
650         STEPConstruct_DataMapOfAsciiStringTransient &DPDCs,
651         STEPConstruct_DataMapOfPointTransient &ColRGBs)
652 {
653   // detect if color corresponds to one of pre-defined colors
654   Standard_CString cName = 0;
655   if      ( C == Quantity_Color(Quantity_NOC_GREEN) )    cName = "green";
656   else if ( C == Quantity_Color(Quantity_NOC_RED) )      cName = "red";
657   else if ( C == Quantity_Color(Quantity_NOC_BLUE1) )    cName = "blue";
658   else if ( C == Quantity_Color(Quantity_NOC_YELLOW) )   cName = "yellow";
659   else if ( C == Quantity_Color(Quantity_NOC_MAGENTA1) ) cName = "magenta";
660   else if ( C == Quantity_Color(Quantity_NOC_CYAN1) )    cName = "cyan";
661   else if ( C == Quantity_Color(Quantity_NOC_BLACK) )    cName = "black";
662   else if ( C == Quantity_Color(Quantity_NOC_WHITE) )    cName = "white";
663   
664   if ( cName ) {
665     Handle(StepVisual_DraughtingPreDefinedColour) ColPr;
666     TCollection_AsciiString aName(cName);
667     if(DPDCs.IsBound(aName)) {
668       ColPr = Handle(StepVisual_DraughtingPreDefinedColour)::DownCast(DPDCs.Find(aName));
669       if(!ColPr.IsNull()) return ColPr;
670     }
671     ColPr = new StepVisual_DraughtingPreDefinedColour;
672     Handle(StepVisual_PreDefinedItem) preDef = new StepVisual_PreDefinedItem;
673     preDef->Init(new TCollection_HAsciiString(cName));
674     ColPr->SetPreDefinedItem(preDef);
675     DPDCs.Bind(aName,ColPr);
676     return ColPr;
677   }
678   else {
679     Handle(StepVisual_ColourRgb) ColRGB;
680     gp_Pnt P;
681     C.Values (P.ChangeCoord().ChangeData()[0],
682               P.ChangeCoord().ChangeData()[1],
683               P.ChangeCoord().ChangeData()[2],
684               Quantity_TOC_sRGB);
685     if(ColRGBs.IsBound(P)) {
686       ColRGB = Handle(StepVisual_ColourRgb)::DownCast(ColRGBs.Find(P));
687       if(!ColRGB.IsNull()) return ColRGB;
688     }
689     Handle(TCollection_HAsciiString) ColName = new TCollection_HAsciiString ( "" );
690     ColRGB = new StepVisual_ColourRgb;
691     ColRGB->Init ( ColName, P.Coord (1), P.Coord (2), P.Coord (3) );
692     ColRGBs.Bind(P,ColRGB);
693     return ColRGB;
694   }
695 }
696
697
698 //=======================================================================
699 //function : DecodeColor
700 //purpose  : 
701 //=======================================================================
702
703 Standard_Boolean STEPConstruct_Styles::DecodeColor (const Handle(StepVisual_Colour) &Colour, Quantity_Color &Col) 
704 {
705   if ( Colour->IsKind (STANDARD_TYPE(StepVisual_ColourRgb)) ) {
706     Handle(StepVisual_ColourRgb) rgb = Handle(StepVisual_ColourRgb)::DownCast ( Colour );
707     if( rgb->Red()>1. || rgb->Green()>1. || rgb->Blue()>1. ) {
708       Standard_Real norm = rgb->Red();
709       if(norm<rgb->Green()) norm = rgb->Green();
710       if(norm<rgb->Blue()) norm = rgb->Blue();
711       Col.SetValues(rgb->Red()/norm, rgb->Green()/norm,
712                     rgb->Blue()/norm, Quantity_TOC_sRGB);
713     }
714     else
715       Col.SetValues(rgb->Red(), rgb->Green(), rgb->Blue(), Quantity_TOC_sRGB);
716     return Standard_True;
717   }
718   else if ( Colour->IsKind (STANDARD_TYPE(StepVisual_PreDefinedColour)) ) {
719     Handle(StepVisual_PreDefinedColour) pdc = 
720       Handle(StepVisual_PreDefinedColour)::DownCast ( Colour );
721     Handle(StepVisual_PreDefinedItem) pdi = pdc->GetPreDefinedItem();
722     const TCollection_AsciiString name = pdi->Name()->String();
723     if      ( name.IsEqual ( "red"     ) ) Col.SetValues ( Quantity_NOC_RED );
724     else if ( name.IsEqual ( "green"   ) ) Col.SetValues ( Quantity_NOC_GREEN );
725     else if ( name.IsEqual ( "blue"    ) ) Col.SetValues ( Quantity_NOC_BLUE1 );
726     else if ( name.IsEqual ( "yellow"  ) ) Col.SetValues ( Quantity_NOC_YELLOW );
727     else if ( name.IsEqual ( "magenta" ) ) Col.SetValues ( Quantity_NOC_MAGENTA1 );
728     else if ( name.IsEqual ( "cyan"    ) ) Col.SetValues ( Quantity_NOC_CYAN1 );
729     else if ( name.IsEqual ( "black"   ) ) Col.SetValues ( Quantity_NOC_BLACK );
730     else if ( name.IsEqual ( "white"   ) ) Col.SetValues ( Quantity_NOC_WHITE );
731     else {
732 #ifdef OCCT_DEBUG
733       std::cout << "Error: color name \"" << name << "\" is not recognized" << std::endl;
734 #endif
735       return Standard_False;
736     }
737     return Standard_True;
738   }
739   return Standard_False;
740 }
741