Newer
Older
import cz.fidentis.analyst.project.Project;
import cz.fidentis.analyst.core.ControlPanel;
import cz.fidentis.analyst.face.HumanFace;

Matej Kovár
committed
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

Matej Kovár
committed
import javax.swing.JOptionPane;
/**
*
* @author Matej Kovar
*/
public class FaceStatePanel extends ControlPanel {
private final ImageIcon anonymousFace = new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + "face160x160.png"));

Matej Kovár
committed
private ImageIcon previewFace = null;
public static final String DEFAULT_ICON = "head28x28.png";
public static final String PRIMARY_FACE_ICON = "primaryFace28x28.png";
public static final String SECONDARY_FACE_ICON = "secondaryFace28x28.png";
public static final String NAME = "Face State";
/**
* All types of icons which this panel can have
* @author Matej Kovar
*/
public enum TypeOfIcon {
DEFAULT,
MANY_TO_MANY_PRIMARY,
MANY_TO_MANY_SECONDARY
}
private TypeOfIcon typeOfIcon = TypeOfIcon.DEFAULT;
// Loaded geometry info of face
private Map<String, FaceGeometryInfo> loadedFaces = new HashMap<>();
/**
* Panel with face information
* @param loadFaceListener ActionListener listens when load face button is clicked
*/
public FaceStatePanel(ActionListener loadFaceListener) {
this.setName(NAME);
initComponents();
loadInfoButton.addActionListener(loadFaceListener);
loadInfoButton.setToolTipText("Loads face geometry info from file in specified file path");
}
/**
* Panel with face information
* @param project where path to face is stored
* @param faceName name of the displayed face
* @param path path to face
*/
public FaceStatePanel(Project project, String faceName, Path path) {
// Listener for loading currently selected face (to show face state)
ActionListener listenerLoadFace = (ActionEvent e) -> {
HumanFace face = project.loadFace(faceName);
this.loadFaceGeometryInfo(face);
this.showFaceState(faceName, path);
};
this.setName(NAME);
initComponents();
loadInfoButton.addActionListener(listenerLoadFace);
loadInfoButton.setToolTipText("Loads face geometry info from file in specified file path");
//this.project = project;
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
filePanel = new javax.swing.JPanel();
pathLabel = new javax.swing.JLabel();
pathOutput = new javax.swing.JLabel();
featurePointsLabel = new javax.swing.JLabel();
featurePointsOutput = new javax.swing.JLabel();
previewLabel = new javax.swing.JLabel();
previewOutput = new javax.swing.JLabel();
textureLabel = new javax.swing.JLabel();
textureOutput = new javax.swing.JLabel();
geometryPanel = new javax.swing.JPanel();
verticesLabel = new javax.swing.JLabel();
verticesOutput = new javax.swing.JLabel();
facetsLabel = new javax.swing.JLabel();
facetsOutput = new javax.swing.JLabel();
fpLabel = new javax.swing.JLabel();
jComboBox1 = new javax.swing.JComboBox<>();
loadInfoButton = new javax.swing.JButton();
photoPanel = new javax.swing.JPanel();
photo = new javax.swing.JLabel();
filePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.filePanel.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N
pathLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.pathLabel.text")); // NOI18N
pathLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(pathOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.pathOutput.text")); // NOI18N
sizeLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(sizeLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.sizeLabel.text")); // NOI18N
sizeLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(sizeOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.sizeOutput.text")); // NOI18N
featurePointsLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(featurePointsLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.featurePointsLabel.text")); // NOI18N
featurePointsLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(featurePointsOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.featurePointsOutput.text")); // NOI18N
previewLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(previewLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.previewLabel.text")); // NOI18N
previewLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(previewOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.previewOutput.text")); // NOI18N
textureLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(textureLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.textureLabel.text")); // NOI18N
textureLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(textureOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.textureOutput.text")); // NOI18N
javax.swing.GroupLayout filePanelLayout = new javax.swing.GroupLayout(filePanel);
filePanel.setLayout(filePanelLayout);
filePanelLayout.setHorizontalGroup(
filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(filePanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(featurePointsLabel)
.addComponent(textureLabel)
.addComponent(previewLabel)
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(sizeLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(pathLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGap(10, 10, 10)
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(sizeOutput, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
.addComponent(featurePointsOutput, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(pathOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(previewOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(textureOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(0, 0, Short.MAX_VALUE))
);
filePanelLayout.setVerticalGroup(
filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(filePanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(pathOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(sizeLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(sizeOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(featurePointsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(featurePointsOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(previewLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(previewOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(filePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(textureLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(textureOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(14, 14, 14))
geometryPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.geometryPanel.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N
verticesLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(verticesLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.verticesLabel.text")); // NOI18N
verticesLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(verticesOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.verticesOutput.text")); // NOI18N
facetsLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(facetsLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.facetsLabel.text")); // NOI18N
facetsLabel.setEnabled(false);
org.openide.awt.Mnemonics.setLocalizedText(facetsOutput, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.facetsOutput.text")); // NOI18N
fpLabel.setFont(new java.awt.Font("Tahoma", 1, 10)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(fpLabel, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.fpLabel.text")); // NOI18N
fpLabel.setEnabled(false);
loadInfoButton.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(loadInfoButton, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.loadInfoButton.text")); // NOI18N
javax.swing.GroupLayout geometryPanelLayout = new javax.swing.GroupLayout(geometryPanel);
geometryPanel.setLayout(geometryPanelLayout);
geometryPanelLayout.setHorizontalGroup(
geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(geometryPanelLayout.createSequentialGroup()
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(geometryPanelLayout.createSequentialGroup()
.addComponent(verticesLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(verticesOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, geometryPanelLayout.createSequentialGroup()
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(facetsLabel)
.addComponent(fpLabel))
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(geometryPanelLayout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 286, Short.MAX_VALUE)
.addComponent(loadInfoButton)
.addGap(51, 51, 51))
.addGroup(geometryPanelLayout.createSequentialGroup()
.addGap(20, 20, 20)
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jComboBox1, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(facetsOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))))
.addContainerGap())
geometryPanelLayout.setVerticalGroup(
geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(geometryPanelLayout.createSequentialGroup()
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(verticesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(verticesOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(facetsLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(facetsOutput, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18)
.addGroup(geometryPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(fpLabel)
.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(53, 53, 53)
.addComponent(loadInfoButton)
.addContainerGap(34, Short.MAX_VALUE))
photoPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.photoPanel.border.title"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 1, 14))); // NOI18N
photo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/face160x160.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(photo, org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.photo.text")); // NOI18N

Matej Kovár
committed
photo.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
photoMouseClicked(evt);
}
});
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
javax.swing.GroupLayout photoPanelLayout = new javax.swing.GroupLayout(photoPanel);
photoPanel.setLayout(photoPanelLayout);
photoPanelLayout.setHorizontalGroup(
photoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(photoPanelLayout.createSequentialGroup()
.addGap(55, 55, 55)
.addComponent(photo)
.addGap(55, 55, 55))
);
photoPanelLayout.setVerticalGroup(
photoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(photoPanelLayout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(photo)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(filePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(geometryPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(photoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(photoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(filePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(geometryPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
filePanel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(FaceStatePanel.class, "FaceStatePanel.filePanel.AccessibleContext.accessibleName")); // NOI18N
}// </editor-fold>//GEN-END:initComponents

Matej Kovár
committed
public void setTypeOfIcon(TypeOfIcon typeOfIcon) {
this.typeOfIcon = typeOfIcon;
}

Matej Kovár
committed
private void photoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_photoMouseClicked
if (previewFace != null) {
JOptionPane.showMessageDialog(this.getParent(), previewFace, "Preview Image", JOptionPane.PLAIN_MESSAGE);
}
}//GEN-LAST:event_photoMouseClicked
/**
* Shows face information on panel
* @param faceName String
public void showFaceState(String faceName, Path path) {
pathOutput.setText(getPathText(path));
sizeOutput.setText(getSizeText(path));
featurePointsOutput.setText(getFeaturePointsText(path));
previewOutput.setText(getPreviewText(path));
textureOutput.setText(getTextureText(path));
verticesOutput.setText(getNumberOfVertices(faceName));
facetsOutput.setText(getNumberOfFacets(faceName));
}
@Override
public ImageIcon getIcon() {
switch (typeOfIcon) {
case MANY_TO_MANY_PRIMARY:
return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + PRIMARY_FACE_ICON));
case MANY_TO_MANY_SECONDARY:
return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + SECONDARY_FACE_ICON));
default:
break;
}
return new ImageIcon(FaceStatePanel.class.getClassLoader().getResource("/" + DEFAULT_ICON));
}
/**
* Gets photo which would be displayed on photo panel
* @param path Path
* @return ImageIcon either loaded face preview or anonymous face when preview is not found
*/
previewFace = null;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if (path != null && path.toFile().exists()) {
String pathString = path.toString();
Path preview = Paths.get(pathString.substring(0, pathString.lastIndexOf(".")).concat("_preview.jpg"));
BufferedImage image = ImageIO.read(preview.toFile());
BufferedImage zoomedImage = Scalr.resize(image, (int)screenSize.getWidth() / 2, (int)screenSize.getHeight() / 2);
BufferedImage smallImage = Scalr.resize(image, 240, 160);
previewFace = new ImageIcon(zoomedImage);
photo.setToolTipText("Click to enlarge the image");
} catch (IOException ex) {
//Exceptions.printStackTrace(ex);)
}
photo.setToolTipText("");
return anonymousFace;
/**
* Gets path text
* @param path Path
*/
private String getPathText(Path path) {
if (path != null) {
pathLabel.setEnabled(true);
return path.toString();
}
pathLabel.setEnabled(false);
return "";
}
/**
* Gets size of model ".obj"
* @param path Path
*/
private String getSizeText(Path path) {
if (path != null && path.toFile().exists()) {
try {
long bytes = Files.size(path);
sizeLabel.setEnabled(true);
return String.format("%,d kB", bytes / 1024);
} catch (IOException ex) {
//Exceptions.printStackTrace(ex);
// TODO HANDLE EXCEPTION
}
}
sizeLabel.setEnabled(false);
return "";
}
/**
* Gets path to feature points file
* @param path Path to face
* @return String path to feature points file or blank string
*/
private String getFeaturePointsText(Path path) {
if (path != null) {
featurePointsLabel.setEnabled(true);
String filePath = path.toString().split(".obj")[0] + "_landmarks.csv";
if ((new File(filePath)).exists()) {
return filePath;
}
filePath = path.toString().split("_ECA")[0] + "_landmarks.csv";
if ((new File(filePath)).exists()) {
return filePath;
}
filePath = path.toString().split("_CA")[0] + "_landmarks.csv";
if ((new File(filePath)).exists()) {
return filePath;
}
}
featurePointsLabel.setEnabled(false);
return "";
}
/**
* Gets path to preview file
* @param path Path to face
* @return String path to preview file or blank string
*/
private String getPreviewText(Path path) {
if (path != null) {
previewLabel.setEnabled(true);
String filePath = path.toString().split(".obj")[0] + "_preview.jpg";
if ((new File(filePath)).exists()) {
return filePath;
}
}
previewLabel.setEnabled(false);
return "";
}
/**
* Gets path to texture file
* @param path Path to face
* @return String path to texture file or blank string
*/
private String getTextureText(Path path) {
if (path != null) {
textureLabel.setEnabled(true);
String filePath = path.toString().split(".obj")[0] + ".jpg";
if ((new File(filePath)).exists()) {
return filePath;
}
}
textureLabel.setEnabled(false);
return "";
}
* Gets number of vertices from face mesh model
* @param faceName String name of face
* @return String number of vertices or blank string
private String getNumberOfVertices(String faceName) {
if (faceName != null && loadedFaces.get(faceName) != null) {
verticesLabel.setEnabled(true);
return "" + loadedFaces.get(faceName).getVerticesInfo();
verticesLabel.setEnabled(false);
return "";
}
/**
* Gets number of facets from face mesh model
* @param faceName String name of face
* @return String number of facets or blank string
*/
private String getNumberOfFacets(String faceName) {
if (faceName != null && loadedFaces.get(faceName) != null) {
facetsLabel.setEnabled(true);
return "" + loadedFaces.get(faceName).getFecetsInfo();
facetsLabel.setEnabled(false);
return "";
* Loads geometry info of face to loadedFaces
* @param faceName String name of face
*/
public void loadFaceGeometryInfo(String faceName) {
FaceGeometryInfo faceGeometryInfo = new FaceGeometryInfo(getNumberOfVertices(faceName), getNumberOfFacets(faceName), getFeaturePoints(faceName));
loadedFaces.put(faceName, faceGeometryInfo);
}
/**
* Gets feature points of face
* @param faceName String name of face
* @return feature points or empty list
private List<String> getFeaturePoints(String faceName) {
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
List<String> featurePoints = Collections.EMPTY_LIST;
if (loadedFaces.get(faceName) != null) {
featurePoints = loadedFaces.get(faceName).getFeaturePointsInfo()
.stream().collect(Collectors.toList());
return featurePoints;
}
return featurePoints;
}
/**
* Loads feature points to combo-box or disable feature points if face
* has not any
* @param faceName String name of face
*/
private void loadFeaturePoints(String faceName) {
DefaultComboBoxModel model = new DefaultComboBoxModel();
if (faceName != null &&
loadedFaces.get(faceName) != null &&
!loadedFaces.get(faceName).getFeaturePointsInfo().isEmpty()) {
fpLabel.setEnabled(true);
jComboBox1.setVisible(true);
} else {
fpLabel.setEnabled(false);
jComboBox1.setVisible(false);
if (faceName != null) {
model.addAll(getFeaturePoints(faceName));
public void loadFaceGeometryInfo(HumanFace face) {
String vertices = Long.toString(face.getMeshModel().getNumVertices());
String facets = Integer.toString(face.getMeshModel().getFacets().size());
List<String> featurePoints = face.getFeaturePoints().stream()
.map(fp -> fp.getFeaturePointType().getName())
.collect(Collectors.toList());
FaceGeometryInfo faceGeometryInfo = new FaceGeometryInfo(vertices, facets, featurePoints);
loadedFaces.put(face.getShortName(), faceGeometryInfo);
* Removes face from loadedFaces
* @param faceName String name of face
public void removeFaceByName(String faceName) {
loadedFaces.remove(faceName);
}
/**
* Removes all loaded faces
*/
public void clearLoadedFaces() {
loadedFaces.clear();
/**
* Face from list is (de)selected
* @param selected true if face is selected, false if deselected
* @param faceNames String name of face
* @param path Path to face
*/
public void newSelection(boolean selected, String faceName, Path path) {
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel facetsLabel;
private javax.swing.JLabel facetsOutput;
private javax.swing.JLabel featurePointsLabel;
private javax.swing.JLabel featurePointsOutput;
private javax.swing.JLabel fpLabel;
private javax.swing.JPanel geometryPanel;
private javax.swing.JComboBox<String> jComboBox1;
private javax.swing.JButton loadInfoButton;
private javax.swing.JLabel pathLabel;
private javax.swing.JLabel pathOutput;
private javax.swing.JLabel photo;
private javax.swing.JPanel photoPanel;
private javax.swing.JLabel previewLabel;
private javax.swing.JLabel previewOutput;
private javax.swing.JLabel sizeLabel;
private javax.swing.JLabel sizeOutput;
private javax.swing.JLabel textureLabel;
private javax.swing.JLabel textureOutput;
private javax.swing.JLabel verticesLabel;
private javax.swing.JLabel verticesOutput;
// End of variables declaration//GEN-END:variables
}