ggbApplet.setVisible(...)

FriedrichLaher shared this question 1 year ago
Answered

Bedienungsanleitung: nach Laden/Start der ggb erstmal den Textblock löschen ( also Rechtsklick ...), dann Punkt A klicken;

nachdem der Textblock wieder erschienen ist Linksklick in den Text; der Listener "frst" sollte eigentlich ( Zeile 70, spätestens 71 ) Segmente um den Text herum, je Klick ein weiteres sichtbar- und das vorherige unsichtbar machen; seltsamerweise geschieht das abers erst, wenn außerhalb des Fensters und dann wieder innerhalb linksgeklickt wird.


{
if ( ! ggbApplet.exists('TEXT'))
{
var a  =   ggbApplet, c = a.evalCommand, n = '\n',
    q  =   '\"',
                     cl = a.evalCommandGetLabels,
   lg = console.log, cf = confirm,
   schonWieder = 0,
   NoSGMNTS = 8   ,NoPOINTS = 8,  klickZhlr = 0,
   ColorIdx = 0   ,SgmntIdx = 0,
   POINTS = [0,1,2,3,4,5,6,7],
   SGMNTS = [0,1,2,3,4,5,6,7],
   COLORS =
   ["red"   ,"green"  ,"blue","pink","lawngreen",
    "yellow","magenta","orange","Tomato","DarkGreen"
   ],
   NoCOLORS = COLORS.length,
   Ia
    c('SGMNtDscr =\
      {"\\text{hor  unten  links}","\\text{hor  unten  rechts}",\
       "\\text{vrt  rchts  unten}", "\\text{vrt  rechts  oben}",\
       "\\text{hor  oben  rechts}", "\\text{hor  oben  links}",\
       "\\text{vrt  links  oben}" ,"\\text{vrt  links  unten}"}'
   +n+'\
    TEXT =Text("\\text{Dwpspr, mwt Schrpwbrwchtzng pxrxllpl zzr xwchsp lwpgpndp Tpxt wwrd dzrch\\\\dxs - vqn Strpckpn zwwschpn spwnpn tckpznktpn 1-2-3-4-1 gpbwldptp\\\\Rpchtpck - (fxst) pngstm=glwch pwngpschlqsspn.\\\\Dwpsps Rpchtpck swpht mxn wpnn mxn - mwt Mxzszpwgpr - hwnpwn-\\\\gpstpllt,  lwnksKlwckt. Klwcks xzßprhxlb vprbprgpn dwpsp grxzp Lwnwp wwpdpr.\\\\Dxs pnglwschsprxchwgp @qzwvxlpnt fRr dpn dpztschpn Bpfphl tckpznkt wst \\\\Cqrnpr znd mwr dpr K8rzp wpgpn sympxtwschpr.}",\
    \
    A + (0,-1),true,true)'
  +n+'\
    Ia : ( x( A), y( Corner(TEXT,1) ) - 0.3 )'
    );
 for(i=0,j=1;i < 8;i+=2,j++){ // 0: C1, 2: C2, 4: C3, 6: C4

    POINTS[i] = cl('Corner(TEXT,'+j+')')
 }
 for(i=0,j=1;i < 8;i+=2,j+=2){

   POINTS[j] = cl('Midpoint('+POINTS[j-1]+','
                             +POINTS[(j+1) & 7]+')')
 }
 for(i=0;i<8;i++){
     SGMNTS[i] = cl('Segment('+POINTS[ i ]+','
                              +POINTS[(i+1) & 7 ]+')'
                   )
 }

    POINTS.concat(SGMNTS,'Ia','HP')
    .forEach(
    function(o){ a.setLabelVisible(o,0)
                 a.setVisible(o,0);
    })
    a.registerClickListener('frst')

    if( schonWieder > 1)
    cf("Mist, da ist mir ein Fehler entgangen")

++schonWieder;

    function frst(o) {
             if ( o != 'TEXT') return

             var snam = SGMNTS[ SgmntIdx ]

            c('t2 = Text(Element(SGMNtDscr,'+(SgmntIdx+1)+'), Ia , true,true)'
            )
            a.setLineThickness( snam,4)
            a.setVisible( SGMNTS[(SgmntIdx-1) & 7],0)
            c('SetColor('+snam+','+COLORS[ColorIdx]+')'
           +n+'SetFilling('+snam+',1)'
             )
             a.setVisible( snam, 1)
             a.refreshViews()
            ++SgmntIdx, SgmntIdx &= 7
            ++ColorIdx, ColorIdx %= NoCOLORS
    }
}
}(0)

