55 ,mainLayout(new QGridLayout(this))
56 ,showLinks(new QCheckBox(this))
57 ,sliderLinksRadius(new QSlider(this))
58 ,sliderNormalOpacity(new QSlider(Qt::Horizontal,this))
59 ,sliderZeroOpacity(new QSlider(Qt::Horizontal,this))
60 ,sliderBoundaryOpacity(new QSlider(Qt::Horizontal,this))
61 ,linksColorBox(new QComboBox(this))
63 ,polyData(vtkSmartPointer<vtkPolyData>::New())
64 ,polyDataBnd(vtkSmartPointer<vtkPolyData>::New())
65 ,polyData0(vtkSmartPointer<vtkPolyData>::New())
66 ,tubeFilter(vtkSmartPointer<vtkTubeFilter>::New())
67 ,tubeFilterBnd(vtkSmartPointer<vtkTubeFilter>::New())
68 ,tubeFilter0(vtkSmartPointer<vtkTubeFilter>::New())
69 ,tubeMapper(vtkSmartPointer<vtkPolyDataMapper>::New())
70 ,tubeActor(vtkSmartPointer<vtkActor>::New())
71 ,tubeMapperBnd(vtkSmartPointer<vtkPolyDataMapper>::New())
72 ,tubeActorBnd(vtkSmartPointer<vtkActor>::New())
73 ,tubeMapper0(vtkSmartPointer<vtkPolyDataMapper>::New())
74 ,tubeActor0(vtkSmartPointer<vtkActor>::New())
78 showLinks->setObjectName(
"showSegments");
79 showLinks->setChecked(
true);
80 showLinks->setText(
"links");
81 sliderLinksRadius->setEnabled(
true);
82 sliderLinksRadius->setMinimum(0);
83 sliderLinksRadius->setMaximum(30);
84 sliderLinksRadius->setValue(5);
85 sliderLinksRadius->setOrientation(Qt::Horizontal);
87 sliderNormalOpacity->setObjectName(
"normalSegmentOpacity");
88 sliderNormalOpacity->setRange(0,100);
89 sliderNormalOpacity->setValue(100);
90 sliderZeroOpacity->setObjectName(
"zeroBurgersOpacity");
91 sliderBoundaryOpacity->setObjectName(
"boundarySegmentOpacity");
92 for(
auto* slider : {sliderZeroOpacity,sliderBoundaryOpacity})
94 slider->setRange(0,100);
97 tubeActor0->SetVisibility(
false);
98 tubeActorBnd->SetVisibility(
false);
100 linksColorBox->addItem(
"Burgers vector");
101 linksColorBox->addItem(
"plane normal");
102 linksColorBox->addItem(
"glissile/sessile");
103 linksColorBox->addItem(
"edge/screw");
104 linksColorBox->addItem(
"slip system");
106 auto *segmentsBox =
controls::box(
"Segments",
this,
"Show or hide dislocation segments.", showLinks);
108 "Tube radius in simulation length units b. Changes apply immediately.");
111 "Choose which dislocation property determines segment color. Slip system uses the SlipSystems palette.");
113 "Opacity of nonzero-Burgers segments away from external and grain boundaries. 0 is transparent; 100 is opaque.");
115 "Opacity of segments with zero net Burgers vector, including those on boundaries. 0 is transparent; 100 is opaque.");
117 "Opacity of nonzero-Burgers segments on external boundaries or grain boundaries, including periodic grain boundaries. 0 is transparent; 100 is opaque.");
118 mainLayout->addWidget(segmentsBox, 0, 0);
119 mainLayout->setRowStretch(1, 1);
120 this->setLayout(mainLayout);
122 connect(showLinks,SIGNAL(stateChanged(
int)),
this, SLOT(modify()));
123 connect(sliderNormalOpacity,SIGNAL(valueChanged(
int)),
this, SLOT(modify()));
124 connect(sliderZeroOpacity,SIGNAL(valueChanged(
int)),
this, SLOT(modify()));
125 connect(sliderBoundaryOpacity,SIGNAL(valueChanged(
int)),
this, SLOT(modify()));
126 connect(sliderLinksRadius,SIGNAL(valueChanged(
int)),
this, SLOT(modify()));
128 tubeFilter->SetInputData(polyData);
129 tubeFilter->SetRadius(5.0);
130 tubeFilter->SetNumberOfSides(10);
131 tubeFilter->Update();
132 tubeMapper->SetInputConnection(tubeFilter->GetOutputPort());
133 tubeMapper->ScalarVisibilityOn();
134 tubeMapper->SetScalarModeToUseCellFieldData();
135 tubeMapper->SelectColorArray(
"Colors");
136 tubeActor->SetMapper(tubeMapper);
139 tubeFilterBnd->SetInputData(polyDataBnd);
140 tubeFilterBnd->SetRadius(5.0);
141 tubeFilterBnd->SetNumberOfSides(10);
142 tubeFilterBnd->Update();
143 tubeMapperBnd->SetInputConnection(tubeFilterBnd->GetOutputPort());
144 tubeMapperBnd->ScalarVisibilityOn();
145 tubeActorBnd->SetMapper(tubeMapperBnd);
146 tubeActorBnd->GetProperty()->SetOpacity(0.0);
149 tubeFilter0->SetInputData(polyData0);
150 tubeFilter0->SetRadius(5.0);
151 tubeFilter0->SetNumberOfSides(10);
152 tubeFilter0->Update();
153 tubeMapper0->SetInputConnection(tubeFilter0->GetOutputPort());
154 tubeMapper0->ScalarVisibilityOn();
155 tubeActor0->SetMapper(tubeMapper0);
156 tubeActor0->GetProperty()->SetColor(0.5, 0.5, 0.5);
157 tubeActor0->GetProperty()->SetOpacity(0.0);
159 renderer->AddActor(tubeActor);
160 renderer->AddActor(tubeActorBnd);
161 renderer->AddActor(tubeActor0);
166 std::cout<<
"Updating links..."<<std::flush;
167 const auto t0= std::chrono::system_clock::now();
170 vtkSmartPointer<vtkFloatArray> radii(vtkSmartPointer<vtkFloatArray>::New());
171 vtkSmartPointer<vtkUnsignedCharArray> colors(vtkSmartPointer<vtkUnsignedCharArray>::New());
172 vtkSmartPointer<vtkUnsignedCharArray> colorsBnd(vtkSmartPointer<vtkUnsignedCharArray>::New());
173 radii->SetName(
"TubeRadius");
174 colors->SetName(
"Colors");
175 colorsBnd->SetNumberOfComponents(3);
176 colors->SetNumberOfComponents(3);
177 vtkSmartPointer<vtkCellArray> cells(vtkSmartPointer<vtkCellArray>::New());
178 vtkSmartPointer<vtkCellArray> cellsBnd(vtkSmartPointer<vtkCellArray>::New());
179 vtkSmartPointer<vtkCellArray> cells0(vtkSmartPointer<vtkCellArray>::New());
182 std::map<size_t,vtkIdType> nodeIndices;
185 nodeIndices.emplace(entry.first,
static_cast<vtkIdType
>(nodeIndices.size()));
193 vtkSmartPointer<vtkLine> line(vtkSmartPointer<vtkLine>::New());
194 line->GetPointIds()->SetId(0, nodeIndices.at(link.second.lock()->source->sID));
195 line->GetPointIds()->SetId(1, nodeIndices.at(link.second.lock()->sink->sID));
197 if(link.second.lock()->hasZeroBurgers())
199 cells0->InsertNextCell(line);
203 Eigen::Matrix<int,3,1> colorVector=
computeColor(link.second.lock()->burgers(),link.second.lock()->chord(),link.second.lock()->slipSystem(),sscm);
204 unsigned char lineClr[3]={(
unsigned char) colorVector(0),(
unsigned char) colorVector(1),(
unsigned char) colorVector(2)};
206 if(link.second.lock()->isGrainBoundarySegment() || link.second.lock()->isBoundarySegment())
208 cellsBnd->InsertNextCell(line);
209 colorsBnd->InsertNextTypedTuple(lineClr);
213 cells->InsertNextCell(line);
214 colors->InsertNextTypedTuple(lineClr);
215 radii->InsertNextValue(link.second.lock()->burgers().norm()*sliderLinksRadius->value());
302 polyData->SetPoints(nodePolyData->GetPoints());
303 polyData->SetLines(cells);
304 polyData->GetCellData()->AddArray(colors);
305 polyData->GetPointData()->AddArray(radii);
306 polyData->GetPointData()->SetActiveScalars(
"TubeRadius");
307 polyData->Modified();
309 polyDataBnd->SetPoints(nodePolyData->GetPoints());
310 polyDataBnd->SetLines(cellsBnd);
311 polyDataBnd->GetCellData()->SetScalars(colorsBnd);
312 polyDataBnd->Modified();
314 polyData0->SetPoints(nodePolyData->GetPoints());
315 polyData0->SetLines(cells0);
316 polyData0->Modified();
376 switch (linksColorBox->currentIndex())
381 clrVector = burgers.normalized();
390 clrVector=slipSystem->unitNormal;
399 clrVector(0)= slipSystem? 1.0 : 0.1;
400 clrVector(1)= slipSystem? 0.5 : 0.4;
401 clrVector(2)= slipSystem? 0.0 : 0.9;
407 const float u = acos(std::fabs(chord.normalized().dot(burgers.normalized())))*2.0/std::numbers::pi;
411 clrVector=VectorDim::UnitX()*
u+VectorDim::UnitZ()*(1.0-
u);
417 clrVector=VectorDim::Zero();
421 const auto ssIter(sscm.find(slipSystem.get()));
422 if(ssIter!=sscm.end())
424 clrVector=ssIter->second->rgb().template cast<double>()/255.0;