From 7fe1d94a2165d104ecf6ef17ba82ceb2b2b88a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Tr=C3=B6ger?= Date: Sun, 4 Aug 2013 13:54:04 +0000 Subject: [PATCH] fix rotational/translational solver bugs in cylce detection and mapping --- src/Mod/Assembly/App/ConstraintGroup.cpp | 1 - src/Mod/Assembly/App/ItemAssembly.cpp | 2 -- src/Mod/Assembly/App/opendcm/core/kernel.hpp | 6 +++--- src/Mod/Assembly/App/opendcm/module3d/solver.hpp | 12 +++++++++--- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Mod/Assembly/App/ConstraintGroup.cpp b/src/Mod/Assembly/App/ConstraintGroup.cpp index 818f9aa378..b8f6db81a0 100644 --- a/src/Mod/Assembly/App/ConstraintGroup.cpp +++ b/src/Mod/Assembly/App/ConstraintGroup.cpp @@ -85,5 +85,4 @@ void ConstraintGroup::init(ItemAssembly* ass) { } } - } diff --git a/src/Mod/Assembly/App/ItemAssembly.cpp b/src/Mod/Assembly/App/ItemAssembly.cpp index 76c0f2a9ba..960828f600 100644 --- a/src/Mod/Assembly/App/ItemAssembly.cpp +++ b/src/Mod/Assembly/App/ItemAssembly.cpp @@ -211,9 +211,7 @@ void ItemAssembly::init(boost::shared_ptr parent) { //no signals for subsystems, we need to extract the placement by hand void ItemAssembly::finish(boost::shared_ptr parent) { - Base::Console().Message("finish\n"); if(parent) { - Base::Console().Message("set product placement\n"); Base::Placement p = m_solver->getTransformation(); this->Placement.setValue(p); } diff --git a/src/Mod/Assembly/App/opendcm/core/kernel.hpp b/src/Mod/Assembly/App/opendcm/core/kernel.hpp index 80f37d753f..392dc43da0 100644 --- a/src/Mod/Assembly/App/opendcm/core/kernel.hpp +++ b/src/Mod/Assembly/App/opendcm/core/kernel.hpp @@ -438,15 +438,15 @@ struct Kernel { void setAccess(ParameterType t) { if(t==complete) { - new(&Jacobi) VectorMap(&m_jacobi(0,0),m_eqns,m_params,DynStride(m_eqns,1)); + new(&Jacobi) MatrixMap(&m_jacobi(0,0),m_eqns,m_params,DynStride(m_eqns,1)); new(&Parameter) VectorMap(&m_parameter(0),m_params,DynStride(1,1)); } else if(t==rotation) { int num = m_param_trans_offset; - new(&Jacobi) VectorMap(&m_jacobi(0,0),m_eqns,num,DynStride(m_eqns,1)); + new(&Jacobi) MatrixMap(&m_jacobi(0,0),m_eqns,num,DynStride(m_eqns,1)); new(&Parameter) VectorMap(&m_parameter(0),num,DynStride(1,1)); } else if(t==general) { int num = m_params - m_param_trans_offset; - new(&Jacobi) VectorMap(&m_jacobi(0,m_param_trans_offset),m_eqns,num,DynStride(m_eqns,1)); + new(&Jacobi) MatrixMap(&m_jacobi(0,m_param_trans_offset),m_eqns,num,DynStride(m_eqns,1)); new(&Parameter) VectorMap(&m_parameter(m_param_trans_offset),num,DynStride(1,1)); } }; diff --git a/src/Mod/Assembly/App/opendcm/module3d/solver.hpp b/src/Mod/Assembly/App/opendcm/module3d/solver.hpp index d2ce5d1d98..3f8d5a114f 100644 --- a/src/Mod/Assembly/App/opendcm/module3d/solver.hpp +++ b/src/Mod/Assembly/App/opendcm/module3d/solver.hpp @@ -29,8 +29,12 @@ #include #include +#include #include +#include "Base/Console.h" +#include + namespace dcm { namespace details { @@ -374,10 +378,12 @@ void SystemSolver::solveCluster(boost::shared_ptr cluster, Sys& sy cycle_dedector cd(has_cycle); //create te needed property map, fill it and run the test property_map vi_map(cluster); + property_map vc_map(cluster); + property_map ec_map(cluster); cluster->initIndexMaps(); - boost::depth_first_search(*cluster.get(), boost::visitor(cd).vertex_index_map(vi_map)); - - bool done = false; + boost::undirected_dfs(*cluster.get(), boost::visitor(cd).vertex_index_map(vi_map).vertex_color_map(vc_map).edge_color_map(ec_map)); + + bool done = false; if(!has_cycle) { #ifdef USE_LOGGING BOOST_LOG(log)<< "non-cyclic system dedected"