Comments (15)

photo
1

Sorry, your file is too complicated to understand. Please make a simple test-case and explain what you are trying to do overall

photo
1

klick in den Text hinein sollte hier die Sichtbarkeit von s4 und uu umschalten, so, wie das klicks auf Punkt c

ordnungsgemäß tun . Insideklicks mit folgenden Outsideklicks sind jetzt noch seltsamer. Farbe habe ich bei small.ggb

weggelassen. Allerdings scheint mit dem Färben auch was nicht zu Stimmen.


{ //
var
a = ggbApplet, c = a.evalCommand, n = '\n',
              cl = a.evalCommandGetLabels,
   lg = console.log, cf = confirm

// textbox, with clickable content;
// click, inside,
// should toggle visibilites of uu and s4
// problem:
// change shows up only after the inside-click
// ist followed by an outside one.

if ( ! ggbApplet.exists('TEXT'))
{
    c('TEXT =Text("\\text{Dwpspr, mwt Schrpwbrwchtzng pxrxllpl zzr xwchsp lwpgpndp Tpxt wwrd dzrch\\\\dxs - vqn Strpckpn zwwschpn spwnpn tckpznktpn 1-2-3-4-1 gpbwldptp\\\\Rpchtpck}",\
     A + (.5,-1),true,true)'
    )
    c( 'C1 = Corner(TEXT,1)'+n+'C2 = Corner(TEXT,2)'
    +n+'C3 = Corner(TEXT,3)'+n+'C4 = Corner(TEXT,4)'
    +n+'s1 = Segment(C1,C2)'+n+'s2 = Segment(C2,C3)'
    +n+'uu = Segment(C3,C4)'+n+'s4 = Segment(C4,C1)'
    )
     a.setVisible('s4',0)
     a.registerClickListener('showHide')
 }
 function showHide(o) { if( o != 'TEXT') return

     a.setVisible('s4',!a.getVisible('s4')) // toggle visi-
     a.setVisible('uu',!a.getVisible('uu')) // bility of s4,s3
 }
}(0)

photo
1

here with smaller textblock. Insideklicks toggle only label visibility, which is not intended, only the following outside klick

korrects that.

{ //
var
a = ggbApplet, c = a.evalCommand, n = '\n',
              cl = a.evalCommandGetLabels,
   lg = console.log, cf = confirm

// textbox, with clickable content;
// click, inside,
// should toggle visibilites of uu and s4
// problem:
// change shows up only after the inside-click
// ist followed by an outside one.

if ( ! ggbApplet.exists('TEXT'))
{
    c('TEXT =Text("\\text{Dwpspr, mwt Schrpwbrwchtzng pxrxllpl zzr xwchsp lwpgpndp Tpxt wwrd dzrch\\\\dxs - vqn Strpckpn zwwschpn spwnpn tckpznktpn 1-2-3-4-1 gpbwldptp\\\\Rpchtpck}",\
     A + (.5,-1),true,true)'
    )
    c( 'C1 = Corner(TEXT,1)'+n+'C2 = Corner(TEXT,2)'
    +n+'C3 = Corner(TEXT,3)'+n+'C4 = Corner(TEXT,4)'
    +n+'s1 = Segment(C1,C2)'+n+'s2 = Segment(C2,C3)'
    +n+'uu = Segment(C3,C4)'+n+'s4 = Segment(C4,C1)'
    )
     a.setVisible('s4',0)
     a.registerClickListener('showHide')
 }
 function showHide(o) { if( o != 'TEXT') return

     a.setVisible('s4',!a.getVisible('s4')) // toggle visi-
     a.setVisible('uu',!a.getVisible('uu')) // bility of s4,s3
 }
}(0)

