Beschränkung und trotzdem Freiheit?

FriedrichLaher shared this question 2 years ago
Answered

Gegeben seien die Objektnamen Strings p1,p2 und PfP, wobei p1,p2 die schon existierender Punkte sind.

Wenn nun ein Skript

ggbApplet.evalCommand(PfP + '= Point( PerpendicularLine(' +p1+','+'Segment('+p1+','+p2+'))) ')
durchführt entsteht zwar ein entlang der Vertikalen zu p1,p2 freier Punkt, der aber u.U. überdeckt oder weit drausen auf dem Zeichenblatt plaziert ist.

Wie schaffe ich nun daß PfP weiterhin frei auf der Vertikalen , aber nicht in Extremlage plaziert wird? - Oder, wie ist denn das MoveTOOL realisiert - wenn es einem Skript möglich wäre, ein Objekt mittels ( ungezeichneten ) Vektors zu bewegen ( also nicht auch zu Duplizieren und/doder abhängig zu machen - also: forget the history ) - wäre das Problem gelöst

Comments (12)

photo
1

Hoffe, das folgende kappt auch weiter. Skript steckt im Punkt C .

/*
* PfP: Pfeilposition: Point, mit dem die Pfeilspitze
*                            auf- und abbewegt wird.
* BlL, BlR : "Bezugslinien :", normal auf die Enden
*                      der um bemaßenden Strecke:
* Zwischen diesen der Doppelpfei BlL |<--->| BlR
*                                    |     |
* hght : height, bestimmt die Länge der BlL,B
****************************************************/

ggbApplet.evalCommand('\
PfP  = Point( PerpendicularLine( A, Segment(A,B) ) ) \n\
hght = Point( PerpendicularLine( B, Segment(A,B) ) )\n\
\
BlR  = Segment(B,hght)\n\
BlL  = Translate(BlR, Vector(B,A))\n\
PfPr = Translate(PfP, Vector(A,B))\n\
Midd = Midpoint(PfP,PfPr)\n\
Adjustor = Vector(Midd,PfP)\n\
           Vector(Midd,PfPr)'
)
with(ggbApplet){
  setVisible('A',0);
  var  xA = getXcoord('A'),yA = getYcoord('A'),
       xB = getXcoord('B'),yB = getYcoord('B');

  setCoords('PfP',xA,yA);setCoords('PfPr',xB,yB);
}


Nachdem ich den Punkt PfP ( und auch sein Gegenstück PfPr auf der p2 seite der Strecke p1,p2 ) erstmal hinwandern ließ wo er will, setze ich die beiden einfach auf A und B, und die Freiheit sie auf einen beliebigen Abstand von A,B einzunehmen bleibt : verschieben an PfP; https://www.geogebra.org/m/ka4fxdw5

photo
1

Soll das eine Bemaßung werden (dann müsste ich mal graben da ich das irgendwo schon habe)? Wenn ja dann möchte ich wissen welche Möglichkeiten du dir offen halten willst (z.B. soll die Strecke A zu B immer parallel zur Maßlinie sein/ willst du auch den Text außerhalb der Maßhilfslinien platzieren usw.). Nur das mit dem Text wird etwas umständlich in GGb.

photo
1

Habe es wieder gefunden. Ich würde das mit meinem aktuellen Wissen zwar anders machen aber evtl. ist es ja nicht das was du willst.

/fqysGxu7dZIAAAAASUVORK5CYII=

photo
1

danke für Deine Mühe, ich schätzr mal das hat dich 14 Tage oder mehr beansprucht. Allerdings sehe ich keine allgemeine Aufabenstellung . Wenn ich mit meinem zurechtgekommen bin werde ich Deines näher ansehen. Kann bei den vielen Tipp- und Denk-Fehehlern, bedingt durch Parkinson und Übermüdung die ich alseine finden muß, noch dauern . "Alter ( 70 ) Mann ist kein Schnellzug" :)

photo
1

Die Frage meinerseits ist immer noch ob du eine Bemaßung realisieren möchtest? Möchtest du eins so wie oben im Beispiel? Oder willst du eine die mehr/weniger kann? Möchtest du nur wissen wie das funktioniert oder willst du eine fertige Lösung oder ein Skript/Werkzeug? Die Fragen weiter oben sind auch noch offen?


