diff --git a/src/avatartranslator/AvatarBlockTemplate.java b/src/avatartranslator/AvatarBlockTemplate.java index 9e1716c69307d7d3f80d5b97b1b60d57516784a3..76553ff0af08d72e456878d303db558a4887ddc2 100644 --- a/src/avatartranslator/AvatarBlockTemplate.java +++ b/src/avatartranslator/AvatarBlockTemplate.java @@ -112,7 +112,7 @@ public class AvatarBlockTemplate { // expire at = makeAvatarEmptyTransitionBetween(asm, as2, aaos5, _reference); - at.setDelays("value", "value"); + at.setDelays("__value", "__value"); at = makeAvatarEmptyTransitionBetween(asm, aaos5, as1, _reference); // reset diff --git a/src/avatartranslator/directsimulation/AvatarSimulationBlock.java b/src/avatartranslator/directsimulation/AvatarSimulationBlock.java index a81fdb4fc3213becf475b0d7bad52c513e2982f9..d45fc863708a792aa149317224239685420ab35d 100644 --- a/src/avatartranslator/directsimulation/AvatarSimulationBlock.java +++ b/src/avatartranslator/directsimulation/AvatarSimulationBlock.java @@ -308,6 +308,21 @@ public class AvatarSimulationBlock { } } + // Random? + if (_elt instanceof AvatarRandom) { + AvatarRandom random = (AvatarRandom)(_elt); + index = block.getIndexOfAvatarAttributeWithName(random.getVariable()); + if (index >-1) { + int valMin = evaluateIntExpression(random.getMinValue(), attributeValues); + int valMax = evaluateIntExpression(random.getMaxValue(), attributeValues); + valMin = (int)(Math.floor((Math.random()*(valMax - valMin)))) + valMin; + attributeValues.remove(index); + attributeValues.add(index, "" + valMin); + ast.actions = new Vector<String>(); + ast.actions.add(random.getVariable() + " = " + valMin); + } + } + // Action on signal? if (_elt instanceof AvatarActionOnSignal) { AvatarActionOnSignal aaos = (AvatarActionOnSignal)_elt; diff --git a/src/ui/avatarinteractivesimulation/AvatarSpecificationSimulationSDPanel.java b/src/ui/avatarinteractivesimulation/AvatarSpecificationSimulationSDPanel.java index f1eb462d3183e5f663cb994fcac4db8a4d9aed5b..20a3570755e1be78a68dda0a2c4dfd947bdf383e 100644 --- a/src/ui/avatarinteractivesimulation/AvatarSpecificationSimulationSDPanel.java +++ b/src/ui/avatarinteractivesimulation/AvatarSpecificationSimulationSDPanel.java @@ -79,6 +79,7 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { private int verticalSpaceUnderBlocks = 15; private int spaceVerticalText = 2; private int spaceHorizontalText = 2; + private int spaceStop = 20; private int verticalLink = 10; private int lengthAsync = 50; @@ -171,6 +172,12 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { Vector<AvatarSimulationTransaction> allTransactions = ass.getAllTransactions(); Vector<AvatarSimulationBlock> blocks = ass.getSimulationBlocks(); + if (allTransactions.size() > 0) { + ast = allTransactions.get(0); + clockValue = ast.clockValueWhenPerformed-ast.duration; + g.drawString("@" + clockValue, 10, currentY); + } + for(int i=Math.max(allTransactions.size()-drawnTransactions, 0); i<allTransactions.size(); i++) { ast = allTransactions.get(i); ast.stamp = stamp; @@ -184,7 +191,11 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { newCurrentY = drawTransition(g, (AvatarTransition)(ast.executedElement), ast, xOfBlock, currentY); } else if (ast.executedElement instanceof AvatarActionOnSignal) { newCurrentY = drawAvatarActionOnSignal(g, (AvatarActionOnSignal)(ast.executedElement), ast, xOfBlock, currentY, currentX); - } + } else if (ast.executedElement instanceof AvatarStopState) { + newCurrentY = drawAvatarStopState(g, xOfBlock, currentY, currentX); + } else if (ast.executedElement instanceof AvatarRandom) { + newCurrentY = drawRandom(g, (AvatarRandom)(ast.executedElement), ast, xOfBlock, currentY); + } // Draw the line of other blocks @@ -196,6 +207,10 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { } xOfBlock += spaceBetweenLifeLines; } + if (ast.clockValueWhenPerformed != clockValue) { + clockValue = ast.clockValueWhenPerformed; + g.drawString("@" + clockValue, 10, currentY); + } } // Update currentY; @@ -267,7 +282,6 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { w = Math.max(g.getFontMetrics().stringWidth(action), w); } - x = currentX - w/2 - spaceHorizontalText; y = currentY; width = w + 2*spaceHorizontalText; @@ -294,6 +308,37 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { return currentY + verticalLink; } + private int drawRandom(Graphics g, AvatarRandom arandom, AvatarSimulationTransaction ast, int currentX, int currentY) { + int w; + int x, y, width, height; + Color c = g.getColor(); + + if (ast.actions == null) { + return currentY; + } + + String action = ast.actions.get(0); + + g.drawLine(currentX, currentY, currentX, currentY+verticalLink); + currentY += verticalLink; + + w = g.getFontMetrics().stringWidth(action); + x = currentX - w/2 - spaceHorizontalText; + y = currentY; + width = w + 2*spaceHorizontalText; + height = g.getFontMetrics().getHeight() + spaceVerticalText * 2; + g.setColor(Color.WHITE); + g.fillRoundRect(x, y, width, height, 5, 5); + g.setColor(c); + g.drawRoundRect(x, y, width, height, 5, 5); + + g.drawString(action, x + spaceHorizontalText, y+height-2*spaceVerticalText); + + currentY += height; + g.drawLine(currentX, currentY, currentX, currentY+verticalLink); + return currentY + verticalLink; + } + private int drawAvatarActionOnSignal(Graphics g, AvatarActionOnSignal aaos, AvatarSimulationTransaction ast, int currentX, int currentY, int startX) { int w; Color c = g.getColor(); @@ -369,7 +414,7 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { if (x + lengthAsync < currentX-lengthAsync) { // Forward g.setColor(ColorManager.AVATAR_RECEIVE_SIGNAL); - GraphicLib.dashedLine(g, x + lengthAsync, y-1, x + lengthAsync, currentY-1); + GraphicLib.dashedLine(g, x + lengthAsync - 1, y, x + lengthAsync-1, currentY); GraphicLib.dashedLine(g, x + lengthAsync, currentY-1, currentX-lengthAsync, currentY-1); g.setColor(c); GraphicLib.dashedLine(g, x + lengthAsync, y, x + lengthAsync, currentY); @@ -377,9 +422,9 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { } else { // Backward g.setColor(ColorManager.AVATAR_RECEIVE_SIGNAL); - GraphicLib.dashedLine(g, x + lengthAsync, y-1, x + lengthAsync, y+6); + GraphicLib.dashedLine(g, x + lengthAsync-1, y, x + lengthAsync-1, y+7); GraphicLib.dashedLine(g, x + lengthAsync, y+6, currentX-lengthAsync, y+6); - GraphicLib.dashedLine(g, currentX-lengthAsync, currentY, currentX-lengthAsync, y+6); + GraphicLib.dashedLine(g, currentX-lengthAsync-1, currentY, currentX-lengthAsync-1, y+7); g.setColor(c); GraphicLib.dashedLine(g, x + lengthAsync, y, x + lengthAsync, y+7); GraphicLib.dashedLine(g, x + lengthAsync, y+7, currentX-lengthAsync, y+7); @@ -434,6 +479,24 @@ public class AvatarSpecificationSimulationSDPanel extends JPanel { } + private int drawAvatarStartState(Graphics g, int currentX, int currentY, int startX) { + currentX -= 7; + g.fillOval(currentX, currentY, 15, 15); + g.drawLine(currentX, currentY, currentX, currentY+20); + + currentY += 20; + return currentY; + } + + private int drawAvatarStopState(Graphics g, int currentX, int currentY, int startX) { + g.drawLine(currentX, currentY, currentX, currentY+spaceStop+3); + currentX -= (spaceStop/2); + g.drawLine(currentX, currentY, currentX+spaceStop, currentY+spaceStop); + g.drawLine(currentX, currentY+spaceStop, currentX+spaceStop, currentY); + currentY += spaceStop + 3; + return currentY; + } + public void setNewSize() { setPreferredSize(new Dimension(maxX + limit, maxY + limit)); mustScroll = true;