1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-03 14:10:33 +03:00

Compare commits

..

4 Commits

Author SHA1 Message Date
ika
6231958ddc 0033356: Data Exchange - Wrong half of sphere is imported 2023-05-15 13:06:20 +01:00
msmediasofts
359edc7d8a 0033366: Documentation - Add description of BRepAlgoAPI_Algo::Shape()
Added description of BRepAlgoAPI_Algo::Shape()
2023-04-19 18:04:52 +01:00
mzernova
f9998f03ad 0031777: Visualization - improve SelectMgr_EntityOwner to process selection scheme
The selection scheme has been propagated to Owner object interface, and the
AIS_Selection::Select() method has been replaced to unify the logic.
2023-04-05 17:20:33 +01:00
dorlov
c479c4f6d8 0023638: Data Exchange - Reading IGES file produced invalid shape
Removed double healing of Iges group entities
Added ShapeBuild_ReShape member to the IGESData_IGESModel class, shapes which are registered in ShapeBuild_ReShape class does not process to healing
2023-03-28 01:00:42 +01:00
17 changed files with 569 additions and 410 deletions

View File

@@ -3228,6 +3228,30 @@ void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateVi
} }
} }
//=======================================================================
//function : isDetected
//purpose :
//=======================================================================
Standard_Boolean AIS_InteractiveContext::isDetected (const Handle(AIS_InteractiveObject)& theObject)
{
for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper(); aDetIter++)
{
Handle(SelectMgr_EntityOwner) aPicked = MainSelector()->Picked(myDetectedSeq(aDetIter));
Handle(AIS_InteractiveObject) anObj;
if (!aPicked.IsNull())
{
anObj = Handle(AIS_InteractiveObject)::DownCast(aPicked->Selectable());
}
if (!anObj.IsNull()
&& anObj == theObject)
{
return Standard_True;
}
}
return Standard_False;
}
//======================================================================= //=======================================================================
//function : SetSelected //function : SetSelected
//purpose : Sets the whole object as selected and highlights it with selection color //purpose : Sets the whole object as selected and highlights it with selection color
@@ -3288,7 +3312,8 @@ void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& t
} }
// added to avoid untimely viewer update... // added to avoid untimely viewer update...
mySelection->ClearAndSelect (anOwner); const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
mySelection->ClearAndSelect (anOwner, myFilters, isDetected (anObj));
if (myAutoHilight) if (myAutoHilight)
{ {
@@ -3350,7 +3375,7 @@ void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& t
unhighlightSelected(); unhighlightSelected();
} }
mySelection->ClearAndSelect (theOwner); mySelection->ClearAndSelect (theOwner, myFilters, isDetected (anObject));
if (myAutoHilight) if (myAutoHilight)
{ {
Handle(Prs3d_Drawer) aCustomStyle; Handle(Prs3d_Drawer) aCustomStyle;
@@ -3401,16 +3426,17 @@ void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityO
return; return;
} }
if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected()) if (!myFilters->IsOk (theOwner) && !theOwner->IsSelected())
{ {
return; return;
} }
mySelection->Select (theOwner); AIS_SelectionScheme aSelScheme = theOwner->IsSelected() ? AIS_SelectionScheme_Remove : AIS_SelectionScheme_Add;
const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
mySelection->Select (theOwner, myFilters, aSelScheme, isDetected (anObj));
if (myAutoHilight) if (myAutoHilight)
{ {
const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (anObj); Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (anObj);
if (!aStatusPtr) if (!aStatusPtr)
{ {
@@ -3469,7 +3495,8 @@ Standard_Boolean AIS_InteractiveContext::SetSelectedState (const Handle(SelectMg
} }
else else
{ {
const AIS_SelectStatus aSelStatus = mySelection->Select (theEntity); const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(theEntity->Selectable());
const AIS_SelectStatus aSelStatus = mySelection->Select (theEntity, myFilters, AIS_SelectionScheme_Remove, isDetected (anObj));
theEntity->SetSelected (false); theEntity->SetSelected (false);
return aSelStatus == AIS_SS_Removed; return aSelStatus == AIS_SS_Removed;
} }

View File

@@ -1302,6 +1302,9 @@ protected: //! @name internal methods
Standard_EXPORT AIS_StatusOfDetection moveTo (const Handle(V3d_View)& theView, Standard_EXPORT AIS_StatusOfDetection moveTo (const Handle(V3d_View)& theView,
const Standard_Boolean theToRedrawOnUpdate); const Standard_Boolean theToRedrawOnUpdate);
//! Returns True if the object is detected.
Standard_EXPORT Standard_Boolean isDetected (const Handle(AIS_InteractiveObject)& theObject);
//! Helper function to unhighlight all entity owners currently highlighted with seleciton color. //! Helper function to unhighlight all entity owners currently highlighted with seleciton color.
Standard_EXPORT void unselectOwners (const Handle(AIS_InteractiveObject)& theObject); Standard_EXPORT void unselectOwners (const Handle(AIS_InteractiveObject)& theObject);

View File

@@ -55,24 +55,38 @@ void AIS_Selection::Clear()
//function : Select //function : Select
//purpose : //purpose :
//======================================================================= //=======================================================================
AIS_SelectStatus AIS_Selection::Select (const Handle(SelectMgr_EntityOwner)& theObject) AIS_SelectStatus AIS_Selection::Select (const Handle(SelectMgr_EntityOwner)& theOwner,
const Handle(SelectMgr_Filter)& theFilter,
const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected)
{ {
if (theObject.IsNull() if (theOwner.IsNull()
|| !theObject->HasSelectable()) || !theOwner->HasSelectable())
{ {
return AIS_SS_NotDone; return AIS_SS_NotDone;
} }
if (!myResultMap.IsBound (theObject)) const Standard_Boolean isDetected = theIsDetected
&& (theFilter.IsNull() || theFilter->IsOk (theOwner));
const Standard_Boolean wasSelected = theOwner->IsSelected();
const Standard_Boolean toSelect = theOwner->Select (theSelScheme, isDetected);
if (toSelect && !wasSelected)
{ {
AIS_NListOfEntityOwner::Iterator aListIter; AIS_NListOfEntityOwner::Iterator aListIter;
myresult.Append (theObject, aListIter); myresult.Append (theOwner, aListIter);
myResultMap.Bind (theObject, aListIter); myResultMap.Bind (theOwner, aListIter);
theObject->SetSelected (Standard_True); theOwner->SetSelected (Standard_True);
return AIS_SS_Added; return AIS_SS_Added;
} }
AIS_NListOfEntityOwner::Iterator aListIter = myResultMap.Find (theObject); if (!toSelect && !wasSelected)
{
return AIS_SS_NotDone;
}
AIS_NListOfEntityOwner::Iterator aListIter = myResultMap.Find (theOwner);
if (myIterator == aListIter) if (myIterator == aListIter)
{ {
if (myIterator.More()) if (myIterator.More())
@@ -88,14 +102,14 @@ AIS_SelectStatus AIS_Selection::Select (const Handle(SelectMgr_EntityOwner)& the
// In the mode of advanced mesh selection only one owner is created for all selection modes. // In the mode of advanced mesh selection only one owner is created for all selection modes.
// It is necessary to check the current detected entity // It is necessary to check the current detected entity
// and remove the owner from map only if the detected entity is the same as previous selected (IsForcedHilight call) // and remove the owner from map only if the detected entity is the same as previous selected (IsForcedHilight call)
if (theObject->IsForcedHilight()) if (theOwner->IsForcedHilight())
{ {
return AIS_SS_Added; return AIS_SS_Added;
} }
myresult.Remove (aListIter); myresult.Remove (aListIter);
myResultMap.UnBind (theObject); myResultMap.UnBind (theOwner);
theObject->SetSelected (Standard_False); theOwner->SetSelected (Standard_False);
// update list iterator for next object in <myresult> list if any // update list iterator for next object in <myresult> list if any
if (aListIter.More()) if (aListIter.More())
@@ -142,86 +156,39 @@ void AIS_Selection::SelectOwners (const AIS_NArray1OfEntityOwner& thePickedOwner
const Standard_Boolean theToAllowSelOverlap, const Standard_Boolean theToAllowSelOverlap,
const Handle(SelectMgr_Filter)& theFilter) const Handle(SelectMgr_Filter)& theFilter)
{ {
(void )theToAllowSelOverlap; (void)theToAllowSelOverlap;
switch (theSelScheme)
if (theSelScheme == AIS_SelectionScheme_ReplaceExtra
&& thePickedOwners.Size() == myresult.Size())
{ {
case AIS_SelectionScheme_UNKNOWN: // If picked owners is equivalent to the selected then just clear selected.
Standard_Boolean isTheSame = Standard_True;
for (AIS_NArray1OfEntityOwner::Iterator aPickedIter (thePickedOwners); aPickedIter.More(); aPickedIter.Next())
{ {
return; if (!myResultMap.IsBound (aPickedIter.Value()))
}
case AIS_SelectionScheme_ReplaceExtra:
{
// If picked owners is equivalent to the selected then just clear selected
// Else go to AIS_SelectionScheme_Replace
if (thePickedOwners.Size() == myresult.Size())
{ {
Standard_Boolean isTheSame = Standard_True; isTheSame = Standard_False;
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next()) break;
{
if (!myResultMap.IsBound (aSelIter.Value()))
{
isTheSame = Standard_False;
break;
}
}
if (isTheSame)
{
Clear();
return;
}
} }
} }
Standard_FALLTHROUGH if (isTheSame)
case AIS_SelectionScheme_Replace:
{ {
Clear(); Clear();
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next()) return;
{ }
appendOwner (aSelIter.Value(), theFilter); }
}
return; if (theSelScheme == AIS_SelectionScheme_Replace
} || theSelScheme == AIS_SelectionScheme_ReplaceExtra
case AIS_SelectionScheme_Add: || theSelScheme == AIS_SelectionScheme_Clear)
{ {
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next()) Clear();
{ }
appendOwner (aSelIter.Value(), theFilter);
}
return;
}
case AIS_SelectionScheme_Remove:
{
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
if (myResultMap.IsBound (aSelIter.Value()))
{
Select (aSelIter.Value());
}
}
return;
}
case AIS_SelectionScheme_XOR:
{
for (AIS_NArray1OfEntityOwner::Iterator aSelIter (thePickedOwners); aSelIter.More(); aSelIter.Next())
{
const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
if (anOwner.IsNull()
|| !anOwner->HasSelectable()
|| !theFilter->IsOk (anOwner))
{
continue;
}
Select (anOwner); for (AIS_NArray1OfEntityOwner::Iterator aPickedIter (thePickedOwners); aPickedIter.More(); aPickedIter.Next())
} {
return; const Handle(SelectMgr_EntityOwner)& anOwner = aPickedIter.Value();
} Select (anOwner, theFilter, theSelScheme, true);
case AIS_SelectionScheme_Clear:
{
Clear();
return;
}
} }
} }

View File

@@ -34,23 +34,36 @@ public:
//! creates a new selection. //! creates a new selection.
Standard_EXPORT AIS_Selection(); Standard_EXPORT AIS_Selection();
//! removes all the object of the selection. //! removes all the object of the selection.
Standard_EXPORT virtual void Clear(); Standard_EXPORT virtual void Clear();
//! if the object is not yet in the selection, it will be added. //! if the object is not yet in the selection, it will be added.
//! if the object is already in the selection, it will be removed. //! if the object is already in the selection, it will be removed.
Standard_EXPORT virtual AIS_SelectStatus Select (const Handle(SelectMgr_EntityOwner)& theObject); //! @param[in] theOwner element to change selection state
//! @param[in] theFilter context filter
//! @param[in] theSelScheme selection scheme
//! @param[in] theIsDetected flag of object detection
//! @return result of selection
Standard_EXPORT virtual AIS_SelectStatus Select (const Handle(SelectMgr_EntityOwner)& theOwner,
const Handle(SelectMgr_Filter)& theFilter,
const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected);
//! the object is always add int the selection. //! the object is always add int the selection.
//! faster when the number of objects selected is great. //! faster when the number of objects selected is great.
Standard_EXPORT virtual AIS_SelectStatus AddSelect (const Handle(SelectMgr_EntityOwner)& theObject); Standard_EXPORT virtual AIS_SelectStatus AddSelect (const Handle(SelectMgr_EntityOwner)& theObject);
//! clears the selection and adds the object in the selection. //! clears the selection and adds the object in the selection.
virtual void ClearAndSelect (const Handle(SelectMgr_EntityOwner)& theObject) //! @param[in] theObject element to change selection state
//! @param[in] theFilter context filter
//! @param[in] theIsDetected flag of object detection
virtual void ClearAndSelect (const Handle(SelectMgr_EntityOwner)& theObject,
const Handle(SelectMgr_Filter)& theFilter,
const Standard_Boolean theIsDetected)
{ {
Clear(); Clear();
Select (theObject); Select (theObject, theFilter, AIS_SelectionScheme_Add, theIsDetected);
} }
//! checks if the object is in the selection. //! checks if the object is in the selection.

View File

@@ -34,6 +34,8 @@ public:
DEFINE_STANDARD_ALLOC DEFINE_STANDARD_ALLOC
//! Returns a shape built by the shape construction algorithm.
//! Does not check if the shape is built.
Standard_EXPORT virtual const TopoDS_Shape& Shape() Standard_OVERRIDE; Standard_EXPORT virtual const TopoDS_Shape& Shape() Standard_OVERRIDE;
// Provide access to methods of protected base class BOPAlgo_Options // Provide access to methods of protected base class BOPAlgo_Options

View File

@@ -23,6 +23,7 @@
#include <Interface_Macros.hxx> #include <Interface_Macros.hxx>
#include <Interface_Static.hxx> #include <Interface_Static.hxx>
#include <Message_Msg.hxx> #include <Message_Msg.hxx>
#include <ShapeBuild_ReShape.hxx>
#include <Standard_Transient.hxx> #include <Standard_Transient.hxx>
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
#include <TCollection_HAsciiString.hxx> #include <TCollection_HAsciiString.hxx>
@@ -47,6 +48,7 @@ void IGESData_VerifyDate
IGESData_IGESModel::IGESData_IGESModel () IGESData_IGESModel::IGESData_IGESModel ()
{ {
thestart = new TColStd_HSequenceOfHAsciiString(); thestart = new TColStd_HSequenceOfHAsciiString();
myReShape = new ShapeBuild_ReShape();
// thecheckstx = new Interface_Check; // thecheckstx = new Interface_Check;
// thechecksem = new Interface_Check; // thechecksem = new Interface_Check;
} }
@@ -62,6 +64,7 @@ void IGESData_IGESModel::ClearHeader ()
IGESData_GlobalSection newheader; // Un peu brutal, certes IGESData_GlobalSection newheader; // Un peu brutal, certes
theheader = newheader; theheader = newheader;
thestart = new TColStd_HSequenceOfHAsciiString(); thestart = new TColStd_HSequenceOfHAsciiString();
myReShape = new ShapeBuild_ReShape();
} }

View File

@@ -22,10 +22,10 @@
class IGESData_IGESEntity; class IGESData_IGESEntity;
class Interface_Check; class Interface_Check;
class ShapeBuild_ReShape;
class Standard_Transient; class Standard_Transient;
class TCollection_HAsciiString; class TCollection_HAsciiString;
class IGESData_IGESModel; class IGESData_IGESModel;
DEFINE_STANDARD_HANDLE(IGESData_IGESModel, Interface_InterfaceModel) DEFINE_STANDARD_HANDLE(IGESData_IGESModel, Interface_InterfaceModel)
@@ -151,8 +151,11 @@ public:
//! i.e. a string "Dnn" with nn = directory entry number (2*N-1) //! i.e. a string "Dnn" with nn = directory entry number (2*N-1)
Standard_EXPORT Handle(TCollection_HAsciiString) StringLabel (const Handle(Standard_Transient)& ent) const Standard_OVERRIDE; Standard_EXPORT Handle(TCollection_HAsciiString) StringLabel (const Handle(Standard_Transient)& ent) const Standard_OVERRIDE;
//! Gets ReShape used to store a model's shapes changes
const Handle(ShapeBuild_ReShape)& ReShape() const { return myReShape; }
//! Sets ReShape used to store a history of changes of the model's shapes
void SetReShape(const Handle(ShapeBuild_ReShape)& theReShape) { myReShape = theReShape; }
DEFINE_STANDARD_RTTIEXT(IGESData_IGESModel,Interface_InterfaceModel) DEFINE_STANDARD_RTTIEXT(IGESData_IGESModel,Interface_InterfaceModel)
@@ -166,7 +169,7 @@ private:
Handle(TColStd_HSequenceOfHAsciiString) thestart; Handle(TColStd_HSequenceOfHAsciiString) thestart;
IGESData_GlobalSection theheader; IGESData_GlobalSection theheader;
Handle(ShapeBuild_ReShape) myReShape;
}; };

