source: src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.cpp@ 3f7587

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 3f7587 was 57a770, checked in by Frederik Heber <heber@…>, 13 years ago

Corrected verbosity levels of GLMoleculeObject..., GLWorldScene, and ..View.

  • placede messages from Observer's to observerLog.
  • Property mode set to 100644
File size: 3.2 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * GLMoleculeObject_bond.cpp
10 *
11 * Created on: Aug 17, 2011
12 * Author: heber
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include "GLMoleculeObject_bond.hpp"
21
22#include <Qt3D/qglbuilder.h>
23#include <Qt3D/qglcylinder.h>
24#include <Qt3D/qglmaterial.h>
25#include <Qt3D/qglscenenode.h>
26
27#include "CodePatterns/MemDebug.hpp"
28
29#include <cmath>
30
31#include "CodePatterns/Assert.hpp"
32#include "CodePatterns/Log.hpp"
33#include "Atom/atom.hpp"
34#include "Bond/bond.hpp"
35#include "Element/element.hpp"
36#include "Helpers/defs.hpp"
37#include "LinearAlgebra/Line.hpp"
38#include "LinearAlgebra/Vector.hpp"
39
40static QGLSceneNode *createBond(QObject *parent, double distance)
41{
42 QGLBuilder builder;
43 QGLCylinder cylinder(.25,.25,.25);
44 cylinder.setHeight(distance);
45 builder << cylinder;
46 QGLSceneNode *n = builder.finalizedSceneNode();
47 n->setParent(parent);
48 return n;
49}
50
51GLMoleculeObject_bond::GLMoleculeObject_bond(QObject *parent, const bond *bondref, double distance, enum SideOfBond side) :
52 GLMoleculeObject(createBond(parent, distance), parent), _bond(bondref)
53{
54 Vector Position;
55 Vector OtherPosition;
56 size_t elementno = 0;
57 switch (side) {
58 case left:
59 Position = _bond->leftatom->getPosition();
60 OtherPosition = _bond->rightatom->getPosition();
61 if (_bond->leftatom->getType() != NULL) {
62 elementno = _bond->leftatom->getType()->getNumber();
63 } else { // if not element yet set, set to hydrogen
64 elementno = 1;
65 }
66 break;
67 case right:
68 Position = _bond->rightatom->getPosition();
69 OtherPosition = _bond->leftatom->getPosition();
70 if (_bond->rightatom->getType() != NULL) {
71 elementno = _bond->rightatom->getType()->getNumber();
72 } else { // if not element yet set, set to hydrogen
73 elementno = 1;
74 }
75
76 break;
77 default:
78 ASSERT(0,
79 "GLMoleculeObject_bond::GLMoleculeObject_bond() - side is not a valid argument: "+toString(side)+".");
80 break;
81 }
82
83 QGLMaterial *elementmaterial = getMaterial(elementno);
84 setMaterial(elementmaterial);
85
86 // calculate position
87 Vector Z(0.,0.,1.);
88 Vector zeroVec(0.,0.,0.);
89 Vector a,b;
90 Vector OtherAxis;
91 double alpha;
92 a = Position - OtherPosition;
93 // construct rotation axis
94 b = a;
95 b.VectorProduct(Z);
96 Line axis(zeroVec, b);
97 // calculate rotation angle
98 alpha = a.Angle(Z);
99 // construct other axis to check right-hand rule
100 OtherAxis = b;
101 OtherAxis.VectorProduct(Z);
102 // assure right-hand rule for the rotation
103 if (a.ScalarProduct(OtherAxis) < MYEPSILON)
104 alpha = M_PI-alpha;
105 // check
106 Vector a_rotated = axis.rotateVector(a, alpha);
107 LOG(3, "INFO: Created cylinder from "// << Position << " to " << OtherPosition
108 << a << " to " << a_rotated << " around " << b << " by " << alpha/M_PI*180. << ", respectively.");
109
110 // set position
111 setPosition(QVector3D(Position[0], Position[1], Position[2]));
112 setRotationVector(QVector3D(b[0], b[1], b[2]));
113 setRotationAngle(alpha/M_PI*180.);
114}
Note: See TracBrowser for help on using the repository browser.