photo
1

Die folgenden Bemerkungen gelten für Version GGB-5.0 (vermutlich auch 6.0) und für JS, der innerhalb des GGB-Files eingebettet ist (also nicht in HTML).

.

Die Funktion für einen Listener muss zwingend in Global-JS definiert werden.

Es ist auch sinnvoll das Registrieren des Listeners ebenfalls in Global-JS vorzunehmen (in ggbOnInit() )

Das sieht dann in Global-JS wie folgt aus (getestet):

.

function ggbOnInit() {

ggbApplet.registerClickListener('showHide')

//alert("init listener")

}

function showHide(o) {

//alert("showHIde = "+o)

o=""+o //diese Zeile ist ev. nicht notwendig

if( o != 'TEXT') {return} // ev. beser wäre eine Abfrage auf den typ des GGB-Objektes

// da man die folgenden 3 Zeilen auch ohne Listener in onClick-TEXT integrieren könnte

ggbApplet.setVisible('s4',!ggbApplet.getVisible('s4')) // toggle visi-

ggbApplet.setVisible('uu',!ggbApplet.getVisible('uu')) // bility of s4,uu

ggbApplet.evalCommand("SelectObjects( )")

}

.

Der Befehl ggbApplet.evalCommand("SelectObjects( )") sorgt dafür, das nach dem Klick auf den Text, dieser nicht mehr selektiert ist, sodass der mit der Selektion verbundene Rahmen sich nicht mit s4 resp. uu überlagert (sodass das FlipFlop von s4 resp uu überhaupt sichtbar wird).

.

Ausserdem: Der Skript in "A" enthält noch Syntax-Error, sodass innerhalb diesem Skript gar nichts ausgeführt wird (was aber mit obigem Global-JS auch nicht mehr notwendig ist). Es wäre aber hübsch, wenn Du ein GGB-File grob testen würdest (mindestens auf Syntax-Error) bevor Du es ins Forum stellst.


photo
1

Danke für Deine Mühe Rami, tut

mir Leid daß bei Dir mit meinem Code - welchem? - Syntaxerror auftraten. Eigentlich teste ich schon vor dem Posten.

Allerding trat auch jetz, sowohl bei Übernahme aus dem letzten Listing als auch dem ggb keiner auf.

Das mit den "SelecObjects" macht mir allerdings einen Strich durch die Rechnung, denn gerade die durch den Klick in den Text gezeigte Umrandungslinie will ich an den Stellen der unsichtbaren Strecken haben ( in der Aufgabe die ich mir mt dem Code zu Begin des Threads stellte sollen 8 halbe Kanten des Rechtecks reihum je Klick nur eine, mit wechselden Farben sichtbar werden ) Ersatzweise und nicht so begriedigens bietet sich

SelecObjects(aktuelleStrecke) an, auch wenn die Farben dann eben nicht sehr kräftig sind.


Muß mich halt Durchbeißen.


Schöns Wpchenende!

photo
1

ach ja, ich verwende praktisch imm die online Version, also https://www.geogebra.org/classic

photo
1

sorry !!

der Syntax-Error tritt nur in GGB-5.0 auf. Meine etwas spitze Anmerkung war voreilig und unpassend.

Und ich bring meinen obigen Global-JS unter GGB 6.0 nicht zum Laufen.

Ich werde das Ganze unter GGB-6.0 untersuchen und melde mich wieder.

--------------------------------------------------------------------------------

PS:

Ich denke es ist an der Zeit mich von GGB 5.0 zu verabschieden und hoffe, dass ich meinen starken Widerwillen gegenüber der Oberfläche von GGB-6.0 überwinden kann

