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