diff --git a/CMakeLists.txt b/CMakeLists.txt index 6461a3e10..f44c39c25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,6 +117,7 @@ if(FREECAD_LIBPACK_USE) # checking for a unique file in LibPack location to make sure the right version of the LibPack is there find_file(FREECAD_LIBPACK_CHECKFILE6X boost_program_options-vc80-mt-gd.lib ${FREECAD_LIBPACK_DIR}/lib ) find_file(FREECAD_LIBPACK_CHECKFILE7X boost_program_options-vc90-mt-gd-1_39.lib ${FREECAD_LIBPACK_DIR}/lib ) + find_file(FREECAD_LIBPACK_CHECKFILE8X boost_program_options-vc90-mt-gd-1_48.lib ${FREECAD_LIBPACK_DIR}/lib ) find_file(FREECAD_LIBPACK_CHECKCUSTOM boost_program_options-vc90-mt-gd-1_41.lib ${FREECAD_LIBPACK_DIR}/lib ) IF(FREECAD_LIBPACK_CHECKFILE6X) include(cMake/UseLibPack6x.cmake) @@ -128,6 +129,13 @@ if(FREECAD_LIBPACK_USE) set(FREECAD_LIBPACK6 NOTFOUND CACHE STRING "Displays if the libpack has been found") MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK6) set(FREECAD_LIBPACK7 FOUND CACHE STRING "Displays if the libpack has been found") + ELSEIF(FREECAD_LIBPACK_CHECKFILE8X) + include(cMake/UseLibPack8x.cmake) + set(FREECAD_LIBPACK6 NOTFOUND CACHE STRING "Displays if the libpack has been found") + set(FREECAD_LIBPACK7 NOTFOUND CACHE STRING "Displays if the libpack has been found") + set(SWIG_EXECUTABLE ${FREECAD_LIBPACK_DIR}/tools/swigwin-1.3.40/swig.exe) + MARK_AS_ADVANCED(FORCE FREECAD_LIBPACK6) + set(FREECAD_LIBPACK8 FOUND CACHE STRING "Displays if the libpack has been found") ELSEIF(FREECAD_LIBPACK_CHECKCUSTOM) include(cMake/UseLibPackCustom.cmake) set(FREECAD_LIBPACKX FOUND CACHE STRING "Displays if the libpack has been found") diff --git a/cMake/UseLibPack8x.cmake b/cMake/UseLibPack8x.cmake new file mode 100644 index 000000000..d75740064 --- /dev/null +++ b/cMake/UseLibPack8x.cmake @@ -0,0 +1,331 @@ +# ================================================================================ +# == Win32 is default behaviour use the LibPack copied in Source tree ============ + +# -------------------------------------------------------------------------------- +# General includes + +link_directories(${FREECAD_LIBPACK_DIR}/lib) +include_directories(${FREECAD_LIBPACK_DIR}/include) + +# OpenGL +set(OPENGL_gl_LIBRARY opengl32 glu32) + +# Python +set(PYTHON_DEBUG_LIBRARY python26_d.lib) +set(PYTHON_LIBRARY python26.lib) +set(PYTHON_INCLUDE_PATH ${FREECAD_LIBPACK_DIR}/include/python) +set(PYTHON_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/python.exe) +set(PYTHONLIBS_FOUND TRUE) + +# XercesC +set(XERCESC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/xercesc) +set(XERCESC_LIBRARIES xerces-c_2.lib) +set(XERCESC_DEBUG_LIBRARIES xerces-c_2D.lib) +set(XERCESC_FOUND TRUE) + +# Boost +set(Boost_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/boost) +set(Boost_LIBRARIES + optimized boost_filesystem-vc90-mt-1_48.lib + optimized boost_system-vc90-mt-1_48.lib + optimized boost_graph-vc90-mt-1_48.lib + optimized boost_program_options-vc90-mt-1_48.lib + optimized boost_regex-vc90-mt-1_48.lib + optimized boost_signals-vc90-mt-1_48.lib + optimized boost_thread-vc90-mt-1_48.lib +) +set(Boost_DEBUG_LIBRARIES + debug boost_filesystem-vc90-mt-gd-1_48.lib + debug boost_date_time-vc90-mt-gd-1_48.lib + debug boost_filesystem-vc90-mt-gd-1_48.lib + debug boost_iostreams-vc90-mt-gd-1_48.lib + debug boost_math_c99f-vc90-mt-gd-1_48.lib + debug boost_math_tr1f-vc90-mt-gd-1_48.lib + debug boost_thread-vc90-mt-gd-1_48.lib + debug boost_system-vc90-mt-gd-1_48.lib + debug boost_graph-vc90-mt-gd-1_48.lib + debug boost_program_options-vc90-mt-gd-1_48.lib + debug boost_regex-vc90-mt-gd-1_48.lib + debug boost_signals-vc90-mt-gd-1_48.lib +) +set(Boost_FOUND TRUE) + +# Zlib +set(ZLIB_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/zlib) +set(ZLIB_LIBRARIES zdll.lib) +set(ZLIB_FOUND TRUE) + +# SMESH +set(SMESH_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/smesh) +set(SMESH_LIBRARIES + StdMeshers.lib + MEFISTO2.lib + SMESH.lib + DriverUNV.lib + SMESHDS.lib + DriverSTL.lib + DriverDAT.lib + Driver.lib + SMDS.lib + ) + +set(SMESH_FOUND TRUE) + +# Coin3D +set(COIN3D_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/coin) +set(COIN3D_LIBRARY_DEBUG coin3d.lib) +set(COIN3D_LIBRARY_RELEASE coin3.lib) +set(COIN3D_FOUND TRUE) + + +# QT +set(QT_INCLUDE_DIR + ${FREECAD_LIBPACK_DIR}/include/QT/ + ${FREECAD_LIBPACK_DIR}/include/QT/Qt + ${FREECAD_LIBPACK_DIR}/include/QT/QtCore + ${FREECAD_LIBPACK_DIR}/include/QT/QtGui + ${FREECAD_LIBPACK_DIR}/include/QT/QtDesigner + ${FREECAD_LIBPACK_DIR}/include/QT/QtSvg + ${FREECAD_LIBPACK_DIR}/include/QT/QtNetwork + ${FREECAD_LIBPACK_DIR}/include/QT/QtSql + ${FREECAD_LIBPACK_DIR}/include/QT/QtTest + ${FREECAD_LIBPACK_DIR}/include/QT/QtUiTools + ${FREECAD_LIBPACK_DIR}/include/QT/QtXml + ${FREECAD_LIBPACK_DIR}/include/QT/QtOpenGl + ${FREECAD_LIBPACK_DIR}/include/QT/QtWebKit + ) + +set(QT_QTCORE_INCLUDE_DIR + ${FREECAD_LIBPACK_DIR}/include/QT/ + ${FREECAD_LIBPACK_DIR}/include/QT/QtCore + ) + +set(QT_LIBRARIES + optimized QtCore4.lib + optimized QtGui4.lib + optimized QtDesigner4.lib + optimized QtSvg4.lib + optimized QtNetwork4.lib + optimized QtSql4.lib + optimized QtTest4.lib + optimized QtXml4.lib + optimized QtOpenGl4.lib + optimized QtWebKit4.lib +) +set(QT_DEBUG_LIBRARIES + debug QtCored4.lib + debug QtGuid4.lib + debug QtDesignerd4.lib + debug QtSvgd4.lib + debug QtNetworkd4.lib + debug QtSqld4.lib + debug QtTestd4.lib + debug QtXmld4.lib + debug QtOpenGld4.lib + debug QtWebKitd4.lib +) + +set(QT_QTCORE_LIBRARY_DEBUG + debug QtCored4.lib + ) + +set(QT_QTCORE_LIBRARY + optimized QtCore4.lib +) + +set(QT_UIC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/uic.exe) +set(QT_MOC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/moc.exe) +set(QT_RCC_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/rcc.exe) +set(QT_HELPCOMPILER_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/qhelpgenerator.exe) +set(QT_COLLECTIOMGENERATOR_EXECUTABLE ${FREECAD_LIBPACK_DIR}/bin/qcollectiongenerator.exe) + + + +MACRO (QT4_EXTRACT_OPTIONS _qt4_files _qt4_options) + SET(${_qt4_files}) + SET(${_qt4_options}) + #SET(_QT4_DOING_OPTIONS FALSE) + FOREACH(_currentArg ${ARGN}) + # IF ("${_currentArg}" STREQUAL "OPTIONS") + # SET(_QT4_DOING_OPTIONS TRUE) + # ELSE ("${_currentArg}" STREQUAL "OPTIONS") + # IF(_QT4_DOING_OPTIONS) + # LIST(APPEND ${_qt4_options} "${_currentArg}") + # ELSE(_QT4_DOING_OPTIONS) + LIST(APPEND ${_qt4_files} "${_currentArg}") + # ENDIF(_QT4_DOING_OPTIONS) + # ENDIF ("${_currentArg}" STREQUAL "OPTIONS") + ENDFOREACH(_currentArg) +ENDMACRO (QT4_EXTRACT_OPTIONS) + +# macro used to create the names of output files preserving relative dirs +MACRO (QT4_MAKE_OUTPUT_FILE infile prefix ext outfile ) + STRING(LENGTH ${CMAKE_CURRENT_BINARY_DIR} _binlength) + STRING(LENGTH ${infile} _infileLength) + SET(_checkinfile ${CMAKE_CURRENT_SOURCE_DIR}) + IF(_infileLength GREATER _binlength) + STRING(SUBSTRING "${infile}" 0 ${_binlength} _checkinfile) + IF(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") + FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_BINARY_DIR} ${infile}) + ELSE(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") + FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile}) + ENDIF(_checkinfile STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") + ELSE(_infileLength GREATER _binlength) + FILE(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${infile}) + ENDIF(_infileLength GREATER _binlength) + SET(_outfile "${CMAKE_CURRENT_BINARY_DIR}/${rel}") + STRING(REPLACE ".." "__" _outfile ${_outfile}) + GET_FILENAME_COMPONENT(outpath ${_outfile} PATH) + GET_FILENAME_COMPONENT(_outfile ${_outfile} NAME_WE) + FILE(MAKE_DIRECTORY ${outpath}) + SET(${outfile} ${outpath}/${prefix}${_outfile}.${ext}) +ENDMACRO (QT4_MAKE_OUTPUT_FILE ) + +MACRO (QT4_WRAP_CPP outfiles ) + QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN}) + SET(ARGN) + foreach(it ${moc_files}) + get_filename_component(it ${it} ABSOLUTE) + QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${moc_options} ${it} -o ${outfile} + MAIN_DEPENDENCY ${it} + ) + SET(${outfiles} ${${outfiles}} ${outfile}) + endforeach(it) +ENDMACRO (QT4_WRAP_CPP) + + +# This is a special version of the built in macro qt4_wrap_cpp +# It is required since moc'ed files are now included instead of being added to projects directly +# It adds a reverse dependency to solve this +# This has the unfortunate side effect that some files are always rebuilt +# There is probably a cleaner solution than this + +include(AddFileDependencies) + +macro(fc_wrap_cpp outfiles ) + QT4_EXTRACT_OPTIONS(moc_files moc_options ${ARGN}) + SET(ARGN) + foreach(it ${moc_files}) + get_filename_component(it ${it} ABSOLUTE) + QT4_MAKE_OUTPUT_FILE(${it} moc_ cpp outfile) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_MOC_EXECUTABLE} + ARGS ${moc_options} ${it} -o ${outfile} + MAIN_DEPENDENCY ${it} + ) + SET(${outfiles} ${${outfiles}} ${outfile}) + add_file_dependencies(${it} ${outfile}) + endforeach(it) +endmacro(fc_wrap_cpp) + + +MACRO (QT4_ADD_RESOURCES outfiles ) + QT4_EXTRACT_OPTIONS(rcc_files rcc_options ${ARGN}) + SET(ARGN) + FOREACH (it ${rcc_files}) + GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + GET_FILENAME_COMPONENT(rc_path ${infile} PATH) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx) + # parse file for dependencies + # all files are absolute paths or relative to the location of the qrc file + FILE(READ "${infile}" _RC_FILE_CONTENTS) + STRING(REGEX MATCHALL "]*>" "" _RC_FILE "${_RC_FILE}") + STRING(REGEX MATCH "^/|([A-Za-z]:/)" _ABS_PATH_INDICATOR "${_RC_FILE}") + IF(NOT _ABS_PATH_INDICATOR) + SET(_RC_FILE "${rc_path}/${_RC_FILE}") + ENDIF(NOT _ABS_PATH_INDICATOR) + SET(_RC_DEPENDS ${_RC_DEPENDS} "${_RC_FILE}") + ENDFOREACH(_RC_FILE) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_RCC_EXECUTABLE} + ARGS ${rcc_options} -name ${outfilename} -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile} + DEPENDS ${_RC_DEPENDS}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) +ENDMACRO (QT4_ADD_RESOURCES) + +MACRO (QT4_WRAP_UI outfiles ) +QT4_EXTRACT_OPTIONS(ui_files ui_options ${ARGN}) + +FOREACH (it ${ui_files}) + GET_FILENAME_COMPONENT(outfile ${it} NAME_WE) + GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE) + SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h) + ADD_CUSTOM_COMMAND(OUTPUT ${outfile} + COMMAND ${QT_UIC_EXECUTABLE} + ARGS -o ${outfile} ${infile} + MAIN_DEPENDENCY ${infile}) + SET(${outfiles} ${${outfiles}} ${outfile}) + ENDFOREACH (it) +ENDMACRO (QT4_WRAP_UI) + + +set(QT4_FOUND TRUE) + +# SoQt +set(SOQT_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/soqt) +set(SOQT_LIBRARY_RELEASE soqt1.lib) +set(SOQT_LIBRARY_DEBUG soqt1d.lib) +set(SOQT_FOUND TRUE) + +# OpenCV +set(OPENCV_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/opencv) +set(OPENCV_LIBRARIES cv.lib cvaux.lib cxcore.lib cxts.lib highgui.lib) +set(OPENCV_FOUND TRUE) + +# OCC +set(OCC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/OpenCascade) +set(OCC_LIBRARIES + TKFillet + TKMesh + TKernel + TKG2d + TKG3d + TKMath + TKIGES + TKSTL + TKShHealing + TKXSBase + TKBool + TKXSBase + TKXCAF + TKLCAF + TKCAF + TKSTEP + TKIGES + TKXDESTEP + TKXDEIGES + TKBO + TKBRep + TKTopAlgo + TKGeomAlgo + TKGeomBase + TKOffset + TKPrim + TKSTEP + TKSTEPBase + TKSTEPAttr + TKHLR +) +set(OCC_LIBRARY_DIR + ${FREECAD_LIBPACK_DIR}/lib +) +set(OCC_FOUND TRUE) + +SET(EIGEN2_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/eigen2) +set(EIGEN2_FOUND TRUE) + +SET(EIGEN3_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/eigen3) +set(EIGEN3_FOUND TRUE) + + + + diff --git a/src/Gui/CommandDoc.cpp b/src/Gui/CommandDoc.cpp index b9d0ea68b..a445f68c1 100644 --- a/src/Gui/CommandDoc.cpp +++ b/src/Gui/CommandDoc.cpp @@ -192,6 +192,11 @@ void StdCmdImport::activated(int iMsg) getActiveGuiDocument()->getDocument()->getName(), it.value().toAscii()); } + + std::list views = getActiveGuiDocument()->getMDIViewsOfType(Gui::View3DInventor::getClassTypeId()); + for (std::list::iterator it = views.begin(); it != views.end(); ++it) { + (*it)->viewAll(); + } } bool StdCmdImport::isActive(void) diff --git a/src/Gui/SoFCOffscreenRenderer.cpp b/src/Gui/SoFCOffscreenRenderer.cpp index 6ca265ab9..8af4a831b 100644 --- a/src/Gui/SoFCOffscreenRenderer.cpp +++ b/src/Gui/SoFCOffscreenRenderer.cpp @@ -252,6 +252,12 @@ QStringList SoFCOffscreenRenderer::getWriteImageFiletypeInfo() std::string SoFCOffscreenRenderer::createMIBA() const { std::stringstream com; + const std::map& cfg = App::Application::Config(); + std::map::const_iterator it; + it = cfg.find("BuildVersionMajor"); + std::string major = (it != cfg.end() ? it->second : ""); + it = cfg.find("BuildVersionMinor"); + std::string minor = (it != cfg.end() ? it->second : ""); com << setw(7) << setfill(' ') << fixed; com << " \n" ; @@ -266,8 +272,8 @@ std::string SoFCOffscreenRenderer::createMIBA() const com << " \n" ; com << " \n" ; com << " Unknown\n" ; - com << " 2006-07-05T01:11:00\n" ; - com << " FreeCAD 0.5\n" ; + com << " " << QDateTime::currentDateTime().toString().toAscii().constData() << "\n" ; + com << " " << App::GetApplication().getExecutableName() << " " << major << "." << minor << "\n" ; com << " Unknown\n"; com << " 1.0\n"; com << " \n" ; diff --git a/src/Mod/Draft/DraftSnap.py b/src/Mod/Draft/DraftSnap.py index ee2e2aab9..c4bacf77a 100644 --- a/src/Mod/Draft/DraftSnap.py +++ b/src/Mod/Draft/DraftSnap.py @@ -148,26 +148,7 @@ class Snapper: return None # setup trackers if needed - v = Draft.get3DView() - if v in self.trackers[0]: - i = self.trackers[0].index(v) - self.grid = self.trackers[1][i] - self.tracker = self.trackers[2][i] - self.extLine = self.trackers[3][i] - self.radiusTracker = self.trackers[4][i] - else: - if Draft.getParam("grid"): - self.grid = DraftTrackers.gridTracker() - else: - self.grid = None - self.tracker = DraftTrackers.snapTracker() - self.extLine = DraftTrackers.lineTracker(dotted=True) - self.radiusTracker = DraftTrackers.radiusTracker() - self.trackers[0].append(v) - self.trackers[1].append(self.grid) - self.trackers[2].append(self.tracker) - self.trackers[3].append(self.extLine) - self.trackers[4].append(self.radiusTracker) + self.setTrackers() # getting current snap Radius self.radius = self.getScreenDist(Draft.getParam("snapRange"),screenpos) @@ -175,10 +156,6 @@ class Snapper: self.radiusTracker.update(self.radius) self.radiusTracker.off() - # set the grid - if self.grid and (not self.forceGridOff): - self.grid.set() - # activate snap oldActive = False if Draft.getParam("alwaysSnap"): @@ -362,6 +339,19 @@ class Snapper: self.extLine.on() self.setCursor(tsnap[1]) return tsnap[2],eline + else: + tsnap = self.snapToExtPerpendicular(last) + if tsnap: + if (tsnap[0].sub(point)).Length < self.radius: + if self.tracker: + self.tracker.setCoords(tsnap[2]) + self.tracker.setMarker(self.mk[tsnap[1]]) + self.tracker.on() + if self.extLine: + self.extLine.p2(tsnap[2]) + self.extLine.on() + self.setCursor(tsnap[1]) + return tsnap[2],eline for o in [self.lastObj[1],self.lastObj[0]]: if o: @@ -541,6 +531,14 @@ class Snapper: return None return None + def snapToExtPerpendicular(self,last): + "returns a perpendicular X extension snap location" + if self.isEnabled("extension") and self.isEnabled("perpendicular"): + if last and self.extLine: + tmpEdge = Part.Line(self.extLine.p1(),self.extLine.p2()).toShape() + np = self.getPerpendicular(tmpEdge,last) + return [np,'perpendicular',np] + def snapToElines(self,e1,e2): "returns a snap location at the infinite intersection of the given edges" snaps = [] @@ -920,16 +918,31 @@ class Snapper: mw.addToolBar(self.toolbar) self.toolbar.show() if FreeCADGui.ActiveDocument: - if not self.forceGridOff: - if not self.grid: - self.grid = DraftTrackers.gridTracker() - self.grid.set() + self.setTrackers() - def setGrid(self): - "sets the grid, if visible" - if self.grid and (not self.forceGridOff): - if self.grid.Visible: - self.grid.set() + def setTrackers(self): + v = Draft.get3DView() + if v in self.trackers[0]: + i = self.trackers[0].index(v) + self.grid = self.trackers[1][i] + self.tracker = self.trackers[2][i] + self.extLine = self.trackers[3][i] + self.radiusTracker = self.trackers[4][i] + else: + if Draft.getParam("grid"): + self.grid = DraftTrackers.gridTracker() + else: + self.grid = None + self.tracker = DraftTrackers.snapTracker() + self.extLine = DraftTrackers.lineTracker(dotted=True) + self.radiusTracker = DraftTrackers.radiusTracker() + self.trackers[0].append(v) + self.trackers[1].append(self.grid) + self.trackers[2].append(self.tracker) + self.trackers[3].append(self.extLine) + self.trackers[4].append(self.radiusTracker) + if not self.forceGridOff: + self.grid.set() if not hasattr(FreeCADGui,"Snapper"): FreeCADGui.Snapper = Snapper() diff --git a/src/Mod/Part/App/PartFeatures.cpp b/src/Mod/Part/App/PartFeatures.cpp index 1bf2ce874..45aec90d8 100644 --- a/src/Mod/Part/App/PartFeatures.cpp +++ b/src/Mod/Part/App/PartFeatures.cpp @@ -212,7 +212,7 @@ Sweep::Sweep() ADD_PROPERTY_TYPE(Spine,(0),"Sweep",App::Prop_None,"Path to sweep along"); ADD_PROPERTY_TYPE(Solid,(false),"Sweep",App::Prop_None,"Create solid"); ADD_PROPERTY_TYPE(Frenet,(false),"Sweep",App::Prop_None,"Frenet"); - ADD_PROPERTY_TYPE(Transition,(long(0)),"Sweep",App::Prop_None,"Transition mode"); + ADD_PROPERTY_TYPE(Transition,(long(1)),"Sweep",App::Prop_None,"Transition mode"); Transition.setEnums(TransitionEnums); } @@ -244,16 +244,19 @@ App::DocumentObjectExecReturn *Sweep::execute(void) if (!(spine && spine->getTypeId().isDerivedFrom(Part::Feature::getClassTypeId()))) return new App::DocumentObjectExecReturn("No spine linked."); const std::vector& subedge = Spine.getSubValues(); - if (subedge.size() != 1) - return new App::DocumentObjectExecReturn("Not exactly one sub-shape linked."); TopoDS_Shape path; const Part::TopoShape& shape = static_cast(spine)->Shape.getValue(); if (!shape._Shape.IsNull()) { - if (!subedge[0].empty()) { - path = shape.getSubShape(subedge[0].c_str()); + try { + BRepBuilderAPI_MakeWire mkWire; + for (std::vector::const_iterator it = subedge.begin(); it != subedge.end(); ++it) { + TopoDS_Shape subshape = shape.getSubShape(it->c_str()); + mkWire.Add(TopoDS::Edge(subshape)); + } + path = mkWire.Wire(); } - else { + catch (Standard_Failure) { if (shape._Shape.ShapeType() == TopAbs_EDGE) path = shape._Shape; else if (shape._Shape.ShapeType() == TopAbs_WIRE) @@ -273,8 +276,12 @@ App::DocumentObjectExecReturn *Sweep::execute(void) const TopoDS_Shape& shape = static_cast(*it)->Shape.getValue(); if (shape.IsNull()) return new App::DocumentObjectExecReturn("Linked shape is invalid."); + // There is a weird behaviour of BRepOffsetAPI_MakePipeShell when trying to add the wire as is. + // If we re-create the wire then everything works fine. + // https://sourceforge.net/apps/phpbb/free-cad/viewtopic.php?f=10&t=2673&sid=fbcd2ff4589f0b2f79ed899b0b990648#p20268 if (shape.ShapeType() == TopAbs_WIRE) { - profiles.Append(shape); + BRepBuilderAPI_MakeWire mkWire(TopoDS::Wire(shape)); + profiles.Append(mkWire.Wire()); } else if (shape.ShapeType() == TopAbs_EDGE) { BRepBuilderAPI_MakeWire mkWire(TopoDS::Edge(shape)); diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index 5020e4872..444f5b1e0 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -442,7 +442,6 @@ CmdPartImport::CmdPartImport() sPixmap = "Part_Import"; } - void CmdPartImport::activated(int iMsg) { QStringList filter; @@ -471,6 +470,11 @@ void CmdPartImport::activated(int iMsg) doCommand(Doc, "Part.insert(\"%s\",\"%s\")", (const char*)fn.toUtf8(), pDoc->getName()); } commitCommand(); + + std::list views = getActiveGuiDocument()->getMDIViewsOfType(Gui::View3DInventor::getClassTypeId()); + for (std::list::iterator it = views.begin(); it != views.end(); ++it) { + (*it)->viewAll(); + } } } @@ -947,6 +951,7 @@ CmdPartLoft::CmdPartLoft() sToolTipText = QT_TR_NOOP("Advanced utility to lofts"); sWhatsThis = sToolTipText; sStatusTip = sToolTipText; + sPixmap = "Part_Loft"; } void CmdPartLoft::activated(int iMsg) @@ -972,6 +977,7 @@ CmdPartSweep::CmdPartSweep() sToolTipText = QT_TR_NOOP("Advanced utility to sweep"); sWhatsThis = sToolTipText; sStatusTip = sToolTipText; + sPixmap = "Part_Sweep"; } void CmdPartSweep::activated(int iMsg) diff --git a/src/Mod/Part/Gui/Makefile.am b/src/Mod/Part/Gui/Makefile.am index ca433d86f..15a2a094a 100644 --- a/src/Mod/Part/Gui/Makefile.am +++ b/src/Mod/Part/Gui/Makefile.am @@ -200,12 +200,14 @@ EXTRA_DIST = \ Resources/icons/Part_Fillet.svg \ Resources/icons/Part_Revolve.svg \ Resources/icons/Part_Import.svg \ + Resources/icons/Part_Loft.svg \ Resources/icons/Part_Mirror.svg \ Resources/icons/Part_MirrorPNG.png \ Resources/icons/Part_RuledSurface.svg \ Resources/icons/Part_Shapebuilder.png \ Resources/icons/Part_Shapebuilder.svg \ Resources/icons/Part_ShapeInfo.svg \ + Resources/icons/Part_Sweep.svg \ Resources/icons/Tree_Part.svg \ Resources/icons/preferences-part_design.svg \ Resources/icons/PartFeature.svg \ diff --git a/src/Mod/Part/Gui/Resources/Part.qrc b/src/Mod/Part/Gui/Resources/Part.qrc index 82c60f77a..f6fbdf0c3 100644 --- a/src/Mod/Part/Gui/Resources/Part.qrc +++ b/src/Mod/Part/Gui/Resources/Part.qrc @@ -16,6 +16,7 @@ icons/Part_Fillet.svg icons/Part_Fuse.svg icons/Part_Import.svg + icons/Part_Loft.svg icons/Part_Mirror.svg icons/Part_MirrorPNG.png icons/Part_Revolve.svg @@ -24,6 +25,7 @@ icons/Part_Shapebuilder.png icons/Part_ShapeInfo.svg icons/Part_Sphere.svg + icons/Part_Sweep.svg icons/Part_Torus.svg icons/preferences-part_design.svg icons/Tree_Part.svg diff --git a/src/Mod/Part/Gui/Resources/icons/Part_Loft.svg b/src/Mod/Part/Gui/Resources/icons/Part_Loft.svg new file mode 100644 index 000000000..72df9ab92 --- /dev/null +++ b/src/Mod/Part/Gui/Resources/icons/Part_Loft.svg @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/Mod/Part/Gui/Resources/icons/Part_Sweep.svg b/src/Mod/Part/Gui/Resources/icons/Part_Sweep.svg new file mode 100644 index 000000000..c5b8ca3c2 --- /dev/null +++ b/src/Mod/Part/Gui/Resources/icons/Part_Sweep.svg @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/Mod/Part/Gui/TaskLoft.cpp b/src/Mod/Part/Gui/TaskLoft.cpp index 96c3417a2..7192c27c4 100644 --- a/src/Mod/Part/Gui/TaskLoft.cpp +++ b/src/Mod/Part/Gui/TaskLoft.cpp @@ -32,6 +32,7 @@ #include "TaskLoft.h" #include +#include #include #include #include @@ -198,7 +199,8 @@ TaskLoft::TaskLoft() { widget = new LoftWidget(); taskbox = new Gui::TaskView::TaskBox( - QPixmap(), widget->windowTitle(), true, 0); + Gui::BitmapFactory().pixmap("Part_Loft"), + widget->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(widget); Content.push_back(taskbox); } diff --git a/src/Mod/Part/Gui/TaskSweep.cpp b/src/Mod/Part/Gui/TaskSweep.cpp index effd5c28b..63839c514 100644 --- a/src/Mod/Part/Gui/TaskSweep.cpp +++ b/src/Mod/Part/Gui/TaskSweep.cpp @@ -32,6 +32,7 @@ #include "TaskSweep.h" #include +#include #include #include #include @@ -117,7 +118,7 @@ void SweepWidget::findShapes() bool SweepWidget::accept() { - Gui::SelectionFilter edgeFilter ("SELECT Part::Feature SUBELEMENT Edge COUNT 1"); + Gui::SelectionFilter edgeFilter ("SELECT Part::Feature SUBELEMENT Edge COUNT 1.."); Gui::SelectionFilter partFilter ("SELECT Part::Feature COUNT 1"); bool matchEdge = edgeFilter.match(); bool matchPart = partFilter.match(); @@ -127,16 +128,14 @@ bool SweepWidget::accept() } // get the selected object - std::string objectName, subShape; + std::string selection; if (matchEdge) { const std::vector& result = edgeFilter.Result[0]; - const std::vector& edges = result[0].getSubNames(); - objectName = result.front().getFeatName(); - subShape = edges.front(); + selection = result.front().getAsPropertyLinkSubString(); } else { const std::vector& result = partFilter.Result[0]; - objectName = result.front().getFeatName(); + selection = result.front().getAsPropertyLinkSubString(); } QString list, solid, frenet; @@ -166,15 +165,17 @@ bool SweepWidget::accept() try { QString cmd; cmd = QString::fromAscii( - "App.getDocument('%6').addObject('Part::Sweep','Sweep')\n" - "App.getDocument('%6').ActiveObject.Sections=[%1]\n" - "App.getDocument('%6').ActiveObject.Spine=(FreeCAD.ActiveDocument.%2,['%3'])\n" - "App.getDocument('%6').ActiveObject.Solid=%4\n" - "App.getDocument('%6').ActiveObject.Frenet=%5\n" + "App.getDocument('%5').addObject('Part::Sweep','Sweep')\n" + "App.getDocument('%5').ActiveObject.Sections=[%1]\n" + "App.getDocument('%5').ActiveObject.Spine=%2\n" + "App.getDocument('%5').ActiveObject.Solid=%3\n" + "App.getDocument('%5').ActiveObject.Frenet=%4\n" ) - .arg(list).arg(QLatin1String(objectName.c_str())) - .arg(QLatin1String(subShape.c_str())) - .arg(solid).arg(frenet).arg(QString::fromAscii(d->document.c_str())); + .arg(list) + .arg(QLatin1String(selection.c_str())) + .arg(solid) + .arg(frenet) + .arg(QString::fromAscii(d->document.c_str())); Gui::Document* doc = Gui::Application::Instance->getDocument(d->document.c_str()); if (!doc) throw Base::Exception("Document doesn't exist anymore"); @@ -225,7 +226,8 @@ TaskSweep::TaskSweep() { widget = new SweepWidget(); taskbox = new Gui::TaskView::TaskBox( - QPixmap(), widget->windowTitle(), true, 0); + Gui::BitmapFactory().pixmap("Part_Sweep"), + widget->windowTitle(), true, 0); taskbox->groupLayout()->addWidget(widget); Content.push_back(taskbox); } diff --git a/src/Mod/Start/Gui/CMakeLists.txt b/src/Mod/Start/Gui/CMakeLists.txt index 54bdc5c5e..339c9ad50 100644 --- a/src/Mod/Start/Gui/CMakeLists.txt +++ b/src/Mod/Start/Gui/CMakeLists.txt @@ -54,6 +54,8 @@ SET(StartPage_Resources StartPage/PartDesignExample.png StartPage/ArchExample.png StartPage/web.png + StartPage/blank.png + StartPage/complete.jpg ) add_library(StartGui SHARED ${StartGui_SRCS}) diff --git a/src/Mod/Start/StartPage/CMakeLists.txt b/src/Mod/Start/StartPage/CMakeLists.txt index 19c59fcf3..7a798c98e 100644 --- a/src/Mod/Start/StartPage/CMakeLists.txt +++ b/src/Mod/Start/StartPage/CMakeLists.txt @@ -24,6 +24,8 @@ SET(StartPage_DATA PartDesignExample.png ArchExample.png web.png + blank.png + complete.jpg ) INSTALL(FILES ${StartPage_SRCS} diff --git a/src/Mod/Start/StartPage/Makefile.am b/src/Mod/Start/StartPage/Makefile.am index de35b6d45..57ffd74ee 100644 --- a/src/Mod/Start/StartPage/Makefile.am +++ b/src/Mod/Start/StartPage/Makefile.am @@ -28,7 +28,9 @@ data_DATA = \ Complete.png \ PartDesignExample.png \ ArchExample.png \ - web.png + web.png \ + blank.png \ + complete.jpg EXTRA_DIST = \ $(data_DATA) $(python_DATA) diff --git a/src/Mod/Start/StartPage/StartPage.py b/src/Mod/Start/StartPage/StartPage.py index c3983a86f..978cae6b7 100644 --- a/src/Mod/Start/StartPage/StartPage.py +++ b/src/Mod/Start/StartPage/StartPage.py @@ -309,10 +309,10 @@ def getWebExamples(): def getExamples(): return """ """ def getLinks(): @@ -366,7 +366,7 @@ def getWorkbenches():
  •   \

    This is the """ + text31 + """, \ - """ + text32 + """

    ')" + """ + text32 + """

    ')" onMouseout="show('')" href="DefaultWorkbench.py">""" + text31 + """
  • @@ -399,7 +399,7 @@ def getInfo(filename): html += text35 + " " + getLocalTime(s.st_mtime) + "
    " html += "" + text36 + " " + filename + "

    " # get additional info from fcstd files - if os.path.splitext(filename)[1] in [".fcstd",".FcStd"]: + if os.path.splitext(filename)[1].upper() in [".FCSTD"]: zfile=zipfile.ZipFile(filename) files=zfile.namelist() # check for meta-file if it's really a FreeCAD document @@ -429,7 +429,12 @@ def getRecentFiles(): if i < ct: mr = rf.GetString("MRU%d" % (i)) fn = os.path.basename(mr) - html += '
  • ' diff --git a/src/Mod/Start/StartPage/blank.png b/src/Mod/Start/StartPage/blank.png new file mode 100755 index 000000000..4b7940448 Binary files /dev/null and b/src/Mod/Start/StartPage/blank.png differ diff --git a/src/Mod/Start/StartPage/complete.jpg b/src/Mod/Start/StartPage/complete.jpg new file mode 100644 index 000000000..68c82d030 Binary files /dev/null and b/src/Mod/Start/StartPage/complete.jpg differ