photo
1

Ich hab es (psychisch) nicht geschafft GGB-6.0 zu verwenden.

Also habe ich wieder 5.0 verwendet aber das Ganze auch in 6.0-portable getestet.

-------------------------------------------------------------------------------

Version 02 imAnhang:

Ganz leicht erweiterter global-JS-scipt aus meinem vorletzten post.

Es ist jederzeit jeweils ein Segment auf allen Seiten sichtbar, sodass der Rahmen erhalten bleibt, auch wenn das text-objekt nicht selektiert ist.

.

Version 03 im Anhang:

  • Hide/Show ist nicht mehr verwendet. Stattdessen wird die Farbe gesetzt.
  • Mit jedem Click auf den Text wird ein Zähler erhöht. Dieser bestimmt in welchem Frame-Segment welche Farbe eingesetzt werden soll. (Dieser Teil nur skizzenhaft und in der einfachsten Form)
  • Der global-JS fragt nicht auf den Objekt-namen sondern auf den Objekt-typ (=="text") ab. Anschliessend erstellt er zum aktuellen Objekt zusätzlich benötigte Objekte (sofern sie noch nicht existieren). Deren Namen ist gegeben durch einen Sufix zum Objekt-Namen des angeklickten Objektes (zum Beispiel: obj+"_{S1}").
  • Noch ein kleiner GGB-Bug: diese generierten (neuen) Objekte müssten beim Schliessen der App GGB veranlassen einen Save vorzuschlagen. Tut GGB aber nicht.

.

.

photo
1

Hallo rame, danke für Deine Mühe, hoffentlich hat es Dir auch Spas gemacht. Wenn Du mit so dicht gepackten Code wiee ClickText03.ggb zurecht kommst, alle Achtung! - Aber vielleicht ist Dein Editor doch besser al meiner. Oder codierst wirdlich direkt Zeichen fpr Zeichen in die Tabs von Geogebra? - Ffür mich nur zur Not für kleinere Korrekturen denkbar. Der Pixelabstand ist ca. 0.1mm und der Textcursor oft schwer zu sehen.


Das Bild zeigt, was ich aus dem globalJs deines ClickText02.ggb gemacht habe.

Für mich sind schon Zeilenlängen > 60 Zeichen unangenehm.


Ist Dir Bewußt daß Du in js mit

varname = ...
eine globale Variable erzeugst ? In ClickText03.ggb has Du das einigemale getan .


Nochmals danke . Fritzef8331417fb1bf78b359d6c97f60c4b8

photo
1

zu "3": sieh Bild; es gelang, Selektion zu erhalten, bei losgelassener Maustaste5982b3d4d744f071232431dca51e93fb

photo
1

zu "3": sieh Bild; es gelang, Selektion zu erhalten, bei losgelassener Maustaste5982b3d4d744f071232431dca51e93fb was ist da passiert

a86cedd6244bbbf27ffdae1302122815

photo
1

zu "3": sieh Bild; es gelang, Selektion zu erhalten, bei losgelassener Maustasted48ea9a1675ebd039e24d00a91c6db8a

photo
1

zu "3": sieh Bild; es gelang, Selektion zu erhalten, bei losgelassener Maustasted48ea9a1675ebd039e24d00a91c6db8a

b4e4b75e6e7acf1140d2e834a31390be

photo
1

Allgemein:

Ich sehe schlecht und arbeite immer mit der Schriftgösse 20 (in allen Fenstern) auf einem 24'' Bildschirm

Das ist in GGB-5 machbar, da die Fenster angeordnet resp. als eigenständige Windows-Frames losgelöst werden können (zB ganze Bildschirm-Breite). Das ist für mich der Hauptgrund warum ich GGB-6 nicht mag (nebst der Hauptmenü-Struktur und dem lokalen Save, der als Export gehandhabt werden muss). Es ist mir unbegreiflich warum die GGB-Entwickler nicht die Tabulatoren des Browsers (für die verschiedenen Fenster) nutzbar machen.

