package com.framsticks.model; import com.framsticks.util.Casting; import com.framsticks.util.Containers; import com.framsticks.util.Orientation; import org.apache.log4j.Logger; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Author: Piotr Ĺšniegowski */ public class Model { private final static Logger LOGGER = Logger.getLogger(Model.class); public Double startingEnergy; public Double getEnerg0() { return startingEnergy; } public void setEnerg0(Double energ0) { startingEnergy = energ0; } public Double getSe() { return startingEnergy; } public void setSe(Double se) { startingEnergy = se; } /** Vstyle */ public String visualizationStyle; public String getVstyle() { return visualizationStyle; } public void setVstyle(String Vstyle) { visualizationStyle = Vstyle; } public final List parts = new ArrayList(); public final List joints = new ArrayList(); public final List neurodefs = new ArrayList(); public Double getNumparts() { return (double)parts.size(); } public Double getNumjoints() { return (double)joints.size(); } public Double getNumneurons() { return (double)neurodefs.size(); } //this is impossible to use, because numparts field is marked as readonly public void setNumparts(Double numparts) { Containers.resizeList(parts, (int) (double) numparts); } public void setNumjoints(Double numjoints) { Containers.resizeList(joints, (int)(double)numjoints); } public void setNumneurons(Double numneurons) { Containers.resizeList(neurodefs, (int)(double)numneurons); } public List getParts() { return parts; } public List getJoints() { return joints; } public List getNeuroDefs() { return neurodefs; } public static Model build(List objects) { Iterator i = objects.iterator(); if (!i.hasNext()) { return null; } Model f0Genotype = Casting.tryCast(Model.class, i.next()); if (f0Genotype == null) { LOGGER.fatal("first object is not a Model"); return null; } while (i.hasNext()) { Object object = i.next(); if (object instanceof Joint) { f0Genotype.joints.add((Joint)object); continue; } if (object instanceof Part) { f0Genotype.parts.add((Part)object); continue; } if (object instanceof NeuroDef) { f0Genotype.neurodefs.add((NeuroDef) object); continue; } LOGGER.error("invalid class: " + object.getClass().getCanonicalName()); } for (Part p : f0Genotype.getParts()) { p.setOrientation(new Orientation().rotate(p.getRotation())); } for (Joint j : f0Genotype.getJoints()) { /** based on c++ Joint::attachToParts*/ Part p1 = f0Genotype.parts.get(j.getP1()); Part p2 = f0Genotype.parts.get(j.getP2()); assert p1 != null && p2 != null; Orientation o = new Orientation().rotate(j.getRotation()); p2.setOrientation(p1.getOrientation().transform(o)); p2.setPosition(p2.getOrientation().transform(j.getDelta()).add(p1.getPosition())); } return f0Genotype; } }