Hi Rutger,
If you look at the end of TNode::DistancetoPrimitive, you will see a few
lines of code selecting the TView if no TNode is selected.
As soon as you have a TNode in the picture, the TView object will be
selected.
You will find below a modified version of tutorials/tornado.C
where I have added a few lines to draw a dummy TNode with
visibilty set to 0.
In your event display program, you can use the same logic as in
TNode::DistancetoPrimitive to select TView if nothing else
is selected.
Rene Brun
{
double PI = 3.141592653;
int d = 16;
int numberOfPoints=200;
int numberOfCircles=40;
float x, y, z;
// create and open a canvas
sky = new TCanvas( "sky", "Tornado", 300, 10, 700, 500 );
sky->SetFillColor(14);
// creating view
TView *view = new TView(1);
float range = numberOfCircles*d;
view->SetRange( 0, 0, 0, 4.0*range, 2.0*range, range );
for( int j = d; j < numberOfCircles*d; j += d ) {
TPolyMarker3D *pm3d = new TPolyMarker3D( numberOfPoints );
for( int i = 1; i < numberOfPoints; i++ ) {
float csin = sin(2*PI / (double)numberOfPoints * (double)i) +
1;
float ccos = cos(2*PI / (double)numberOfPoints * (double)i) +
1;
float esin = sin(2*PI / (double)(numberOfCircles*d) *
(double)j) + 1;
x = j * ( csin + esin );
y = j * ccos;
z = j;
pm3d->SetPoint( i, x, y, z );
}
pm3d->SetMarkerSize( 1 );
pm3d->SetMarkerColor( 2 + ( d == ( j & d ) ) );
pm3d->SetMarkerStyle( 3 );
pm3d->Draw();
}
TBRIK *brik = new TBRIK("BRIK","BRIK","void",200,150,150);
TNode *node1 = new TNode("NODE1","NODE1","BRIK");
node1->SetVisibility(0);
node1->Draw("same");
}
On Thu, 2 Mar 2000, Rutger van der Eijk wrote:
> Hi Rene,
>
> I looked into it a bit further. Basically my question can be explained
> by looking at the examples tornado.C and shapes.C in the tutorial.
>
> In shapes.C I create some shapes attach them to a a node. And than draw
> the top node. On the canvas (I don't mean the X3D view) I can rotate the
> view anywhere in the canvas. If I turn on 'event status', I see that this
> is because TView is always selected if not one of the shapes is 'near'.
> This is what I mean with TView beging on the 'background', and it is the
> effect I want to have.
>
> No if I execute tornado.C I get something different. I can only rotate if
> my mouse is near the tornado. If I am away from the tornado the canvas is
> selected and NOT the TView.
>
> My question is: Why is in the case of tornado not TView 'on the
> background'?
>
> Cheers,
>
> Rutger
>
> On Sat, 26 Feb 2000, Rene Brun wrote:
>
> > Hi Rutger,
> > The way you create TView is OK. I have to know a bit more about
> > what your Track class is (how you draw it?) to come with a diagnostic.
> > Look at $ROOTSYS/tutorials/tornado.C for a simple example.
> > Did you derive your class from TAtt3D ?
> > At least one 3-d object must be in the pad to get the view cursor.
> >
> > Rene Brun
> >
> >
> > On Fri, 25 Feb 2000, Rutger van der Eijk wrote:
> >
> > > Hi,
> > >
> > > I want to be able to rotate a track which I draw on a canvas by using a
> > > TView.
> > >
> > > I have some geometry description with the ROOT geometry classes. If I draw
> > > the geometry on a canvas I am able to rotate it. The rotation is provided
> > > by TView. I always get the rotation symbol if the TView is 'selected'
> > > (i.e. shortest distanceToPrimitive; turning on 'Event Status' in canvas
> > > tells me).
> > >
> > > I want to be able to do the same thing (rotate from a TView) with a track
> > > that I paint. So as done in TNode::Draw() (which is called by
> > > TGeometry::Draw()) I create a TView:
> > >
> > > if (!gPad) {
> > > if (!gROOT->GetMakeDefCanvas()) return;
> > > (gROOT->GetMakeDefCanvas())();
> > > }
> > > gPad->Clear();
> > >
> > > TView *view = gPad->GetView();
> > > if (!view) {
> > > view = new TView(1);
> > > view->SetRange(-100, -250, 300, 100, 250, 1000);
> > > // where the range is the range where the track can be present
> > > }
> > >
> > > and after that draw by track
> > >
> > > The track is correctly painted, but I am not able to rotate the track
> > > because TView is never 'selected'. Instead of TView the created canvas
> > > (c1) is selected.
> > >
> > > Why doesn't this work? Or better why is TView selected after a geometry
> > > draw, and in my simple case not?
> > >
> > > (I know I can use a TMarker3DBox to get a box which helps me rotate, but I
> > > want to rotate without having to refer to the TMarker3DBox edges. Which
> > > works with TView on the 'background', i.e. always 'selected' if no other
> > > object is.)
> > >
> > > I have the feeling I am missing something trivial. But I seem not to be
> > > able to figure out what. Can anyone show me the light?
> > >
> > > Thanks,
> > >
> > > Rutger
> > >
> > >
> >
> >
>
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:20 MET