Oder willst du gar keine Bemaßung?

photo
1

Hallo Loco

was ich will ist Hilfe zur Selsthilfe, und vielleicht, auch anderen zu nützen.

Ja, ich will eine B. realisieren.

Ersteinmal nur wie schon anbedeutet, Text vielleicht noch dazu. Aber nichts geknicktes / Gekrümmtes.

Dazu

habe ich inzwischen das Skript geschafft.

Mit

"Die Fragen weiter oben sind auch noch offen?"

meinst Du was?

Seltsam

fand ich, daß im folgenden Code die Zeile

42: a.registerObjectClickListener( 'EinAusTxt','EinAusListener');

notwendig war

und daß,

von den Zeilen 24-26 , wirklich nicht, wie ich meinte, eine genügt. ( die Parameter i1..i3) dienen nur Debugzwecken ).

Der Versuch, auf die Schnelle ein Werkzeug daraus zu machen klappte nicht befriedigend.

Bedienungsablauf:

  • Code in das "Bei Mausklick" Tab eines Objects namens 'AA' plazieren,
  • einmal laufen lassen
  • den roten Text klicken, der dann Blau wird und damit den Bemaßer klickgierig macht
  • Bewegetool wählen
  • Endpunkte zu bemaßender Strecken klicken .

Die Pfeile können dann am zuerst geklicktem Punkt beliebig verschoben werden ( und dabei vorerst in der "Luft hängen" ), danach, mit dem Punkt auf der anderen Seite des B.Strecke die Bezugslinien Bezugslinien ( womit ich die Senkrechten zur bemaßenden Strecke meine );

Dir "Justierpunkte" können durch Klick auf den Schaft des Pfeils, der auf den Pfeilbewegerpunkt zeigt, unsichtbar gemacht werden oder wieder sichtbar.


Gegen ALLE möglichen Fehlbedienungen ist es wohl noch nicht geschützt.