Wenn dann dereinst die Code-Kompatibilität von GGB-5 und GGB-6 zu weit auseinander laufen und sich in GGB-6 (resp. 7) die Möglichkeiten der Fenster-Organisation und der Praktikabilität von grossen Schriftgrössen nicht wesentlich verbessern, dann werde ich mir einen 50'' Bildschirm zulegen oder aber mich von GGB verabschieden (wahrscheinlichere Variante).

.

Das weglassen von "var" geschieht aus Faulheit (ebenso das ";" am Ende eines Ausdruckes). Falls ich auf einer GGB-script-Seite mehr als 1 function() habe, achte ich darauf. Die Globalen Variablen in GGB beschränken sich leider immer (?) auf eine Code-Seite, sodass das Risiko in GGB recht überschaubar ist

Obige Faulheit kompensiere ich damit, dass ich konsequent einrücke (sehr mühsam, da keine Tabulator-Funktion vorhanden) und ggbApplet aus Gründen der Uebersichtlichkeit immer ausschreibe (vermutlich stelle ich letzteres gelegentlich mal um)

.

Zu Version 02

Ja, Deine Logik ist kürzer/einfacher

Für den Operator "?" habe ich mich dumm und dämlich gesucht (es hat sich gelohnt)

Leider, leider läuft dieser sehr nützliche Operator nicht in GGB-5.0

.

Zu Version 03 (eigentlich eher allgemein)

Wenn man den Cursor beim Klicken weit genug bewegt, dann wird "Selektion und Bewegen" dem Klick-Ereignis vorgezogen. Du wirst feststellen, dass in diesen Fällen der Klick-Script (resp. clickListener) nicht ausgeführt wird. Mit "Selektion und Bewegen" wird dann in der Regel das Ereignis "onUpdate" aktiv. Leider (?) verändern sich obige Regel nicht, falls das Objekt auf "fixiert" gesetzt wird. Ansonsten finde ich obige Regel sinnvoll/nowendig.

photo
1

Hallo rami!


Naja fast volle BSbreite kann man - Onlineversion - für ein Skripingfenster, erreichen, indem man die Algebra Ansicht abschaltet. Ja, der lokale Save als Export, das ist mir auch lästig, und daß Pasting nur mit Strg-V möglich ist.


Semicolon: mir fällt gerade keine Kombination von Statements ein wo es NOTwendig wäre -

OOHAA,

doch

a = a + 1 ;b = 2 ;--a ;++b // da darf keines der ; fehlen

// aber

a = a + 1

b = 2

--a

++b

// klappt


Globale var:

das müßten wohl die Entwickler beantworten, aber einfach dürfte es nicht sein ins Umgebende HTML / DOM einzugreifen .


und:

für ein ein "abgeschloßenes" System von Variablen und Funktionen, auch Listenern, die alle im selben "Bei Mausklick oder bei "Update"-Skript stecken gibt es das Verfahren, sie


{ hier dazwischen }(0)


zu plazieren; da bleiben auch die Variablenwerte erhalten die der Ablauf einer Funktion hinerlassen hat.


Einrückungen:

wenn Du firefox verwendest steht Dir die "Javascriptumgebung" zur Verfügung - ein recht komfortabler Editor mit Syntaxhighlighting, der automatisch formatiert und außerdem bei der Fehlersuche hilft kann Sogar ablaufen lassen kann man den Code. Die Formatierung ist auch mit noch nicht eingerücktem Code "enblock" möglich. Der auch in firefox enthaltene Debugger ist weniger für ggb Js geeignet, dessen "Konsole" aber nützlich in Verbingung mit js Befehl "colsole.log - da verschwinden die angezeigten Daten nicht nach einer ( nicht nötigen ) Bestätigung wie bei alert oder confirm


Erst wenn das ganze dann einigmaßen paßt Pastest Du es dann nach Geogebra


Erholsamen Feirtag !


F.

© 2020 International GeoGebra Institute