View File

@@ -131,8 +131,6 @@ static void TrimTolerances (const TopoDS_Shape& shape,
} }
} }
//======================================================================= //=======================================================================
//function : Transfer //function : Transfer
//purpose : //purpose :
@@ -196,10 +194,11 @@ Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
// fixing shape // fixing shape
Handle(Standard_Transient) info; Handle(Standard_Transient) info;
shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(), shape = XSAlgo::AlgoContainer()->ProcessShape(shape, theeps, CAS.GetMaxTol(),
"read.iges.resource.name", "read.iges.resource.name",
"read.iges.sequence", info, "read.iges.sequence",
aPS.Next()); info, mymodel->ReShape(),
aPS.Next());
XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
} }

View File

@@ -226,270 +226,304 @@ TopoDS_Shape IGESToBRep_CurveAndSurface::TransferCurveAndSurface
//function : TransferGeometry //function : TransferGeometry
//purpose : //purpose :
//======================================================================= //=======================================================================
TopoDS_Shape IGESToBRep_CurveAndSurface::TransferGeometry TopoDS_Shape IGESToBRep_CurveAndSurface::TransferGeometry
(const Handle(IGESData_IGESEntity)& theStart, (const Handle(IGESData_IGESEntity)& start,
const Message_ProgressRange& theProgress) const Message_ProgressRange& theProgress)
{ {
// Declaration of messages// // Declaration of messages//
// DCE 22/12/98 // DCE 22/12/98
//Message_Msg aMsg1005("IGES_1001"); // The type of the Start is not recognized //Message_Msg msg1005("IGES_1005"); // Software error : start IsNull.
//Message_Msg aMsg1005("IGES_1005"); // Software error : the Start IsNull. //Message_Msg msg1015("IGES_1015"); // invalid type or exception raising (software error).
//Message_Msg aMsg1015("IGES_1015"); // invalid type or exception raising (software error). //Message_Msg msg1010("IGES_1010"); // Not sameparameter.
//Message_Msg aMsg1010("IGES_1010"); // Not sameparameter. // Message_Msg msg1015("IGES_1015");
//Message_Msg aMsg1015("IGES_1020"); // Associated entity IsNull //Message_Msg msg210 ("XSTEP_210");
//Message_Msg aMsg1015("IGES_1025"); // No shape is found for the associated entity for the type 308 //Message_Msg msg202 ("XSTEP_202");
//Message_Msg aMsg1015("IGES_1030"); // No shape is found for the associated entity for the type 402 ////////////////////////////
//Message_Msg aMsg1015("IGES_1035"); // The conversion of a Location is not possible TopoDS_Shape res;
//Message_Msg aMsg210 ("XSTEP_210"); // No associated entities for the type 308 gp_Trsf T408;
//Message_Msg aMsg202 ("XSTEP_202"); // No associated entities for the type 402 if (start.IsNull()) {
//////////////////////////// Message_Msg msg1005("IGES_1005"); // Software error : start IsNull.
TopoDS_Shape aRes; SendFail(start, msg1005);
gp_Trsf aT408; return res;
if (theStart.IsNull())
{
const Message_Msg aMsg1005("IGES_1005"); // Software error : start IsNull.
SendFail(theStart, aMsg1005);
return aRes;
} }
// Read of the DE number and the type number of the entity
Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
//Standard_Integer typeNumber = start->TypeNumber();
// sln 13.06.2002 OCC448: Avoid transferring invisible sub entities which // sln 13.06.2002 OCC448: Avoid transferring invisible sub entities which
// logically depend on the one // logically depend on the one
const Standard_Integer anOnlyvisible = Interface_Static::IVal("read.iges.onlyvisible"); Standard_Integer onlyvisible = Interface_Static::IVal("read.iges.onlyvisible");
if (IGESToBRep::IsCurveAndSurface(theStart)) if (IGESToBRep::IsCurveAndSurface(start)) {
{ if(onlyvisible && start->BlankStatus() == 1)
if(anOnlyvisible && theStart->BlankStatus() == 1) return res;
return aRes; try {
try
{
OCC_CATCH_SIGNALS OCC_CATCH_SIGNALS
aRes = TransferCurveAndSurface(theStart, theProgress); res = TransferCurveAndSurface(start, theProgress);
} }
catch(Standard_Failure const&) catch(Standard_Failure const&) {
{ Message_Msg msg1015("IGES_1015");
const Message_Msg aMsg1015("IGES_1015"); SendFail(start, msg1015);
SendFail(theStart, aMsg1015);
} }
return aRes; return res;
} }
//408 : SingularSubfigure //408 : SingularSubfigure
if (theStart->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure)))
{ {
if(anOnlyvisible && theStart->BlankStatus() == 1) if(onlyvisible && start->BlankStatus() == 1)
return aRes; return res;
DeclareAndCast(IGESBasic_SingularSubfigure, aSt408, theStart); DeclareAndCast(IGESBasic_SingularSubfigure, st408, start);
Handle (IGESBasic_SubfigureDef) aStsub = aSt408->Subfigure(); Handle (IGESBasic_SubfigureDef) stsub = st408->Subfigure();
const gp_XYZ aTrans = aSt408->Translation(); gp_XYZ trans = st408->Translation();
gp_Vec aVectr(aTrans); gp_Vec vectr(trans);
const Standard_Real aScunit = GetUnitFactor(); Standard_Real scunit = GetUnitFactor();
aVectr.Multiply(aScunit); vectr.Multiply(scunit);
aT408.SetTranslation(aVectr); T408.SetTranslation(vectr);
if (aSt408->HasScaleFactor()) if (st408->HasScaleFactor()) {
{ Standard_Real scalef = st408->ScaleFactor();
const Standard_Real aScalef = aSt408->ScaleFactor(); T408.SetScaleFactor(scalef);
aT408.SetScaleFactor(aScalef); }
if (HasShapeResult(stsub)) {
res = GetShapeResult(stsub);
} }
if (HasShapeResult(aStsub)) else {
{ try {
aRes = GetShapeResult(aStsub); OCC_CATCH_SIGNALS
} res = TransferGeometry(stsub, theProgress);
else }
{ catch(Standard_Failure const&) {
try res.Nullify();
{ Message_Msg msg1015("IGES_1015");
OCC_CATCH_SIGNALS SendFail( st408, msg1015);
aRes = TransferGeometry(aStsub, theProgress); }
} if (!res.IsNull()) {
catch(Standard_Failure const&) SetShapeResult(stsub,res);
{ }
aRes.Nullify();
const Message_Msg aMsg1015("IGES_1015");
SendFail(aSt408, aMsg1015);
}
if (!aRes.IsNull())
{
SetShapeResult(aStsub, aRes);
}
} }
} }
// 308 : SubfigureDefinition // 308 : SubfigureDefinition
else if (theStart->IsKind(STANDARD_TYPE(IGESBasic_SubfigureDef))) else if (start->IsKind(STANDARD_TYPE(IGESBasic_SubfigureDef))) {
{ DeclareAndCast(IGESBasic_SubfigureDef, st308, start);
DeclareAndCast(IGESBasic_SubfigureDef, aSt308, theStart); TopoDS_Compound group;
TopoDS_Compound aGroup; BRep_Builder B;
BRep_Builder aBuilder; B.MakeCompound (group);
aBuilder.MakeCompound (aGroup); if (st308->NbEntities() < 1) {
if (aSt308->NbEntities() < 1) Message_Msg msg210 ("XSTEP_210");
{ SendFail( st308, msg210);
const Message_Msg aMsg210 ("XSTEP_210"); return res;
SendFail(aSt308, aMsg210);
return aRes;
} }
Message_ProgressScope aPS (theProgress, "Subfigure item", aSt308->NbEntities()); Message_ProgressScope PS (theProgress, "Subfigure item", st308->NbEntities());
for (Standard_Integer anIndx =1; anIndx <= aSt308->NbEntities() && aPS.More(); anIndx++) for (Standard_Integer i=1; i <= st308->NbEntities() && PS.More(); i++)
{ {
Message_ProgressRange aRange = aPS.Next(); Message_ProgressRange aRange = PS.Next();
TopoDS_Shape anItem; TopoDS_Shape item;
if (aSt308->AssociatedEntity(anIndx).IsNull()) if (st308->AssociatedEntity(i).IsNull()) {
{ Message_Msg msg1020("IGES_1020");
Message_Msg aMsg1020("IGES_1020"); msg1020.Arg(i);
aMsg1020.Arg(anIndx); SendWarning( st308, msg1020);
SendWarning(aSt308, aMsg1020); continue;
continue;
} }
if(anOnlyvisible && aSt308->AssociatedEntity(anIndx)->BlankStatus() == 1) if(onlyvisible && st308->AssociatedEntity(i)->BlankStatus() == 1 )
continue; continue;
if (HasShapeResult(aSt308->AssociatedEntity(anIndx))) if (HasShapeResult(st308->AssociatedEntity(i)))
{ {
anItem = GetShapeResult(aSt308->AssociatedEntity(anIndx)); item = GetShapeResult(st308->AssociatedEntity(i));
}
else {
try {
OCC_CATCH_SIGNALS
item = TransferGeometry (st308->AssociatedEntity(i), aRange);
}
catch(Standard_Failure const&) {
item.Nullify();
Message_Msg msg1015("IGES_1015");
SendFail( st308->AssociatedEntity(i), msg1015);
}
} }
else if (item.IsNull()) {
{ Message_Msg msg1025("IGES_1025");
try msg1025.Arg(i);
{ SendWarning (start,msg1025);
OCC_CATCH_SIGNALS
anItem = TransferGeometry (aSt308->AssociatedEntity(anIndx), aRange);
}
catch(Standard_Failure const&)
{
anItem.Nullify();
const Message_Msg aMsg1015("IGES_1015");
SendFail(aSt308->AssociatedEntity(anIndx), aMsg1015);
}
} }
if (anItem.IsNull()) else {
{ B.Add(group, item);
Message_Msg aMsg1025("IGES_1025"); SetShapeResult (st308->AssociatedEntity(i),item);
aMsg1025.Arg(anIndx);
SendWarning (theStart, aMsg1025);
}
else
{
aBuilder.Add(aGroup, anItem);
SetShapeResult (aSt308->AssociatedEntity(anIndx), anItem);
} }
} }
aRes = aGroup; res = group;
} }
// 402 : Group Associativity else if (start->IsKind(STANDARD_TYPE(IGESBasic_Group))) {
else if (theStart->IsKind(STANDARD_TYPE(IGESBasic_Group))) if(onlyvisible && start->BlankStatus() == 1)
{ return res;
if(anOnlyvisible && theStart->BlankStatus() == 1)
return aRes; DeclareAndCast(IGESBasic_Group, st402f1, start);
TopoDS_Compound group;
DeclareAndCast(IGESBasic_Group, aSt402, theStart); BRep_Builder B;
TopoDS_Compound aGroup; B.MakeCompound (group);
BRep_Builder aBuilder; if (st402f1->NbEntities() < 1) {
aBuilder.MakeCompound (aGroup); Message_Msg msg202 ("XSTEP_202");
const Standard_Integer aNbEnt = aSt402->NbEntities(); msg202.Arg(st402f1->FormNumber());
if (aNbEnt < 1) SendFail(st402f1, msg202);
{ return res;
Message_Msg aMsg202 ("XSTEP_202");
aMsg202.Arg(aSt402->FormNumber());
SendFail(aSt402, aMsg202);
return aRes;
} }
Message_ProgressScope aPS (theProgress, "Group item", aNbEnt); Message_ProgressScope PS (theProgress, "Group item", st402f1->NbEntities());
Standard_Boolean aProblemInGroup = Standard_False; Standard_Boolean ProblemInGroup = Standard_False;
for (Standard_Integer anIndx=1; anIndx <= aNbEnt && aPS.More(); anIndx++) for (Standard_Integer i=1; i <= st402f1->NbEntities() && PS.More(); i++)
{ {
Message_ProgressRange aRange = aPS.Next(); Message_ProgressRange aRange = PS.Next();
TopoDS_Shape anItem; TopoDS_Shape item;
if (aSt402->Entity(anIndx).IsNull()) if (st402f1->Entity(i).IsNull()) {
{ Message_Msg msg1020("IGES_1020");
Message_Msg aMsg1020("IGES_1020"); msg1020.Arg(i);
aMsg1020.Arg(anIndx); SendFail( st402f1, msg1020);
SendFail(aSt402, aMsg1020); continue;
continue;
} }
if(anOnlyvisible && aSt402->Entity(anIndx)->BlankStatus() == 1) if(onlyvisible && st402f1->Entity(i)->BlankStatus() == 1)
continue; continue;
if (HasShapeResult(aSt402->Entity(anIndx))) if (HasShapeResult(st402f1->Entity(i))) {
{ item = GetShapeResult(st402f1->Entity(i));
anItem = GetShapeResult(aSt402->Entity(anIndx));
} }
else else {
{ try {
try OCC_CATCH_SIGNALS
{ item = TransferGeometry (st402f1->Entity(i), aRange);
OCC_CATCH_SIGNALS }
anItem = TransferGeometry (aSt402->Entity(anIndx), aRange); catch(Standard_Failure const&) {
} item.Nullify();
catch(Standard_Failure const&) Message_Msg msg1015("IGES_1015");
{ SendFail(st402f1->Entity(i),msg1015);
anItem.Nullify(); }
const Message_Msg aMsg1015("IGES_1015");
SendFail(aSt402->Entity(anIndx), aMsg1015);
}
} }
if (anItem.IsNull()) if (item.IsNull()) {
{ //Message_Msg msg1030("IGES_1030");
aProblemInGroup = Standard_True; //msg1030.Arg(st402f1->FormNumber());
//msg1030.Arg(i);
//SendWarning (st402f1,msg1030);
ProblemInGroup = Standard_True;
} }
else else {
{ B.Add(group, item);
aBuilder.Add(aGroup, anItem); SetShapeResult (st402f1->Entity(i),item);
SetShapeResult (aSt402->Entity(anIndx), anItem);
} }
} }
aRes = aGroup; res = group;
if(aProblemInGroup) if(ProblemInGroup) {
{ Message_Msg msg1030("IGES_1030");
Message_Msg aMsg1030("IGES_1030"); msg1030.Arg(st402f1->FormNumber());
aMsg1030.Arg(aSt402->FormNumber()); SendWarning (st402f1,msg1030);
SendWarning (aSt402, aMsg1030);
} }
} }
else else if (start->IsKind(STANDARD_TYPE(IGESBasic_GroupWithoutBackP))) {
{
Message_Msg aMsg1001("IGES_1001"); if(onlyvisible && start->BlankStatus() == 1)
aMsg1001.Arg(theStart->FormNumber()); return res;
SendFail (theStart, aMsg1001);
return aRes; DeclareAndCast(IGESBasic_GroupWithoutBackP, st402f7, start);
} TopoDS_Compound group;
//unused Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(st402f7);
BRep_Builder B;
B.MakeCompound (group);
if (st402f7->NbEntities() < 1) {
Message_Msg msg202 ("XSTEP_202");
msg202.Arg(st402f7->FormNumber());
SendFail(st402f7, msg202);
return res;
}
Message_ProgressScope PS (theProgress, "Group item", st402f7->NbEntities());
Standard_Boolean ProblemInGroup = Standard_False;
for (Standard_Integer i=1; i <= st402f7->NbEntities() && PS.More(); i++)
{
Message_ProgressRange aRange = PS.Next();
TopoDS_Shape item;
if (st402f7->Entity(i).IsNull()) {
Message_Msg msg1020("IGES_1020");
msg1020.Arg(i);
SendFail( st402f7, msg1020);
continue;
}
if(onlyvisible && st402f7->Entity(i)->BlankStatus() == 1 )
continue;
if (theStart->HasTransf()) if (HasShapeResult(st402f7->Entity(i))) {
{ item = GetShapeResult(st402f7->Entity(i));
gp_Trsf aT; }
else {
try {
OCC_CATCH_SIGNALS
item = TransferGeometry (st402f7->Entity(i), aRange);
}
catch(Standard_Failure const&) {
item.Nullify();
Message_Msg msg1015("IGES_1015");
SendFail(st402f7->Entity(i),msg1015);
}
}
if (item.IsNull()) {
//Message_Msg msg1030("IGES_1030");
//msg1030.Arg(st402f7->FormNumber());
//msg1030.Arg(i);
//SendWarning (st402f7,msg1030);
ProblemInGroup = Standard_True;
}
else {
B.Add(group, item);
SetShapeResult (st402f7->Entity(i),item);
}
}
res = group;
if(ProblemInGroup) {
Message_Msg msg1030("IGES_1030");
msg1030.Arg(st402f7->FormNumber());
SendWarning (st402f7,msg1030);
}
}
else {
Message_Msg msg1001("IGES_1001");
msg1001.Arg(start->FormNumber());
SendFail (start,msg1001);
return res;
}
if (start->HasTransf()) {
gp_Trsf T;
SetEpsilon(1.E-04); SetEpsilon(1.E-04);
if (IGESData_ToolLocation::ConvertLocation(GetEpsilon(), theStart->CompoundLocation(), if (IGESData_ToolLocation::ConvertLocation(GetEpsilon(),start->CompoundLocation(),
aT, GetUnitFactor())) T,GetUnitFactor())) {
{ if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure)))
if (theStart->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) {
{ gp_XYZ tra = T.TranslationPart();
gp_XYZ aTra = aT.TranslationPart(); gp_XYZ trans = T408.TranslationPart();
const gp_XYZ aTrans = aT408.TranslationPart(); tra.Add(trans);
aTra.Add(aTrans); T.SetTranslationPart(tra);
aT.SetTranslationPart(aTra); Standard_Real sc = T.ScaleFactor();
Standard_Real aSc = aT.ScaleFactor(); Standard_Real scalef = T408.ScaleFactor();
const Standard_Real aScalef = aT408.ScaleFactor(); sc = sc*scalef;
aSc = aSc*aScalef; T.SetScaleFactor(sc);
aT.SetScaleFactor(aSc); }
} TopLoc_Location L(T);
const TopLoc_Location aLoc(aT); res.Move(L, Standard_False);
aRes.Move(aLoc, Standard_False);
} }
else else {
{ Message_Msg msg1035("IGES_1035");
const Message_Msg aMsg1035("IGES_1035"); SendWarning (start,msg1035);
SendWarning (theStart, aMsg1035);
} }
} }
else else {
{ if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) {
if (theStart->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) TopLoc_Location L(T408);
{ res.Move(L);
const TopLoc_Location aLoc(aT408);
aRes.Move(aLoc);
} }
} }
return aRes; return res;
} }