{
//  t1st = Target1st,t2nd = Target2nd;  // global für tests
//  eals = EinAusListener;
   var
            p1, N,  R = 255, G = 0, B = 0,
            PfP,    pfx      , obj,
       bm = ['AUS', 0,'EIN'];
  const
        a = ggbApplet,
        n = '\n',
       cl = console.log,
        c = a.evalCommand,
      RGL = a.registerClickListener,
     uRGL = a.unregisterClickListener
;
 a.setVisible('AA',0);
  uRGL('Target1st'); uRGL('Target2nd');

  if ( !a.exists( "Bemaßungen" )) { c('Bemaßungen = 0');
  }
  N = a.getValue("Bemaßungen") ;
  ;
   EinAusListener('i1');
   EinAusListener('i2');
   EinAusListener('i3');
  ;
  a.registerObjectClickListener( 'EinAusTxt','EinAusListener');

  // --------------------------------------------------------------------
function
EinAusListener(obj) {

    a.setColor('EinAusTxt', R,G, B) ; R ^= 255; B ^= 255;

    var bmTxt = '$bMß\\\\'+bm[ bm[1] ^= 2 ] + '$';

    if ( !bm[1]) RGL('Target1st'); else{uRGL('Target1st'); uRGL('Target2nd');}

    c( 'EinAusTxt = Text('+ '"'+bmTxt+'"'+', (0,4),false,true)' );

    a.registerObjectClickListener( 'EinAusTxt','EinAusListener');
}
// -----------------------------------------------------------------
function chk(siz,aus) { pfx = obj.slice(0,siz) ;

        return (   ( pfx.length == siz  ) && ( aus.indexOf(pfx) > -1)
               )
} // -----------------------------------------------------------------
function Target1st(pp1) { if ( bm[1] ) return ;

     obj = p1 = pp1; if(  ( p1 != 'EinAusTxt' ) && !chk(8, 'Adjustortheother')
                                                && !chk(4, 'hghtMidd')
                                                && !chk(3, 'PfPBlLBlR') )
    { uRGL('Target1st');RGL('Target2nd');}
}//--------------------------------------------------------------
  function Target2nd(p2) { const p2eQp1 = 'abbrechen => neue/ANDERE Bemaßung\n\
                                           OK        => anderer 2ter Punkt'
    if ( bm[1] ) return ;

    switch(p2){
        case 'EinAusTxt': return;
        case  p1: if(   ! confirm(  p2eQp1 ) )
                  { uRGL( 'Target2nd' ) ; RGL( 'Target1st' ) ;
                    return;
                  } else  return;
    }
//  Punkt2 IST != Punkt1; wird verarbeitet, dann wieder Punkt1 erwartet;
//  Klicks an der gerade erzeugten Bemaßung dürfen aber nicht als
// "1te" der nächsten Bemaßung gelten

    uRGL('Target2nd');
     PfP = 'PfP' + N;
    hght = 'hght' + N;
    var
    BlR = 'BlR' + N,
    BlL = 'BlL' + N,
    PfPr = 'PfPr' + N,
    Midd = 'Midd' + N,
    Adjustor = 'Adjustor' + N,
    theother = 'theother' + N
    ;
    c(PfP + '= Point( PerpendicularLine(' +p1+','+'Segment('+p1+','+p2+'))) '+n
    + hght +'= Point( PerpendicularLine(' +p2+','
                             + 'Segment(' +p1+','+p2+ ') ) )'+n
    + BlR + '= Segment(' + p2 +','+ hght + ')'+n
    + BlL + '= Translate(' + BlR +','+'Vector('+p2+','+p1+'))'+n
    + PfPr + '= Translate('+PfP+','+'Vector('+p1+','+p2+'))'+n
    + Midd + '= Midpoint(' +PfP+','+PfPr+')'
    +n
    + Adjustor + '= Vector('+Midd+','+PfP+ ')'+n
    + theother + '= Vector('+Midd+','+PfPr+ ')'
    );
    var x1 = a.getXcoord(p1), y1 = a.getYcoord(p1),
        x2 = a.getXcoord(p2), y2 = a.getYcoord(p2)
    ;
    a.setCoords(PfP, x1,y1); a.setCoords(PfPr,x2,y2);
    a.setCoords(hght,x2,y2);

    a.setVisible(p1+'_1',0); a.setVisible(p1+'\'',0)

    a.setLabelVisible(hght + '\'', 0);
    a.setLabelVisible(p2 + '\'', 0);
    a.setVisible(Midd, 0);
    [
      PfP,
      hght,
      BlR,
      BlL,
      PfPr,
      Adjustor,
      theother
    ].forEach(function (pnt) { a.setLabelVisible(pnt, 0);}
             );
    a.setVisible(PfPr, 0);
    a.setVisible(hght + '\'', 0);
    [
      BlL,
      Adjustor,
      theother,
      BlR
    ].forEach(function (l) { a.setLineThickness(l, 1);
                             a.setFilling(l, 1);
            });
    a.registerObjectClickListener( Adjustor,'enableAdjusting');

    c("Bemaßungen ="+ (++N) );

    RGL('Target1st');
// -----------------------------------------------------------------
} // 2nd -------------------------------------------------------
function enableAdjusting(Ajstr) { var sfx = Ajstr.slice(8);

//      if ( bm[1] ) EinAusListener ? noch umschreiben

      var p =  'PfP'+sfx; a.setVisible(p, !a.getVisible(p));
          p = 'hght'+sfx; a.setVisible(p, !a.getVisible(p));
    }
// --------------- - -- --------------------------
} (1)
Danke fürs lesen.

Gruß Fritz

photo
1

Nachtrag: ich nehme an es stört nicht daß das "Justieren" weiterhin möglich ist, auch wenn das Bemaßen abgestell ist ( roter Text ) .

photo
1

