// Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include IMPLEMENT_STANDARD_RTTIEXT(XSControl_Controller, Standard_Transient) // ParamEditor // Transferts static NCollection_DataMap listad; //================================================================================================= XSControl_Controller::XSControl_Controller(const Standard_CString theLongName, const Standard_CString theShortName) : myShortName(theShortName), myLongName(theLongName) { // Standard parameters Interface_Static::Standards(); TraceStatic("read.precision.mode", 5); TraceStatic("read.precision.val", 5); TraceStatic("write.precision.mode", 6); TraceStatic("write.precision.val", 6); } //================================================================================================= void XSControl_Controller::TraceStatic(const Standard_CString theName, const Standard_Integer theUse) { Handle(Interface_Static) val = Interface_Static::Static(theName); if (val.IsNull()) return; myParams.Append(val); myParamUses.Append(theUse); } //================================================================================================= void XSControl_Controller::SetNames(const Standard_CString theLongName, const Standard_CString theShortName) { if (theLongName && theLongName[0] != '\0') { myLongName.Clear(); myLongName.AssignCat(theLongName); } if (theShortName && theShortName[0] != '\0') { myShortName.Clear(); myShortName.AssignCat(theShortName); } } //================================================================================================= void XSControl_Controller::Record(const Standard_CString theName) const { if (listad.IsBound(theName)) { Handle(Standard_Transient) thisadapt(this); Handle(Standard_Transient) newadapt = listad.ChangeFind(theName); if (newadapt->IsKind(thisadapt->DynamicType())) return; if (!(thisadapt->IsKind(newadapt->DynamicType())) && thisadapt != newadapt) throw Standard_DomainError("XSControl_Controller : Record"); } listad.Bind(theName, this); } //================================================================================================= Handle(XSControl_Controller) XSControl_Controller::Recorded(const Standard_CString theName) { Handle(Standard_Transient) recorded; return (listad.Find(theName, recorded) ? Handle(XSControl_Controller)::DownCast(recorded) : Handle(XSControl_Controller)()); } // #### DEFINITION #### //================================================================================================= Handle(Transfer_ActorOfTransientProcess) XSControl_Controller::ActorRead( const Handle(Interface_InterfaceModel)&) const { return myAdaptorRead; } //================================================================================================= Handle(Transfer_ActorOfFinderProcess) XSControl_Controller::ActorWrite() const { return myAdaptorWrite; } // ########################### // Help du Transfer : controle de valeur + help //================================================================================================= void XSControl_Controller::SetModeWrite(const Standard_Integer modemin, const Standard_Integer modemax, const Standard_Boolean) { if (modemin > modemax) { myModeWriteShapeN.Nullify(); return; } myModeWriteShapeN = new Interface_HArray1OfHAsciiString(modemin, modemax); } //================================================================================================= void XSControl_Controller::SetModeWriteHelp(const Standard_Integer modetrans, const Standard_CString help, const Standard_Boolean) { if (myModeWriteShapeN.IsNull()) return; if (modetrans < myModeWriteShapeN->Lower() || modetrans > myModeWriteShapeN->Upper()) return; Handle(TCollection_HAsciiString) hl = new TCollection_HAsciiString(help); myModeWriteShapeN->SetValue(modetrans, hl); } //================================================================================================= Standard_Boolean XSControl_Controller::ModeWriteBounds(Standard_Integer& modemin, Standard_Integer& modemax, const Standard_Boolean) const { modemin = modemax = 0; if (myModeWriteShapeN.IsNull()) return Standard_False; modemin = myModeWriteShapeN->Lower(); modemax = myModeWriteShapeN->Upper(); return Standard_True; } //================================================================================================= Standard_Boolean XSControl_Controller::IsModeWrite(const Standard_Integer modetrans, const Standard_Boolean) const { if (myModeWriteShapeN.IsNull()) return Standard_True; if (modetrans < myModeWriteShapeN->Lower()) return Standard_False; if (modetrans > myModeWriteShapeN->Upper()) return Standard_False; return Standard_True; } //================================================================================================= Standard_CString XSControl_Controller::ModeWriteHelp(const Standard_Integer modetrans, const Standard_Boolean) const { if (myModeWriteShapeN.IsNull()) return ""; if (modetrans < myModeWriteShapeN->Lower()) return ""; if (modetrans > myModeWriteShapeN->Upper()) return ""; Handle(TCollection_HAsciiString) str = myModeWriteShapeN->Value(modetrans); if (str.IsNull()) return ""; return str->ToCString(); } // ########################### // Transfer : on fait ce qu il faut par defaut (avec ActorWrite) // peut etre redefini ... //================================================================================================= Standard_Boolean XSControl_Controller::RecognizeWriteTransient( const Handle(Standard_Transient)& obj, const Standard_Integer modetrans) const { if (myAdaptorWrite.IsNull()) return Standard_False; myAdaptorWrite->ModeTrans() = modetrans; return myAdaptorWrite->Recognize(new Transfer_TransientMapper(obj)); } //================================================================================================= static IFSelect_ReturnStatus TransferFinder(const Handle(Transfer_ActorOfFinderProcess)& theActor, const Handle(Transfer_Finder)& theMapper, const Handle(Transfer_FinderProcess)& theFP, const Handle(Interface_InterfaceModel)& theModel, const Standard_Integer theModeTrans, const Message_ProgressRange& theProgress) { if (theActor.IsNull()) return IFSelect_RetError; if (theModel.IsNull()) return IFSelect_RetError; theActor->ModeTrans() = theModeTrans; theFP->SetModel(theModel); theFP->SetActor(theActor); theFP->Transfer(theMapper, theProgress); IFSelect_ReturnStatus stat = IFSelect_RetFail; Handle(Transfer_Binder) binder = theFP->Find(theMapper); Handle(Transfer_SimpleBinderOfTransient) bindtr; while (!binder.IsNull()) { bindtr = Handle(Transfer_SimpleBinderOfTransient)::DownCast(binder); if (!bindtr.IsNull()) { Handle(Standard_Transient) ent = bindtr->Result(); if (!ent.IsNull()) { stat = IFSelect_RetDone; theModel->AddWithRefs(ent); } } binder = binder->NextResult(); } return stat; } //================================================================================================= IFSelect_ReturnStatus XSControl_Controller::TransferWriteTransient( const Handle(Standard_Transient)& theObj, const Handle(Transfer_FinderProcess)& theFP, const Handle(Interface_InterfaceModel)& theModel, const Standard_Integer theModeTrans, const Message_ProgressRange& theProgress) const { if (theObj.IsNull()) return IFSelect_RetVoid; return TransferFinder(myAdaptorWrite, new Transfer_TransientMapper(theObj), theFP, theModel, theModeTrans, theProgress); } //================================================================================================= Standard_Boolean XSControl_Controller::RecognizeWriteShape(const TopoDS_Shape& shape, const Standard_Integer modetrans) const { if (myAdaptorWrite.IsNull()) return Standard_False; myAdaptorWrite->ModeTrans() = modetrans; return myAdaptorWrite->Recognize(new TransferBRep_ShapeMapper(shape)); } //================================================================================================= IFSelect_ReturnStatus XSControl_Controller::TransferWriteShape( const TopoDS_Shape& shape, const Handle(Transfer_FinderProcess)& FP, const Handle(Interface_InterfaceModel)& model, const Standard_Integer modetrans, const Message_ProgressRange& theProgress) const { if (shape.IsNull()) return IFSelect_RetVoid; IFSelect_ReturnStatus theReturnStat = TransferFinder(myAdaptorWrite, new TransferBRep_ShapeMapper(shape), FP, model, modetrans, theProgress); return theReturnStat; } // ########################### // Cutomisation ! On enregistre des Items pour une WorkSession // (annule et remplace) // Ensuite, on les remet en place a la demande //================================================================================================= void XSControl_Controller::AddSessionItem(const Handle(Standard_Transient)& theItem, const Standard_CString theName, const Standard_Boolean toApply) { if (theItem.IsNull() || theName[0] == '\0') return; myAdaptorSession.Bind(theName, theItem); if (toApply && theItem->IsKind(STANDARD_TYPE(IFSelect_GeneralModifier))) myAdaptorApplied.Append(theItem); } //================================================================================================= Handle(Standard_Transient) XSControl_Controller::SessionItem(const Standard_CString theName) const { Handle(Standard_Transient) item; if (!myAdaptorSession.IsEmpty()) item = myAdaptorSession.Find(theName); return item; } //================================================================================================= void XSControl_Controller::Customise(Handle(XSControl_WorkSession)& WS) { WS->SetParams(myParams, myParamUses); // General if (!myAdaptorSession.IsEmpty()) { NCollection_DataMap::Iterator iter( myAdaptorSession); for (; iter.More(); iter.Next()) WS->AddNamedItem(iter.Key().ToCString(), iter.ChangeValue()); } if (WS->NamedItem("xst-model-all").IsNull()) { Handle(IFSelect_SelectModelEntities) sle = new IFSelect_SelectModelEntities; WS->AddNamedItem("xst-model-all", sle); Handle(IFSelect_SelectModelRoots) slr = new IFSelect_SelectModelRoots; WS->AddNamedItem("xst-model-roots", slr); if (strcasecmp(WS->SelectedNorm(), "STEP")) { Handle(XSControl_SelectForTransfer) st1 = new XSControl_SelectForTransfer; st1->SetInput(slr); st1->SetReader(WS->TransferReader()); WS->AddNamedItem("xst-transferrable-roots", st1); } Handle(XSControl_SelectForTransfer) st2 = new XSControl_SelectForTransfer; st2->SetInput(sle); st2->SetReader(WS->TransferReader()); WS->AddNamedItem("xst-transferrable-all", st2); Handle(XSControl_SignTransferStatus) strs = new XSControl_SignTransferStatus; strs->SetReader(WS->TransferReader()); WS->AddNamedItem("xst-transfer-status", strs); Handle(XSControl_ConnectedShapes) scs = new XSControl_ConnectedShapes; scs->SetReader(WS->TransferReader()); WS->AddNamedItem("xst-connected-faces", scs); Handle(IFSelect_SignType) stp = new IFSelect_SignType(Standard_False); WS->AddNamedItem("xst-long-type", stp); Handle(IFSelect_SignType) stc = new IFSelect_SignType(Standard_True); WS->AddNamedItem("xst-type", stc); WS->AddNamedItem("xst-ancestor-type", new IFSelect_SignAncestor); WS->AddNamedItem("xst-types", new IFSelect_SignCounter(stp, Standard_False, Standard_True)); WS->AddNamedItem("xst-category", new IFSelect_SignCategory); WS->AddNamedItem("xst-validity", new IFSelect_SignValidity); Handle(IFSelect_DispPerOne) dispone = new IFSelect_DispPerOne; dispone->SetFinalSelection(slr); WS->AddNamedItem("xst-disp-one", dispone); Handle(IFSelect_DispPerCount) dispcount = new IFSelect_DispPerCount; Handle(IFSelect_IntParam) intcount = new IFSelect_IntParam; intcount->SetValue(5); dispcount->SetCount(intcount); dispcount->SetFinalSelection(slr); WS->AddNamedItem("xst-disp-count", dispcount); Handle(IFSelect_DispPerFiles) dispfiles = new IFSelect_DispPerFiles; Handle(IFSelect_IntParam) intfiles = new IFSelect_IntParam; intfiles->SetValue(10); dispfiles->SetCount(intfiles); dispfiles->SetFinalSelection(slr); WS->AddNamedItem("xst-disp-files", dispfiles); Handle(IFSelect_DispPerSignature) dispsign = new IFSelect_DispPerSignature; dispsign->SetSignCounter(new IFSelect_SignCounter(Handle(IFSelect_Signature)(stc))); dispsign->SetFinalSelection(slr); WS->AddNamedItem("xst-disp-sign", dispsign); // Not used directly but useful anyway WS->AddNamedItem("xst-pointed", new IFSelect_SelectPointed); WS->AddNamedItem("xst-sharing", new IFSelect_SelectSharing); WS->AddNamedItem("xst-shared", new IFSelect_SelectShared); WS->AddNamedItem("xst-nb-selected", new IFSelect_GraphCounter); // szv:mySignType = stp; WS->SetSignType(stp); } // Applied Modifiers Standard_Integer i, nb = myAdaptorApplied.Length(); for (i = 1; i <= nb; i++) { const Handle(Standard_Transient)& anitem = myAdaptorApplied.Value(i); Handle(TCollection_HAsciiString) name = WS->Name(anitem); WS->SetAppliedModifier(GetCasted(IFSelect_GeneralModifier, anitem), WS->ShareOut()); } // Editors of Parameters // Here for the specific manufacturers of controllers could create the // Parameters: So wait here Handle(TColStd_HSequenceOfHAsciiString) listat = Interface_Static::Items(); Handle(IFSelect_ParamEditor) paramed = IFSelect_ParamEditor::StaticEditor(listat, "All Static Parameters"); WS->AddNamedItem("xst-static-params-edit", paramed); Handle(IFSelect_EditForm) paramform = paramed->Form(Standard_False); WS->AddNamedItem("xst-static-params", paramform); }