View File

@@ -83,6 +83,51 @@ void SelectMgr_EntityOwner::HilightWithColor (const Handle(PrsMgr_PresentationMa
} }
} }
// =======================================================================
// function : Select
// purpose :
// =======================================================================
Standard_Boolean SelectMgr_EntityOwner::Select (const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected) const
{
switch (theSelScheme)
{
case AIS_SelectionScheme_UNKNOWN:
{
return myIsSelected;
}
case AIS_SelectionScheme_Replace:
{
return theIsDetected;
}
case AIS_SelectionScheme_Add:
{
return !myIsSelected || theIsDetected || IsForcedHilight();
}
case AIS_SelectionScheme_Remove:
{
return myIsSelected && !theIsDetected;
}
case AIS_SelectionScheme_XOR:
{
if (theIsDetected)
{
return !myIsSelected && !IsForcedHilight();
}
return myIsSelected;
}
case AIS_SelectionScheme_Clear:
{
return Standard_False;
}
case AIS_SelectionScheme_ReplaceExtra:
{
return theIsDetected;
}
}
return Standard_False;
}
// ======================================================================= // =======================================================================
// function : DumpJson // function : DumpJson
// purpose : // purpose :

View File

@@ -17,6 +17,7 @@
#ifndef _SelectMgr_EntityOwner_HeaderFile #ifndef _SelectMgr_EntityOwner_HeaderFile
#define _SelectMgr_EntityOwner_HeaderFile #define _SelectMgr_EntityOwner_HeaderFile
#include <AIS_SelectionScheme.hxx>
#include <Aspect_VKey.hxx> #include <Aspect_VKey.hxx>
#include <PrsMgr_PresentationManager.hxx> #include <PrsMgr_PresentationManager.hxx>
#include <SelectMgr_SelectableObject.hxx> #include <SelectMgr_SelectableObject.hxx>
@@ -139,6 +140,12 @@ public:
//! @param theIsSelected [in] shows if owner is selected. //! @param theIsSelected [in] shows if owner is selected.
void SetSelected (const Standard_Boolean theIsSelected) { myIsSelected = theIsSelected; } void SetSelected (const Standard_Boolean theIsSelected) { myIsSelected = theIsSelected; }
//! If the object needs to be selected, it returns true.
//! @param[in] theSelScheme selection scheme
//! @param[in] theIsDetected flag of object detection
Standard_EXPORT Standard_Boolean Select (const AIS_SelectionScheme theSelScheme,
const Standard_Boolean theIsDetected) const;
//! Returns selection state. //! Returns selection state.
Standard_DEPRECATED ("Deprecated method - IsSelected() should be used instead") Standard_DEPRECATED ("Deprecated method - IsSelected() should be used instead")
Standard_Integer State() const { return myIsSelected ? 1 : 0; } Standard_Integer State() const { return myIsSelected ? 1 : 0; }

