0031668: Visualization - WebGL sample doesn't work on Emscripten 1.39
[occt.git] / src / STEPConstruct / STEPConstruct_ContextTool.cxx
1 // Created on: 1993-09-20
2 // Created by: Martine LANGLOIS
3 // Copyright (c) 1993-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 // :j4 16.03.99 gka S4134
18 // abv 18.11.99 renamed from StepPDR_ContextTool
19
20 #include <GeomToStep_MakeAxis2Placement3d.hxx>
21 #include <Interface_Macros.hxx>
22 #include <Interface_Static.hxx>
23 #include <StepAP203_CcDesignApproval.hxx>
24 #include <StepAP203_CcDesignDateAndTimeAssignment.hxx>
25 #include <StepAP203_CcDesignPersonAndOrganizationAssignment.hxx>
26 #include <StepAP203_CcDesignSecurityClassification.hxx>
27 #include <StepBasic_ApplicationContext.hxx>
28 #include <StepBasic_ApplicationProtocolDefinition.hxx>
29 #include <StepBasic_ApprovalDateTime.hxx>
30 #include <StepBasic_ApprovalPersonOrganization.hxx>
31 #include <StepBasic_HArray1OfProduct.hxx>
32 #include <StepBasic_HArray1OfProductContext.hxx>
33 #include <StepBasic_Product.hxx>
34 #include <StepBasic_ProductCategoryRelationship.hxx>
35 #include <StepBasic_ProductContext.hxx>
36 #include <StepBasic_ProductDefinition.hxx>
37 #include <StepBasic_ProductDefinitionFormation.hxx>
38 #include <StepBasic_ProductRelatedProductCategory.hxx>
39 #include <StepBasic_ProductType.hxx>
40 #include <STEPConstruct_AP203Context.hxx>
41 #include <STEPConstruct_Assembly.hxx>
42 #include <STEPConstruct_ContextTool.hxx>
43 #include <STEPConstruct_Part.hxx>
44 #include <StepData_StepModel.hxx>
45 #include <StepGeom_Axis2Placement3d.hxx>
46 #include <StepRepr_NextAssemblyUsageOccurrence.hxx>
47 #include <StepRepr_PropertyDefinition.hxx>
48 #include <StepShape_ShapeDefinitionRepresentation.hxx>
49 #include <TCollection_HAsciiString.hxx>
50
51 #include "stdio.h"
52 //#include <StepBasic_ProductDefinitionContext.hxx>
53 //:i3
54 //:j4
55 //=======================================================================
56 //function : STEPConstruct_ContextTool
57 //purpose  :
58 //=======================================================================
59 STEPConstruct_ContextTool::STEPConstruct_ContextTool ()
60 {
61 }
62
63 //=======================================================================
64 //function : STEPConstruct_ContextTool
65 //purpose  :
66 //=======================================================================
67
68 STEPConstruct_ContextTool::STEPConstruct_ContextTool (const Handle(StepData_StepModel)& aStepModel)
69 {
70   SetModel(aStepModel);
71 }
72
73 //=======================================================================
74 //function : SetModel
75 //purpose  :
76 //=======================================================================
77
78 void STEPConstruct_ContextTool::SetModel (const Handle(StepData_StepModel)& aStepModel)
79 {
80   theAPD.Nullify();  //thePRPC.Nullify();
81
82   Standard_Integer i, nb = aStepModel->NbEntities();
83   for(i = 1; i<=nb && theAPD.IsNull(); i ++) {
84     Handle(Standard_Transient) ent = aStepModel->Value(i);
85     if (ent->IsKind(STANDARD_TYPE(StepBasic_ApplicationProtocolDefinition))) {
86       if (theAPD.IsNull())  theAPD  = GetCasted(StepBasic_ApplicationProtocolDefinition, ent);
87     }
88     //if (ent->IsKind(STANDARD_TYPE(StepBasic_ProductRelatedProductCategory))) {
89     //  if (thePRPC.IsNull()) thePRPC = GetCasted(StepBasic_ProductRelatedProductCategory, ent);
90     //}
91   }
92 }
93
94 //=======================================================================
95 //function : GetAPD
96 //purpose  :
97 //=======================================================================
98
99 Handle(StepBasic_ApplicationProtocolDefinition)  STEPConstruct_ContextTool::GetAPD()
100 {
101   return theAPD;
102 }
103
104 //=======================================================================
105 //function : AddAPD
106 //purpose  :
107 //=======================================================================
108
109 void STEPConstruct_ContextTool::AddAPD (const Standard_Boolean enforce)
110 {
111   Standard_Boolean noapd = theAPD.IsNull();
112   if (noapd || enforce) theAPD  = new StepBasic_ApplicationProtocolDefinition;
113
114   switch (Interface_Static::IVal("write.step.schema")) { //j4
115   default:
116   case 1:
117     theAPD->SetApplicationProtocolYear (1997);
118     theAPD->SetStatus (new TCollection_HAsciiString("committee draft"));
119     theAPD->SetApplicationInterpretedModelSchemaName
120       (new TCollection_HAsciiString("automotive_design"));
121     break;
122   case 2:
123     theAPD->SetApplicationProtocolYear (1998);
124     theAPD->SetStatus (new TCollection_HAsciiString("draft international standard"));
125     theAPD->SetApplicationInterpretedModelSchemaName
126       (new TCollection_HAsciiString("automotive_design"));
127     break;
128   case 3:
129     theAPD->SetApplicationProtocolYear (1994);
130     theAPD->SetStatus (new TCollection_HAsciiString("international standard"));
131     theAPD->SetApplicationInterpretedModelSchemaName
132       (new TCollection_HAsciiString("config_control_design"));
133     break;
134     
135   case 4: theAPD->SetApplicationProtocolYear (2000);
136     theAPD->SetStatus (new TCollection_HAsciiString("international standard"));
137     theAPD->SetApplicationInterpretedModelSchemaName
138       (new TCollection_HAsciiString("automotive_design"));
139     break;
140   case 5: theAPD->SetApplicationProtocolYear (2013);
141     theAPD->SetStatus (new TCollection_HAsciiString("international standard"));
142     theAPD->SetApplicationInterpretedModelSchemaName
143       (new TCollection_HAsciiString("ap242_managed_model_based_3d_engineering"));
144     break;
145   }
146
147   if (theAPD->Application().IsNull())
148     theAPD->SetApplication (new StepBasic_ApplicationContext);
149   Handle(TCollection_HAsciiString) appl;
150   switch (Interface_Static::IVal("write.step.schema")) { //j4
151   default:
152   case 1:
153   case 2: appl = new TCollection_HAsciiString ( "core data for automotive mechanical design processes" );
154           break;
155   case 3: appl = new TCollection_HAsciiString ( "configuration controlled 3D designs of mechanical parts and assemblies" );
156           break;
157   case 5: appl = new TCollection_HAsciiString ( "Managed model based 3d engineering");
158           break;
159   }
160   theAPD->Application()->SetApplication ( appl );
161 //  if (noapd || enforce) aStepModel->AddWithRefs (theAPD);
162 }
163
164 //=======================================================================
165 //function : IsAP203
166 //purpose  : 
167 //=======================================================================
168
169 Standard_Boolean STEPConstruct_ContextTool::IsAP203 () const
170 {
171   if ( theAPD.IsNull() ) return Standard_False;
172   Handle(TCollection_HAsciiString) schema = theAPD->ApplicationInterpretedModelSchemaName();
173   if ( schema.IsNull() ) return Standard_False;
174   TCollection_AsciiString sch = schema->String();
175   sch.LowerCase();
176   return sch == "config_control_design";
177 }
178
179 //=======================================================================
180 //function : IsAP214
181 //purpose  : 
182 //=======================================================================
183
184 Standard_Boolean STEPConstruct_ContextTool::IsAP214 () const
185 {
186   if ( theAPD.IsNull() ) return Standard_False;
187   Handle(TCollection_HAsciiString) schema = theAPD->ApplicationInterpretedModelSchemaName();
188   if ( schema.IsNull() ) return Standard_False;
189   TCollection_AsciiString sch = schema->String();
190   sch.LowerCase();
191   return sch == "automotive_design";
192 }
193
194 //=======================================================================
195 //function : IsAP242
196 //purpose  : 
197 //=======================================================================
198
199 Standard_Boolean STEPConstruct_ContextTool::IsAP242 () const
200 {
201   if ( theAPD.IsNull() ) return Standard_False;
202   Handle(TCollection_HAsciiString) schema = theAPD->ApplicationInterpretedModelSchemaName();
203   if ( schema.IsNull() ) return Standard_False;
204   TCollection_AsciiString sch = schema->String();
205   sch.LowerCase();
206   return sch == "ap242_managed_model_based_3d_engineering";
207 }
208
209 // ================================================================
210 // Data Section : Basic Product Information (level S1)
211 //                   * Get methods
212 //                   * Set methods
213 // ================================================================
214
215 //=======================================================================
216 //function : GetACstatus
217 //purpose  :
218 //=======================================================================
219
220 Handle(TCollection_HAsciiString)  STEPConstruct_ContextTool::GetACstatus()
221 {
222   if (GetAPD().IsNull()) return new TCollection_HAsciiString("");
223   return GetAPD()->Status();
224 }
225
226 //=======================================================================
227 //function : GetACschemaName
228 //purpose  :
229 //=======================================================================
230
231 Handle(TCollection_HAsciiString)  STEPConstruct_ContextTool::GetACschemaName()
232 {
233   if (GetAPD().IsNull()) return new TCollection_HAsciiString("");
234   return  GetAPD()->ApplicationInterpretedModelSchemaName();
235 }
236
237 //=======================================================================
238 //function : GetACyear
239 //purpose  :
240 //=======================================================================
241
242 Standard_Integer  STEPConstruct_ContextTool::GetACyear()
243 {
244   return (GetAPD().IsNull() ? 1998 :
245           GetAPD()->ApplicationProtocolYear());
246 }
247
248 /*
249 //=======================================================================
250 //function : GetACapplication
251 //purpose  :
252 //=======================================================================
253
254 Handle(TCollection_HAsciiString)  STEPConstruct_ContextTool::GetACapplication()
255 {
256   return GetPDC()->Formation()->OfProduct()->FrameOfReferenceValue(1)
257     ->FrameOfReference()->Application();
258 }
259 */
260
261 //=======================================================================
262 //function : GetACname
263 //purpose  :
264 //=======================================================================
265
266 Handle(TCollection_HAsciiString)  STEPConstruct_ContextTool::GetACname()
267 {
268   if (GetAPD().IsNull()) return new TCollection_HAsciiString("");
269   if (GetAPD()->Application().IsNull()) return new TCollection_HAsciiString("");
270   return GetAPD()->Application()->Application();
271 }
272
273 //=======================================================================
274 //function : SetACstatus
275 //purpose  :
276 //=======================================================================
277
278 void STEPConstruct_ContextTool::SetACstatus (const Handle(TCollection_HAsciiString)& status)
279 {
280   if (GetAPD().IsNull()) return;
281   GetAPD()->SetStatus(status);
282 }
283
284 //=======================================================================
285 //function : SetACschemaName
286 //purpose  :
287 //=======================================================================
288
289 void STEPConstruct_ContextTool::SetACschemaName (const Handle(TCollection_HAsciiString)& schemaName)
290 {
291   if (GetAPD().IsNull()) return;
292   GetAPD()->SetApplicationInterpretedModelSchemaName(schemaName);
293 }
294
295 //=======================================================================
296 //function : SetACyear
297 //purpose  :
298 //=======================================================================
299
300 void STEPConstruct_ContextTool::SetACyear (const Standard_Integer year)
301 {
302   if (GetAPD().IsNull()) return;
303   GetAPD()->SetApplicationProtocolYear(year);
304 }
305
306 //=======================================================================
307 //function : SetACname
308 //purpose  :
309 //=======================================================================
310
311 void STEPConstruct_ContextTool::SetACname (const Handle(TCollection_HAsciiString)& name)
312 {
313   if (GetAPD().IsNull()) return;
314   if (GetAPD()->Application().IsNull()) GetAPD()->SetApplication
315     (new StepBasic_ApplicationContext);
316   GetAPD()->Application()->SetApplication (name);
317 }
318
319 /*
320 //=======================================================================
321 //function : SetACapplication
322 //purpose  :
323 //=======================================================================
324
325 void STEPConstruct_ContextTool::SetACapplication (const Handle(TCollection_HAsciiString)& application)
326 {
327   GetPDC()->Formation()->OfProduct()->FrameOfReferenceValue(1)
328     ->FrameOfReference()->SetApplication(application);
329
330 }
331 */
332
333 // --------------------------------
334 // Product Related Product Category
335 // --------------------------------
336
337 /*
338
339 //=======================================================================
340 //function : GetPRPC
341 //purpose  :
342 //=======================================================================
343
344 Handle(StepBasic_ProductRelatedProductCategory) STEPConstruct_ContextTool::GetPRPC()
345 {
346   return thePRPC;
347 }
348
349 //=======================================================================
350 //function : AddPRPC
351 //purpose  :
352 //=======================================================================
353
354 void STEPConstruct_ContextTool::AddPRPC (const Standard_Boolean enforce)
355 {
356   Standard_Boolean noprpc = thePRPC.IsNull();
357   if (noprpc || enforce) {
358     //:i3 abv 1 Sep 98: ProSTEP TR9: generate PRODUCT_TYPE (derived) instead of PRPC
359     switch (Interface_Static::IVal("write.step.schema")) { //j4
360     default:
361     case 1:
362       thePRPC = new StepBasic_ProductType;
363       thePRPC->SetName (new TCollection_HAsciiString("part"));
364       break;
365     case 4:
366     case 2:
367       thePRPC = new StepBasic_ProductRelatedProductCategory;
368       thePRPC->SetName (new TCollection_HAsciiString("part"));
369       break;
370     case 3:
371       thePRPC = new StepBasic_ProductRelatedProductCategory;
372       thePRPC->SetName (new TCollection_HAsciiString("detail")); // !!!!! or "assembly"
373       break;
374     }
375     thePRPC->UnSetDescription(); //:i3
376   }
377 //  if (noprpc || enforce) aStepModel->AddWithRefs(thePRPC);
378 }
379
380 //=======================================================================
381 //function : SetPRPCName
382 //purpose  :
383 //=======================================================================
384
385 void STEPConstruct_ContextTool::SetPRPCName(const Handle(TCollection_HAsciiString)& aName)
386 {
387   GetPRPC()->SetName(aName);
388 }
389
390 //=======================================================================
391 //function : GetPRPCName
392 //purpose  :
393 //=======================================================================
394
395 Handle(TCollection_HAsciiString)  STEPConstruct_ContextTool::GetPRPCName()
396 {
397   if (GetPRPC().IsNull()) return new TCollection_HAsciiString("");
398   return GetPRPC()->Name();
399 }
400
401 //=======================================================================
402 //function : SetPRPCDescription
403 //purpose  :
404 //=======================================================================
405
406 void STEPConstruct_ContextTool::SetPRPCDescription (const Handle(TCollection_HAsciiString)& aDescription)
407 {
408   Handle(StepBasic_ProductRelatedProductCategory) aPRPC = GetPRPC();
409   aPRPC->SetDescription(aDescription);
410 //  aPRPC->HasDescription(Standard_True);
411 }
412
413 //=======================================================================
414 //function : GetPRPCDescription
415 //purpose  :
416 //=======================================================================
417
418 Handle(TCollection_HAsciiString) STEPConstruct_ContextTool::GetPRPCDescription()
419 {
420   Handle(StepBasic_ProductRelatedProductCategory) aPRPC = GetPRPC();
421   if (!aPRPC.IsNull() && aPRPC->HasDescription())
422     return aPRPC->Description();
423   else {
424     return new TCollection_HAsciiString("");
425   }
426 }
427
428 // ================================================================
429 //
430 // Settings from an already done SDR (see SDRtool)
431 //
432 // ================================================================
433
434 void STEPConstruct_ContextTool::SetSDR (const Handle(StepShape_ShapeDefinitionRepresentation)& sdr)
435 {
436 //  SDR partage des choses avec le contexte ... On raccroche les wagons
437   Handle(StepBasic_Product) theProduct =
438     sdr->Definition()->Definition().ProductDefinition()->Formation()->OfProduct();
439   Handle(StepBasic_ApplicationContext) theAppli =
440     theProduct->FrameOfReferenceValue(1)->FrameOfReference();
441   Handle(StepBasic_HArray1OfProduct) ProdList =
442     new StepBasic_HArray1OfProduct(1,1);
443   ProdList->SetValue(1,theProduct);
444   thePRPC->SetProducts (ProdList);
445   theAPD->SetApplication (theAppli);
446 }
447 */
448
449 //=======================================================================
450 //function : GetDefaultAxis
451 //purpose  :
452 //=======================================================================
453
454 Handle(StepGeom_Axis2Placement3d) STEPConstruct_ContextTool::GetDefaultAxis ()
455 {
456   if ( myAxis.IsNull() ) {
457     GeomToStep_MakeAxis2Placement3d mkax;
458     myAxis = mkax.Value();
459   }
460   return myAxis;
461 }
462
463 //=======================================================================
464 //function : AP203Context
465 //purpose  :
466 //=======================================================================
467
468 STEPConstruct_AP203Context &STEPConstruct_ContextTool::AP203Context ()
469 {
470   return theAP203;
471 }
472
473 //=======================================================================
474 //function : Level
475 //purpose  :
476 //=======================================================================
477
478 Standard_Integer STEPConstruct_ContextTool::Level () const
479 {
480   return myLevel.Length();
481 }
482
483 //=======================================================================
484 //function : NextLevel
485 //purpose  :
486 //=======================================================================
487
488 void STEPConstruct_ContextTool::NextLevel ()
489 {
490   myLevel.Append ( 1 );
491 }
492
493 //=======================================================================
494 //function : PrevLevel
495 //purpose  :
496 //=======================================================================
497
498 void STEPConstruct_ContextTool::PrevLevel ()
499 {
500   if ( myLevel.Length() >0 ) myLevel.Remove ( myLevel.Length() );
501 }
502
503 //=======================================================================
504 //function : SetLevel
505 //purpose  :
506 //=======================================================================
507
508 void STEPConstruct_ContextTool::SetLevel (const Standard_Integer lev)
509 {
510   if ( lev < myLevel.Length() ) {
511     while ( lev < myLevel.Length() && myLevel.Length() >0 )
512       myLevel.Remove ( myLevel.Length() );
513   }
514   else {
515     while ( myLevel.Length() < lev ) myLevel.Append ( 1 );
516   }
517 }
518
519 //=======================================================================
520 //function : Index
521 //purpose  :
522 //=======================================================================
523
524 Standard_Integer STEPConstruct_ContextTool::Index () const
525 {
526   return ( myLevel.Length() >0 ? myLevel.Last() : 0 );
527 }
528
529 //=======================================================================
530 //function : NextIndex
531 //purpose  :
532 //=======================================================================
533
534 void STEPConstruct_ContextTool::NextIndex ()
535 {
536   if ( myLevel.Length() >0 )
537     myLevel.SetValue ( myLevel.Length(), myLevel.Last() + 1 );
538 }
539
540 //=======================================================================
541 //function : PrevIndex
542 //purpose  :
543 //=======================================================================
544
545 void STEPConstruct_ContextTool::PrevIndex ()
546 {
547   if ( myLevel.Length() >0 )
548     myLevel.SetValue ( myLevel.Length(), myLevel.Last() - 1 );
549 }
550
551 //=======================================================================
552 //function : SetIndex
553 //purpose  :
554 //=======================================================================
555
556 void STEPConstruct_ContextTool::SetIndex (const Standard_Integer ind)
557 {
558   if ( myLevel.Length() >0 )
559     myLevel.SetValue ( myLevel.Length(), ind );
560 }
561
562 //=======================================================================
563 //function : GetProductName
564 //purpose  :
565 //=======================================================================
566
567 Handle(TCollection_HAsciiString) STEPConstruct_ContextTool::GetProductName () const
568 {
569   Handle(TCollection_HAsciiString) PdtName;
570   if (Interface_Static::IsSet("write.step.product.name"))
571     PdtName = new TCollection_HAsciiString(Interface_Static::CVal("write.step.product.name"));
572   else PdtName = new TCollection_HAsciiString("Product");
573
574   for ( Standard_Integer i=1; i <= myLevel.Length(); i++ ) {
575     PdtName->AssignCat ((char*)( i >1 ? "." : " " ));
576     char buf[100];
577     sprintf ( buf, "%d", myLevel.Value(i) );
578     PdtName->AssignCat ( buf );
579   }
580
581   return PdtName;
582 }
583
584 //=======================================================================
585 //function : GetRootsForPart
586 //purpose  : 
587 //=======================================================================
588
589 Handle(TColStd_HSequenceOfTransient) STEPConstruct_ContextTool::GetRootsForPart (const STEPConstruct_Part &SDRTool)
590 {
591   Handle(TColStd_HSequenceOfTransient) seq = new TColStd_HSequenceOfTransient;
592
593   seq->Append ( SDRTool.SDRValue() );
594 //  seq->Append ( GetAPD() );
595
596   if ( ! SDRTool.PRPC().IsNull() ) seq->Append ( SDRTool.PRPC() );
597
598   // for AP203, add required product management data
599   if ( Interface_Static::IVal("write.step.schema") == 3 ) {
600     theAP203.Init ( SDRTool );
601     seq->Append (theAP203.GetProductCategoryRelationship());
602     seq->Append (theAP203.GetCreator());
603     seq->Append (theAP203.GetDesignOwner());
604     seq->Append (theAP203.GetDesignSupplier());
605     seq->Append (theAP203.GetClassificationOfficer());
606     seq->Append (theAP203.GetSecurity());
607     seq->Append (theAP203.GetCreationDate());
608     seq->Append (theAP203.GetClassificationDate());
609     seq->Append (theAP203.GetApproval());
610     seq->Append (theAP203.GetApprover());
611     seq->Append (theAP203.GetApprovalDateTime());
612   }
613
614   return seq;
615 }
616
617 //=======================================================================
618 //function : GetRootsForAssemblyLink
619 //purpose  : 
620 //=======================================================================
621
622 Handle(TColStd_HSequenceOfTransient) STEPConstruct_ContextTool::GetRootsForAssemblyLink (const STEPConstruct_Assembly &assembly)
623 {
624   Handle(TColStd_HSequenceOfTransient) seq = new TColStd_HSequenceOfTransient;
625
626   seq->Append ( assembly.ItemValue() );
627   
628   // for AP203, write required product management data
629   if ( Interface_Static::IVal("write.step.schema") == 3 ) {
630     theAP203.Init ( assembly.GetNAUO() );
631     seq->Append (theAP203.GetSecurity());
632     seq->Append (theAP203.GetClassificationOfficer());
633     seq->Append (theAP203.GetClassificationDate());
634     seq->Append (theAP203.GetApproval());
635     seq->Append (theAP203.GetApprover());
636     seq->Append (theAP203.GetApprovalDateTime());
637   }
638
639   return seq;
640 }
641
642
643
644
645