Poslední sestrojený prvek při krokování konstrukce
Krokování konstrukce
Budeme potřebovat postupně krokovat připravenou složitější konstrukci a nespokojíme se buď s tím, jak je zvýrazněný poslední objekt (budeme chtít výraznější vyznačení). Nebo nejsme spokojeni s tím, že je zvýrazněný jenom jeden (naposledy sestrojený) objekt a budeme chtít, aby souvislosti posledních kroků zůstávaly viditelné, zvýrazněné. Připravené ukázky se tedy budou lišit tím, zda dříve sestrojené objekty postupně ztrácejí výraznost, nebo zda zdůrazňujeme jen dosud poslední sestrojený objekt.
Pokud navíc krokujeme konstrukci pomocí bodů zastavení (a to se děje velmi často, protože v konstrukci bývá hodně "samozřejmých" konstrukčních čar, jejichž sestrojení přeskakujeme, aby nebylo krokování příliš dlouhé), bude potřeba zvláštní pozornosti.
Ke zvýraznění jsme použili číslo krok definované jako ConstructionStep() , tedy jako pořadové číslo prvku, který se právě sestrojil.
Aktivace bodů zastavení hodnotu objektu krok nijak neovlivní, vždy se jedná o číslo objektu v konstrukci, nikoli o číslo snímku-zastávky v nastaveném krokování.
Objekt krok využijeme pro skriptování: nebudeme psát skripty pro jednotlivé objekty ani definovat funkci sloužící jako Listener, ale ošetříme událost OnUpdate objektu krok.
Celý javascript je velmi krátký:
Na kartě OnUpdate objektu krok naprogramujeme:
var pocet = ggbApplet.getObjectNumber(); // počet objektů v konstrukci
var j = 1;
for (i = 1; i < pocet; i++) { // všem objektům v konstrukci určíme tloušťku čáry
j = Math.max(1, 8 + i - ggbApplet.getValue("krok")); // nedávno sestrojeným větší, starším 1
ggbApplet.setLineThickness(ggbApplet.getObjectName(i), j); // nastavíme ji
};
(viz první ukázka níže)
To, že měníme atributy objektů, které ještě nejsou sestrojené, v tomto případě nevadí. V této ukázce navíc neřešíme, jestli je objekt opravdu čára, a neměníme vlastnosti bodů. Jak zjistit typ objektu jsme
ukázali v předchozích kapitolách.
Pozor na to, že ggbApplet.getObjectNumber() udává skutečný počet objektů v konstrukci, zatímco ConstructionStep() počítá počet příkazů. Jakmile tedy sestrojíme například čtverec, začnou se tato dvě čísla lišit.
V konstrukcích, kde sestrojíme každý bod či čáru samostatně, návod můžeme použít tak, jak je.
Jinak můžeme zkusit dotázat se na konstrukční krok daného prvku ConstructionStep(object) a testovat ten. Tady už je ale třeba dát pozor jednak na dotaz na objekty, které zatím (v dané fázi krokování) nejsou sestrojeny – u nich se nemůžeme ptát na jejich konstrukční krok –, jednak na cyklické odkazy, které tak mohou snadno vzniknout.
Následující postup předpokládá, že v appletu máme volnou
číselnou proměnnou kr pro zjištění kroku konstrukce
aktuálně zpracovávaného prvku. Objekt krok je ve
shodě s výše uvedenými postupy definován jako aktuální krok konstrukce ConstructionStep().
Podobně jako výše můžeme pracovat rovnou s polem názvů
objektů a provedeme iteraci přes všechny prvky pole forEach():
var prvky = ggbApplet.getAllObjectNames();
prvky.forEach(nastavSilu);
function nastavSilu(prvek) {
if (ggbApplet.isDefined(prvek)) {
ggbApplet.evalCommand("SetValue(kr,ConstructionStep(" + prvek + "))"); // aktuální krok
var p = ggbApplet.getValue("kr");
var k = ggbApplet.getValue("krok");
j = Math.max(1, 8 + p - k);
ggbApplet.setLineThickness(prvek, j);
}
}
(viz druhá ukázka níže)
Ukázky se na pohled neliší (jsou zde pro stažení) protože v konstrukci nejsou objekty typu mnohoúhelník, které způsobí to, že se rozejte pořadí příkazu s číslem objektu v konstrukci.
Postup, kde nehlídáme rozdíl mezi číslem v poli objektů a pořadovým čislem v konstrukci
Postup důsledně kontrolující konstrukční kroky
Přístup "všechno nebo nic"
Pokud budeme trasovat opravdu každý konstrukční krok, můžeme být striktnější a používat jen dvě tloušťky čar.
A nebo tři, čtyři, když dopíšeme nastavení pro předposlední, předpředposlední,... krok.
Ilustrujeme jen zmíněný přístup "všechno nebo nic".
var pocet = ggbApplet.getObjectNumber();
var j = 1;
for (i = 0; i < pocet; i++) {
j = (i + 1 == ggbApplet.getValue("krok")) ? 8 : 1;
ggbApplet.setLineThickness(ggbApplet.getObjectName(i), j);
};
V níže vloženém appletu, kde jsou použité body zastavení, nedělá to, co bychom si přáli.
Takhle raději ne, to nefunguje
Podobně s barvami
Analogie téhož:
var pocet = ggbApplet.getObjectNumber();
var kr = ggbApplet.getValue("krok");
for (i = 0; i < pocet; i++) {
if ((kr-1 - i) < 4) {
ggbApplet.setColor(ggbApplet.getObjectName(i), 255, 0, 0);
} else {
ggbApplet.setColor(ggbApplet.getObjectName(i), 0, 0, 0);
}
}