View File

@@ -112,18 +112,20 @@ Standard_Boolean ShapeFix_Shape::Perform(const Message_ProgressRange& theProgres
TopLoc_Location nullLoc,L; TopLoc_Location nullLoc,L;
L = myShape.Location(); L = myShape.Location();
TopoDS_Shape aShapeNullLoc = myShape; TopoDS_Shape aShapeNullLoc = myShape;
const Standard_Boolean aIsRecorded = Context()->IsNewShape(myShape);
aShapeNullLoc.Location(nullLoc); aShapeNullLoc.Location(nullLoc);
if(myMapFixingShape.Contains(aShapeNullLoc)) { if(aIsRecorded || myMapFixingShape.Contains(aShapeNullLoc))
{
myShape.Location(L, Standard_False); myShape.Location(L, Standard_False);
myResult = Context()->Apply(myShape); myResult = Context()->Apply(myShape);
status = Standard_True; status = Standard_True;
return status; return status;
} }
else myMapFixingShape.Add(aShapeNullLoc); myMapFixingShape.Add(aShapeNullLoc);
//--------------------------------------- //---------------------------------------
myShape.Location(L, Standard_False); myShape.Location(L, Standard_False);
TopoDS_Shape S = Context()->Apply(myShape); TopoDS_Shape S = Context()->Apply(myShape);
if ( NeedFix ( myFixVertexPositionMode ) ) if (NeedFix(myFixVertexPositionMode))
ShapeFix::FixVertexPosition(S,Precision(),Context()); ShapeFix::FixVertexPosition(S,Precision(),Context());
st = S.ShapeType(); st = S.ShapeType();

View File

@@ -267,7 +267,7 @@ public:
//! Performs an analysis and reorders edges in the wire using class WireOrder. //! Performs an analysis and reorders edges in the wire using class WireOrder.
//! Flag <theModeBoth> determines the use of miscible mode if necessary. //! Flag <theModeBoth> determines the use of miscible mode if necessary.
Standard_EXPORT Standard_Boolean FixReorder(Standard_Boolean theModeBoth = Standard_False); Standard_EXPORT Standard_Boolean FixReorder(Standard_Boolean theModeBoth = Standard_True);
//! Applies FixSmall(num) to all edges in the wire //! Applies FixSmall(num) to all edges in the wire
Standard_EXPORT Standard_Integer FixSmall (const Standard_Boolean lockvtx, const Standard_Real precsmall = 0.0); Standard_EXPORT Standard_Integer FixSmall (const Standard_Boolean lockvtx, const Standard_Real precsmall = 0.0);

View File

@@ -174,7 +174,7 @@ void TopoDSToStep_MakeStepWire::Init (const TopoDS_Wire& aWire,
const TopoDS_Wire ForwardWire = TopoDS::Wire (aWire.Oriented (TopAbs_FORWARD)); const TopoDS_Wire ForwardWire = TopoDS::Wire (aWire.Oriented (TopAbs_FORWARD));
Handle(ShapeFix_Wire) STW = new ShapeFix_Wire (ForwardWire, aTool.CurrentFace(), Precision::Confusion()); Handle(ShapeFix_Wire) STW = new ShapeFix_Wire (ForwardWire, aTool.CurrentFace(), Precision::Confusion());
// for toroidal like surfaces we need to use both (3d and 2d) mode to correctly reorder the edges // for toroidal like surfaces we need to use both (3d and 2d) mode to correctly reorder the edges
STW->FixReorder (Standard_True); STW->FixReorder ();
Handle(ShapeExtend_WireData) anExtWire = STW->WireData(); Handle(ShapeExtend_WireData) anExtWire = STW->WireData();
//:abv 04.05.00: CAX-IF TRJ4: writing complete sphere with single vertex_loop //:abv 04.05.00: CAX-IF TRJ4: writing complete sphere with single vertex_loop

View File

@@ -82,103 +82,131 @@ void XSAlgo_AlgoContainer::PrepareForTransfer() const
//======================================================================= //=======================================================================
//function : ProcessShape //function : ProcessShape
//purpose : //purpose :
//======================================================================= //=======================================================================
TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape(const TopoDS_Shape& theShape,
TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape (const TopoDS_Shape& shape, const Standard_Real thePrec,
const Standard_Real Prec, const Standard_Real theMaxTol,
const Standard_Real maxTol, const Standard_CString thePrscfile,
const Standard_CString prscfile, const Standard_CString thePseq,
const Standard_CString pseq, Handle(Standard_Transient)& theInfo,
Handle(Standard_Transient)& info, const Handle(ShapeBuild_ReShape)& theReShape,
const Message_ProgressRange& theProgress, const Message_ProgressRange& theProgress,
const Standard_Boolean NonManifold) const const Standard_Boolean theNonManifold) const
{ {
if ( shape.IsNull() ) return shape; if (theShape.IsNull())
Handle(ShapeProcess_ShapeContext) context = Handle(ShapeProcess_ShapeContext)::DownCast(info);
if ( context.IsNull() )
{ {
Standard_CString rscfile = Interface_Static::CVal(prscfile); return theShape;
if (rscfile != nullptr && strlen (rscfile) == 0) }
Handle(ShapeProcess_ShapeContext) aContext = Handle(ShapeProcess_ShapeContext)::DownCast(theInfo);
if (aContext.IsNull())
{
Standard_CString aRscfile = Interface_Static::CVal(thePrscfile);
if (aRscfile != nullptr && strlen(aRscfile) == 0)
{ {
context = new ShapeProcess_ShapeContext(shape, nullptr); aContext = new ShapeProcess_ShapeContext(theShape, nullptr);
Interface_Static::FillMap(context->ResourceManager()->GetMap()); Interface_Static::FillMap(aContext->ResourceManager()->GetMap());
} }
else else
{ {
if (!rscfile) if (!aRscfile)
rscfile = prscfile; aRscfile = thePrscfile;
context = new ShapeProcess_ShapeContext(shape, rscfile); aContext = new ShapeProcess_ShapeContext(theShape, aRscfile);
} }
context->SetDetalisation(TopAbs_EDGE); aContext->SetDetalisation(TopAbs_EDGE);
} }
context->SetNonManifold(NonManifold); aContext->SetNonManifold(theNonManifold);
info = context; theInfo = aContext;
Standard_CString seq = Interface_Static::CVal ( pseq ); Standard_CString aSeq = Interface_Static::CVal(thePseq);
if ( ! seq ) seq = pseq; if (!aSeq) aSeq = thePseq;
// if resource file is not loaded or does not define <seq>.exec.op, // if resource file is not loaded or does not define <seq>.exec.op,
// do default fixes // do default fixes
Handle(Resource_Manager) rsc = context->ResourceManager(); Handle(Resource_Manager) aRsc = aContext->ResourceManager();
TCollection_AsciiString str ( seq ); TCollection_AsciiString aStr(aSeq);
str += ".exec.op"; aStr += ".exec.op";
if ( ! rsc->Find ( str.ToCString() ) ) { if (!aRsc->Find(aStr.ToCString()))
{
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
{ {
static Standard_Integer time = 0; static Standard_Integer aTime = 0;
if ( ! time ) if (!aTime)
std::cout << "Warning: XSAlgo_AlgoContainer::ProcessShape(): Sequence " << str.ToCString() << std::cout << "Warning: XSAlgo_AlgoContainer::ProcessShape(): Sequence " << aStr.ToCString() <<
" is not defined in " << prscfile << " resource; do default processing" << std::endl; " is not defined in " << thePrscfile << " resource; do default processing" << std::endl;
time++; aTime++;
} }
#endif #endif
// if reading, do default ShapeFix // if reading, do default ShapeFix
if ( ! strncmp ( pseq, "read.", 5 ) ) { if (!strncmp(thePseq, "read.", 5))
{
try { try {
OCC_CATCH_SIGNALS OCC_CATCH_SIGNALS
Handle(ShapeExtend_MsgRegistrator) msg = new ShapeExtend_MsgRegistrator; Handle(ShapeExtend_MsgRegistrator) aMsg = new ShapeExtend_MsgRegistrator;
Handle(ShapeFix_Shape) sfs = ShapeAlgo::AlgoContainer()->ToolContainer()->FixShape(); Handle(ShapeFix_Shape) aSfs = ShapeAlgo::AlgoContainer()->ToolContainer()->FixShape();
sfs->Init ( shape ); aSfs->Init(theShape);
sfs->SetMsgRegistrator ( msg ); aSfs->SetMsgRegistrator(aMsg);
sfs->SetPrecision ( Prec ); aSfs->SetPrecision(thePrec);
sfs->SetMaxTolerance ( maxTol ); aSfs->SetMaxTolerance(theMaxTol);
sfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False; aSfs->FixFaceTool()->FixWireTool()->FixSameParameterMode() = Standard_False;
sfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False; aSfs->FixSolidTool()->CreateOpenSolidMode() = Standard_False;
sfs->Perform(theProgress); aSfs->SetContext(theReShape);
aSfs->Perform(theProgress);
TopoDS_Shape S = sfs->Shape(); TopoDS_Shape aShape = aSfs->Shape();
if ( ! S.IsNull() && S != shape ) { if (!aShape.IsNull() && aShape != theShape)
context->RecordModification ( sfs->Context(), msg ); {
context->SetResult ( S ); aContext->RecordModification(aSfs->Context(), aMsg);
} aContext->SetResult(aShape);
}
} }
catch (Standard_Failure const& anException) { catch (Standard_Failure const& anException)
{
#ifdef OCCT_DEBUG #ifdef OCCT_DEBUG
std::cout << "Error: XSAlgo_AlgoContainer::ProcessShape(): Exception in ShapeFix::Shape" << std::endl; std::cout << "Error: XSAlgo_AlgoContainer::ProcessShape(): Exception in ShapeFix::Shape" << std::endl;
anException.Print(std::cout); std::cout << std::endl; anException.Print(std::cout); std::cout << std::endl;
#endif #endif
(void)anException; (void)anException;
} }
return context->Result(); return aContext->Result();
} }
// for writing, define default sequence of DirectFaces // for writing, define default sequence of DirectFaces
else if ( ! strncmp ( pseq, "write.", 6 ) ) { else if (!strncmp(thePseq, "write.", 6))
rsc->SetResource ( str.ToCString(), "DirectFaces" ); {
aRsc->SetResource(aStr.ToCString(), "DirectFaces");
} }
} }
// Define runtime tolerances and do Shape Processing // Define runtime tolerances and do Shape Processing
rsc->SetResource ( "Runtime.Tolerance", Prec ); aRsc->SetResource("Runtime.Tolerance", thePrec);
rsc->SetResource ( "Runtime.MaxTolerance", maxTol ); aRsc->SetResource("Runtime.MaxTolerance", theMaxTol);
if ( !ShapeProcess::Perform(context, seq, theProgress) ) if (!ShapeProcess::Perform(aContext, aSeq, theProgress))
return shape; // return original shape return theShape; // return original shape
return context->Result(); return aContext->Result();
} }
//=======================================================================
//function : ProcessShape
//purpose :
//=======================================================================
TopoDS_Shape XSAlgo_AlgoContainer::ProcessShape(const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Message_ProgressRange& theProgress,
const Standard_Boolean theNonManifold) const
{
Handle(ShapeBuild_ReShape) aReShape = new ShapeBuild_ReShape();
return ProcessShape(theShape, thePrec, theMaxTol, thePrscfile,
thePseq, theInfo, aReShape, theProgress,
theNonManifold);
}
//======================================================================= //=======================================================================
//function : PerformFixShape //function : PerformFixShape
//purpose : //purpose :

View File

@@ -23,6 +23,7 @@
#include <Standard_Integer.hxx> #include <Standard_Integer.hxx>
#include <Message_ProgressRange.hxx> #include <Message_ProgressRange.hxx>
class ShapeBuild_ReShape;
class XSAlgo_ToolContainer; class XSAlgo_ToolContainer;
class TopoDS_Shape; class TopoDS_Shape;
class TopoDS_Edge; class TopoDS_Edge;
@@ -30,7 +31,6 @@ class TopoDS_Face;
class Transfer_TransientProcess; class Transfer_TransientProcess;
class Transfer_FinderProcess; class Transfer_FinderProcess;
class XSAlgo_AlgoContainer; class XSAlgo_AlgoContainer;
DEFINE_STANDARD_HANDLE(XSAlgo_AlgoContainer, Standard_Transient) DEFINE_STANDARD_HANDLE(XSAlgo_AlgoContainer, Standard_Transient)
@@ -55,16 +55,44 @@ public:
Standard_EXPORT virtual void PrepareForTransfer() const; Standard_EXPORT virtual void PrepareForTransfer() const;
//! Does shape processing with specified tolerances //! Does shape processing with specified tolerances
//! and returns resulting shape and associated information //! @param[in] theShape shape to process
//! in the form of Transient. //! @param[in] thePrec basic precision and tolerance
//! This information should be later transmitted to //! @param[in] theMaxTol maximum allowed tolerance
//! MergeTransferInfo in order to be recorded in the //! @param[in] thePrscfile name of the resource file
//! translation map //! @param[in] thePseq name of the sequence of operators defined in the resource file for Shape Processing
Standard_EXPORT virtual TopoDS_Shape ProcessShape ( //! @param[out] theInfo information to be recorded in the translation map
const TopoDS_Shape& shape, const Standard_Real Prec, const Standard_Real MaxTol, //! @param[in] theProgress progress indicator
const Standard_CString rscfile, const Standard_CString seq, Handle(Standard_Transient)& info, //! @param[in] theNonManifold flag to proceed with non-manifold topology
const Message_ProgressRange& theProgress = Message_ProgressRange(), //! @return the processed shape
const Standard_Boolean NonManifold = Standard_False) const; Standard_EXPORT virtual TopoDS_Shape ProcessShape (const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Message_ProgressRange& theProgress = Message_ProgressRange(),
const Standard_Boolean theNonManifold = Standard_False) const;
//! Does shape processing with specified tolerances
//! @param[in] theShape shape to process
//! @param[in] thePrec basic precision and tolerance
//! @param[in] theMaxTol maximum allowed tolerance
//! @param[in] thePrscfile name of the resource file
//! @param[in] thePseq name of the sequence of operators defined in the resource file for Shape Processing
//! @param[out] theInfo information to be recorded in the translation map
//! @param[in] theReShape tool to record the modifications of input shape
//! @param[in] theProgress progress indicator
//! @param[in] theNonManifold flag to proceed with non-manifold topology
//! @return the processed shape
Standard_EXPORT virtual TopoDS_Shape ProcessShape(const TopoDS_Shape& theShape,
const Standard_Real thePrec,
const Standard_Real theMaxTol,
const Standard_CString thePrscfile,
const Standard_CString thePseq,
Handle(Standard_Transient)& theInfo,
const Handle(ShapeBuild_ReShape)& theReShape,
const Message_ProgressRange& theProgress = Message_ProgressRange(),
const Standard_Boolean theNonManifold = Standard_False) const;
//! Checks quality of pcurve of the edge on the given face, //! Checks quality of pcurve of the edge on the given face,
//! and corrects it if necessary. //! and corrects it if necessary.

View File

@@ -1,4 +1,4 @@
puts "TODO OCC23638 ALL: Faulty shapes in variables faulty_1 to faulty_" puts "TODO OCC23638 ALL: Faulty shapes in variables faulty_1 to faulty_1"
puts "============" puts "============"
puts "CR23638" puts "CR23638"
@@ -8,8 +8,6 @@ puts ""
# Reading IGES file produced invalid shape # Reading IGES file produced invalid shape
####################################################################### #######################################################################
param read.surfacecurve.mode -3
igesread [locate_data_file bug23638_cadbad.igs] result * igesread [locate_data_file bug23638_cadbad.igs] result *
checkshape result checkshape result