diff --git a/src/Mod/Assembly/App/ItemAssembly.cpp b/src/Mod/Assembly/App/ItemAssembly.cpp index dd576924c..ec8223890 100644 --- a/src/Mod/Assembly/App/ItemAssembly.cpp +++ b/src/Mod/Assembly/App/ItemAssembly.cpp @@ -58,6 +58,7 @@ App::DocumentObjectExecReturn *ItemAssembly::execute(void) { Base::Console().Message("Execute ItemAssembly\n"); + try{ //create a solver and init all child assemblys with subsolvers m_solver = boost::shared_ptr(new Solver); init(boost::shared_ptr()); @@ -74,6 +75,10 @@ App::DocumentObjectExecReturn *ItemAssembly::execute(void) //solve the system m_solver->solve(); + } + catch(std::exception& e) { + Base::Console().Message("Solver exeption: %s", e.what()); + } this->touch(); return App::DocumentObject::StdReturn; diff --git a/src/Mod/Assembly/App/Solver.h b/src/Mod/Assembly/App/Solver.h index 5ddc4c51e..8867f5eee 100644 --- a/src/Mod/Assembly/App/Solver.h +++ b/src/Mod/Assembly/App/Solver.h @@ -99,6 +99,7 @@ struct gp_lin_accessor { break; case 2: p.SetZ(value); + break; case 3: d.SetX(value); break; @@ -148,6 +149,7 @@ struct gp_pln_accessor { break; case 2: p.SetZ(value); + break; case 3: d.SetX(value); break; @@ -198,6 +200,7 @@ struct gp_cylinder_accessor { break; case 2: p.SetZ(value); + break; case 3: d.SetX(value); break; @@ -209,6 +212,7 @@ struct gp_cylinder_accessor { break; case 6: t.SetRadius(value); + break; }; t.SetAxis(gp_Ax1(p,d)); }; diff --git a/src/Mod/Assembly/App/opendcm/core/geometry.hpp b/src/Mod/Assembly/App/opendcm/core/geometry.hpp index 131a2d24e..38f30fcd0 100644 --- a/src/Mod/Assembly/App/opendcm/core/geometry.hpp +++ b/src/Mod/Assembly/App/opendcm/core/geometry.hpp @@ -439,7 +439,7 @@ void Geometry::finishCalculation() { //recalculate(1.); //remove scaling to get right global value m_global = m_rotated; #ifdef USE_LOGGING - BOOST_LOG(log) << "Finish cluster calculation"; + BOOST_LOG(log) << "Finish cluster calculation: "<::finishCalculation() { m_global = m_parameter; normalize(); #ifdef USE_LOGGING - BOOST_LOG(log) << "Finish calculation"; + BOOST_LOG(log) << "Finish calculation: "<::transformToMaps(typename ClusterMath::Kernel::Transf template void ClusterMath::finishCalculation() { - mapsToTransform(m_transform); - init=false; - #ifdef USE_LOGGING BOOST_LOG(log) << "Finish calculation"; #endif + + mapsToTransform(m_transform); + init=false; m_transform = m_ssrTransform*m_transform; diff --git a/src/Mod/Assembly/App/opendcm/module3d/coincident.hpp b/src/Mod/Assembly/App/opendcm/module3d/coincident.hpp index 0bbe62b85..e211a99c6 100644 --- a/src/Mod/Assembly/App/opendcm/module3d/coincident.hpp +++ b/src/Mod/Assembly/App/opendcm/module3d/coincident.hpp @@ -114,9 +114,78 @@ struct ci_orientation::type< Kernel, tag::plane3D, tag::cylinder3D > : public dc template< typename Kernel > struct ci_orientation::type< Kernel, tag::cylinder3D, tag::cylinder3D > : public dcm::Orientation::type< Kernel, tag::cylinder3D, tag::cylinder3D > {}; + + +//we need a custom distance type to use point-distance functions instead of real geometry distance +struct ci_distance : public Equation { + + using Equation::operator=; + ci_distance() : Equation(0) {}; + + + template< typename Kernel, typename Tag1, typename Tag2 > + struct type : public PseudoScale { + + typedef typename Kernel::number_type Scalar; + typedef typename Kernel::VectorMap Vector; + typedef std::vector > Vec; + + option_type value; + Scalar calculate(Vector& param1, Vector& param2) { + assert(false); + return 0; + }; + Scalar calculateGradientFirst(Vector& param1, Vector& param2, Vector& dparam1) { + assert(false); + return 0; + }; + Scalar calculateGradientSecond(Vector& param1, Vector& param2, Vector& dparam2) { + assert(false); + return 0; + }; + void calculateGradientFirstComplete(Vector& param1, Vector& param2, Vector& gradient) { + assert(false); + }; + void calculateGradientSecondComplete(Vector& param1, Vector& param2, Vector& gradient) { + assert(false); + }; + }; +}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::point3D, tag::point3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::point3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::point3D, tag::line3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::line3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::point3D, tag::plane3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::plane3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::point3D, tag::cylinder3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::cylinder3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::line3D, tag::line3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::line3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::line3D, tag::plane3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::plane3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::line3D, tag::cylinder3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::cylinder3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::plane3D, tag::plane3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::plane3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::plane3D, tag::cylinder3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::cylinder3D > {}; + +template< typename Kernel > +struct ci_distance::type< Kernel, tag::cylinder3D, tag::cylinder3D > : public dcm::Distance::type< Kernel, tag::point3D, tag::line3D > {}; + + }//details -struct Coincidence : public dcm::constraint_sequence< fusion::vector2< Distance, details::ci_orientation > > { +struct Coincidence : public dcm::constraint_sequence< fusion::vector2< details::ci_distance, details::ci_orientation > > { //allow to set the distance Coincidence& operator()(Direction val) { fusion::at_c<1>(*this) = val; @@ -128,7 +197,7 @@ struct Coincidence : public dcm::constraint_sequence< fusion::vector2< Distance, }; }; -struct Alignment : public dcm::constraint_sequence< fusion::vector2< Distance, details::ci_orientation > > { +struct Alignment : public dcm::constraint_sequence< fusion::vector2< details::ci_distance, details::ci_orientation > > { //allow to set the distance Alignment& operator()(Direction val) { fusion::at_c<1>(*this) = val; diff --git a/src/Mod/Assembly/App/opendcm/module3d/solver.hpp b/src/Mod/Assembly/App/opendcm/module3d/solver.hpp index ac9910c45..b767b4dae 100644 --- a/src/Mod/Assembly/App/opendcm/module3d/solver.hpp +++ b/src/Mod/Assembly/App/opendcm/module3d/solver.hpp @@ -275,7 +275,7 @@ void SystemSolver::solveCluster(boost::shared_ptr cluster, Sys& sy if(params <= 0 || constraints <= 0) { //TODO:throw #ifdef USE_LOGGING - BOOST_LOG(log)<< "Error in system counting: params = " << params << " and constraints = "<