Rotate tool - Need help please urgent

455
2
05-11-2010 01:29 PM
KrishnaPragada
New Contributor II
Rotate tool
Hi All,

I am writing rotate tool similar to ArcMap rotate tool using EngineRotateTrackerClass. I am unable to rotate to features first time, however , able to rotate second time onwards. Can any one help me please.

Here is the scenorio

1. Start editing
2. Select features
3. Select Rotate tool
4. Mousedown on map & rotate features...which is not working.
5. If again mousedown & rotate features working fine.

Here is the code I am using...


private IHookHelper m_hookHelper = null;
private IRotateTracker rotateTracker = null;
bool m_bMouseDownOccurred = true;


public override void OnClick()
{
this.rotateTracker = new EngineRotateTrackerClass();
IScreenDisplay screenDisplay = this.m_hookHelper.ActiveView.ScreenDisplay;
this.rotateTracker.Display = screenDisplay;
}

public override void OnMouseDown(int Button, int Shift, int X, int Y)
{
InitializeTracker();

if (this.rotateTracker != null)
this.rotateTracker.OnMouseDown();

m_bMouseDownOccurred = true;
}

private void InitializeTracker()
{

IEnumFeature enumFeat = this.m_hookHelper.FocusMap.FeatureSelection as IEnumFeature;
if (enumFeat != null)
{
this.rotateTracker.ClearGeometry();

IFeature feat = enumFeat.Next();
ESRI.ArcGIS.Geometry.IGeometry objGeometry = feat.ShapeCopy;
ESRI.ArcGIS.Geometry.IPoint objPoint = new ESRI.ArcGIS.Geometry.PointClass();
objPoint.X = ((objGeometry.Envelope.UpperRight.X - objGeometry.Envelope.LowerLeft.X) / 2.0) +
objGeometry.Envelope.LowerLeft.X;
objPoint.Y = ((objGeometry.Envelope.UpperRight.Y - objGeometry.Envelope.LowerLeft.Y) / 2.0) +
objGeometry.Envelope.LowerLeft.Y;
this.rotateTracker.Origin = objPoint;
this.rotateTracker.ClearGeometry();
//this.rotateTracker.AddGeometry(feat.ShapeCopy);
enumFeat.Reset();
feat = enumFeat.Next();
while (feat != null)
{
this.rotateTracker.AddGeometry(feat.ShapeCopy);
feat = enumFeat.Next();
}
}
}


public override void OnMouseMove(int Button, int Shift, int X, int Y)
{
if (!(Button == 1)) return;

if (m_bMouseDownOccurred)
{
//Debug.WriteLine("RotationTrackerTool beginning OnMouseMove");
if ((this.rotateTracker != null))
{
ESRI.ArcGIS.Geometry.IPoint pPoint = new PointClass();

ESRI.ArcGIS.Display.IScreenDisplay pScreenDisplay = this.m_hookHelper.ActiveView.ScreenDisplay;

pPoint = pScreenDisplay.DisplayTransformation.ToMapPoint(X, Y);
rotateTracker.OnMouseMove(pPoint);
// this.m_hookHelper.ActiveView.Refresh();
}
}
}


public override void OnMouseUp(int Button, int Shift, int X, int Y)
{

try
{
if (!(Button == 1)) return;

//Debug.WriteLine("RotationTrackerTool beginning OnMouseUp");
if ((rotateTracker != null))
{
if (!rotateTracker.OnMouseUp())
{
return;
}
IInvalidArea2 pRefresh = null; ;
pRefresh = new InvalidAreaClass();
pRefresh.Display = this.m_hookHelper.ActiveView.ScreenDisplay;
engineEditor.StartOperation();
IEnumFeature enumFeat = this.engineEditor.EditSelection;
IFeature feat = enumFeat.Next();
while (feat != null)
{

pRefresh.Add(feat);
ESRI.ArcGIS.Geometry.IGeometry pGeom = feat.ShapeCopy;
if (pGeom is ESRI.ArcGIS.Geometry.ITransform2D)
{
ESRI.ArcGIS.Geometry.ITransform2D pTransform2D = pGeom as
ESRI.ArcGIS.Geometry.ITransform2D;
pTransform2D.Rotate(rotateTracker.Origin, rotateTracker.Angle);
feat.Shape = pGeom;
feat.Store();
pRefresh.Add(feat);

}
feat = enumFeat.Next();
}

engineEditor.StopOperation("Rotate Operation");

pRefresh.Invalidate((short)ESRI.ArcGIS.Display.esr iScreenCache.esriAllScreenCaches);
}
}
catch (Exception ex)
{

}
finally
{

}

}
0 Kudos
2 Replies
IdanT
by
New Contributor
I am writing a rotate tool similar to the one you wrote. Did you find a solution to your problem?
If so, can you please post it?

Thanks,
Idan
0 Kudos
CARLOSGARCIA
New Contributor
Ok, I solved it!

IEngineEditor m_pEditor;

1.  public override void OnCreate(object hook)
        {
...            m_pEditor = new EngineEditorClass();
        }
2. private void InitializeTracker()
        {

            IEnumFeature enumFeat = m_pEditor.EditSelection;
...
        }
And works good
0 Kudos