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);
modifiedGeometryindicates that the data of the object have changed. It can be emitted by using:this->touchGeometry();
modifiedStructureindicates that the structure (e.g., the connection of the control points) has changed. It can be emitted by using:this->touchStructure();
modifiedFieldindicates 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
setDataof the data inspector. A connection between the signalmodifiedGeometryand the slotupdateValuesallows 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
modifiedGeometryis sent, the slotupdateValuesis 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
modifiedGeometryis emitted. Here is the methodExecutein 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
setDataof the corresponding actor, the signalmodifiedGeometryis 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());