Signals between Axl objects¶
Signals are exchanged between the objects of the following types:
- Data: geometric objects, such as points, lines, planes, …
- Inspector: tools, which display the information on the geometric objects and allow to edit them;
- Actor: tools, which allow to modify graphically the objects;
The signals are exchanged between data and inspectors and bewteen data and actors, to update the information attached to these classes.
Data¶
Each Axl data which inherits from axlAbstractData
has signals attached to it:
signals:
void modifiedGeometry(void);
void modifiedStructure(void);
void modifiedField(void);
modifiedGeometry
indicates that the data of the object have changed. It can be emitted by using:this->touchGeometry();
modifiedStructure
indicates that the structure (e.g., the connection of the control points) has changed. It can be emitted by using:this->touchStructure();
modifiedField
indicates that the field attached to the object has changed. It can be emitted by using:this->touchField();
Inspector¶
Two types of messages need to be considered.
First, when values such as the coordinates of a point are modified from the inspector, the corresponding data are modified. This is done with the connection:
connect(d->coordinate_x, SIGNAL(valueChanged(double)), this, SLOT(onCoordDataChanged_x(double)));
via the method
onCoordDataChanged_x
:void axlInspectorObjectPoint::onCoordDataChanged_x(double x) { d->point->x() = x; d->point->touchGeometry(); emit update(); }
Secondly, when the object is modified, the data inspector should update its displayed values. This is done in the method
setData
of the data inspector. A connection between the signalmodifiedGeometry
and the slotupdateValues
allows to update the values displayed by the data inspector when the data is modified:{ return QSize(300, 300); } void axlInspectorObjectPoint::setData(axlPoint *point) {
Here is the method
updateValues
, which updates the values displayed by the inspector:void axlInspectorObjectPoint::onChangedBoxValue_y(void) { double y = d->point->y(); d->coordinate_y->setValue(y); }
When the signal
modifiedGeometry
is sent, the slotupdateValues
is evaluated and the displayed values of the coordinates in the inspector are updated according to the coordinates of the point.
Actor¶
Here also, two types of messages need to be considered.
When the widget in the actor Data Observer modifies the data, a signal
modifiedGeometry
is emitted. Here is the methodExecute
in the classaxlActorPointObserver
, which send this signal:virtual void Execute(vtkObject *caller, unsigned long event, void *) { vtkRenderWindowInteractor *interactor = observerDataAssembly->getInteractor(); //interactor->Render(); if(event == vtkCommand::InteractionEvent) { observerData_sphereSource->Update(); observerData_sphereSource->Modified(); interactor->Render(); if (!pointWidget) return; if(caller == pointWidget) { observerData_point->setCoordinates(pointWidget->GetPosition()[0], pointWidget->GetPosition()[1], pointWidget->GetPosition()[2]); observerData_point->touchGeometry();
When the data is modified, the actor should be updated. In the method
setData
of the corresponding actor, the signalmodifiedGeometry
is connected with the slotonUpdateGeometry
, which updates the actor data:connect(d->point, SIGNAL(modifiedGeometry()),this, SLOT(onUpdateGeometry()));
Here is the method
onUpdateGeometry
, which update the source and widget of the actor:} //remove actor specificity this->RemoveAllObservers(); this->RemovePart(this->getActor()); this->getActor()->RemoveAllObservers(); if(axlActorComposite *actorComposite = dynamic_cast<axlActorComposite *>(this->parent()) ) actorComposite->removeActorReference(this); } void axlActorPoint::onUpdateGeometry(void) { d->sphereSource->SetCenter(d->point->coordinates());