SimulationManager.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. package ui.controller;
  2. import classes.*;
  3. import ui.model.Model;
  4. import ui.view.FlexiblePane;
  5. import ui.view.MyCanvas;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. /**
  9. * Controller for Simulation.
  10. *
  11. * @author Gruppe14
  12. */
  13. public class SimulationManager {
  14. int global = 0;
  15. private Model model;
  16. private ArrayList<AbstractCpsObject> objectsToHandle;
  17. // private ArrayList<CpsEdge> allConnections;
  18. private ArrayList<SubNet> subNets;
  19. private ArrayList<CpsEdge> brokenEdges;
  20. private MyCanvas canvas;
  21. private int timeStep;
  22. private HashMap<Integer, Float> tagTable = new HashMap<>();
  23. private FlexiblePane flexPane;
  24. private HashMap<HolonElement, Float> flexDevicesTurnedOnThisTurn = new HashMap<>();
  25. /**
  26. * Constructor.
  27. *
  28. * @param m Model
  29. */
  30. SimulationManager(Model m) {
  31. canvas = null;
  32. model = m;
  33. subNets = new ArrayList<>();
  34. brokenEdges = new ArrayList<>();
  35. }
  36. /**
  37. * calculates the flow of the edges and the supply for objects.
  38. *
  39. * @param x current Iteration
  40. */
  41. void calculateStateForTimeStep(int x) {
  42. reset();
  43. timeStep = x;
  44. searchForSubNets();
  45. for (SubNet singleSubNet : subNets) {
  46. resetConnections(singleSubNet.getObjects().get(0), new ArrayList<>(), new ArrayList<>());
  47. }
  48. for (SubNet singleSubNet : subNets) {
  49. float production = calculateEnergyWithoutFlexDevices("prod", singleSubNet, timeStep);
  50. float consumption = calculateEnergyWithoutFlexDevices("cons", singleSubNet, timeStep);
  51. // surplus of energy is computed by sum, since consumption is a negative value
  52. float energySurplus = production + consumption;
  53. float minConsumption = calculateMinimumEnergy(singleSubNet, timeStep);
  54. // --------------- use flexible devices ---------------
  55. if (energySurplus != 0 && model.useFlexibleDevices()) {
  56. turnOnFlexibleDevices(singleSubNet, energySurplus, x);
  57. if (!flexDevicesTurnedOnThisTurn.isEmpty()) {
  58. System.out.println("The following devices were turned on in this turn: ");
  59. System.out.println(flexDevicesTurnedOnThisTurn.toString());
  60. }
  61. // recompute after having examined/turned on all flexible devices
  62. production = calculateEnergyWithFlexDevices("prod", singleSubNet, timeStep);
  63. consumption = calculateEnergyWithFlexDevices("cons", singleSubNet, timeStep);
  64. energySurplus = production + consumption;
  65. }
  66. // --------------- set flow simulation ---------------
  67. setFlowSimulation(singleSubNet);
  68. // --------------- visualise graph ---------------
  69. for (HolonObject hl : singleSubNet.getObjects()) {
  70. if (hl.getState() != HolonObject.NO_ENERGY
  71. && hl.getState() != HolonObject.PRODUCER) {
  72. for (int i = 0; i < hl.getConnections().size(); i++) {
  73. CpsEdge edge = hl.getConnectedTo().get(i);
  74. if (edge.isWorking() && edge.getFlow() > 0
  75. || edge.getCapacity() == CpsEdge.CAPACITY_INFINITE) {
  76. if ((production + consumption) >= 0) {
  77. if (energySurplus > 0) {
  78. hl.setState(HolonObject.OVER_SUPPLIED);
  79. } else {
  80. hl.setState(HolonObject.SUPPLIED);
  81. }
  82. } else {
  83. if ((production + minConsumption) >= 0) {
  84. hl.setState(HolonObject.PARTIALLY_SUPPLIED);
  85. } else if (hl.checkIfPartiallySupplied(timeStep)) {
  86. hl.setState(HolonObject.PARTIALLY_SUPPLIED);
  87. } else {
  88. hl.setState(HolonObject.NOT_SUPPLIED);
  89. }
  90. }
  91. break;
  92. }
  93. }
  94. if (hl.checkIfPartiallySupplied(timeStep)
  95. && hl.getState() != HolonObject.SUPPLIED
  96. && hl.getState() != HolonObject.OVER_SUPPLIED) {
  97. hl.setState(HolonObject.PARTIALLY_SUPPLIED);
  98. }
  99. }
  100. }
  101. }
  102. canvas.repaint();
  103. flexPane.recalculate();
  104. }
  105. /**
  106. * search for all flexible devices in the network and turn them on, until wasted energy = 0
  107. * or all devices have been examined
  108. *
  109. * @param subNet the subnet
  110. * @param energySurplus the current surplus of energy
  111. */
  112. private void turnOnFlexibleDevices(SubNet subNet, float energySurplus, int timestep) {
  113. for (HolonObject holonOb : subNet.getObjects()) {
  114. for (HolonElement holonEl : holonOb.getElements()) {
  115. // if this element is flexible and active (can be considered for calculations)
  116. if (holonEl.isFlexible() && holonEl.isActive()) {
  117. float energyAvailableSingle = holonEl.getAvailableEnergyAt(timestep);
  118. float energyAvailableMult = energyAvailableSingle * holonEl.getAmount();
  119. // ------------- flexible consumer / OVERPRODUCTION -------------
  120. if (energyAvailableMult < 0 && energySurplus > 0) {
  121. // if there is more wasted energy than energy that this device can give, give all energy available
  122. if (Math.abs(energyAvailableMult) <= Math.abs(energySurplus)) {
  123. energySurplus += energyAvailableMult;
  124. // set the new energy consumption to the maximum
  125. holonEl.setEnergyPerElement(energyAvailableSingle);
  126. flexDevicesTurnedOnThisTurn.put(holonEl, energyAvailableMult);
  127. }
  128. // else: we just need to turn on part of the flexible energy available
  129. else {
  130. float energyNeeded = -energySurplus;
  131. energySurplus += energyNeeded; // should give 0, but was kept this was for consistency
  132. // the energy needed divided through the amount of elements
  133. holonEl.setEnergyPerElement(energyNeeded / holonEl.getAmount());
  134. flexDevicesTurnedOnThisTurn.put(holonEl, energyNeeded);
  135. }
  136. }
  137. // ------------- flexible producer / UNDEPRODUCTION -------------
  138. else if (energyAvailableMult > 0 && energySurplus < 0) {
  139. // if there is more energy needed than this device can give, give all the energy available
  140. if (Math.abs(energyAvailableMult) <= Math.abs(energySurplus)) {
  141. energySurplus += energyAvailableMult;
  142. // set the new energy consumption to the maximum
  143. holonEl.setEnergyPerElement(energyAvailableSingle);
  144. flexDevicesTurnedOnThisTurn.put(holonEl, energyAvailableMult);
  145. }
  146. // else: we just need to turn on part of the flexible energy available
  147. else {
  148. float energyNeeded = -energySurplus;
  149. int i = 0;
  150. energySurplus += energyNeeded; // should give 0, but was kept this was for consistency
  151. // the energy needed divided through the amount of elements
  152. holonEl.setEnergyPerElement(energyNeeded / holonEl.getAmount());
  153. flexDevicesTurnedOnThisTurn.put(holonEl, energyNeeded);
  154. }
  155. }
  156. }
  157. if (energySurplus == 0) {
  158. break;
  159. }
  160. }
  161. }
  162. }
  163. /**
  164. * Set Flow Simulation.
  165. *
  166. * @param sN Subnet
  167. */
  168. private void setFlowSimulation(SubNet sN) {
  169. ArrayList<AbstractCpsObject> producers = new ArrayList<>();
  170. AbstractCpsObject tmp = null;
  171. tagTable = new HashMap<>();
  172. // traverse all objects in this subnet
  173. for (HolonObject hl : sN.getObjects()) {
  174. float energy = hl.getCurrentEnergyAtTimeStep(timeStep);
  175. // if their production is higher than their consumption
  176. if (energy > 0) {
  177. tagTable.put(hl.getId(), energy);
  178. hl.addTag(hl.getId());
  179. for (CpsEdge edge : hl.getConnections()) {
  180. if (edge.isWorking()) {
  181. // set other end of edge as tmp-object
  182. // and add this end to the other end's tag-list
  183. AbstractCpsObject a = edge.getA();
  184. AbstractCpsObject b = edge.getB();
  185. if (a.getId() == hl.getId()) {
  186. b.addTag(hl.getId());
  187. tmp = b;
  188. }
  189. if (b.getId() == hl.getId()) {
  190. a.addTag(hl.getId());
  191. tmp = a;
  192. }
  193. edge.setFlow(edge.getFlow() + energy);
  194. edge.calculateState();
  195. edge.addTag(hl.getId());
  196. if (edge.isWorking() && !producers.contains(tmp)) {
  197. if (tmp instanceof HolonSwitch) {
  198. if (((HolonSwitch) tmp).getState(timeStep)) {
  199. producers.add(tmp);
  200. }
  201. } else if (!(tmp instanceof CpsUpperNode)) {
  202. producers.add(tmp);
  203. }
  204. }
  205. }
  206. }
  207. }
  208. }
  209. setFlowSimRec(producers, 0);
  210. }
  211. /**
  212. * Set Flow Simulation Rec.
  213. *
  214. * @param nodes the nodes
  215. * @param iter the Iteration
  216. */
  217. private void setFlowSimRec(ArrayList<AbstractCpsObject> nodes, int iter) {
  218. ArrayList<AbstractCpsObject> newNodes = new ArrayList<>();
  219. ArrayList<CpsEdge> changedEdges = new ArrayList<>();
  220. AbstractCpsObject tmp;
  221. if (nodes.size() != 0) {
  222. for (AbstractCpsObject cps : nodes) {
  223. // check whether the cps is in a legit state if it is a switch
  224. if (legitState(cps)) {
  225. for (CpsEdge edge : cps.getConnections()) {
  226. // is edge working
  227. // and does the edge's tag-list not (yet) contain all tags of the cps
  228. if (edge.isWorking()
  229. && (!(edge.containsTags(edge.getTags(), cps.getTag())))) {
  230. if (edge.getA().getId() == cps.getId()) {
  231. tmp = edge.getB();
  232. } else {
  233. tmp = edge.getA();
  234. }
  235. for (Integer tag : cps.getTag()) {
  236. if (!(edge.getTags().contains(tag))
  237. && !(edge.getPseudoTags().contains(tag))) {
  238. edge.setFlow(edge.getFlow() + tagTable.get(tag));
  239. edge.addTag(tag);
  240. }
  241. }
  242. // uppernodes do not spread energy
  243. if (!(tmp instanceof CpsUpperNode)) {
  244. for (Integer tag : tmp.getTag()) {
  245. if (!(edge.getTags().contains(tag))
  246. && tagTable.get(tag) != null
  247. && !(edge.getPseudoTags().contains(tag))) {
  248. edge.setFlow(edge.getFlow() + tagTable.get(tag));
  249. edge.addPseudoTag(tag);
  250. changedEdges.add(edge);
  251. }
  252. }
  253. }
  254. edge.calculateState();
  255. if (edge.isWorking()
  256. && !(tmp instanceof CpsUpperNode)) {
  257. tmp.addAllPseudoTags(cps.getTag());
  258. if (!newNodes.contains(tmp)) {
  259. newNodes.add(tmp);
  260. }
  261. }
  262. }
  263. }
  264. }
  265. }
  266. setPseudoTags(newNodes, changedEdges);
  267. setFlowSimRec(newNodes, iter + 1);
  268. }
  269. }
  270. /**
  271. * Set the Pseudo Tags.
  272. *
  273. * @param nodes Array of AbstractCpsObjects
  274. */
  275. private void setPseudoTags(ArrayList<AbstractCpsObject> nodes, ArrayList<CpsEdge> edges) {
  276. for (AbstractCpsObject node : nodes) {
  277. node.recalculateTags();
  278. node.setPseudoTags(new ArrayList<>());
  279. }
  280. for (CpsEdge edge : edges) {
  281. edge.recalculateTags();
  282. edge.setPseudoTag(new ArrayList<>());
  283. }
  284. }
  285. /**
  286. * Reset the Connection.
  287. *
  288. * @param cps CpsObject
  289. * @param visitedObj the visited Objects
  290. * @param visitedEdges the visited Edges
  291. */
  292. private void resetConnections(AbstractCpsObject cps, ArrayList<Integer> visitedObj,
  293. ArrayList<CpsEdge> visitedEdges) {
  294. visitedObj.add(cps.getId());
  295. cps.resetTags();
  296. for (CpsEdge e : cps.getConnections()) {
  297. if (!(visitedEdges.contains(e))) {
  298. e.setFlow(0);
  299. e.calculateState();
  300. e.setTags(new ArrayList<>());
  301. visitedEdges.add(e);
  302. if (!(visitedObj.contains(e.getA().getId()))) {
  303. resetConnections(e.getA(), visitedObj, visitedEdges);
  304. e.getA().resetTags();
  305. }
  306. if (!(visitedObj.contains(e.getB().getId()))) {
  307. resetConnections(e.getB(), visitedObj, visitedEdges);
  308. e.getB().resetTags();
  309. }
  310. }
  311. }
  312. }
  313. /**
  314. * calculates the energy of either all producers or consumers.
  315. * Flexible devices are filtered out
  316. *
  317. * @param type Type
  318. * @param sN Subnet
  319. * @param x Integer
  320. * @return The Energy
  321. */
  322. private float calculateEnergyWithoutFlexDevices(String type, SubNet sN, int x) {
  323. float energy = 0;
  324. for (HolonObject hl : sN.getObjects()) {
  325. float currentEnergyWithoutFlexibles = hl.getCurrentEnergyAtTimeStepWithoutFlexiblesAndResetFlexibles(x);
  326. if (type.equals("prod")) {
  327. if (currentEnergyWithoutFlexibles > 0) {
  328. energy += currentEnergyWithoutFlexibles;
  329. hl.setState(HolonObject.PRODUCER);
  330. }
  331. }
  332. if (type.equals("cons")) {
  333. if (currentEnergyWithoutFlexibles < 0) {
  334. energy = energy + currentEnergyWithoutFlexibles;
  335. hl.setState(HolonObject.NOT_SUPPLIED);
  336. }
  337. }
  338. if (currentEnergyWithoutFlexibles == 0) {
  339. hl.setState(HolonObject.NO_ENERGY);
  340. }
  341. }
  342. return energy;
  343. }
  344. /**
  345. * calculates the energy of either all producers or consumers.
  346. * Flexible devices are filtered out
  347. *
  348. * @param type Type
  349. * @param sN Subnet
  350. * @param x Integer
  351. * @return The Energy
  352. */
  353. private float calculateEnergyWithFlexDevices(String type, SubNet sN, int x) {
  354. float energy = 0;
  355. for (HolonObject hl : sN.getObjects()) {
  356. float currentEnergy = hl.getCurrentEnergyAtTimeStep(x);
  357. if (type.equals("prod")) {
  358. if (currentEnergy > 0) {
  359. energy += currentEnergy;
  360. hl.setState(HolonObject.PRODUCER);
  361. }
  362. }
  363. if (type.equals("cons")) {
  364. if (currentEnergy < 0) {
  365. energy = energy + currentEnergy;
  366. hl.setState(HolonObject.NOT_SUPPLIED);
  367. }
  368. }
  369. if (currentEnergy == 0) {
  370. hl.setState(HolonObject.NO_ENERGY);
  371. }
  372. }
  373. return energy;
  374. }
  375. /**
  376. * Calculate the Minimum Energy.
  377. *
  378. * @param sN Subnet
  379. * @param x Integer
  380. * @return the Calculated minimum Energy
  381. */
  382. private float calculateMinimumEnergy(SubNet sN, int x) {
  383. float min = 0;
  384. float minElement = 0;
  385. for (HolonObject hl : sN.getObjects()) {
  386. if (hl.getElements().size() > 0 && hl.getElements().get(0).getOverallEnergyAtTimeStep(x) < 0) {
  387. minElement = hl.getElements().get(0).getOverallEnergyAtTimeStep(x);
  388. }
  389. for (HolonElement he : hl.getElements()) {
  390. float overallEnergy = he.getOverallEnergyAtTimeStep(x);
  391. if (minElement < overallEnergy && overallEnergy < 0) {
  392. minElement = overallEnergy;
  393. }
  394. }
  395. min = min + minElement;
  396. }
  397. return min;
  398. }
  399. /**
  400. * generates all subNets from all objectsToHandle.
  401. */
  402. private void searchForSubNets() {
  403. subNets = new ArrayList<>();
  404. brokenEdges.clear();
  405. boolean end = false;
  406. int i = 0;
  407. AbstractCpsObject cps;
  408. if (objectsToHandle.size() > 0) {
  409. while (!end) {
  410. cps = objectsToHandle.get(i);
  411. SubNet singleSubNet = new SubNet(new ArrayList<>(), new ArrayList<>(),
  412. new ArrayList<>());
  413. singleSubNet = buildSubNet(cps, new ArrayList<>(), singleSubNet);
  414. if (singleSubNet.getObjects().size() != 0) {
  415. subNets.add(singleSubNet);
  416. }
  417. if (0 == objectsToHandle.size()) {
  418. end = true;
  419. }
  420. }
  421. }
  422. }
  423. /**
  424. * recursivly generates a subnet of all objects, that one specific object is
  425. * connected to.
  426. *
  427. * @param cps AbstractCpsObject
  428. * @param visited visited Array of Integer
  429. * @param sN Subnets
  430. * @return Subnet
  431. */
  432. private SubNet buildSubNet(AbstractCpsObject cps, ArrayList<Integer> visited, SubNet sN) {
  433. visited.add(cps.getId());
  434. if (cps instanceof HolonObject) {
  435. sN.getObjects().add((HolonObject) cps);
  436. }
  437. if (cps instanceof HolonSwitch) {
  438. sN.getSwitches().add((HolonSwitch) cps);
  439. }
  440. removeFromToHandle(cps.getId());
  441. AbstractCpsObject a;
  442. AbstractCpsObject b;
  443. for (CpsEdge edge : cps.getConnections()) {
  444. if (edge.isWorking()) {
  445. a = edge.getA();
  446. b = edge.getB();
  447. if (!(cps instanceof HolonSwitch)) {
  448. if (!(sN.getEdges().contains(edge))) {
  449. sN.getEdges().add(edge);
  450. }
  451. }
  452. if (cps instanceof HolonSwitch && ((HolonSwitch) cps).getState(timeStep)) {
  453. if (!(sN.getEdges().contains(edge))) {
  454. sN.getEdges().add(edge);
  455. }
  456. }
  457. if (!visited.contains(a.getId()) && legitState(cps) && !(a instanceof CpsUpperNode)) {
  458. sN = buildSubNet(a, visited, sN);
  459. }
  460. if (!visited.contains(b.getId()) && legitState(cps) && !(b instanceof CpsUpperNode)) {
  461. sN = buildSubNet(b, visited, sN);
  462. }
  463. if (a instanceof CpsUpperNode && a.getId() != cps.getId()) {
  464. edge.setConnected(CpsEdge.CON_UPPER_NODE_NOT_INSIDE);
  465. checkForConnectedStates(b, (CpsUpperNode) a, edge);
  466. }
  467. if (b instanceof CpsUpperNode && b.getId() != cps.getId()) {
  468. edge.setConnected(CpsEdge.CON_UPPER_NODE_NOT_INSIDE);
  469. checkForConnectedStates(a, (CpsUpperNode) b, edge);
  470. }
  471. } else {
  472. brokenEdges.add(edge);
  473. }
  474. }
  475. return sN;
  476. }
  477. /**
  478. * is the Switch in a legitimate State.
  479. *
  480. * @param current AbstractCpsObject
  481. * @return boolean
  482. */
  483. private boolean legitState(AbstractCpsObject current) {
  484. return !(current instanceof HolonSwitch)
  485. || ((HolonSwitch) current).getState(timeStep);
  486. }
  487. // /**
  488. // * ensures that objectsToHandle only contains HolonObjects.
  489. // */
  490. // public void cleanObjectsToHandle() {
  491. // for (int i = 0; i < objectsToHandle.size(); i++) {
  492. // if (!(objectsToHandle.get(i) instanceof HolonObject)) {
  493. // objectsToHandle.remove(i);
  494. // }
  495. // }
  496. // }
  497. /**
  498. * removes an Object that already has been handled.
  499. *
  500. * @param id the Object ID
  501. */
  502. private void removeFromToHandle(int id) {
  503. for (int i = 0; i < objectsToHandle.size(); i++) {
  504. if (objectsToHandle.get(i).getId() == id) {
  505. objectsToHandle.remove(i);
  506. }
  507. }
  508. }
  509. /**
  510. * copies the data of an array of Objects.
  511. *
  512. * @param toCopy the ArrayList of CpsObjects co Copy
  513. */
  514. private void copyObjects(ArrayList<AbstractCpsObject> toCopy) {
  515. for (AbstractCpsObject cps : toCopy) {
  516. if (cps instanceof CpsUpperNode) {
  517. copyObjects(((CpsUpperNode) cps).getNodes());
  518. } else {
  519. objectsToHandle.add(cps);
  520. }
  521. }
  522. }
  523. /**
  524. * Prints the Components auf all subnets.
  525. */
  526. private void printNetsToConsole() {
  527. for (int i = 0; i < subNets.size(); i++) {
  528. SubNet subNet = subNets.get(i);
  529. System.out.println("SUBNET NR:" + i);
  530. subNet.toString(timeStep);
  531. }
  532. }
  533. /**
  534. * Set the Canvas.
  535. *
  536. * @param can the Canvas
  537. */
  538. public void setCanvas(MyCanvas can) {
  539. canvas = can;
  540. }
  541. /**
  542. * Reset all Data to the current state of the Model.
  543. */
  544. public void reset() {
  545. objectsToHandle = new ArrayList<>();
  546. copyObjects(model.getObjectsOnCanvas());
  547. flexDevicesTurnedOnThisTurn = new HashMap<>();
  548. }
  549. /**
  550. * Resets the State of all Edges
  551. */
  552. private void resetEdges() {
  553. for (CpsEdge e : brokenEdges) {
  554. e.setWorkingState(true);
  555. }
  556. }
  557. /**
  558. * Resets the State for the whole Simulation Model
  559. */
  560. void resetSimulation() {
  561. reset();
  562. resetEdges();
  563. }
  564. /**
  565. * Get all Subnets.
  566. *
  567. * @return all Subnets
  568. */
  569. public ArrayList<SubNet> getSubNets() {
  570. return subNets;
  571. }
  572. /**
  573. * Get broken Edges
  574. */
  575. // public ArrayList<CpsEdge> getBrokenEdges() {
  576. // return brokenEdges;
  577. // }
  578. /**
  579. * checks whether a given object is connected to an object inside the upperNode.
  580. * if yes, the state for the edge is changed in "connected" or "not connected"
  581. */
  582. private void checkForConnectedStates(AbstractCpsObject cps, CpsUpperNode cUNode, CpsEdge theEdge) {
  583. AbstractCpsObject tmp;
  584. for (CpsEdge edge : cps.getConnections()) {
  585. if (edge.getA().getId() == cps.getId()) {
  586. tmp = edge.getB();
  587. } else {
  588. tmp = edge.getA();
  589. }
  590. if (cUNode.getNodes().contains(tmp)) {
  591. if (tmp instanceof CpsUpperNode) {
  592. checkForConnectedStates(cps, (CpsUpperNode) tmp, theEdge);
  593. } else {
  594. theEdge.setConnected(CpsEdge.CON_UPPER_NODE_AND_INSIDE);
  595. break;
  596. }
  597. }
  598. }
  599. }
  600. public FlexiblePane getFlexiblePane() {
  601. return flexPane;
  602. }
  603. void setFlexiblePane(FlexiblePane fp) {
  604. flexPane = fp;
  605. }
  606. }