+ 0000478: Segfault on insert part into 2D drawing (workaround)

git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5144 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d
This commit is contained in:
wmayer 2011-11-17 10:31:04 +00:00
parent a512879ba1
commit e35a042c2d
4 changed files with 54 additions and 34 deletions

View File

@ -60,6 +60,12 @@ if(MSVC)
ADD_MSVC_PRECOMPILED_HEADER("PreCompiled.h" "PreCompiled.cpp" Drawing_CPP_SRCS) ADD_MSVC_PRECOMPILED_HEADER("PreCompiled.h" "PreCompiled.cpp" Drawing_CPP_SRCS)
endif(MSVC) endif(MSVC)
# Set special compiler flag to convert a SIGSEV into an exception
# to handle issue #0000478.
IF(MSVC)
SET_SOURCE_FILES_PROPERTIES(ProjectionAlgos.cpp PROPERTIES COMPILE_FLAGS "/EHa")
ENDIF(MSVC)
add_library(Drawing SHARED ${Drawing_SRCS} ${Features_SRCS} ${DrawingAlgos_SRCS}) add_library(Drawing SHARED ${Drawing_SRCS} ${Features_SRCS} ${DrawingAlgos_SRCS})
target_link_libraries(Drawing ${Drawing_LIBS}) target_link_libraries(Drawing ${Drawing_LIBS})
fc_copy_script("Mod/Drawing" "Drawing" Init.py) fc_copy_script("Mod/Drawing" "Drawing" Init.py)

View File

@ -77,33 +77,39 @@ App::DocumentObjectExecReturn *FeatureProjection::execute(void)
if (shape.IsNull()) if (shape.IsNull())
return new App::DocumentObjectExecReturn("Linked shape object is empty"); return new App::DocumentObjectExecReturn("Linked shape object is empty");
const Base::Vector3f& dir = Direction.getValue(); try {
Drawing::ProjectionAlgos alg(shape, dir); const Base::Vector3f& dir = Direction.getValue();
Drawing::ProjectionAlgos alg(shape, dir);
TopoDS_Compound comp; TopoDS_Compound comp;
BRep_Builder builder; BRep_Builder builder;
builder.MakeCompound(comp); builder.MakeCompound(comp);
if (!alg.V.IsNull() && VCompound.getValue()) if (!alg.V.IsNull() && VCompound.getValue())
builder.Add(comp, alg.V); builder.Add(comp, alg.V);
if (!alg.V1.IsNull() && Rg1LineVCompound.getValue()) if (!alg.V1.IsNull() && Rg1LineVCompound.getValue())
builder.Add(comp, alg.V1); builder.Add(comp, alg.V1);
if (!alg.VN.IsNull() && RgNLineVCompound.getValue()) if (!alg.VN.IsNull() && RgNLineVCompound.getValue())
builder.Add(comp, alg.VN); builder.Add(comp, alg.VN);
if (!alg.VO.IsNull() && OutLineVCompound.getValue()) if (!alg.VO.IsNull() && OutLineVCompound.getValue())
builder.Add(comp, alg.VO); builder.Add(comp, alg.VO);
if (!alg.VI.IsNull() && IsoLineVCompound.getValue()) if (!alg.VI.IsNull() && IsoLineVCompound.getValue())
builder.Add(comp, alg.VI); builder.Add(comp, alg.VI);
if (!alg.H.IsNull() && HCompound.getValue()) if (!alg.H.IsNull() && HCompound.getValue())
builder.Add(comp, alg.H); builder.Add(comp, alg.H);
if (!alg.H1.IsNull() && Rg1LineHCompound.getValue()) if (!alg.H1.IsNull() && Rg1LineHCompound.getValue())
builder.Add(comp, alg.H1); builder.Add(comp, alg.H1);
if (!alg.HN.IsNull() && RgNLineHCompound.getValue()) if (!alg.HN.IsNull() && RgNLineHCompound.getValue())
builder.Add(comp, alg.HN); builder.Add(comp, alg.HN);
if (!alg.HO.IsNull() && OutLineHCompound.getValue()) if (!alg.HO.IsNull() && OutLineHCompound.getValue())
builder.Add(comp, alg.HO); builder.Add(comp, alg.HO);
if (!alg.HI.IsNull() && IsoLineHCompound.getValue()) if (!alg.HI.IsNull() && IsoLineHCompound.getValue())
builder.Add(comp, alg.HI); builder.Add(comp, alg.HI);
Shape.setValue(comp); Shape.setValue(comp);
return App::DocumentObject::StdReturn; return App::DocumentObject::StdReturn;
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
return new App::DocumentObjectExecReturn(e->GetMessageString());
}
} }

View File

@ -119,11 +119,19 @@ void ProjectionAlgos::execute(void)
Handle( HLRBRep_Algo ) brep_hlr = new HLRBRep_Algo; Handle( HLRBRep_Algo ) brep_hlr = new HLRBRep_Algo;
brep_hlr->Add(Input); brep_hlr->Add(Input);
gp_Ax2 transform(gp_Pnt(0,0,0),gp_Dir(Direction.x,Direction.y,Direction.z)); try {
HLRAlgo_Projector projector( transform ); #if defined(__GNUC__) && defined (FC_OS_LINUX)
brep_hlr->Projector(projector); Base::SignalException se;
brep_hlr->Update(); #endif
brep_hlr->Hide(); gp_Ax2 transform(gp_Pnt(0,0,0),gp_Dir(Direction.x,Direction.y,Direction.z));
HLRAlgo_Projector projector( transform );
brep_hlr->Projector(projector);
brep_hlr->Update();
brep_hlr->Hide();
}
catch (...) {
Standard_Failure::Raise("Fatal error occurred while projecting shape");
}
// extracting the result sets: // extracting the result sets:
HLRBRep_HLRToShape shapes( brep_hlr ); HLRBRep_HLRToShape shapes( brep_hlr );

View File

@ -230,8 +230,8 @@ SET(Part_SRCS
) )
SET(Part_Scripts SET(Part_Scripts
Init.py Init.py
TestPartApp.py TestPartApp.py
MakeBottle.py MakeBottle.py
) )