GMF Connections

Status
Nicht offen für weitere Antworten.

js2002

Mitglied
Hi,

ich möchte eine einfach Verbindung ziwschen "LeistungsPlatzhalter"n haben.
Das hat auch funktioniert wie man auf den Grafiken sieht.
Beim Drag & Drop der Connection wird die "Connection" EClass erzeugt und "Source" und "Target" werden gefüllt.
Im ECore Modell habe ich bei der EClass für "LeistungsPlatzhalter" noch 2 Referenzen. Siehe Grafik 2. Die werden leider nicht gefüllt. Was muss ich da tun?

Mein Ziel was dahintersteckt ist:
Ich möchte beim Zeichnen sicherstellen, dass ein "LeistungsPlatzhalter" maximal EINE ankommende Connection hat.
Ich stelle mir das so vor, dass ich dann (wenn es endlich klappt) "Sourceconnections" auf 1 beschränke.
Geht das so oder macht man das anders?


2. Wo kann ich was über EOpposite und EContainment lesen?

Langsam verzweifel ich, ich finde einfach keine gute GMF Literatur.

hscap0688.png


hscap0689.png
 

Wildcard

Top Contributor
Wenn die Reference targetConnection als upper bound 1 hat (und der Rest richtig modelliert ist), kann auch nur eine Connection gezogen werden.
 

js2002

Mitglied
Was meinste mit "Reference targetConnection". Die bei der EClass "LeistungsPlatzhalter" oder die bei EClass "Connection"?

Hier mal die
My.ecore

Die Beschränkung fehlt logischerweise noch.

Mir fällt grad auch noch auf, dass ich mehr als eine Connection von und zu einem "LeistungsPlatzhalter" zeichnen kann. Das soll auch nicht so sein :-(
 

Wildcard

Top Contributor
Code:
  <eClassifiers xsi:type="ecore:EClass" name="LeistungsPlatzhalter">
    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
    <eStructuralFeatures xsi:type="ecore:EReference" name="targetconnections" upperBound="1"
        eType="#//Connection"/>
    <eStructuralFeatures xsi:type="ecore:EReference" name="sourceconnections" upperBound="-1"
        eType="#//Connection"/>
  </eClassifiers>
Das eOpposite musst du noch setzen.
EOpposite von Connection#source wäre LeistungsPlatzhalter#sourceconnections, das eOpposite von Connection#target wäre LeistungsPlatzhalter#targetconnections
 

js2002

Mitglied
Danke, ich probiere es gleich mal aus. (Auch wenn ich schon gefühlte 40 Stunden am PC sitze)
Kannste mir denn sagen woher ich sowas wissen soll?
Ich kann dich ja nicht ewig als mein persönliches Handbuch "benutzen"....
 

Wildcard

Top Contributor
Ich halte speziell EMF für sehr gut dokumentiert.
Die Properties sind ja nun nicht gerade endlos viele, daher sollte man in der Lage sein nachzuschauen wenn einem Property XY nichts sagt.
 

js2002

Mitglied
Ich hab das IBM RedBook und Containment steht da in sehr schlechtem Englisch erklärt.
EOppsite nicht.
 

Wildcard

Top Contributor
js2002 hat gesagt.:
Ich hab das IBM RedBook und Containment steht da in sehr schlechtem Englisch erklärt.
EOppsite nicht.
Das sehe ich anders:
http://www.redbooks.ibm.com/redbooks/pdfs/sg246302.pdf hat gesagt.:
The EMF eOpposite attribute of the eReferences entity is very helpful when
making a connection between two ports with an edge, because for all the
references with an eOpposite attribute, EMF keeps track of the changes on the
other side of the reference. This means, for example, that if you add an Edge to
an OutputPort:
outputPort.getEdges().add(edge);
Then EMF will do the opposite setup automatically and transparently for you:
edge.setSource(outputPort);
When creating an association in the EMF Class Diagram in the UML plug-in.
The Navigable checkbox (see Figure 1-12 on page 20) drives the access to the
association features. Once an association is navigable on both ends, a change
on one side is reflected on the other side, because the eReferences’ eOpposite
attributes are used.
 

js2002

Mitglied
Ja, entschuldige, es lag wohl an meiner Übermüdung und dem Zeitdruck. Sorry.

Das mit dem name="targetconnections" upperBound="1" funktioniert wunderbar!
Mein Editor erlaubt nun nur mehrfache Ausgänge und nur einen Eingang.

Eins ist da noch komisch dran.
Man kann "Platzhalter" A ---> "Platzhalter" C und "Platzhalter" B ---> "Platzhalter" C erstmal zeichnen.
Wenn refreshed wird (z.B. durch einfügen von irgendwas) verschwindet das zuerstgezeichnete, also A->C.

2 Möglichkeiten:

1. Jedes mal nach dem Einfügen einer "Connection" refresh'en, also neuzeichnen lassen. Nicht so die feine Lösung, denn vielleicht wollte der Zeichner die alte Verbindung behalten.

2. Diese Lösung wäre schöner: Wenn man eine zweite "Connection" auf den "Leistungsplatzhalter" zieht, sollte ein Symbol beim Mauszeiger kommen ala "nicht möglich". (Wie es ja auch passiert, wenn ich versuche diese Connection mit anderen Figures zu benutzen, meine, dass der Mauszeiger zu diesem Stopschild wird)

Ist das oben beschriebene Verhalten normal oder ist mein mapping fehlerhaft?

Ich schicks mal mit:
My.gmfmap
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben