62,mainLayout(new QGridLayout(this))
63,showLoops(new QCheckBox(this))
64,colorScheme(new QComboBox(this))
65,manualColorButton(new QPushButton(
"Choose color…", this))
66,slippedAreaBox(new
controls::GroupBox(tr(
"&Slipped Area")))
67,sliderSlippedArea(new QSlider(this))
68,meshAreaBox(new
controls::GroupBox(tr(
"&Slipped Mesh")))
69,nodePolyData(vtkSmartPointer<vtkPolyData>::New())
70,nodeGlyphs(vtkSmartPointer<vtkGlyph3D>::New())
71,nodeMapper(vtkSmartPointer<vtkPolyDataMapper>::New())
72,nodeActor(vtkSmartPointer<vtkActor>::New())
73,labelPolyData(vtkSmartPointer<vtkPolyData>::New())
74,labelMapper(vtkSmartPointer<vtkLabeledDataMapper>::New())
75,labelActor(vtkSmartPointer<vtkActor2D>::New())
76,loopPolyData(vtkSmartPointer<vtkPolyData>::New())
77,loopMapper(vtkSmartPointer<vtkPolyDataMapper>::New())
78,loopActor(vtkSmartPointer<vtkActor>::New())
79,areaPolyData(vtkSmartPointer<vtkPolyData>::New())
80,areaMapper(vtkSmartPointer<vtkPolyDataMapper>::New())
81,areaActor(vtkSmartPointer<vtkActor>::New())
82,meshPolydata(vtkSmartPointer<vtkPolyData>::New())
83,meshMapper(vtkSmartPointer<vtkPolyDataMapper>::New())
84,meshActor(vtkSmartPointer<vtkActor>::New())
85,globalMeshSizeEdit(new QLineEdit(
"100000000"))
86,localMeshSizeEdit(new QLineEdit(
"1.0"))
91 nodeGlyphs->SetInputData(nodePolyData);
92 nodeGlyphs->SetSourceConnection(vtkSmartPointer<vtkSphereSource>::New()->GetOutputPort());
93 nodeGlyphs->ScalingOn();
94 nodeGlyphs->SetScaleModeToScaleByVector();
95 nodeGlyphs->SetScaleFactor(10);
96 nodeGlyphs->SetColorModeToColorByScalar();
98 nodeMapper->SetInputConnection(nodeGlyphs->GetOutputPort());
99 nodeActor->SetMapper(nodeMapper);
100 nodeActor->SetVisibility(
false);
103 labelMapper->SetInputData(labelPolyData);
104 labelMapper->SetLabelModeToLabelScalars();
105 labelMapper->SetLabelFormat(
"%1.0f");
106 labelMapper->GetLabelTextProperty()->SetFontSize(20);
107 labelActor->SetMapper(labelMapper);
108 labelActor->GetProperty()->SetColor(0.0, 0.0, 0.0);
109 labelActor->SetVisibility(
false);
112 showLoops->setChecked(
false);
113 showLoops->setText(
"Loops");
115 slippedAreaBox->setCheckable(
true);
116 slippedAreaBox->setChecked(
false);
118 meshAreaBox->setCheckable(
true);
119 meshAreaBox->setChecked(
false);
125 sliderSlippedArea->setMinimum(0);
126 sliderSlippedArea->setMaximum(10);
127 sliderSlippedArea->setValue(5);
128 sliderSlippedArea->setOrientation(Qt::Horizontal);
132 QGridLayout *slippedAreaLayout =
new QGridLayout();
134 "Opacity of slipped-area polygons: 0 is transparent and 10 is opaque.");
137 slippedAreaBox->setLayout(slippedAreaLayout);
153 QGridLayout *meshAreaLayout =
new QGridLayout();
155 meshAreaLayout, 0,
"Global size", globalMeshSizeEdit,
156 "Maximum triangle area away from the loop boundary, in b squared. Press Enter to rebuild the slipped mesh.");
158 "Spacing between refinement points along dislocation segments, in Burgers-vector units. Press "
159 "Enter to rebuild the slipped mesh.");
161 meshAreaBox->setLayout(meshAreaLayout);
164 controls::box(
"Loops",
this,
"Show or hide loop outlines, loop nodes and loop-node IDs.", showLoops);
166 "Appearance",
this,
"Color settings shared by outlines, node markers, slipped areas and slipped meshes.");
167 mainLayout->addWidget(loopsBox, 0, 0, 1, 2);
168 colorScheme->setObjectName(
"loopColorScheme");
169 colorScheme->addItems({
"Manual",
"Slip system"});
170 manualColorButton->setObjectName(
"loopManualColor");
172 "Manual uses one chosen color. Slip system follows the SlipSystems palette and its live updates.");
173 controls::grid(appearanceBox)->addWidget(manualColorButton, 1, 0, 1, 2);
174 manualColorButton->setToolTip(
"Choose the manual color for all loop geometry. Default is light green.");
175 mainLayout->addWidget(appearanceBox, 1, 0, 1, 2);
176 mainLayout->addWidget(slippedAreaBox, 2, 0, 1, 2);
177 mainLayout->addWidget(meshAreaBox, 3, 0, 1, 2);
178 mainLayout->setRowStretch(4, 1);
179 slippedAreaBox->setToolTip(
"Show or hide the area swept by each dislocation loop.");
180 meshAreaBox->setToolTip(
"Show or hide triangulated slipped areas; enabling this group builds the mesh.");
181 connect(colorScheme, &QComboBox::currentIndexChanged,
this,
187 connect(manualColorButton, &QPushButton::clicked,
this,
190 const QColor chosen = QColorDialog::getColor(manualColor,
this,
"Loop color");
201 this->setLayout(mainLayout);
203 connect(showLoops,SIGNAL(stateChanged(
int)),
this, SLOT(modify()));
205 connect(slippedAreaBox,SIGNAL(toggled(
bool)),
this, SLOT(modify()));
206 const auto refreshMesh = [
this]()
208 if(meshAreaBox->isChecked())
214 connect(meshAreaBox, &QGroupBox::toggled,
this, refreshMesh);
215 connect(globalMeshSizeEdit, &QLineEdit::returnPressed,
this, refreshMesh);
216 connect(localMeshSizeEdit, &QLineEdit::returnPressed,
this, refreshMesh);
218 connect(sliderSlippedArea,SIGNAL(valueChanged(
int)),
this, SLOT(modify()));
223 loopMapper->SetInputData(loopPolyData);
224 loopActor->SetMapper(loopMapper);
225 loopActor->GetProperty()->SetColor(0.0, 0.0, 1.0);
226 loopActor->SetVisibility(
false);
228 areaMapper->SetInputData(areaPolyData);
229 areaActor->SetMapper(areaMapper);
231 areaActor->SetVisibility(
false);
233 meshPolydata->Allocate();
234 meshMapper->SetInputData(meshPolydata);
235 meshActor->SetMapper ( meshMapper );
236 meshActor->SetVisibility(
false);
237 meshActor->GetProperty()->SetOpacity(0.8);
239 renderer->AddActor(nodeActor);
240 renderer->AddActor(labelActor);
241 renderer->AddActor(loopActor);
242 renderer->AddActor(areaActor);
243 renderer->AddActor(meshActor);
254 std::cout<<
"Updating loops..."<<std::flush;
255 const auto t0= std::chrono::system_clock::now();
258 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
259 vtkSmartPointer<vtkDoubleArray> nodeLabels(vtkSmartPointer<vtkDoubleArray>::New());
260 nodeLabels->SetNumberOfComponents(1);
261 nodeLabels->SetName(
"node IDs");
265 std::map<size_t,vtkIdType> loopNodeIndices;
266 nodeSlipSystems.clear();
269 const auto& loopNode(weakNode.second.lock());
270 const auto& P(loopNode->get_P());
271 loopNodeIndices.emplace(loopNode->sID,points->InsertNextPoint(P.data()));
272 nodeLabels->InsertNextTuple1(loopNode->sID);
273 nodeSlipSystems.push_back(loopNode->loop()->slipSystem().get());
276 nodePolyData->SetPoints(points);
278 nodePolyData->Modified();
280 labelPolyData->SetPoints(points);
281 labelPolyData->GetPointData()->SetScalars(nodeLabels);
282 labelPolyData->Modified();
285 vtkSmartPointer<vtkCellArray> cells(vtkSmartPointer<vtkCellArray>::New());
286 lineSlipSystems.clear();
287 areaSlipSystems.clear();
290 vtkSmartPointer<vtkLine> line(vtkSmartPointer<vtkLine>::New());
291 line->GetPointIds()->SetId(0, loopNodeIndices.at(loopLink.second.source->sID));
292 line->GetPointIds()->SetId(1, loopNodeIndices.at(loopLink.second.sink->sID));
293 cells->InsertNextCell(line);
294 lineSlipSystems.push_back(loopLink.second.loop->slipSystem().get());
298 loopPolyData->SetPoints(points);
299 loopPolyData->SetLines(cells);
300 loopPolyData->Modified();
303 vtkNew<vtkPoints> areaPoints;
304 vtkNew<vtkCellArray> areaPolygons;
307 areaPoints->SetDataTypeToDouble();
310 const auto& loop(weakloop.second.lock());
311 for(
const auto& pair : loop->patches().localPatches())
316 for(
size_t i=0;
i<3;++
i)
318 const Eigen::Vector3d position=pair.first->glidePlane->globalPosition(
triangle[
i]);
319 ids[
i]=areaPoints->InsertNextPoint(position.data());
321 areaPolygons->InsertNextCell(3,ids);
322 areaSlipSystems.push_back(loop->slipSystem().get());
326 areaPolyData->SetPoints(areaPoints);
327 areaPolyData->SetPolys(areaPolygons);
328 areaPolyData->Modified();
329 areaMapper->SetScalarModeToUseCellData();
334 if(meshAreaBox->isChecked())
336 vtkSmartPointer<vtkPoints> meshPts(vtkSmartPointer<vtkPoints>::New());
337 vtkSmartPointer<vtkCellArray> meshTriangles(vtkSmartPointer<vtkCellArray>::New());
338 meshSlipSystems.clear();
340 const double meshSize(std::atof(globalMeshSizeEdit->text() .toStdString().c_str()));
341 const double localMeshSize(std::atof(localMeshSizeEdit->text() .toStdString().c_str()));
342 size_t ptsIncrement(0);
345 const auto& loop(weakloop.second.lock());
346 for(
const auto& patchMesh : loop->meshed(meshSize,localMeshSize))
348 for(
const auto& point3d : patchMesh.points)
350 meshPts->InsertNextPoint(point3d(0),point3d(1),point3d(2));
352 for(
const auto&
tri : patchMesh.triangles)
354 vtkSmartPointer<vtkTriangle>
triangle = vtkSmartPointer<vtkTriangle>::New();
355 triangle->GetPointIds()->SetId (0,
tri(0)+ptsIncrement);
356 triangle->GetPointIds()->SetId (1,
tri(1)+ptsIncrement);
357 triangle->GetPointIds()->SetId (2,
tri(2)+ptsIncrement);
358 meshTriangles->InsertNextCell (
triangle );
359 meshSlipSystems.push_back(loop->slipSystem().get());
362 ptsIncrement+=patchMesh.points.size();
365 meshPolydata->SetPoints ( meshPts );
366 meshPolydata->SetPolys ( meshTriangles );
367 meshPolydata->Modified();
368 meshMapper->SetScalarModeToUseCellData();