forked from sofa-framework/SofaPython3
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPrefab.cpp
More file actions
116 lines (94 loc) · 3.95 KB
/
Prefab.cpp
File metadata and controls
116 lines (94 loc) · 3.95 KB
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
/******************************************************************************
* SofaPython3 plugin *
* (c) 2021 CNRS, University of Lille, INRIA *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This program 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 *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*******************************************************************************
* Contact information: [email protected] *
******************************************************************************/
#include <SofaPython3/Prefab.h>
#include <SofaPython3/DataHelper.h>
#include <SofaPython3/PythonFactory.h>
#include <SofaPython3/PythonEnvironment.h>
#include <sofa/simulation/DeleteVisitor.h>
#include <sofa/helper/system/FileMonitor.h>
using sofa::helper::system::FileMonitor;
using sofa::helper::system::FileEventListener;
#include <sofa/simulation/VisualVisitor.h>
using sofa::simulation::VisualInitVisitor;
#include <sofa/simulation/Simulation.h>
using sofa::simulation::Simulation;
/// Makes an alias for the pybind11 namespace to increase readability.
namespace py { using namespace pybind11; }
namespace sofapython3
{
using sofa::core::objectmodel::Event;
void Prefab::init()
{
Inherit1::init(sofa::core::execparams::defaultInstance());
m_is_initialized = true;
reinit();
}
void PrefabFileEventListener::fileHasChanged(const std::string &filename)
{
PythonEnvironment::gil acquire ;
py::dict local;
local["filename"] = filename;
py::eval("onReimpAFile(filename)", py::globals(), local);
m_prefab->clearLoggedMessages();
m_prefab->init();
}
void Prefab::reinit()
{
clearLoggedMessages();
/// remove everything in the node.
execute<sofa::simulation::DeleteVisitor>(sofa::core::execparams::defaultInstance());
doReInit();
sofa::simulation::node::init(this);
execute<VisualInitVisitor>(sofa::core::visual::visualparams::defaultInstance());
}
void Prefab::doReInit()
{
d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid);
}
Prefab::Prefab()
{
m_filelistener.m_prefab = this;
m_datacallback.addCallback( std::bind(&Prefab::reinit, this) );
}
Prefab::~Prefab()
{
FileMonitor::removeListener(&m_filelistener);
}
void Prefab::addPrefabParameter(const std::string& name, const std::string& help, const std::string& type, py::object defaultValue)
{
if(!findData(name) && !findLink(name))
{
sofa::core::objectmodel::BaseData* data = sofapython3::addData(py::cast(this), name, py::none(), defaultValue, help, "Prefab's properties", type);
data->setRequired(true);
m_datacallback.addInputs({data});
}
}
void Prefab::setSourceTracking(const std::string& filename)
{
FileMonitor::addFile(filename, &m_filelistener);
}
void Prefab::breakPrefab()
{
FileMonitor::removeListener(&m_filelistener);
for (auto& data : this->getDataFields())
if (data->getGroup() == "Prefab's properties")
m_datacallback.delInput(data);
}
} // namespace sofapython3