use of facetmodeller.plc.Node in project facetmodeller by pglelievre.
the class ModelManager method readSessionInformation.
@Override
public String readSessionInformation(BufferedReader reader, boolean merge) {
// I need to construct new objects as I read the file:
PLC plc2 = new PLC();
SectionVector sections2 = new SectionVector();
GroupVector groups2 = new GroupVector();
// Read the number of dimensions, nodes, facets, regions, samples and groups:
String textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading number of dimensions, etc.";
}
int ndim, nnodes, nregions, nfacets, nsections, ngroups;
textLine = textLine.trim();
String[] ss = textLine.split("[ ]+");
if (ss.length < 6) {
return "Not enough values on number of dimensions etc. line.";
}
try {
// converts to integer
ndim = Integer.parseInt(ss[0].trim());
// converts to integer
nnodes = Integer.parseInt(ss[1].trim());
// converts to integer
nfacets = Integer.parseInt(ss[2].trim());
// converts to integer
nregions = Integer.parseInt(ss[3].trim());
// converts to integer
nsections = Integer.parseInt(ss[4].trim());
// converts to integer
ngroups = Integer.parseInt(ss[5].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
return "Parsing number of dimensions, etc.";
}
// Check ndim:
if (ndim != numberOfDimensions()) {
return "Incorrect number of dimensions.";
}
// ---------- IN THE FIRST PASS I READ ALL INFORMATION OTHER THAN ID'S AND CREATE NEW OBJECTS ----------
// Skip the commented start of node definitions:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of node definitions.";
}
// Loop over each node:
for (int i = 0; i < nnodes; i++) {
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading node ID etc. line.";
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length < 2) {
return "Not enough values on node ID etc. line.";
}
int nodeType;
boolean bmarker = false;
try {
int nodeID = Integer.parseInt(ss[0].trim());
if (nodeID != i) {
return "Unmatched node ID";
}
nodeType = Integer.parseInt(ss[1].trim());
if (ss.length > 2) {
bmarker = Boolean.parseBoolean(ss[2].trim());
}
} catch (NumberFormatException e) {
return "Parsing node ID etc.";
}
Node node;
switch(nodeType) {
case Node.NODE_ON_SECTION:
node = new NodeOnSection();
break;
case Node.NODE_OFF_SECTION:
node = new NodeOffSection();
break;
default:
return "Unmatched node type.";
}
if (node == null) {
return "Unexpected empty new Node created.";
}
// Set the node boundary marker:
node.setBoundaryMarker(bmarker);
// Read the additional information for the node (depends on the node type):
String msg = node.readSessionInformation(reader, merge);
if (msg != null) {
return "Reading information for node " + i + "." + System.lineSeparator() + msg.trim();
}
plc2.addNode(node);
}
// Loop over each facet:
for (int i = 0; i < nfacets; i++) {
// Add a new empty facet to the plc (these facets are filled later):
plc2.addFacet(new Facet());
}
// Skip the commented start of region definitions:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of region definitions.";
}
// Loop over each region:
for (int i = 0; i < nregions; i++) {
// Make a new region object:
Region region = new Region();
// Read the region information:
region.readSessionInformation(reader, merge);
// Add the region to the plc:
// section and group membership will be added later
plc2.addRegion(region);
}
// Skip the commented start of section definitions:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of section definitions.";
}
for (int i = 0; i < nsections; i++) {
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of ith section definition.";
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading section type.";
}
textLine = textLine.trim();
int sectionType;
try {
sectionType = Integer.parseInt(textLine);
} catch (NumberFormatException e) {
return "Parsing section type.";
}
Section section;
switch(sectionType) {
case Section.SECTION_IMAGE_CROSS:
section = new ImageCrossSection();
break;
case Section.SECTION_IMAGE_DEPTH:
section = new ImageDepthSection();
break;
case Section.SECTION_NOIMAGE_CROSS:
section = new NoImageCrossSection();
break;
case Section.SECTION_NOIMAGE_DEPTH:
section = new NoImageDepthSection();
break;
case Section.SECTION_SNAPSHOT:
section = new SnapshotSection();
break;
case Section.SECTION_TOPO:
// replacement for obsolete TopoSection (.node and .ele file will be read later)
section = new NoImageDepthSection(true);
break;
default:
return "Unmatched section type.";
}
if (section == null) {
return "Unexpected empty new Section created.";
}
String msg = section.readSessionInformation(reader, merge);
if (msg != null) {
return "Reading information for section " + i + "." + System.lineSeparator() + msg.trim();
}
sections2.add(section);
}
// Skip the commented start of group definitions:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of group definitions.";
}
// Loop over each group:
for (int i = 0; i < ngroups; i++) {
// Create a new group object:
Group group = new Group();
// Read the group information:
String msg = group.readSessionInformation(reader, merge);
if (msg != null) {
return "Reading information for group" + i + "." + System.lineSeparator() + msg.trim();
}
// Add the group to the list of groups:
groups2.add(group);
}
// ---------- IN THE SECOND PASS I READ THE ID'S AND SET THE CROSS-LINKAGES ----------
// Skip the commented start of node linkages:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of node linkages.";
}
// Loop over each node:
for (int i = 0; i < nnodes; i++) {
Node node = plc2.getNode(i);
// The node gets linked to the facets in the loop over each facet below.
// Read the section id and group id:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading node section and group IDs line.";
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length < 2) {
return "Not enough values on node section and group IDs line.";
}
// section and group id
int sid, gid;
try {
// converts to integer
sid = Integer.parseInt(ss[0].trim());
// converts to integer
gid = Integer.parseInt(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
return "Parsing node section and group IDs.";
}
// Cross-link the node and section:
node.setSection(sections2.get(sid));
sections2.get(sid).addNode(node);
// Cross-link the node and group:
node.setGroup(groups2.get(gid));
groups2.get(gid).addNode(node);
}
// Skip the commented start of facet linkages:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of facet linkages.";
}
// Loop over each facet:
for (int i = 0; i < nfacets; i++) {
Facet facet = plc2.getFacet(i);
// Read the node id's and link those nodes to the facet:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading facet node IDs line.";
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length < 1) {
return "No values on facet node IDs line.";
}
// number of nodes
int n;
try {
// converts to integer
n = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
return "Parsing facet node length.";
}
if (ss.length < n + 1) {
return "Not enough values on facet node IDs line.";
}
for (int j = 0; j < n; j++) {
// node id
int id;
try {
// converts to integer
id = Integer.parseInt(ss[j + 1].trim());
} catch (NumberFormatException e) {
return "Parsing facet node ID.";
}
// Cross-link the facet and node:
facet.addNode(plc2.getNode(id));
plc2.getNode(id).addFacet(facet);
}
// Read the section id's:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading facet section ID line.";
}
/*
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length<1) { return "No values on facet section ID line."; }
try {
n = Integer.parseInt(ss[0].trim()); // converts to integer
} catch (NumberFormatException e) { return "Parsing facet section length."; }
if ( ss.length < n+1 ) { return "Not enough values on facet section ID line."; }
for (int j=0 ; j<n ; j++ ) {
int id;
try {
id = Integer.parseInt(ss[j+1].trim()); // converts to integer
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { return "Parsing facet section ID."; }
// Cross-link the facet and section:
// facet.addSection( sections.get(id) ); // no longer necessary because facet sections defined by the facet nodes
sections2.get(id).addFacet(facet);
}
*/
// Read the group id and boundary marker:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading facet group ID and boundary marker line.";
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length < 1) {
return "No values on facet group ID and boundary marker line.";
}
int id;
boolean bmarker = false;
try {
// converts to integer
id = Integer.parseInt(ss[0].trim());
if (ss.length > 1) {
bmarker = Boolean.parseBoolean(ss[1].trim());
}
} catch (NumberFormatException e) {
return "Parsing facet group ID and boundary marker line.";
}
// Set the facet boundary marker:
facet.setBoundaryMarker(bmarker);
// Cross-link the facet and group:
facet.setGroup(groups2.get(id));
groups2.get(id).addFacet(facet);
}
// Skip the commented start of region linkages:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of region linkages.";
}
// Loop over each region:
for (int i = 0; i < nregions; i++) {
Region region = plc2.getRegion(i);
// Read the section id:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading region section ID line.";
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length < 1) {
return "No values on region section ID line.";
}
int id;
try {
// converts to integer
id = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
return "Parsing region section ID.";
}
// Cross-link the region and section:
region.setSection(sections2.get(id));
sections2.get(id).addRegion(region);
// Read the group id and link that group to the node:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Reading region group ID line.";
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
if (ss.length < 1) {
return "No values on region group ID line.";
}
try {
// converts to integer
id = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
return "Parsing region group ID.";
}
// Cross-link the region and group:
region.setGroup(groups2.get(id));
// groups.get(id).setRegion(region);
groups2.get(id).addRegion(region);
}
// ---------- Read the VOI information: ----------
// Skip the commented start of the VOI information:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
return "Skipping start of VOI information.";
}
// Read the VOI:
VOI voi2 = new VOI();
String msg = voi2.readSessionInformation(reader, merge);
if (msg != null) {
if (msg.startsWith("Null")) {
// Assume encountered line with "null" in it:
voi2 = null;
} else {
return msg;
}
}
// If overwriting then set existing information to new information, otherwise combine the information:
if (merge) {
// Don't change the VOI!
plc.addAll(plc2);
groups.addAll(groups2);
} else {
// these aren't necessary because the garbage collection should deal with them
plc.clear();
groups.clear();
voi = voi2;
plc = plc2;
groups = groups2;
}
if (merge && ndim == 3) {
sections.addAll(sections2);
} else {
sections.clear();
sections = sections2;
}
// Return successfully:
return null;
}
use of facetmodeller.plc.Node in project facetmodeller by pglelievre.
the class ModelManager method writeSessionInformation.
@Override
public boolean writeSessionInformation(BufferedWriter writer) {
// Write the number of dimensions, nodes, facets, regions, sections and groups:
int ndim = numberOfDimensions();
int nnodes = numberOfNodes();
int nfacets = numberOfFacets();
int nregions = numberOfRegions();
int nsections = numberOfSections();
int ngroups = numberOfGroups();
String textLine = ndim + " " + nnodes + " " + nfacets + " " + nregions + " " + nsections + " " + ngroups;
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Comment start of node definitions:
if (!FileUtils.writeLine(writer, "# NODES")) {
return false;
}
// Loop over each node:
for (int i = 0; i < nnodes; i++) {
Node node = getNode(i);
// Write node ID, indication of ith node type and boundary marker (the latter is a later addition):
textLine = node.getID() + " " + node.getType() + " " + node.getBoundaryMarker();
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Write the node information:
if (!node.writeSessionInformation(writer)) {
return false;
}
}
// Comment start of region definitions:
if (!FileUtils.writeLine(writer, "# REGIONS")) {
return false;
}
// Loop over each region:
for (int i = 0; i < nregions; i++) {
Region region = getRegion(i);
// Write the region information information:
if (!region.writeSessionInformation(writer)) {
return false;
}
}
// Comment start of section definitions:
if (!FileUtils.writeLine(writer, "# SECTIONS")) {
return false;
}
// Loop over each section:
for (int i = 0; i < nsections; i++) {
Section section = getSection(i);
// Comment start of ith section definition:
textLine = "# Section " + section.getID();
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Write indication of the type of section:
textLine = Integer.toString(section.getType());
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Write the section information:
if (!section.writeSessionInformation(writer)) {
return false;
}
}
// Comment start of group definitions:
if (!FileUtils.writeLine(writer, "# GROUPS")) {
return false;
}
// Loop over each group:
for (int i = 0; i < ngroups; i++) {
Group group = getGroup(i);
// Write the group information:
if (!group.writeSessionInformation(writer)) {
return false;
}
}
// Comment start of node linkages:
if (!FileUtils.writeLine(writer, "# NODE LINKS")) {
return false;
}
// Loop over each node:
for (int i = 0; i < nnodes; i++) {
Node node = getNode(i);
// FacetVector facets = node.getFacets();
/* I don't need to write the facet id's here because
* the same information is written below in the loop over each facet. */
// Write the section id and group id:
textLine = node.getSection().getID() + " " + node.getGroup().getID();
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
}
// Comment start of node linkages:
if (!FileUtils.writeLine(writer, "# FACET LINKS")) {
return false;
}
// Loop over each facet:
for (int i = 0; i < nfacets; i++) {
Facet facet = getFacet(i);
NodeVector nodes = facet.getNodes();
SectionVector facetSections = facet.getSections();
// Write the node id's:
int n = nodes.size();
textLine = Integer.toString(n);
for (int j = 0; j < n; j++) {
textLine = textLine + " " + nodes.get(j).getID();
}
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Write the section id's:
n = facetSections.size();
textLine = Integer.toString(n);
for (int j = 0; j < n; j++) {
textLine = textLine + " " + facetSections.get(j).getID();
}
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Write the group id and boundary marker (the latter is a later addition):
textLine = facet.getGroup().getID() + " " + facet.getBoundaryMarker();
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
}
// Comment start of node linkages:
if (!FileUtils.writeLine(writer, "# REGION LINKS")) {
return false;
}
// Loop over each region:
for (int i = 0; i < nregions; i++) {
Region region = getRegion(i);
// Write the section id:
textLine = Integer.toString(region.getSection().getID());
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
// Write the group id:
textLine = Integer.toString(region.getGroup().getID());
if (!FileUtils.writeLine(writer, textLine)) {
return false;
}
}
// Comment start of VOI information:
if (!FileUtils.writeLine(writer, "# VOI")) {
return false;
}
// Write the VOI:
if (hasVOI()) {
if (!getVOI().writeSessionInformation(writer)) {
return false;
}
} else {
if (!FileUtils.writeLine(writer, "null")) {
return false;
}
}
// Return true:
return true;
}
use of facetmodeller.plc.Node in project facetmodeller by pglelievre.
the class SessionLoader method loadSessionAscii2.
private static boolean loadSessionAscii2(FacetModeller controller, File file, boolean merge) {
int loadVersion = 2;
// We will be constructing some new objects as we read the file:
PLC plc = new PLC();
SectionVector sections = new SectionVector();
GroupVector groups = new GroupVector();
// We will be saving some information to set later:
int ndim;
// these colours will be overwritten
Color calibrationColor = Color.CYAN;
Color edgeColor = Color.BLACK;
Color defineFacetEdgeColor = Color.WHITE;
int pointWidth = 5;
int lineWidth = 1;
// Open the file for reading:
BufferedReader reader = FileUtils.openForReading(file);
if (reader == null) {
return false;
}
// Put everything below in an infinite loop that we can break out of when something goes wrong:
boolean ok = true;
while (true) {
// Read the floored version number:
String textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
String[] ss = textLine.split("[ ]+", 2);
int version;
try {
// converts to integer
version = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
if (!ok) {
break;
}
// Check the version number:
if (version != loadVersion) {
// Close the file:
FileUtils.close(reader);
// Return unsuccessfully:
return false;
}
// Read the number of dimensions, nodes, facets, regions, samples and groups:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
int nnodes, nregions, nfacets, nsections, ngroups;
textLine = textLine.trim();
ss = textLine.split("[ ]+", 7);
try {
// converts to integer
ndim = Integer.parseInt(ss[0].trim());
// converts to integer
nnodes = Integer.parseInt(ss[1].trim());
// converts to integer
nfacets = Integer.parseInt(ss[2].trim());
// converts to integer
nregions = Integer.parseInt(ss[3].trim());
// converts to integer
nsections = Integer.parseInt(ss[4].trim());
// converts to integer
ngroups = Integer.parseInt(ss[5].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
// Check ndim:
if (ndim != controller.numberOfDimensions()) {
ok = false;
break;
}
// Loop over each node:
for (int i = 0; i < nnodes; i++) {
// Read the coordinates of the ith node:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
boolean isTopo;
// initialization of z is needed to avoid compiler warning
double x, y, z = 0.0;
textLine = textLine.trim();
ss = textLine.split("[ ]+", 4);
try {
isTopo = Boolean.parseBoolean(ss[0].trim());
// converts to Double
x = Double.parseDouble(ss[1].trim());
// converts to Double
y = Double.parseDouble(ss[2].trim());
if (isTopo) {
z = Double.parseDouble(ss[3].trim());
}
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
// Add a new node to the plc:
if (isTopo) {
plc.addNode(new NodeOffSection(x, y, z));
} else {
plc.addNode(new NodeOnSection(x, y));
}
// section and group membership will be added later
}
if (!ok) {
break;
}
// Loop over each facet:
for (int i = 0; i < nfacets; i++) {
// Add a new empty facet to the plc (these facets are filled later):
plc.addFacet(new Facet());
}
// Loop over each region:
for (int i = 0; i < nregions; i++) {
// Read the coordinates of the ith region and the isControl information:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
double x, y;
boolean isCon;
textLine = textLine.trim();
ss = textLine.split("[ ]+", 4);
// Try parsing coordinates (must be able to do this):
try {
// converts to Double
x = Double.parseDouble(ss[0].trim());
// converts to Double
y = Double.parseDouble(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
// Check for iscontrol information:
if (ss.length < 3) {
isCon = false;
} else {
if (ss[2].trim().isEmpty()) {
// missing from file (old version of session saver was used)
isCon = false;
} else {
// converts to Boolean
isCon = Boolean.parseBoolean(ss[2].trim());
}
}
// Add a new region to the plc:
// section and group membership will be added later
plc.addRegion(new Region(isCon, x, y));
}
if (!ok) {
break;
}
for (int i = 0; i < nsections; i++) {
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
int sectionType;
try {
sectionType = Integer.parseInt(textLine);
} catch (NumberFormatException e) {
ok = false;
break;
}
if (!ok) {
break;
}
Section section = null;
switch(sectionType) {
case 1:
// Read the file name:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
File imageFile;
if (textLine.startsWith("null")) {
imageFile = null;
} else {
try {
URI uri = new URI(textLine);
// image file or .node file
imageFile = new File(uri);
} catch (URISyntaxException e) {
ok = false;
break;
}
}
// Make a new HasImage object associated with the file:
section = new ImageCrossSection(imageFile);
break;
case 3:
// Read the section name:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
String name = textLine.trim();
// Read the image height:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
int height;
try {
height = Integer.parseInt(textLine);
} catch (NumberFormatException e) {
ok = false;
break;
}
// Read the image color:
Color color;
try {
// parse from RGB string
color = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
section = new NoImageCrossSection(name, color);
break;
case 2:
File nodeFile = null;
File eleFile = null;
// Read the node file name:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
if (textLine.startsWith("null")) {
nodeFile = null;
} else {
URI uri = null;
try {
uri = new URI(textLine);
} catch (URISyntaxException e) {
ok = false;
}
if (!ok) {
break;
}
try {
// image file or .node file
nodeFile = new File(uri);
} catch (IllegalArgumentException e) {
ok = false;
}
}
if (!ok) {
break;
}
// Read the ele file name:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
if (textLine.startsWith("null")) {
eleFile = null;
} else {
try {
URI uri = new URI(textLine);
// image file or .node file
eleFile = new File(uri);
} catch (URISyntaxException e) {
ok = false;
}
}
if (!ok) {
break;
}
// formerly a TopoSection
section = new NoImageDepthSection(nodeFile, eleFile);
break;
default:
ok = false;
break;
}
if (!ok) {
break;
}
if (section == null) {
ok = false;
break;
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+", 2);
Dir3D sliceDirection;
try {
// converts to integer
int idir = Integer.parseInt(ss[0].trim());
sliceDirection = Dir3D.fromInt(idir);
} catch (NumberFormatException e) {
ok = false;
break;
}
if (!ok) {
break;
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+", 2);
double loc;
try {
// converts to Double
loc = Double.parseDouble(ss[0].trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
if (!ok) {
break;
}
double x, y;
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
if (!textLine.startsWith("null")) {
ss = textLine.split("[ ]+", 3);
try {
// converts to Double
x = Double.parseDouble(ss[0].trim());
// converts to Double
y = Double.parseDouble(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
section.setTyped1(new MyPoint3D(x, y, sliceDirection, loc));
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
if (!textLine.startsWith("null")) {
ss = textLine.split("[ ]+", 3);
try {
// converts to Double
x = Double.parseDouble(ss[0].trim());
// converts to Double
y = Double.parseDouble(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
section.setTyped2(new MyPoint3D(x, y, sliceDirection, loc));
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
if (!textLine.startsWith("null")) {
ss = textLine.split("[ ]+", 3);
try {
// converts to Double
x = Double.parseDouble(ss[0].trim());
// converts to Double
y = Double.parseDouble(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
section.setClicked1(new MyPoint2D(x, y));
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
if (!textLine.startsWith("null")) {
ss = textLine.split("[ ]+", 3);
try {
// converts to Double
x = Double.parseDouble(ss[0].trim());
// converts to Double
y = Double.parseDouble(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
if (!ok) {
break;
}
section.setClicked2(new MyPoint2D(x, y));
}
sections.add(section);
}
if (!ok) {
break;
}
// Loop over each group:
for (int i = 0; i < ngroups; i++) {
// Create the group object:
Group group = new Group();
// Read the group name:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
group.setName(textLine.trim());
// Read the group colours:
Color col;
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
// parse from RGB string
col = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
group.setNodeColor(col);
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
// parse from RGB string
col = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
group.setFacetColor(col);
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
// parse from RGB string
col = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
group.setRegionColor(col);
// Add the group to the list of groups:
groups.add(group);
}
if (!ok) {
break;
}
// Loop over each node:
for (int i = 0; i < nnodes; i++) {
Node node = plc.getNode(i);
// The node gets linked to the facets in the loop over each facet below.
// Read the section id and group id:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+", 3);
// section and group id
int sid, gid;
try {
// converts to integer
sid = Integer.parseInt(ss[0].trim());
// converts to integer
gid = Integer.parseInt(ss[1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
// Cross-link the node and section:
node.setSection(sections.get(sid));
sections.get(sid).addNode(node);
// Cross-link the node and group:
node.setGroup(groups.get(gid));
groups.get(gid).addNode(node);
}
if (!ok) {
break;
}
// Loop over each facet:
for (int i = 0; i < nfacets; i++) {
Facet facet = plc.getFacet(i);
// Read the node id's and link those nodes to the facet:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+");
// number of nodes
int n;
try {
// converts to integer
n = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
if (!ok) {
break;
}
for (int j = 0; j < n; j++) {
// node id
int id;
try {
// converts to integer
id = Integer.parseInt(ss[j + 1].trim());
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
ok = false;
break;
}
// Cross-link the facet and node:
facet.addNode(plc.getNode(id));
plc.getNode(id).addFacet(facet);
}
// Read the section id's:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
/*
textLine = textLine.trim();
ss = textLine.split("[ ]+");
try {
n = Integer.parseInt(ss[0].trim()); // converts to integer
} catch (NumberFormatException e) { ok=false; break; }
if (!ok) { break; }
for (int j=0 ; j<n ; j++ ) {
int id;
try {
id = Integer.parseInt(ss[j+1].trim()); // converts to integer
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) { ok=false; break; }
// Cross-link the facet and section:
// facet.addSection( sections.get(id) ); // no longer necessary because facet sections defined by the facet nodes
sections.get(id).addFacet(facet);
}
*/
// Read the group id:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+", 2);
int id;
try {
// converts to integer
id = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
// Cross-link the facet and group:
facet.setGroup(groups.get(id));
groups.get(id).addFacet(facet);
}
if (!ok) {
break;
}
// Loop over each region:
for (int i = 0; i < nregions; i++) {
Region region = plc.getRegion(i);
// Read the section id:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+", 2);
int id;
try {
// converts to integer
id = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
// Cross-link the region and section:
region.setSection(sections.get(id));
sections.get(id).addRegion(region);
// Read the group id and link that group to the node:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
textLine = textLine.trim();
ss = textLine.split("[ ]+", 2);
try {
// converts to integer
id = Integer.parseInt(ss[0].trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
// Cross-link the region and group:
region.setGroup(groups.get(id));
// groups.get(id).setRegion(region);
groups.get(id).addRegion(region);
}
if (!ok) {
break;
}
// ---------- Finish with the rest of the information: ----------
// Read painting colours, etc.:
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
// parse from RGB string
calibrationColor = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
// parse from RGB string
edgeColor = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
// parse from RGB string
defineFacetEdgeColor = new Color(Integer.parseInt(textLine.trim()));
} catch (NumberFormatException e) {
ok = false;
break;
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
pointWidth = Integer.parseInt(textLine.trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
textLine = FileUtils.readLine(reader);
if (textLine == null) {
ok = false;
break;
}
try {
lineWidth = Integer.parseInt(textLine.trim());
} catch (NumberFormatException e) {
ok = false;
break;
}
// Always break from while here:
break;
}
// Close the file:
FileUtils.close(reader);
// Check for a problem:
if (!ok) {
return false;
}
// Reset the FacetModeller plc, section lists and group lists:
controller.resetPLC(plc, merge);
controller.resetSectionVector(sections, merge);
controller.resetGroupVector(groups, merge);
// If it is a large model then don't display anything:
if (plc.numberOfNodes() >= LARGE_MODEL) {
controller.clearGroupSelections();
}
// Reset some other information:
if (!merge) {
controller.setCalibrationColor(calibrationColor);
controller.setEdgeColor(edgeColor);
controller.setDefineFacetEdgeColor(defineFacetEdgeColor);
controller.setPointWidth(pointWidth);
controller.setLineWidth(lineWidth);
}
// Return successfully:
return true;
}
use of facetmodeller.plc.Node in project facetmodeller by pglelievre.
the class DefinePolyFacetClickTask method mouseClick.
@Override
public void mouseClick(MyPoint2D p) {
// Check for the required information:
if (!check()) {
return;
}
if (p == null) {
return;
}
// Calculate the closest node to the clicked point:
if (!controller.calculateClosestNode(p)) {
return;
}
// just in case the closestNode object gets nullified by a mouse move (not sure if that is possible but better safe than sorry)
Node node = controller.getClosestNode();
// Check if we need to start, continue or stop the definition of a facet:
Group group = controller.getSelectedCurrentGroup();
Facet currentFacet = controller.getCurrentFacet();
if (currentFacet == null) {
// need to start new facet
// Create a new facet object linked to the current group:
currentFacet = new Facet(group);
// Add the node to the current facet:
currentFacet.addNode(node);
// Save the facet for later:
controller.setCurrentFacet(currentFacet);
} else {
// Check the group has not changed:
if (!currentFacet.getGroup().equals(group)) {
// Clear the facet:
controller.clearCurrentFacet();
} else {
// Check if the new node is already in the facet:
int inode = currentFacet.getNodes().indexOf(node);
// clicked the previous node
if (inode == currentFacet.size() - 1) {
return;
}
if (inode > 0) {
// (the case of returning to the first node is dealt with after this if statement)
// Ask the user for confirmation:
int response = Dialogs.question(controller, "That node is already in the facet. How do you want to continue?", title(), "Ignore click", "Remove nodes", "Stop defining", "Ignore click");
// ignore the click
if (response == Dialogs.YES_OPTION) {
return;
}
if (response == Dialogs.CANCEL_OPTION) {
// stop defining the current facet
controller.clearCurrentFacet();
controller.checkItemsEnabled();
controller.redraw();
return;
}
// Remove all nodes from the facet back to and including the selected node:
while (currentFacet.containsNode(node)) {
currentFacet.removeLastNode();
}
// Check if the current facet is now empty:
if (currentFacet.size() == 0) {
// process will restart
controller.clearCurrentFacet();
}
controller.redraw();
return;
}
// Check how to proceed:
boolean done, add;
if (controller.is3D()) {
// or if we can automatically stop:
if (autoStop) {
done = (currentFacet.size() == 2);
add = true;
} else {
// currentFacet.getNode(0).equals(node); // (stop once user circles back to first node)
done = (inode == 0);
// (don't explicitly close the facet by duplicating the first node)
add = !done;
// not enough nodes in the facet
if (done && currentFacet.size() == 2) {
return;
}
}
} else {
// Check if there will now be 2 nodes for the facet in 2D:
// ( currentFacet.size()==1 ); // (there is already one node and we only need two)
done = true;
add = true;
}
// Add the node to the current facet (if necessary):
if (add) {
// (assume this is a user mistake)
if (currentFacet.containsNode(node)) {
return;
}
// Add the node to the current facet:
currentFacet.addNode(node);
// Don't need to save the facet for later - Java passes pointers!
// synthesizer.setCurrentFacet(currentFacet);
}
// Finish defining the facet (if necessary):
if (done) {
// Add the facet:
AddFacetCommand com = new AddFacetCommand(controller.getModelManager(), currentFacet);
com.execute();
controller.undoVectorAdd(com);
// Nullify the current facet pointer so that the next clicked node will start a new facet definition:
controller.clearCurrentFacet();
}
}
}
// Enable or disable menu items:
controller.checkItemsEnabled();
// Repaint:
controller.redraw();
}
use of facetmodeller.plc.Node in project facetmodeller by pglelievre.
the class FlipEdgeClickTask method mouseClick.
@Override
public void mouseClick(MyPoint2D p) {
// Check for the required information:
if (!check()) {
return;
}
if (p == null) {
return;
}
// Calculate the closest node to the clicked point:
if (!controller.calculateClosestNode(p)) {
return;
}
Node node2 = controller.getClosestNode();
// Check if we need to start, continue or stop the edge flipping operation:
Node currentNode = controller.getCurrentNode();
if (currentNode == null) {
// need to start fresh
controller.setCurrentNode(node2);
} else {
// first node was already selected
// Find the triangular facets containing the edge (triangular facets that contain the two selected nodes):
// will hold the triangular facets containing the edge
FacetVector edgeFacets = new FacetVector();
// will hold the 4 nodes
NodeVector nodes = new NodeVector();
nodes.add(currentNode);
nodes.add(node2);
// the facets for the first node
FacetVector facets1 = currentNode.getFacets();
for (int i1 = 0; i1 < facets1.size(); i1++) {
// loop over each facet for the first node
Facet f1 = facets1.get(i1);
// Skip non-triangular facets:
if (f1.size() != 3) {
continue;
}
// Check if the facet contains the second node:
if (f1.containsNode(node2)) {
// Add the facet to the list:
edgeFacets.add(f1);
}
}
// Nullify the temporary object before any dialogs can launch:
controller.clearCurrentNode();
// Check that the two nodes define an edge:
if (edgeFacets.isEmpty()) {
Dialogs.error(controller, "Those nodes don't define an edge.", title());
return;
}
// Check for a boundary edge:
if (edgeFacets.size() == 1) {
Dialogs.error(controller, "Boundary edges can not be flipped.", title());
return;
}
// Check for a triple point:
if (edgeFacets.size() != 2) {
Dialogs.error(controller, "Triple point edges can not be flipped.", title());
return;
}
// TODO: check for a convex situation
// Determine the two other nodes to use:
// duplicates are not added in this call
nodes.addAll(edgeFacets.get(0).getNodes());
// duplicates are not added in this call
nodes.addAll(edgeFacets.get(1).getNodes());
// Check I did it correctly:
if (nodes.size() != 4) {
Dialogs.error(controller, "That edge can not be flipped.", title());
return;
}
// Figure out which group to use:
Group group = edgeFacets.get(0).getGroup();
if (edgeFacets.get(1).getGroup() != group) {
// the two facets belong to different groups
group = controller.getSelectedCurrentGroup();
}
// Define two new facets:
Facet newFacet1 = new Facet(group);
newFacet1.addNode(nodes.get(0));
newFacet1.addNode(nodes.get(2));
newFacet1.addNode(nodes.get(3));
Facet newFacet2 = new Facet(group);
newFacet2.addNode(nodes.get(1));
newFacet2.addNode(nodes.get(2));
newFacet2.addNode(nodes.get(3));
FacetVector newFacets = new FacetVector();
newFacets.add(newFacet1);
newFacets.add(newFacet2);
// Perform the edge flip (add the new facets, delete the existing facets):
FlipEdgeCommand com = new FlipEdgeCommand(controller.getModelManager(), edgeFacets, newFacets);
com.execute();
controller.undoVectorAdd(com);
}
// Repaint:
controller.redraw();
}
Aggregations