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 @@
+
+
+
+
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 @@
+
+
+
+
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 += ''
+ if mr[-5:].upper() == "FCSTD":
+ html += '
'
+ else:
+ html += '
'
+ 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