Home » Modeling » QVT-OML » Transform to SysML Blocks(I'm trying to transform a model from a custom meta-model to SysML, but I'm stuck on creating SysML Blocks.)
Transform to SysML Blocks [message #872514] |
Wed, 16 May 2012 09:02 |
Matteo M. Messages: 40 Registered: May 2012 |
Member |
|
|
Dear all,
I'm trying to transform a model from a (extremely simple) custom meta-model to SysML, but I'm stuck on creating SysML Blocks.
By opening a simple Papyrus diagram containing a Block (the *.uml file), I noticed that, in its simpler form, a SysML Block is described by the two following entries:
1) a <packagedElement xmi:type="uml:Class" xmi:id="_pNiGwJnwEeG8hYBgdInPzQ" name="Block0">, inside
<uml:Model xmi:id="_tSXsoJnZEeG_XYf4QGS6LA" name="SysMLmodel"> ... </uml:Model>
2) a <Blocks:Block xmi:id="_pQ_qcJnwEeG8hYBgdInPzQ" base_Class="_pNiGwJnwEeG8hYBgdInPzQ"/>, outside of <uml:Model xmi:id="_tSXsoJnZEeG_XYf4QGS6LA" name="SysMLmodel"> ... </uml:Model> and inside <xmi:XMI xmi:version="2.1" ....> ... </xmi:XMI>
In defining my own QVTo transform I used the following target meta-models (I'm not allowed to post links, thus I changed them a little; I hope they are still clear):
modeltype UMLMM uses "http_://www.eclipse.org/uml2/3.0.0/UML";
modeltype BlocksMM uses "http_://www.eclipse.org/papyrus/0.7.0/SysML/Blocks";
and the following (simple) mapping (Component is defined in the source meta-model):
mapping Component::toBlock() : Class {
name := self.name;
}
Now, I'm able to transform components to UML Classes, but I can't stereotype them to SysML Blocks. I'm moving my first steps with QVTo and M2M transformations in general, so I'd really need to be pointed out to the right direction at this point. Any hints?
Thank you in advance,
--
Matteo
|
|
| |
Re: Transform to SysML Blocks [message #873205 is a reply to message #872514] |
Thu, 17 May 2012 17:15 |
Ed Willink Messages: 7670 Registered: July 2009 |
Senior Member |
|
|
Hi
Look at the various MDT/UML2 apply stereotype helper functions in the
UML meta-model. I think that these can be invoked from QVTo.
Regards
Ed Willink
On 16/05/2012 10:02, Matteo M. wrote:
> Dear all,
>
> I'm trying to transform a model from a (extremely simple) custom
> meta-model to SysML, but I'm stuck on creating SysML Blocks.
>
> By opening a simple Papyrus diagram containing a Block (the *.uml
> file), I noticed that, in its simpler form, a SysML Block is described
> by the two following entries:
>
> 1) a <packagedElement xmi:type="uml:Class"
> xmi:id="_pNiGwJnwEeG8hYBgdInPzQ" name="Block0">, inside
>
> <uml:Model xmi:id="_tSXsoJnZEeG_XYf4QGS6LA" name="SysMLmodel"> ...
> </uml:Model>
>
> 2) a <Blocks:Block xmi:id="_pQ_qcJnwEeG8hYBgdInPzQ"
> base_Class="_pNiGwJnwEeG8hYBgdInPzQ"/>, outside of <uml:Model
> xmi:id="_tSXsoJnZEeG_XYf4QGS6LA" name="SysMLmodel"> ... </uml:Model>
> and inside <xmi:XMI xmi:version="2.1" ....> ... </xmi:XMI>
>
> In defining my own QVTo transform I used the following target
> meta-models (I'm not allowed to post links, thus I changed them a
> little; I hope they are still clear):
>
> modeltype UMLMM uses "http_://www.eclipse.org/uml2/3.0.0/UML";
> modeltype BlocksMM uses
> "http_://www.eclipse.org/papyrus/0.7.0/SysML/Blocks";
>
> and the following (simple) mapping (Component is defined in the source
> meta-model):
>
> mapping Component::toBlock() : Class {
> name := self.name;
> }
>
> Now, I'm able to transform components to UML Classes, but I can't
> stereotype them to SysML Blocks. I'm moving my first steps with QVTo
> and M2M transformations in general, so I'd really need to be pointed
> out to the right direction at this point. Any hints?
>
> Thank you in advance,
>
> --
> Matteo
|
|
| | | |
Re: Transform to SysML Blocks [message #874773 is a reply to message #874747] |
Mon, 21 May 2012 14:18 |
Ed Willink Messages: 7670 Registered: July 2009 |
Senior Member |
|
|
Hi
Casting is done with oclAsType, but only for valid casts.
The message says that Block is not derived from PackageableElement,
which is either true, or only true because your sysml does not correctly
extend uml, and so you have multiple distinct PackageableElement classes.
Regards
Ed Willink
On 21/05/2012 14:32, Matteo M. wrote:
> Dear Ed,
>
> I investigated a little more and I think I made some steps forward...
> Without bothering you with details, I'm now facing the following problem.
>
> I defined a mapping between the root node (Bundle) in MMA and a SysML
> Package:
>
>
> mapping Bundle::toPackage() : Package {
> ...
> }
>
>
> Now I want to transform each Component in MMA to a SysML Block in the
> Package; thus I added the following instruction in the population
> section of the mapping above:
>
>
> packagedElement := self.component->map toBlock();
>
>
> where
>
>
> mapping Component::toBlock() : Block { ... }
>
>
> transforms each Component in a UML Class and then applies the SysML
> Block stereotype. However, the following error is raised up by Eclipse:
> " The type 'sysml::blocks::Block' does not conform to the base type
> 'uml::PackageableElement' of the multi-valued property
> 'packagedElement' "
>
> I don't know what this means: I may guess that (at the very least) an
> explicit casting operation is needed to resolve the type mismatch, but
> I have no idea on how this can be performed. I tried to google for the
> error message, but I didn't find anything.
>
> Since this is only marginally related to "stereotypization", I was
> wondering if you can provide some hints that help me to fix this issue...
>
> Again, thank you in advance.
>
> --
> Matteo
|
|
|
Re: Transform to SysML Blocks [message #881869 is a reply to message #874773] |
Tue, 05 June 2012 12:03 |
Matteo M. Messages: 40 Registered: May 2012 |
Member |
|
|
Dear Ed, dear all,
I finally managed it to work. For those of you having similar issues, the following post has helped a lot:
www.eclipse.org/forums/index.php/mv/msg/32162/104316/#msg_104316
Essentially, it says that you cannot apply stereotypes before you applied profiles to your model. This is somewhat of obvious, but there are cases in which is not (at least for me). For example, assuming that model has SysML profiles applied (i.e. Blocks, PortAndFlows, ...), the following code does not work:
var cls := object Class {name := "foo"};
cls.applyStereotype(blk_st); // line 2
model.ownedType += cls; // line 3
This is ok, since cls has no profiles applied at all. On the other hand, it *does* work if you exchange lines 2 and 3 above, like this
var cls := object Class {name := "foo"};
model.ownedType += cls; // moved up
cls.applyStereotype(blk_st); // moved down
I was wondering why does this happen. My guess is we first have to add the class to the model so that it "inherits" the applied profiles (profiles are initially applied to model, not to cls), and only after we can apply the stereotype on cls with success. Is this right?
But even if it's right, I still have some questions. How does this "profile inheritance" work? I mean, what is the internal implementation of
supposed to do. Does it deep copy the cls's properties in a new Class instance inside model or does it add a "pointer" to cls (like in C lang) to model? And in this latter case how model's profiles are applied back to cls? To put it more easily, where can I find details on the semantics of this command?
Finally, I was trying to change the direction of a SysML FlowPort. The port is correctly added to the model and stereotypes are successfully applied. I was expecting that the following code would work:
// prt is a UML::Port
cls.ownedPort += prt;
prt.applyStereotype(fwpt_st);
prt.aggregation := AggregationKind::composite; // this works
prt.oclAsType(FlowPort).direction := FlowDirection::_'out'; // this does not work
But it does not work. More specifically, I succesfully change aggregation from "none" to "composite", but direction always remains "inout". Can you explain why? Does
operate on a temporary instance of FlowPort?
Thank you in advance for your time!
Regards,
--
Matteo
|
|
|
Re: Transform to SysML Blocks [message #881995 is a reply to message #881869] |
Tue, 05 June 2012 15:47 |
Ed Willink Messages: 7670 Registered: July 2009 |
Senior Member |
|
|
Hi Matteo
Thanks for sharing your solutions.
I don't understand much of this, so the following comments are slightly
instinctive.
Profile inheritance: it is recognised that many aspects of profiles lack
clarity in the specification, so you may be going beyond the safe
operating region. There is an ongoing initiative at the OMG called MEF
(Metamodel Extension Facility) to do a bit better.
"inout". My own experiences of trying to understand the QVT
specification on QVTo invocation context are not good, and the QVTo
project does not provide clarifying documentation. So you are into an
area where empirical discovery may be necessary. I hope to see progress
on the OMG specification and Eclipse tooling in the next couple of years.
Regards
Ed Willink
On 05/06/2012 13:03, Matteo M. wrote:
> Dear Ed, dear all,
>
> I finally managed it to work. For those of you having similar issues,
> the following post has helped a lot:
> www.eclipse.org/forums/index.php/mv/msg/32162/104316/#msg_104316
>
> Essentially, it says that you cannot apply stereotypes before you
> applied profiles to your model. This is somewhat of obvious, but there
> are cases in which is not (at least for me). For example, assuming
> that model has SysML profiles applied (i.e. Blocks, PortAndFlows,
> ...), the following code does not work:
>
>
> var cls := object Class {name := "foo"};
> cls.applyStereotype(blk_st); // line 2
> model.ownedType += cls; // line 3
>
>
> This is ok, since cls has no profiles applied at all. On the other
> hand, it *does* work if you exchange lines 2 and 3 above, like this
>
>
> var cls := object Class {name := "foo"};
> model.ownedType += cls; // moved up
> cls.applyStereotype(blk_st); // moved down
>
>
> I was wondering why does this happen. My guess is we first have to add
> the class to the model so that it "inherits" the applied profiles
> (profiles are initially applied to model, not to cls), and only after
> we can apply the stereotype on cls with success. Is this right?
>
> But even if it's right, I still have some questions. How does this
> "profile inheritance" work? I mean, what is the internal
> implementation of
>
> model.ownedType += cls;
>
>
> supposed to do. Does it deep copy the cls's properties in a new Class
> instance inside model or does it add a "pointer" to cls (like in C
> lang) to model? And in this latter case how model's profiles are
> applied back to cls? To put it more easily, where can I find details
> on the semantics of this command?
>
> Finally, I was trying to change the direction of a SysML FlowPort. The
> port is correctly added to the model and stereotypes are successfully
> applied. I was expecting that the following code would work:
>
>
> // prt is a UML::Port
> cls.ownedPort += prt;
> prt.applyStereotype(fwpt_st);
> prt.aggregation := AggregationKind::composite; // this works
> prt.oclAsType(FlowPort).direction := FlowDirection::_'out'; // this
> does not work
>
>
> But it does not work. More specifically, I succesfully change
> aggregation from "none" to "composite", but direction always remains
> "inout". Can you explain why? Does
>
>
> prt.oclAsType(FlowPort)
>
>
> operate on a temporary instance of FlowPort?
>
> Thank you in advance for your time!
>
> Regards,
>
> --
> Matteo
|
|
|
Goto Forum:
Current Time: Thu Sep 19 03:49:06 GMT 2024
Powered by FUDForum. Page generated in 0.06347 seconds
|