Ich bin leider nicht mit JavaScript vertraut und konnte dein Beispiel leider nicht ausführen. Es scheitert schon daran, dass dein Skript die Console benötigt. Im Anhang eine bereinigte Bemaßung. Leider kann ich jenes bereinigtes Beispiel nicht in GGb als benutzerdefiniertes Werkzeug definieren. Das hatte ich vor Jahren in dem obigen Beispiel bereits versucht und habe es dann sein lassen. Ich wollte ursprünglich ebenfalls sich mitdrehende Texte, Texte auf der Maßlinie und Innen/Außen-Pfeile mit einbauen. Diese Pläne hatte ich damals aufgrund der Schwierigkeiten der Werkzeugerstellung auch fallen lassen.

/JvkUsZeYTYMAAAAASUVORK5CYII=

Falls du Fragen dazu hast kann ich sie dir gerne beantworten.

Bezüglich JavaScript müsstest du entweder warten bis jemand mit Kenntnis und Interesse vorbei kommt oder eventuell eine Datei mit (teilweise) funktionierenden Elementen posten da ich in jener Sache eine Starthilfe bräuchte.

photo
1

Hallo Loco,

bin gerade etwas zittrig, daher nur kurze Antwort.

Die Konsole Zeile in meinem Code kannst Du auskommentiereen oder löschen, sie hat keinen Einfluß auf die Funktion.

Ansonsten

sollte es eigentlich Funktionieren wie ich unter "Bedienungsablauf" aufgezählt habe.

Zu

Code in das "Bei Mausklick" Tab eines Objects namens 'AA' plazieren hier noch detailierteres:

* in die Eingabezeile

AA = (1,2)

tippen oder andere x,y Werte statt der 1,2

* dann Rechtsklick auf das AA

* und im sich öffnendem Menü Linksklick auf

"Einstellungen"

* dort Linksklick auf "Skripting"

* und dort, unten

**GANZ WICHTIG, "Javaskript" selektieren.

* Dann das Skript in das Edierfenster hineinpasten.

**auch WICHTIG: das Skript muß schon VORHER, mit Maus odeer Tastatur "selektiert" und "kopiert" sein, also zum Pasten bereit.

* Danach das große dünne X über dem Zahnradsymbol am rechten Fensterrand klicken. Nun noch, falls nicht schon geschehen,

die Zeile cl = console.log löschen.

Mit "einmal laufen lassen" meine ich "Linksklick auf das "AA" auf dem Zeichenblatt.


Viel Erfolg!

Fritz.


javaskript tutorial

https://www.w3schools.com/js/

photo
1

Hallo FriedrichLaher,

ich habe derzeit leider etwas viel zu tun. Leider konnte ich das Skript nicht zum laufen bringen. Eventuell komme ich in zwei bis drei Wochen dazu mir JS anzueignen.

Grüße

Loco

photo
1

Danke, daß Du es so ernst nimmst. Ich kämpfe inzwischen mit gedrehtem Text und disen symmetrisch ( nicht zur :) aber) auf, eine Strecke zu bringen / plazieren.

f, Strcke von A nach B und Text1 seien auf dem Zeichenblatt vorhanden

das folgende script sei wieder an "Bei Mausklick" irgendwo

var a = ggbApplet, c = a.evalCommand, gX = a.getXcoord, gY = a.getYcoord
;
c('RotateText( Text1,Slope(f) )') ;

c('Mrt = ( Corner( Text2,1 )      // Mittelpunkt des 
         + Corner( Text2,3 ) )/2' // rotierten Textes, der soll zu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            );
c('Mps = Midpoint(f)' );          // dem der Strecke f gebracht werden  
var
xmR = gX('Mrt'), ymR = gY('Mrt'),     //x,y zu Mittelpunkt
                                     // des gedrehten Textes
xms = gX( 'Mps' ), yms = gY( 'Mps'),// x,y zu Mittelpunkt der Strecke

newX = gX('Text2')+xms-xmR, newY = gY('Text2')+yms-ymR
;
a.SetCoords( 'Text2', newX, newY); // schön wär's

photo
1

Texte drehen in GGb ist nicht neu und wurde schon gemacht z.B. hier von rami. Dummerweise macht es GGb einen recht schwierig das so elegant wie in einem CAD (mit Textbezugspunkten) zu machen. Man braucht immer einen Phantomtext um die Außenmaße zu bekommen oder muss seine Positionierung eichen.

© 2021 International GeoGebra Institute