// Copyright 2010 ESRI // // All rights reserved under the copyright laws of the United States // and applicable international laws, treaties, and conventions. // // You may freely redistribute and use this sample code, with or // without modification, provided you include the original copyright // notice and use restrictions. // // See the use restrictions at http://help.arcgis.com/en/sdk/10.0/usageRestrictions.htm // using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Editor; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.esriSystem; using System; using System.Windows.Forms; using Microsoft.Win32; namespace ViperPin { public partial class ViperPinForm : Form { private IEditor m_editor; private IPolyline m_curve; private IEditLayers m_editLayers; private IEditSketch3 m_edSketch; private int m_lotNum; public ViperPinForm(IEditor3 editor) { InitializeComponent(); m_editor = editor; m_edSketch = m_editor as IEditSketch3; m_editLayers = m_editor as IEditLayers; lblEditLayer.Text = m_editLayers.CurrentLayer.Name; //Load field combo box with field names IFields pFields = m_editLayers.CurrentLayer.FeatureClass.Fields; for (int i=0; i < pFields.FieldCount; i++) { cmbPINField.Items.Add(pFields.get_Field(i).Name); } //get pinfield from registry string pinField = null; RegistryKey pRegKey = Registry.CurrentUser.OpenSubKey("Software\\ESRI\\ViperPin"); if (pRegKey != null) { pinField = pRegKey.GetValue("Pinfield").ToString(); } //set the combo box to the pinfield for (int i = 0; i < pFields.FieldCount; i++) { if (pinField == pFields.get_Field(i).Name) { cmbPINField.Text = pinField; break; } else { cmbPINField.Text = "None"; } } //cmbPINField.SelectedIndex = 0; cmbPINField.Refresh(); m_lotNum = 1; txtlot.Text = "1"; //Set center right of form to center right of screen this.StartPosition = FormStartPosition.Manual; this.Left = 0; this.Top = (Screen.PrimaryScreen.Bounds.Height / 2) - (this.Height / 2); } private void cmdOK_Click(object sender, EventArgs e) { m_lotNum = int.Parse(txtlot.Text); //Set pin value SetPINValue(); //save pinfield RegistryKey regKey = Registry.CurrentUser.OpenSubKey("Software",true); RegistryKey newKey = regKey.CreateSubKey("ESRI\\ViperPin"); newKey.SetValue("Pinfield", cmbPINField.Text); this.Hide(); //redraw labels //m_editor.Display.Invalidate(null, true, (short)esriViewDrawPhase.esriViewGraphics); IMxDocument mxDoc; mxDoc = m_editor.Parent.Document as IMxDocument; mxDoc.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } private void cmdCancel_Click(object sender, EventArgs e) { this.Close(); } private void SetPINValue() { //The Theory. //Select polygons that intersect the sketch. //Construct one polyline from the boundaries and intersect with sketch. //Sort resulting intersection locations (multipoint) by distance of the intersect // from the start of the sketch and create new ordered multipoint. //Loop through new ordered multipoint, select underlying parcel and calc pin. IFeatureLayer featLayer = m_editLayers.CurrentLayer; m_curve = m_edSketch.Geometry as IPolyline; //Search parcel polys by graphic to get feature cursor ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = m_curve; spatialFilter.GeometryField = m_editLayers.CurrentLayer.FeatureClass.ShapeFieldName; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses; IFeatureCursor featCursor = featLayer.Search(spatialFilter,true); IFeature feature = featCursor.NextFeature(); //If we have no intersects then exit if (feature == null) return; //Make a GeomBag of the polygons boundaries (polylines) IGeometryCollection geomBag = new GeometryBagClass(); object missing = Type.Missing; while (feature != null) { ITopologicalOperator poly = feature.Shape as ITopologicalOperator; geomBag.AddGeometry(poly.Boundary,ref missing,ref missing); feature = featCursor.NextFeature(); } //Make one polyline from the boundaries IPolyline polyLineU = new PolylineClass(); ITopologicalOperator topoOp = polyLineU as ITopologicalOperator; topoOp.ConstructUnion(geomBag as IEnumGeometry); //Get the intersections of the boundaries and the curve IPointCollection pointCol = topoOp.Intersect(m_curve, esriGeometryDimension.esriGeometry0Dimension) as IPointCollection; //The point collection is not ordered by distance along the curve so //need to create a new collection with this info int[] pointOrder = new int[pointCol.PointCount]; double dac = 0, dfc = 0; bool bRS = false; for (int i = 0; i < pointCol.PointCount; i++) { IPoint queryPoint = new PointClass(); pointCol.QueryPoint(i, queryPoint); m_curve.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, queryPoint, false, null,ref dac,ref dfc,ref bRS); pointOrder = (int)dac; } //use built in bubble sort System.Array.Sort(pointOrder); //Loop through the sorted array and calc midpoint between parcel boundaries IPointCollection midPoints = new MultipointClass(); for (int i = 0; i < pointOrder.Length -1; i++) { //Get the midpoint distance double midPointDist = (pointOrder + pointOrder[i + 1]) / 2; //create a point at the distance and store in point collection IPoint queryPoint = new PointClass(); m_curve.QueryPoint(esriSegmentExtension.esriNoExtension, midPointDist, false, queryPoint); midPoints.AddPoint(queryPoint,ref missing,ref missing); } //If ends of sketch are included then add them as points if (chkEnds.Checked) { object before = 0 as object; midPoints.AddPoint(m_curve.FromPoint, ref before, ref missing); midPoints.AddPoint(m_curve.ToPoint, ref missing, ref missing); } m_editor.StartOperation(); //Loop through calculated midpoints, select polygon and calc pin for (int i = 0; i < midPoints.PointCount; i++) { IPoint midPoint = midPoints.get_Point(i); spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = midPoint; spatialFilter.GeometryField = m_editLayers.CurrentLayer.FeatureClass.ShapeFieldName; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin; featCursor = featLayer.Search(spatialFilter, true); while ((feature = featCursor.NextFeature()) != null) { feature.set_Value(feature.Fields.FindField(cmbPINField.Text), m_lotNum); feature.Store(); m_lotNum += int.Parse(txtlotinc.Text); } } m_editor.StopOperation("ViperPIN"); txtlot.Text = m_lotNum.ToString(); } } }
// Copyright 2010 ESRI // // All rights reserved under the copyright laws of the United States // and applicable international laws, treaties, and conventions. // // You may freely redistribute and use this sample code, with or // without modification, provided you include the original copyright // notice and use restrictions. // // See the use restrictions at http://help.arcgis.com/en/sdk/10.0/usageRestrictions.htm // using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Editor; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.Geometry; using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace ViperPin { public sealed class ViperPinTool : BaseTool, IShapeConstructorTool, ISketchTool { #region COM Registration Function(s) [ComRegisterFunction()] [ComVisible(false)] static void RegisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType); // // TODO: Add any COM registration code here // } [ComUnregisterFunction()] [ComVisible(false)] static void UnregisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType); // // TODO: Add any COM unregistration code here // } #region ArcGIS Component Category Registrar generated code /// <summary> /// Required method for ArcGIS Component Category registration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryRegistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); MxCommands.Register(regKey); } /// <summary> /// Required method for ArcGIS Component Category unregistration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryUnregistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); MxCommands.Unregister(regKey); } #endregion #endregion private IApplication m_application; private IEditor3 m_editor; private IEditEvents_Event m_editEvents; private IEditEvents5_Event m_editEvents5; private IEditSketch3 m_edSketch; private IShapeConstructor m_csc; private ViperPinForm m_form; public ViperPinTool() { base.m_category = "Developer Samples"; //localizable text base.m_caption = "ViperPin"; //Text in construct tools window base.m_message = "populate parcel pin"; //localizable text base.m_toolTip = "Viper PIN tool"; //localizable text base.m_name = "DeveloperSamples_ViperPin"; //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand") try { string bitmapResourceName = GetType().Name + ".bmp"; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); //base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur"); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap"); } } #region ISketchTool Members //pass to constructor public void AddPoint(IPoint point, bool Clone, bool allowUndo) { m_csc.AddPoint(point, Clone, allowUndo); } public IPoint Anchor { get { return m_csc.Anchor; } } public double AngleConstraint { get { return m_csc.AngleConstraint; } set { m_csc.AngleConstraint = value; } } public esriSketchConstraint Constraint { get { return m_csc.Constraint; } set { m_csc.Constraint = value; } } public double DistanceConstraint { get { return m_csc.DistanceConstraint; } set { m_csc.DistanceConstraint = value; } } public bool IsStreaming { get { return m_csc.IsStreaming; } set { m_csc.IsStreaming = value; } } public IPoint Location { get { return m_csc.Location; } } #endregion #region ITool Members //pass to constructor public override void OnMouseDown(int Button, int Shift, int X, int Y) { m_csc.OnMouseDown(Button, Shift, X, Y); } public override void OnMouseMove(int Button, int Shift, int X, int Y) { m_csc.OnMouseMove(Button, Shift, X, Y); } public override void OnMouseUp(int Button, int Shift, int X, int Y) { m_csc.OnMouseUp(Button, Shift, X, Y); } public override bool OnContextMenu(int X, int Y) { return m_csc.OnContextMenu(X, Y); } public override void OnKeyDown(int keyCode, int Shift) { m_csc.OnKeyDown(keyCode, Shift); } public override void OnKeyUp(int keyCode, int Shift) { m_csc.OnKeyUp(keyCode, Shift); } public override void Refresh(int hDC) { m_csc.Refresh(hDC); } public override int Cursor { get { return m_csc.Cursor; } } public override void OnDblClick() { if (Control.ModifierKeys == Keys.Shift) { ISketchOperation so = new SketchOperation(); so.MenuString_2 = "Finish Sketch Part"; so.Start(m_editor); m_edSketch.FinishSketchPart(); so.Finish(null); } else m_edSketch.FinishSketch(); } public override bool Deactivate() { //unsubscribe events m_editEvents.OnSketchModified -= m_editEvents_OnSketchModified; m_editEvents5.OnShapeConstructorChanged -= m_editEvents5_OnShapeConstructorChanged; m_editEvents.OnSketchFinished -= m_editEvents_OnSketchFinished; return base.Deactivate(); } #endregion public override void OnCreate(object hook) { if (hook == null) return; m_application = hook as IApplication; //get the editor UID editorUid = new UID(); editorUid.Value = "esriEditor.Editor"; m_editor = m_application.FindExtensionByCLSID(editorUid) as IEditor3; m_editEvents = m_editor as IEditEvents_Event; m_editEvents5 = m_editor as IEditEvents5_Event; } public override bool Enabled { // Enable the tool if we are editing get { return (m_editor.EditState == esriEditState.esriStateEditing); } } public override void OnClick() { m_edSketch = m_editor as IEditSketch3; //Restrict to line constructors (for this tool) m_edSketch.GeometryType = esriGeometryType.esriGeometryPolyline; //Activate a constructor based on the current sketch geometry if (m_edSketch.GeometryType == esriGeometryType.esriGeometryPoint) m_csc = new PointConstructorClass(); else m_csc = new StraightConstructorClass(); m_csc.Initialize(m_editor); m_edSketch.ShapeConstructor = m_csc; m_csc.Activate(); //set the current task to null m_editor.CurrentTask = null; //setup events m_editEvents.OnSketchModified += new IEditEvents_OnSketchModifiedEventHandler(m_editEvents_OnSketchModified); m_editEvents5.OnShapeConstructorChanged += new IEditEvents5_OnShapeConstructorChangedEventHandler(m_editEvents5_OnShapeConstructorChanged); m_editEvents.OnSketchFinished += new IEditEvents_OnSketchFinishedEventHandler(m_editEvents_OnSketchFinished); //Create form and pass initialization parameters m_form = new ViperPinForm(m_editor); base.OnClick(); } void m_editEvents_OnSketchFinished() { //send a shift-tab to hide the construction toolbar //SendKeys.SendWait("+{TAB}"); OnKeyDown(9,1); //Show the dialog modal m_form.ShowDialog(); } private void m_editEvents_OnSketchModified() { m_csc.SketchModified(); } private void m_editEvents5_OnShapeConstructorChanged() { //activate new constructor m_csc.Deactivate(); m_csc = null; m_csc = m_edSketch.ShapeConstructor; m_csc.Activate(); } } }
サインインしたメンバーは投稿、更新のフォローなどができます。初めてですか?無料アカウントを登録してください。
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.