1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
15 #include <IFSelect_DispPerCount.hxx>
16 #include <IFSelect_DispPerFiles.hxx>
17 #include <IFSelect_DispPerOne.hxx>
18 #include <IFSelect_DispPerSignature.hxx>
19 #include <IFSelect_EditForm.hxx>
20 #include <IFSelect_GeneralModifier.hxx>
21 #include <IFSelect_GraphCounter.hxx>
22 #include <IFSelect_IntParam.hxx>
23 #include <IFSelect_ParamEditor.hxx>
24 #include <IFSelect_SelectModelEntities.hxx>
25 #include <IFSelect_SelectModelRoots.hxx>
26 #include <IFSelect_SelectPointed.hxx>
27 #include <IFSelect_SelectShared.hxx>
28 #include <IFSelect_SelectSharing.hxx>
29 #include <IFSelect_ShareOut.hxx>
30 #include <IFSelect_SignAncestor.hxx>
31 #include <IFSelect_Signature.hxx>
32 #include <IFSelect_SignCategory.hxx>
33 #include <IFSelect_SignCounter.hxx>
34 #include <IFSelect_SignType.hxx>
35 #include <IFSelect_SignValidity.hxx>
36 #include <IFSelect_WorkLibrary.hxx>
37 #include <Interface_CheckIterator.hxx>
38 #include <Interface_InterfaceModel.hxx>
39 #include <Interface_Macros.hxx>
40 #include <Interface_Protocol.hxx>
41 #include <Interface_Static.hxx>
42 #include <Message.hxx>
43 #include <Message_Messenger.hxx>
44 #include <Standard_DomainError.hxx>
45 #include <Standard_Transient.hxx>
46 #include <Standard_Type.hxx>
47 #include <TCollection_HAsciiString.hxx>
48 #include <TColStd_HSequenceOfHAsciiString.hxx>
49 #include <TColStd_IndexedMapOfTransient.hxx>
50 #include <TopoDS_Shape.hxx>
51 #include <Transfer_ActorOfFinderProcess.hxx>
52 #include <Transfer_ActorOfTransientProcess.hxx>
53 #include <Transfer_Binder.hxx>
54 #include <Transfer_FinderProcess.hxx>
55 #include <Transfer_SimpleBinderOfTransient.hxx>
56 #include <Transfer_TransientMapper.hxx>
57 #include <TransferBRep_ShapeMapper.hxx>
58 #include <XSControl_ConnectedShapes.hxx>
59 #include <XSControl_Controller.hxx>
60 #include <XSControl_SelectForTransfer.hxx>
61 #include <XSControl_SignTransferStatus.hxx>
62 #include <XSControl_TransferReader.hxx>
63 #include <XSControl_WorkSession.hxx>
65 IMPLEMENT_STANDARD_RTTIEXT(XSControl_Controller,MMgt_TShared)
70 static NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)> listad;
72 //=======================================================================
73 //function : XSControl_Controller
74 //purpose : Constructor
75 //=======================================================================
77 XSControl_Controller::XSControl_Controller (const Standard_CString theLongName, const Standard_CString theShortName)
78 : myShortName(theShortName), myLongName(theLongName)
80 // Standard parameters
81 Interface_Static::Standards();
82 TraceStatic ("read.precision.mode" , 5);
83 TraceStatic ("read.precision.val" , 5);
84 TraceStatic ("write.precision.mode" , 6);
85 TraceStatic ("write.precision.val" , 6);
88 //=======================================================================
89 //function : TraceStatic
91 //=======================================================================
93 void XSControl_Controller::TraceStatic (const Standard_CString theName, const Standard_Integer theUse)
95 Handle(Interface_Static) val = Interface_Static::Static(theName);
96 if (val.IsNull()) return;
97 myParams.Append (val);
98 myParamUses.Append(theUse);
101 //=======================================================================
102 //function : SetNames
104 //=======================================================================
106 void XSControl_Controller::SetNames (const Standard_CString theLongName, const Standard_CString theShortName)
108 if (theLongName && theLongName[0] != '\0') {
109 myLongName.Clear(); myLongName.AssignCat (theLongName);
111 if (theShortName && theShortName[0] != '\0') {
112 myShortName.Clear(); myShortName.AssignCat(theShortName);
116 //=======================================================================
119 //=======================================================================
121 void XSControl_Controller::Record (const Standard_CString theName) const
123 if (listad.IsBound(theName)) {
124 Handle(Standard_Transient) thisadapt(this);
125 Handle(Standard_Transient) newadapt = listad.ChangeFind(theName);
126 if (newadapt->IsKind(thisadapt->DynamicType()))
128 if (!(thisadapt->IsKind(newadapt->DynamicType())) && thisadapt != newadapt)
129 throw Standard_DomainError("XSControl_Controller : Record");
131 listad.Bind(theName, this);
134 //=======================================================================
135 //function : Recorded
137 //=======================================================================
139 Handle(XSControl_Controller) XSControl_Controller::Recorded(const Standard_CString theName)
141 Handle(Standard_Transient) recorded;
142 return (listad.Find(theName, recorded)?
143 Handle(XSControl_Controller)::DownCast(recorded) :
144 Handle(XSControl_Controller)());
147 // #### DEFINITION ####
149 //=======================================================================
150 //function : ActorRead
152 //=======================================================================
154 Handle(Transfer_ActorOfTransientProcess) XSControl_Controller::ActorRead (const Handle(Interface_InterfaceModel)&) const
156 return myAdaptorRead;
159 //=======================================================================
160 //function : ActorWrite
162 //=======================================================================
164 Handle(Transfer_ActorOfFinderProcess) XSControl_Controller::ActorWrite () const
166 return myAdaptorWrite;
169 // ###########################
170 // Help du Transfer : controle de valeur + help
172 //=======================================================================
173 //function : SetModeWrite
175 //=======================================================================
177 void XSControl_Controller::SetModeWrite
178 (const Standard_Integer modemin, const Standard_Integer modemax, const Standard_Boolean )
180 if (modemin > modemax) { myModeWriteShapeN.Nullify(); return; }
181 myModeWriteShapeN = new Interface_HArray1OfHAsciiString (modemin,modemax);
184 //=======================================================================
185 //function : SetModeWriteHelp
187 //=======================================================================
189 void XSControl_Controller::SetModeWriteHelp
190 (const Standard_Integer modetrans, const Standard_CString help, const Standard_Boolean )
192 if (myModeWriteShapeN.IsNull()) return;
193 if (modetrans < myModeWriteShapeN->Lower() ||
194 modetrans > myModeWriteShapeN->Upper()) return;
195 Handle(TCollection_HAsciiString) hl = new TCollection_HAsciiString (help);
196 myModeWriteShapeN->SetValue (modetrans,hl);
199 //=======================================================================
200 //function : ModeWriteBounds
202 //=======================================================================
204 Standard_Boolean XSControl_Controller::ModeWriteBounds
205 (Standard_Integer& modemin, Standard_Integer& modemax, const Standard_Boolean ) const
207 modemin = modemax = 0;
208 if (myModeWriteShapeN.IsNull()) return Standard_False;
209 modemin = myModeWriteShapeN->Lower();
210 modemax = myModeWriteShapeN->Upper();
211 return Standard_True;
214 //=======================================================================
215 //function : IsModeWrite
217 //=======================================================================
219 Standard_Boolean XSControl_Controller::IsModeWrite
220 (const Standard_Integer modetrans, const Standard_Boolean ) const
222 if (myModeWriteShapeN.IsNull()) return Standard_True;
223 if (modetrans < myModeWriteShapeN->Lower()) return Standard_False;
224 if (modetrans > myModeWriteShapeN->Upper()) return Standard_False;
225 return Standard_True;
228 //=======================================================================
229 //function : ModeWriteHelp
231 //=======================================================================
233 Standard_CString XSControl_Controller::ModeWriteHelp
234 (const Standard_Integer modetrans, const Standard_Boolean ) const
236 if (myModeWriteShapeN.IsNull()) return "";
237 if (modetrans < myModeWriteShapeN->Lower()) return "";
238 if (modetrans > myModeWriteShapeN->Upper()) return "";
239 Handle(TCollection_HAsciiString) str = myModeWriteShapeN->Value(modetrans);
240 if (str.IsNull()) return "";
241 return str->ToCString();
245 // ###########################
246 // Transfer : on fait ce qu il faut par defaut (avec ActorWrite)
247 // peut etre redefini ...
249 //=======================================================================
250 //function : RecognizeWriteTransient
252 //=======================================================================
254 Standard_Boolean XSControl_Controller::RecognizeWriteTransient
255 (const Handle(Standard_Transient)& obj,
256 const Standard_Integer modetrans) const
258 if (myAdaptorWrite.IsNull()) return Standard_False;
259 myAdaptorWrite->ModeTrans() = modetrans;
260 return myAdaptorWrite->Recognize (new Transfer_TransientMapper(obj));
263 //=======================================================================
264 //function : TransferFinder
265 //purpose : internal function
266 //=======================================================================
268 static IFSelect_ReturnStatus TransferFinder
269 (const Handle(Transfer_ActorOfFinderProcess)& theActor,
270 const Handle(Transfer_Finder)& theMapper,
271 const Handle(Transfer_FinderProcess)& theFP,
272 const Handle(Interface_InterfaceModel)& theModel,
273 const Standard_Integer theModeTrans)
275 if (theActor.IsNull()) return IFSelect_RetError;
276 if (theModel.IsNull()) return IFSelect_RetError;
277 theActor->ModeTrans() = theModeTrans;
278 theFP->SetModel (theModel);
279 theFP->SetActor (theActor);
280 theFP->Transfer (theMapper);
282 IFSelect_ReturnStatus stat = IFSelect_RetFail;
283 Handle(Transfer_Binder) binder = theFP->Find (theMapper);
284 Handle(Transfer_SimpleBinderOfTransient) bindtr;
285 while (!binder.IsNull()) {
286 bindtr = Handle(Transfer_SimpleBinderOfTransient)::DownCast (binder);
287 if (!bindtr.IsNull()) {
288 Handle(Standard_Transient) ent = bindtr->Result();
290 stat = IFSelect_RetDone;
291 theModel->AddWithRefs (ent);
294 binder = binder->NextResult();
299 //=======================================================================
300 //function : TransferWriteTransient
302 //=======================================================================
304 IFSelect_ReturnStatus XSControl_Controller::TransferWriteTransient
305 (const Handle(Standard_Transient)& theObj,
306 const Handle(Transfer_FinderProcess)& theFP,
307 const Handle(Interface_InterfaceModel)& theModel,
308 const Standard_Integer theModeTrans) const
310 if (theObj.IsNull()) return IFSelect_RetVoid;
311 return TransferFinder
312 (myAdaptorWrite,new Transfer_TransientMapper(theObj),theFP,theModel,theModeTrans);
315 //=======================================================================
316 //function : RecognizeWriteShape
318 //=======================================================================
320 Standard_Boolean XSControl_Controller::RecognizeWriteShape
321 (const TopoDS_Shape& shape,
322 const Standard_Integer modetrans) const
324 if (myAdaptorWrite.IsNull()) return Standard_False;
325 myAdaptorWrite->ModeTrans() = modetrans;
326 return myAdaptorWrite->Recognize (new TransferBRep_ShapeMapper(shape));
329 //=======================================================================
330 //function : TransferWriteShape
332 //=======================================================================
334 IFSelect_ReturnStatus XSControl_Controller::TransferWriteShape
335 (const TopoDS_Shape& shape,
336 const Handle(Transfer_FinderProcess)& FP,
337 const Handle(Interface_InterfaceModel)& model,
338 const Standard_Integer modetrans) const
340 if (shape.IsNull()) return IFSelect_RetVoid;
342 IFSelect_ReturnStatus theReturnStat = TransferFinder
343 (myAdaptorWrite,new TransferBRep_ShapeMapper(shape),FP,model,modetrans);
344 return theReturnStat;
347 // ###########################
348 // Cutomisation ! On enregistre des Items pour une WorkSession
349 // (annule et remplace)
350 // Ensuite, on les remet en place a la demande
352 //=======================================================================
353 //function : AddSessionItem
355 //=======================================================================
357 void XSControl_Controller::AddSessionItem
358 (const Handle(Standard_Transient)& theItem, const Standard_CString theName, const Standard_Boolean toApply)
360 if (theItem.IsNull() || theName[0] == '\0') return;
361 myAdaptorSession.Bind(theName,theItem);
362 if (toApply && theItem->IsKind(STANDARD_TYPE(IFSelect_GeneralModifier)))
363 myAdaptorApplied.Append(theItem);
366 //=======================================================================
367 //function : SessionItem
369 //=======================================================================
371 Handle(Standard_Transient) XSControl_Controller::SessionItem (const Standard_CString theName) const
373 Handle(Standard_Transient) item;
374 if (!myAdaptorSession.IsEmpty())
375 item = myAdaptorSession.Find(theName);
379 //=======================================================================
380 //function : Customise
382 //=======================================================================
384 void XSControl_Controller::Customise (Handle(XSControl_WorkSession)& WS)
386 WS->SetParams (myParams,myParamUses);
389 if (!myAdaptorSession.IsEmpty()) {
390 NCollection_DataMap<TCollection_AsciiString, Handle(Standard_Transient)>::Iterator iter(myAdaptorSession);
391 for (; iter.More(); iter.Next())
392 WS->AddNamedItem (iter.Key().ToCString(), iter.ChangeValue());
395 if (WS->NamedItem("xst-model-all").IsNull()) {
397 Handle(IFSelect_SelectModelEntities) sle = new IFSelect_SelectModelEntities;
398 WS->AddNamedItem ("xst-model-all",sle);
400 Handle(IFSelect_SelectModelRoots) slr = new IFSelect_SelectModelRoots;
401 WS->AddNamedItem ("xst-model-roots",slr);
403 if(strcasecmp(WS->SelectedNorm(),"STEP")) {
404 Handle(XSControl_SelectForTransfer) st1 = new XSControl_SelectForTransfer;
406 st1->SetReader (WS->TransferReader());
407 WS->AddNamedItem ("xst-transferrable-roots",st1);
410 Handle(XSControl_SelectForTransfer) st2 = new XSControl_SelectForTransfer;
412 st2->SetReader (WS->TransferReader());
413 WS->AddNamedItem ("xst-transferrable-all",st2);
415 Handle(XSControl_SignTransferStatus) strs = new XSControl_SignTransferStatus;
416 strs->SetReader (WS->TransferReader());
417 WS->AddNamedItem ("xst-transfer-status",strs);
419 Handle(XSControl_ConnectedShapes) scs = new XSControl_ConnectedShapes;
420 scs->SetReader (WS->TransferReader());
421 WS->AddNamedItem ("xst-connected-faces",scs);
423 Handle(IFSelect_SignType) stp = new IFSelect_SignType (Standard_False);
424 WS->AddNamedItem ("xst-long-type",stp);
426 Handle(IFSelect_SignType) stc = new IFSelect_SignType (Standard_True);
427 WS->AddNamedItem ("xst-type",stc);
429 WS->AddNamedItem ("xst-ancestor-type",new IFSelect_SignAncestor);
430 WS->AddNamedItem ("xst-types",new IFSelect_SignCounter(stp,Standard_False,Standard_True));
431 WS->AddNamedItem ("xst-category",new IFSelect_SignCategory);
432 WS->AddNamedItem ("xst-validity",new IFSelect_SignValidity);
434 Handle(IFSelect_DispPerOne) dispone = new IFSelect_DispPerOne;
435 dispone->SetFinalSelection(slr);
436 WS->AddNamedItem ("xst-disp-one",dispone);
438 Handle(IFSelect_DispPerCount) dispcount = new IFSelect_DispPerCount;
439 Handle(IFSelect_IntParam) intcount = new IFSelect_IntParam;
440 intcount->SetValue(5);
441 dispcount->SetCount(intcount);
442 dispcount->SetFinalSelection(slr);
443 WS->AddNamedItem ("xst-disp-count",dispcount);
445 Handle(IFSelect_DispPerFiles) dispfiles = new IFSelect_DispPerFiles;
446 Handle(IFSelect_IntParam) intfiles = new IFSelect_IntParam;
447 intfiles->SetValue(10);
448 dispfiles->SetCount(intfiles);
449 dispfiles->SetFinalSelection(slr);
450 WS->AddNamedItem ("xst-disp-files",dispfiles);
452 Handle(IFSelect_DispPerSignature) dispsign = new IFSelect_DispPerSignature;
453 dispsign->SetSignCounter(new IFSelect_SignCounter(Handle(IFSelect_Signature)(stc)));
454 dispsign->SetFinalSelection(slr);
455 WS->AddNamedItem ("xst-disp-sign",dispsign);
457 // Not used directly but useful anyway
458 WS->AddNamedItem ("xst-pointed",new IFSelect_SelectPointed);
459 WS->AddNamedItem ("xst-sharing",new IFSelect_SelectSharing);
460 WS->AddNamedItem ("xst-shared",new IFSelect_SelectShared);
461 WS->AddNamedItem ("xst-nb-selected",new IFSelect_GraphCounter);
463 //szv:mySignType = stp;
464 WS->SetSignType( stp );
468 Standard_Integer i, nb = myAdaptorApplied.Length();
469 for (i = 1; i <= nb; i ++) {
470 const Handle(Standard_Transient) &anitem = myAdaptorApplied.Value(i);
471 Handle(TCollection_HAsciiString) name = WS->Name(anitem);
472 WS->SetAppliedModifier(GetCasted(IFSelect_GeneralModifier,anitem),WS->ShareOut());
475 // Editors of Parameters
476 // Here for the specific manufacturers of controllers could create the
477 // Parameters: So wait here
479 Handle(TColStd_HSequenceOfHAsciiString) listat = Interface_Static::Items();
480 Handle(IFSelect_ParamEditor) paramed = IFSelect_ParamEditor::StaticEditor (listat,"All Static Parameters");
481 WS->AddNamedItem ("xst-static-params-edit",paramed);
482 Handle(IFSelect_EditForm) paramform = paramed->Form(Standard_False);
483 WS->AddNamedItem ("xst-static-params",paramform);