//gka 06.01.99 S3767 new function TPSTAT (first version) //pdn 11.01.99 putting "return" statement for compilation on NT #include #include #include #include #include #include #include #include #include // #include #include // pour igeslist #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include essai CKY 4-AUT-1998 //#include essai CKY 4-AUT-1998 //#include essai CKY 4-AUT-1998 // Init functions #include #include #include #include #include #include #include // + tplosttrim #include #include #include #include #include #include #include #include #include #include #include //-------------------------------------------------------------- // Function : igesbrep // //-------------------------------------------------------------- static Standard_Integer igesbrep (Draw_Interpretor& di, Standard_Integer argc, const char** argv) { DeclareAndCast(IGESControl_Controller,ctl,XSDRAW::Controller()); if (ctl.IsNull()) XSDRAW::SetNorm("IGES"); // Progress indicator Handle(Draw_ProgressIndicator) progress = new Draw_ProgressIndicator ( di, 1 ); progress->SetScale ( 0, 100, 1 ); progress->Show(); IGESControl_Reader Reader (XSDRAW::Session(),Standard_False); if (ctl.IsNull()) ctl=Handle(IGESControl_Controller)::DownCast(XSDRAW::Controller()); TCollection_AsciiString fnom,rnom; Standard_Boolean modfic = XSDRAW::FileAndVar (argv[1],argv[2],"IGESBREP",fnom,rnom); if (modfic) di<<" File IGES to read : "<NewScope ( 20, "Loading" ); // On average loading takes 20% progress->Show(); if (modfic) readstat = Reader.ReadFile (fnom.ToCString()); else if (XSDRAW::Session()->NbStartingEntities() > 0) readstat = IFSelect_RetDone; progress->EndScope(); progress->Show(); if (readstat != IFSelect_RetDone) { if (modfic) di<<"Could not read file "< 3); Standard_Integer modepri = 1, nent, nbs; if (fromtcl) modepri = 4; while (modepri) { //Roots for transfer are defined before setting mode ALL or OnlyVisible - gka //mode OnlyVisible does not work. // nent = Reader.NbRootsForTransfer(); if (!fromtcl) { cout<<"Mode (0 End, 1 Visible Roots, 2 All Roots, 3 Only One Entity, 4 Selection) :"<>str; modepri = atoi(str); } if (modepri == 0) { //fin di << "Bye and good luck! " << "\n"; break; } else if (modepri <= 2) { // 1 : Visible Roots, 2 : All Roots di << "All Geometry Transfer"<<"\n"; di<<"spline_continuity (read) : "<ClearContext(); XSDRAW::SetTransferProcess (thesession->MapReader()); progress->NewScope ( 80, "Translation" ); progress->Show(); thesession->MapReader()->SetProgress ( progress ); if (modepri == 1) Reader.SetReadVisible (Standard_True); Reader.TransferRoots(); thesession->MapReader()->SetProgress ( 0 ); progress->EndScope(); progress->Show(); // result in only one shape for all the roots // or in one shape for one root. di<<"Count of shapes produced : "< 1) { cout << " pass(0) one shape for all (1)\n or one shape per root (2)\n + WriteBRep (one for all : 3) (one per root : 4) : " << flush; answer = -1; //amv 26.09.2003 char str_a[80]; cin >> str_a; answer = atoi(str_a); } if ( answer == 0) continue; if ( answer == 1 || answer == 3) { TopoDS_Shape shape = Reader.OneShape(); // save the shape if (shape.IsNull()) { di<<"No Shape produced"<<"\n"; continue; } char fname[110]; sprintf(fname, "%s", rnom.ToCString()); di << "Saving shape in variable Draw : " << fname << "\n"; if (answer == 3) IGESToBRep::WriteShape (shape,1); try { OCC_CATCH_SIGNALS DBRep::Set(fname,shape); } catch(Standard_Failure) { di << "** Exception : "; di << Standard_Failure::Caught()->GetMessageString(); di<<" ** Skip"<<"\n"; di << "Saving shape in variable Draw : " << fname << "\n"; IGESToBRep::WriteShape (shape,1); } } else if (answer == 2 || answer == 4) { Standard_Integer numshape = Reader.NbShapes(); for (Standard_Integer inum = 1; inum <= numshape; inum++) { // save all the shapes TopoDS_Shape shape = Reader.Shape(inum); if (shape.IsNull()) { di<<"No Shape produced"<<"\n"; continue; } char fname[110]; sprintf(fname, "%s_%d", rnom.ToCString(),inum); di << "Saving shape in variable Draw : " << fname << "\n"; if (answer == 4) IGESToBRep::WriteShape (shape,inum); try { OCC_CATCH_SIGNALS DBRep::Set(fname,shape); } catch(Standard_Failure) { di << "** Exception : "; di << Standard_Failure::Caught()->GetMessageString(); di<<" ** Skip"<<"\n"; } } } else return 0; } else if (modepri == 3) { // One Entity cout << "Only One Entity"< DRAW Shape: "<ClearContext(); XSDRAW::SetTransferProcess (thesession->MapReader()); progress->NewScope ( 80, "Translation" ); progress->Show(); thesession->MapReader()->SetProgress ( progress ); Reader.SetReadVisible (Standard_True); Reader.TransferRoots(); thesession->MapReader()->SetProgress ( 0 ); progress->EndScope(); progress->Show(); // result in only one shape for all the roots TopoDS_Shape shape = Reader.OneShape(); // save the shape char fname[110]; sprintf(fname, "%s", rnom.ToCString()); di << "Saving shape in variable Draw : " << fname << "\n"; try { OCC_CATCH_SIGNALS DBRep::Set(fname,shape); } catch(Standard_Failure) { di << "** Exception : "; di << Standard_Failure::Caught()->GetMessageString(); di<<" ** Skip"<<"\n"; di << "Saving shape in variable Draw : " << fname << "\n"; IGESToBRep::WriteShape (shape,1); } return 0; } if(fromtcl) { modepri = 0; // d office, une seule passe if (argv[3][0] == '*' && argv[3][1] == 'r' && argv[3][2] == '\0') { di<<"All Roots : "; list = XSDRAW::GetList ("xst-model-roots"); } else { TCollection_AsciiString compart = XSDRAW_CommandPart (argc,argv,3); di<<"List given by "<Length(); di<<"Nb entities selected : "<>str_answer; answer = atoi(str_answer); } if (answer <= 0 || answer > 3) continue; if (answer == 3) { for (Standard_Integer ill = 1; ill <= nbl; ill ++) { Handle(Standard_Transient) ent = list->Value(ill); di<<" ";// model->Print(ent,di); } di<<"\n"; } if (answer == 1 || answer == 2) { Standard_Integer nbt = 0; Handle(XSControl_WorkSession) thesession = Reader.WS(); XSDRAW::SetTransferProcess (thesession->MapReader()); progress->NewScope ( 80, "Translation" ); progress->Show(); thesession->MapReader()->SetProgress ( progress ); Message_ProgressSentry PSentry ( progress, "Root", 0, nbl, 1 ); for (Standard_Integer ill = 1; ill <= nbl && PSentry.More(); ill ++, PSentry.Next()) { nent = Reader.Model()->Number(list->Value(ill)); if (nent == 0) continue; if (!Reader.TransferOne(nent)) di<<"Transfer entity n0 "< DRAW Shape: "<MapReader()->SetProgress ( 0 ); progress->EndScope(); progress->Show(); di<<"Nb Shapes successfully produced : "<AddWithRefs(ent, protocol): ecriture de l`entite et eventuellement // . de sa matrice de transformation // . de ses sous-elements IGESControl_Writer ICW (Interface_Static::CVal("write.iges.unit"), Interface_Static::IVal("write.iges.brep.mode")); di<<"unit (write) : "<) : brepiges shape [+shape][ +shape] nomfic // c a d tant qu il y a des + on ajoute ce qui suit const char* ficnom = NULL; Standard_Integer npris = 0; Handle(Draw_ProgressIndicator) progress = new Draw_ProgressIndicator ( di, 1 ); progress->NewScope(90,"Translating"); progress->Show(); ICW.TransferProcess()->SetProgress(progress); for ( Standard_Integer i = 1; i < n; i++) { const char* nomvar = a[i]; if (a[i][0] == '+') nomvar = &(a[i])[1]; else if (i > 1) { ficnom = a[i]; break; } TopoDS_Shape Shape = DBRep::Get(nomvar); if (ICW.AddShape (Shape)) npris ++; else if (ICW.AddGeom (DrawTrSurf::GetCurve (nomvar)) ) npris ++; else if (ICW.AddGeom (DrawTrSurf::GetSurface (nomvar)) ) npris ++; } ICW.ComputeModel(); XSDRAW::SetModel(ICW.Model()); XSDRAW::SetTransferProcess (ICW.TransferProcess()); ICW.TransferProcess()->SetProgress(0); progress->EndScope(); progress->Show(); progress->NewScope(10,"Writing"); progress->Show(); di<NbEntities()<<" Entities"<<"\n"; di<<" Now, to write a file, command : writeall filename"<<"\n"; // creation du fichier de sortie char nomfic[100] ; Standard_Integer modepri = 0; if (ficnom) { modepri = 2; strcpy (nomfic,ficnom); } if (!modepri) { cout<<" Mode (0 End, 1 ->screen, 2 file) :"<> modepri; di << "Output mode " << modepri << "\n"; } if (modepri == 0) return 0; // Ecran else if (modepri == 1) { di << " Screen Output" << "\n"; //ICW.Write (cout); Standard_SStream aSStream; ICW.Write (aSStream); di << aSStream; } // .... WRITE (Fichier) .... else if (modepri == 2) { if (!ficnom) { cout << " Output file name :" << flush; cin >> nomfic; } di << " Output on file : " << nomfic << "\n"; if (ICW.Write(nomfic)) di<<" Write OK"<<"\n"; else di<<" Write KO"<<"\n"; } progress->EndScope(); progress->Show(); return 0; } //-------------------------------------------------------------- // Function : testwriteiges // //-------------------------------------------------------------- static Standard_Integer testwrite (Draw_Interpretor& di, Standard_Integer n, const char** a) { if (n != 3) { di << "ERROR in " << a[0] << "Wrong Number of Arguments."<<"\n"; di << " Usage : " << a[0] <<" file_name shape_name"<< "\n"; return 1; } IGESControl_Writer Writer; Standard_CString filename = a[1]; TopoDS_Shape shape = DBRep::Get(a[2]); Standard_Boolean ok = Writer.AddShape(shape); if(!ok){ di<<"Shape not add"<<"\n"; return 1; } if(!(Writer.Write(filename))){ di<<"Error on writing file"<<"\n"; return 1; } di<<"File Is Written"<<"\n"; return 0; } //-------------------------------------------------------------- // Function : igesparam // //-------------------------------------------------------------- static Standard_Integer igesparam (Draw_Interpretor& di, Standard_Integer , const char** ) { // liste des parametres di<<"List of parameters which control IGES :"<<"\n"; di<<" unit : write.iges.unit\n mode write : write.iges.brep.mode\n spline_continuity (read) : read.iges.bspline.continuity\nSee definition by defparam, read/edit value by param"<<"\n"; di<<"unit (write) : "<NbWords(); Standard_Integer narg = n; Handle(Transfer_TransientProcess) TP = XSControl::Session(pilot)->MapReader(); TColStd_Array1OfAsciiString strarg(1, 3); TColStd_Array1OfAsciiString typarg(1, 3); strarg.SetValue(1,"xst-type(CurveOnSurface)"); strarg.SetValue(2,"xst-type(Boundary)"); strarg.SetValue(3,"xst-type(Loop)"); typarg.SetValue(1,"IGESGeom_TrimmedSurface"); typarg.SetValue(2,"IGESGeom_BoundedSurface"); typarg.SetValue(3,"IGESSolid_Face"); if (TP.IsNull()) { di<<"No Transfer Read"<<"\n"; return 1; } Standard_Integer nbFaces = 0, totFaces = 0 ; Handle(IFSelect_WorkSession) WS = pilot->Session(); Transfer_IteratorOfProcessForTransient itrp = TP->AbnormalResult(); Standard_Integer k=0; if(narg > 1) { // TCollection_AsciiString Arg = pilot->Word(1); TCollection_AsciiString Arg(a[1]); for(k=1 ; k<=3;k++ ) { if(typarg.Value(k).Location(Arg,1,typarg.Value(k).Length()) != 0) break; } } if( k == 4) {di<< "Invalid argument"<<"\n"; return 0; } for(Standard_Integer j = 1 ; j <= 3; j++) { TColStd_MapOfTransient aMap; if(narg == 1) k=j; Handle(TColStd_HSequenceOfTransient) list = IFSelect_Functions::GiveList(pilot->Session(),strarg.Value(k).ToCString()); if (!list.IsNull()) itrp.Filter (list); else { di << "No untrimmed faces" << "\n"; return 0; } for (itrp.Start(); itrp.More(); itrp.Next()) { Handle(Standard_Transient) ent = itrp.Starting(); Handle(TColStd_HSequenceOfTransient) super = WS->Sharings (ent); if (!super.IsNull()) { Standard_Integer nb = super->Length(); if (nb > 0) { for (Standard_Integer i = 1; i <= nb; i++) if (super->Value(i)->IsKind (typarg.Value(k).ToCString())) { if(aMap.Add(super->Value(i))) nbFaces++; } } } } if(nbFaces != 0) { if( j == 1 ) di << "Number of untrimmed faces: " << "\n"; switch(k){ case 1: di << "Trimmed Surface: " << "\n"; break; case 2: di << "Bounded Surface: " << "\n"; break; case 3: di << "Face: " << "\n"; break; } Handle(Message_Messenger) aDIMessenger = new Message_Messenger (new Draw_Printer(di)); TColStd_MapIteratorOfMapOfTransient itmap; for(itmap.Initialize(aMap); itmap.More(); itmap.Next()) { //XSDRAW::Model()->Print(itmap.Key(),cout); Standard_SStream aSStream; XSDRAW::Model()->Print(itmap.Key(),aDIMessenger); di << aSStream; di<<" "; } di << "\n"; di << "\n" << "Number:"<< nbFaces << "\n"; totFaces += nbFaces; } if(narg > 1) break; nbFaces = 0; } if(totFaces == 0) di << "No untrimmed faces" << "\n"; else di << "Total number :" << totFaces << "\n"; return 0; } //------------------------------------------------------------------- //-------------------------------------------------------------- // Function : TPSTAT // //-------------------------------------------------------------- static Standard_Integer XSDRAWIGES_TPSTAT(Draw_Interpretor& di,Standard_Integer n, const char** a) { Handle(IFSelect_SessionPilot) pilot = XSDRAW::Pilot(); Standard_Integer argc = n;//= pilot->NbWords(); const Standard_CString arg1 = a[1];//pilot->Arg(1); //IGESControl_Reader read; //(XSControl::Session(pilot),Standard_False); Handle(Transfer_TransientProcess) TP= XSControl::Session(pilot)->MapReader(); IGESControl_Reader read; //(XSControl::Session(pilot),Standard_False); //read.SetTransientProcess(TP); // **** tpent **** // if (TP.IsNull()) { di<<"No Transfer Read"<<"\n"; return IFSelect_RetError;} Handle(Interface_InterfaceModel) model = TP->Model(); //Handle(Interface_InterfaceModel) model = read.Model(); if (model.IsNull()) {di<<"No Transfer Read"<<"\n"; return -1;} //DeclareAndCast(IGESData_IGESModel,modelig,model); // read.SetModel(modelig); Handle(XSControl_WorkSession) thesession = read.WS(); thesession->SetMapReader(TP); //read.SetModel(model); Standard_Integer mod1 = 0; if (argc > 1) { char a2 = arg1[1]; if (a2 == '\0') a2 = '!'; switch (arg1[0]) { case 'g' : read.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_GeneralInfo);break; case 'c' : read.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_CountByItem); break; case 'C' : read.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_ListByItem); break; case 'r' : read.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_ResultCount);break; case 's' : read.PrintTransferInfo(IFSelect_FailAndWarn,IFSelect_Mapping);break; case '?' : mod1 = -1; break; default : mod1 = -2; break; } } if (mod1 < -1) di<<"Unknown Mode"<<"\n"; if (mod1 < 0) { di<<"Modes available :\n" <<"g : general c : checks (count) C (list)"<<"\n" <<"r : number of CasCade resulting shapes"<<"\n" <<"s : mapping between IGES entities and CasCade shapes"<<"\n"; if (mod1 < -1) return -1; return 0; } return 0; } static Standard_Integer etest(Draw_Interpretor& di, Standard_Integer argc, const char** a) { if(argc < 3) { di<<"etest igesfile shape"<<"\n"; return 0; } IGESControl_Reader aReader; aReader.ReadFile(a[1]); aReader.SetReadVisible(Standard_True); aReader.TransferRoots(); TopoDS_Shape shape = aReader.OneShape(); DBRep::Set(a[2],shape); return 0; } extern "C" { static void cleanpilot () { XSDRAW::Session()->ClearData(1); } } //-------------------------------------------------------------- // Function : Init(s) // //-------------------------------------------------------------- void XSDRAWIGES::InitSelect () { Handle(IGESSelect_Activator) igesact = new IGESSelect_Activator; IGESControl_Controller::Init(); // XSDRAW::SetNorm ("IGES"); trop tot XSDRAW::SetController (XSControl_Controller::Recorded("iges")); atexit (cleanpilot); } //======================================================================= //function : InitToBRep //purpose : //======================================================================= void XSDRAWIGES::InitToBRep (Draw_Interpretor& theCommands) { const char* g = "DE: IGES"; theCommands.Add("igesbrep", "igesbrep [file else already loaded model] [name DRAW]", __FILE__, igesbrep, g); theCommands.Add("testreadiges", "testreadiges [file else already loaded model] [name DRAW]", __FILE__, testread, g); theCommands.Add("igesread", "igesread [file else already loaded model] [name DRAW]", __FILE__, igesbrep, g); theCommands.Add("igesparam", "igesparam ->list, + name ->one param, + name val->change", __FILE__, igesparam, g); theCommands.Add("TPSTAT", " ", __FILE__, XSDRAWIGES_TPSTAT, g); theCommands.Add("tplosttrim", "number of untrimmed faces during last transfer", __FILE__, XSDRAWIGES_tplosttrim, g); theCommands.Add("etest", "test of eviewer", __FILE__, etest, g); } //======================================================================= //function : InitFromBRep //purpose : //======================================================================= void XSDRAWIGES::InitFromBRep (Draw_Interpretor& theCommands) { const char* g = "DE: IGES"; theCommands.Add("brepiges", "brepiges sh1 [+sh2 [+sh3 ..]] filename.igs", __FILE__, brepiges, g); theCommands.Add("testwriteiges", "testwriteiges filename.igs shape", __FILE__, testwrite, g); }