File: AtomProperties.cpp

package info (click to toggle)
camitk 6.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 389,496 kB
  • sloc: cpp: 103,476; sh: 2,448; python: 1,618; xml: 984; makefile: 128; perl: 84; sed: 20
file content (146 lines) | stat: -rw-r--r-- 4,484 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*****************************************************************************
 * $CAMITK_LICENCE_BEGIN$
 *
 * CamiTK - Computer Assisted Medical Intervention ToolKit
 * (c) 2001-2025 Univ. Grenoble Alpes, CNRS, Grenoble INP - UGA, TIMC, 38000 Grenoble, France
 *
 * Visit http://camitk.imag.fr for more information
 *
 * This file is part of CamiTK.
 *
 * CamiTK is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * CamiTK is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with CamiTK.  If not, see <http://www.gnu.org/licenses/>.
 *
 * $CAMITK_LICENCE_END$
 ****************************************************************************/
#include "AtomProperties.h"

// XSD / XercesC stuffs
#include <xercesc/util/XercesDefs.hpp>
#include <xercesc/dom/DOMAttr.hpp>
#include <xercesc/util/XMLString.hpp>

// pmlschema includes
#include <AtomProperties.hxx>

//----------------------- Class member init -----------------------
void AtomProperties::resetUniqueIndex() {
    AtomProperties::maxUniqueIndex = 0;
}

// initializing the static class member
unsigned int AtomProperties::maxUniqueIndex = 0;

//----------------------- Constructors -----------------------
AtomProperties::AtomProperties(PhysicalModel* p)  : StructureProperties(p, StructureProperties::ATOM) {
    allocate();
    setPosition(0.0, 0.0, 0.0);
    index = maxUniqueIndex++;
}

AtomProperties::AtomProperties(PhysicalModel* p, physicalModel::AtomProperties xmlAtomProp)  : StructureProperties(p, StructureProperties::ATOM) {
    allocate();

    // Begin the search by required atom's properties, such as index and its position (x,y,z)
    setIndex(xmlAtomProp.index());
    setPosition(xmlAtomProp.x(), xmlAtomProp.y(), xmlAtomProp.z());

    // Search for any optional name given to the atom
    if (xmlAtomProp.name().present()) {
        setName(xmlAtomProp.name().get());
    }

    // Add the eventually unkown attributes
    xmlToFields(xmlAtomProp.any_attribute());
}

AtomProperties::AtomProperties(PhysicalModel* p, const double pos[3]) : StructureProperties(p, StructureProperties::ATOM) {
    allocate();
    setPosition(pos);
    index = maxUniqueIndex++;
}

AtomProperties::AtomProperties(PhysicalModel* p, const unsigned int ind)  :  StructureProperties(p, StructureProperties::ATOM) {
    allocate();
    setPosition(0.0, 0.0, 0.0);
    index = ind;

    if (ind >= maxUniqueIndex) {
        maxUniqueIndex = ind + 1;
    }
}

AtomProperties::AtomProperties(PhysicalModel* p, const unsigned int ind, const double pos[3]) : StructureProperties(p, StructureProperties::ATOM) {
    allocate();
    setPosition(pos);
    index = ind;

    if (ind >= maxUniqueIndex) {
        maxUniqueIndex = ind + 1;
    }
}

//----------------------- destructor -----------------------
AtomProperties::~AtomProperties() {
    if (allocated) {
        delete [] X;
    }
}

//----------------------- allocate -----------------------
void AtomProperties::allocate() {
    X = new double[3];
    allocated = true;
}

//----------------------- setPositionPointer -----------------------
void AtomProperties::setPositionPointer(double* ptr, bool update) {
    // store previous position if needed
    double pos[3];

    if (update) {
        getPosition(pos);
    }

    // delete previous memory to avoid memory leaks, if needed
    if (allocated) {
        delete [] X;
        allocated = false;
    }

    X = ptr;

    // restore if needed
    if (update) {
        setPosition(pos);
    }
}

// --------------- xmlPrint ---------------
void AtomProperties::xmlPrint(std::ostream& o) {

    // beginning of the atom properties
    o << "<atomProperties index=\"" << index << "\"";
    o << " x=\"" << X[0] << "\" y=\"" << X[1] << "\" z=\"" << X[2] << "\"";

    if (getName() != "") {
        o << " name=\"" << getName().c_str() << "\"";
    }

    for (std::map<std::string, std::string>::iterator it = fields.begin(); it != fields.end() ; ++it) {
        o << " " << (*it).first << "=\"" << (*it).second << "\"";
    }

    // end of the properties
    o << "/>" << std::endl;

}