]> OCCT Git - occt-copy.git/commitdiff
Modificarion STEP translator for ISCAR project
authorgka <gka@opencascade.com>
Wed, 2 Aug 2017 08:36:05 +0000 (11:36 +0300)
committergka <gka@opencascade.com>
Wed, 2 Aug 2017 09:04:38 +0000 (12:04 +0300)
Modification for loading a few STEP files in the model

src/IFSelect/IFSelect_WorkSession.cxx
src/RWStepVisual/RWStepVisual_RWPresentationLayerAssignment.cxx
src/StepData/StepData_StepModel.cxx
src/StepData/StepData_StepReaderData.cxx
src/StepSelect/StepSelect_WorkLibrary.cxx
src/StepVisual/StepVisual_PresentationLayerAssignment.cxx
src/XDEDRAW/XDEDRAW_Common.cxx
src/XSDRAWSTEP/XSDRAWSTEP.cxx

index 611bb309115721dc59b46575fede1e93a4eebaf6..b9416b4954587781139de42b1578026a5610c53d 100644 (file)
@@ -212,7 +212,7 @@ IFSelect_ReturnStatus  IFSelect_WorkSession::ReadFile
 {
   if (thelibrary.IsNull()) return IFSelect_RetVoid;
   if (theprotocol.IsNull()) return IFSelect_RetVoid;
-  Handle(Interface_InterfaceModel) model;
+  Handle(Interface_InterfaceModel) model =myModel;
   IFSelect_ReturnStatus status = IFSelect_RetVoid;
   try {
     OCC_CATCH_SIGNALS
@@ -1701,11 +1701,12 @@ Standard_Integer IFSelect_WorkSession::RunTransformer
 {
   Standard_Integer effect = 0;
   if (transf.IsNull() || !IsLoaded()) return effect;
+  
   Handle(Interface_InterfaceModel) newmod;    // Null au depart
   Interface_CheckIterator checks;
   checks.SetName("X-STEP WorkSession : RunTransformer");
   Standard_Boolean res = transf->Perform
-    (thegraph->Graph(),theprotocol,checks,newmod);
+    (thegraph->Graph(),theprotocol,checks,myModel);
 
   if (!checks.IsEmpty(Standard_False)) {
     Handle(Message_Messenger) sout = Message::DefaultMessenger();
@@ -3055,7 +3056,7 @@ Handle(IFSelect_Selection) IFSelect_WorkSession::GiveSelection
   }
 
   Handle(IFSelect_Selection) sel;
-  if (np >= 0)
+  if (np >= 0) 
   {
     nomsel[np] = 0;
   }
index 2cf4d659345ffe658e55c4b549e607dbd2148e1f..1a3b1db4d1ced6b564d07a8d4e071e213a277fde 100644 (file)
@@ -52,14 +52,18 @@ void RWStepVisual_RWPresentationLayerAssignment::ReadStep
        Handle(StepVisual_HArray1OfLayeredItem) aAssignedItems;
        StepVisual_LayeredItem aAssignedItemsItem;
        Standard_Integer nsub3;
-       if (data->ReadSubList (num,3,"assigned_items",ach,nsub3)) {
-         Standard_Integer nb3 = data->NbParams(nsub3);
-         aAssignedItems = new StepVisual_HArray1OfLayeredItem (1, nb3);
-         for (Standard_Integer i3 = 1; i3 <= nb3; i3 ++) {
-           //szv#4:S4163:12Mar99 `Standard_Boolean stat3 =` not needed
-           if (data->ReadEntity (nsub3,i3,"assigned_items",ach,aAssignedItemsItem))
-             aAssignedItems->SetValue(i3,aAssignedItemsItem);
-         }
+  if (data->ReadSubList(num, 3, "assigned_items", ach, nsub3)) {
+    Standard_Integer nb3 = data->NbParams(nsub3);
+    if (nb3)
+    {
+    
+    aAssignedItems = new StepVisual_HArray1OfLayeredItem(1, nb3);
+    for (Standard_Integer i3 = 1; i3 <= nb3; i3++) {
+      //szv#4:S4163:12Mar99 `Standard_Boolean stat3 =` not needed
+      if (data->ReadEntity(nsub3, i3, "assigned_items", ach, aAssignedItemsItem))
+        aAssignedItems->SetValue(i3, aAssignedItemsItem);
+    }
+    }
        }
 
        //--- Initialisation of the read entity ---
index 306609cea814418c82de0595265d028a0b4b2ed6..2f7b682fefbfb0ee891fa1c5bf41bc40be8249e1 100644 (file)
@@ -141,11 +141,22 @@ void  StepData_StepModel::SetIdentLabel
   Standard_Integer num = Number(ent);
   if (!num) 
     return;
+  Standard_Integer nbEnt = NbEntities();
   if(theidnums.IsNull())
   {
-    theidnums = new TColStd_HArray1OfInteger(1, NbEntities());
+    theidnums = new TColStd_HArray1OfInteger(1,nbEnt);
     theidnums->Init(0);
   }
+  else if(nbEnt > theidnums->Length())
+  {
+    Standard_Integer prevLength = theidnums->Length();
+    Handle(TColStd_HArray1OfInteger) idnums1 = new TColStd_HArray1OfInteger(1,nbEnt);
+    idnums1->Init(0);
+    Standard_Integer k =1;
+    for( ; k <= prevLength; k++)
+      idnums1->SetValue(k , theidnums->Value(k));
+    theidnums = idnums1;
+  }
   theidnums->SetValue(num,ident);
 
 }
index bcfd329a9a38b7217d521c0dd8ab614b380425a6..ad4d755dbe074f6c7389d8f5d3cc62457f1c0c37 100644 (file)
@@ -1017,8 +1017,8 @@ Standard_Boolean StepData_StepReaderData::ReadReal(const Standard_Integer num,
   Handle(String) errmess;  // Null si pas d erreur
   if (nump > 0 && nump <= NbParams(num)) {
     const Interface_FileParameter& FP = Param(num,nump);
-    if (FP.ParamType() == Interface_ParamReal)  val =
-      Interface_FileReaderData::Fastof(FP.CValue());
+    if (FP.ParamType() == Interface_ParamReal || FP.ParamType() == Interface_ParamInteger) 
+      val = Interface_FileReaderData::Fastof(FP.CValue());
     else errmess = new String("Parameter n0.%d (%s) not a Real");
   }
   else errmess = new String("Parameter n0.%d (%s) absent");
index 272f079a0b7bd7435dca5c351e8f81ba354a23da..c55eb556156b776df1ca10c9722f2f8289358959 100644 (file)
@@ -70,8 +70,16 @@ Standard_Integer  StepSelect_WorkLibrary::ReadFile
   long status = 1;
   DeclareAndCast(StepData_Protocol,stepro,protocol);
   if (stepro.IsNull()) return 1;
-  Handle(StepData_StepModel) stepmodel  = new StepData_StepModel;
-  model  = stepmodel;
+   //ISCAR
+   Handle(StepData_StepModel) stepmodel;
+  if(!model.IsNull())
+    stepmodel = Handle(StepData_StepModel)::DownCast(model);
+  if(stepmodel.IsNull())
+  {
+    stepmodel  = new StepData_StepModel;
+    model = stepmodel;
+  }
   StepFile_ReadTrace (0);
   char *pName=(char *)name;
   status = StepFile_Read (pName,stepmodel,stepro);
index c48d6761918f59760368237d863b977555f13135..eed606e60fa1a7ede26f09a209c875ed00771bc7 100644 (file)
@@ -70,5 +70,5 @@ StepVisual_LayeredItem StepVisual_PresentationLayerAssignment::AssignedItemsValu
 
 Standard_Integer StepVisual_PresentationLayerAssignment::NbAssignedItems () const
 {
-       return assignedItems->Length();
+  return (assignedItems.IsNull() ? 0 : assignedItems->Length());
 }
index 2902446b432242cb84cbbbe872dea8e711bd64ac..755921d20a186f8c69e1b2140802753ca72bf3e3 100644 (file)
@@ -47,6 +47,8 @@
 #include <XCAFDoc_Editor.hxx>
 #include <TDF_Tool.hxx>
 #include <TopoDS_Shape.hxx>
+#include <StepData_StepModel.hxx>
+#include <Interface_Static.hxx>
 
 #include <stdio.h>
 //============================================================
@@ -512,6 +514,87 @@ static Standard_Integer Expand (Draw_Interpretor& di, Standard_Integer argc, con
   }
   return 0;
 }
+static Standard_Integer testSTEP(Draw_Interpretor& di, Standard_Integer argc, const char** argv)
+{
+  if (argc <3) {
+    di << "Use: " << argv[0] << " Doc filename [mode]: read STEP file to a document\n";
+    return 0;
+  }
+
+  DeclareAndCast(STEPControl_Controller, ctl, XSDRAW::Controller());
+  if (ctl.IsNull()) XSDRAW::SetNorm("STEP");
+
+  STEPCAFControl_Reader reader(XSDRAW::Session(), Standard_True);
+
+  if (argc == 4) {
+    Standard_Boolean mode = Standard_True;
+    for (Standard_Integer i = 0; argv[3][i]; i++)
+      switch (argv[3][i]) {
+      case '-': mode = Standard_False; break;
+      case '+': mode = Standard_True; break;
+      case 'c': reader.SetColorMode(mode); break;
+      case 'n': reader.SetNameMode(mode); break;
+      case 'l': reader.SetLayerMode(mode); break;
+      case 'v': reader.SetPropsMode(mode); break;
+    }
+  }
+
+  TCollection_AsciiString fnom, rnom;
+  Standard_Boolean modfic = XSDRAW::FileAndVar(argv[2], argv[1], "STEP", fnom, rnom);
+  if (modfic) di << " File STEP to read : " << fnom.ToCString() << "\n";
+  else        di << " Model taken from the session : " << fnom.ToCString() << "\n";
+  //  di<<" -- Names of variables BREP-DRAW prefixed by : "<<rnom<<"\n";
+  IFSelect_ReturnStatus readstat = IFSelect_RetVoid;
+  if (modfic) readstat = reader.ReadFile(fnom.ToCString());
+  else  if (XSDRAW::Session()->NbStartingEntities() > 0) readstat = IFSelect_RetDone;
+  if (readstat != IFSelect_RetDone) {
+    if (modfic) di << "Could not read file " << fnom.ToCString() << " , abandon\n";
+    else di << "No model loaded\n";
+    return 1;
+  }
+  ////////////////////////////////////////////////////////
+  //Modification for Drawing2.stp
+  Handle(StepData_StepModel) aModel = Handle(StepData_StepModel)::DownCast(reader.ChangeReader().Model());
+  Standard_Integer i = 1 , nbEnt = aModel->NbEntities();
+  for (; i <= nbEnt; i++)
+  {
+    Handle(Standard_Transient) ent = aModel->Value(i);
+    if (ent->IsKind(STANDARD_TYPE(StepBasic_ProductDefinition)))
+      break;
+  }
+  //product defintion is not found
+  if (i > nbEnt)
+    Interface_Static::SetIVal("read.step.all.shapes", 1);
+  else 
+    Interface_Static::SetIVal("read.step.all.shapes", 0);
+  reader.NbRootsForTransfer();
+  
+  /////////////////////////////////////////////////////////
+  Handle(TDocStd_Document) doc;
+  if (!DDocStd::GetDocument(argv[1], doc, Standard_False)) {
+    Handle(TDocStd_Application) A = DDocStd::GetApplication();
+    A->NewDocument("BinXCAF", doc);
+    TDataStd_Name::Set(doc->GetData()->Root(), argv[1]);
+    Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);
+    Draw::Set(argv[1], DD);
+    //     di << "Document saved with name " << argv[1];
+  }
+  if (!reader.Transfer(doc)) {
+    di << "Cannot read any relevant data from the STEP file\n";
+    return 1;
+  }
+
+  Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(doc);
+  Draw::Set(argv[1], DD);
+  di << "Document saved with name " << argv[1];
+
+  NCollection_DataMap<TCollection_AsciiString, Handle(STEPCAFControl_ExternFile)> DicFile = reader.ExternFiles();
+  FillDicWS(DicFile);
+  AddWS(fnom, XSDRAW::Session());
+
+  return 0;
+
+}
 
 void XDEDRAW_Common::InitCommands(Draw_Interpretor& di)
 {
@@ -537,4 +620,6 @@ void XDEDRAW_Common::InitCommands(Draw_Interpretor& di)
   di.Add("XExpand", "XExpand Doc recursively(0/1) or XExpand Doc recursively(0/1) label1 abel2 ..."  
           "or XExpand Doc recursively(0/1) shape1 shape2 ...",__FILE__, Expand, g);
 
+  di.Add("TestStep", "Doc filename: Read STEP file to DECAF document", __FILE__, testSTEP, g);
+
 }
index 07d260b934de984465dc44252d896d29f9711435..131bd6a1296d2eef2e476fcdcfd60eebc23dd66e 100644 (file)
@@ -49,6 +49,8 @@
 #include <XSControl_WorkSession.hxx>
 #include <XSDRAW.hxx>
 #include <XSDRAWSTEP.hxx>
+#include <TopoDS_Compound.hxx>
+#include <BRep_Builder.hxx>
 
 #include <stdio.h>
 //  Pour le transfert (write)
@@ -272,26 +274,75 @@ static Standard_Integer stepread (Draw_Interpretor& di/*theCommands*/, Standard_
 //=======================================================================
 static Standard_Integer testread (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
-  if (argc != 3)                                                                                      
+  if (argc < 3)                                                                                      
     {                                                                                             
       di << "ERROR in " << argv[0] << "Wrong Number of Arguments.\n";                     
       di << " Usage : " << argv[0] <<" file_name shape_name\n";                          
       return 1;                                                                                 
     }
   STEPControl_Reader Reader;
-  Standard_CString filename = argv[1];
-  IFSelect_ReturnStatus readstat = Reader.ReadFile(filename);
-  di<<"Status from reading STEP file "<<filename<<" : ";  
-  switch(readstat) {                                                              
+  Standard_Integer k =2;
+  for( ; k < argc; k++)
+  {
+    Standard_CString filename = argv[k];
+    IFSelect_ReturnStatus readstat = Reader.ReadFile(filename);
+    
+
+   /* di<<"Status from reading STEP file "<<filename<<" : ";  
+    switch(readstat) {                                                              
     case IFSelect_RetVoid  : { di<<"empty file\n"; return 1; }            
     case IFSelect_RetDone  : { di<<"file read\n";    break; }             
     case IFSelect_RetError : { di<<"file not found\n";   return 1; }      
     case IFSelect_RetFail  : { di<<"error during read\n";  return 1; }    
     default  :  { di<<"failure\n";   return 1; }                          
-  }  
-  Reader.TransferRoots();
-  TopoDS_Shape shape = Reader.OneShape();
-  DBRep::Set(argv[2],shape); 
+    }  */
+    Standard_Integer nbEnt1 = Reader.Model()->NbEntities();
+    //di<<"Number of entities : "<<k<<" "<<nbEnt1<<"\n";
+  }
+  
+  Standard_Integer nbEnt = Reader.Model()->NbEntities();
+ /* di<<"Sum number of entities : "<<nbEnt<<"\n";
+  STEPControl_Writer Writer(Reader.WS(), Standard_False);
+  TCollection_AsciiString filename_out = "Result.stp";
+  Writer.Write(filename_out);*/
+  Standard_Integer nbRoots = Reader.TransferRoots();
+  //Standard_Integer k =1;
+  TopoDS_Compound aComp;
+  BRep_Builder aB;
+  aB.MakeCompound(aComp);
+  gp_Pnt aP1(0.,0.,0.);
+  for ( k =1; k <= nbRoots; k++)
+  {
+    if(Reader.TransferRoot(k))
+    {
+      TopoDS_Shape shape = Reader.Shape(k);
+       if( k == nbRoots)
+        {
+          gp_Trsf aT1;
+          gp_Pnt aP2(10.,0.,0.);
+          aT1.SetTranslation(aP1, aP2);
+          TopLoc_Location aLoc(aT1);
+          TopoDS_Shape aSh1= shape.Moved(aLoc);
+          aB.Add(aComp, aSh1);
+          gp_Trsf aT2;
+          gp_Pnt aP3(20.,0.,0.);
+          aT2.SetTranslation(aP1, aP3);
+          TopLoc_Location aLoc2(aT2);
+          TopoDS_Shape aSh2= shape.Moved(aLoc2);
+          aB.Add(aComp, aSh2);
+
+        }
+        else
+          aB.Add(aComp, shape);
+
+      }
+    }
+
+  
+
+  //TopoDS_Shape shape = Reader.OneShape();
+
+  DBRep::Set(argv[1],aComp); 
   di<<"Count of shapes produced : "<<Reader.NbShapes()<<"\n";
   return 0;
 }