• arcEngine 经典代码编辑


    1 [vc]geo包装1

    link: http://blog.csdn.net/gm316/archive/2007/10/07/1813634.aspx

    void CagGeometrys::AddTrack(CMapControlDefault &mc, hdcGeometryType gt,long button, long shift, long x, long y, double mapX, double mapY)
    {
     //演示rubber的操作,mc中才提供包装结果track,在vba中应该用rubber
     if(e_bUnique)
      e_geos.clear();

     switch(gt)
     {
     case gt_Point:
      {
       IPointPtr pt(__uuidof(Point));
       pt->PutCoords(mapX,mapY);
       IGeometryPtr *g=new IGeometryPtr;
       (*g)=pt;
       e_geos.insert(e_geos.end(),g);
      }
      break;
     case gt_Rectangle:
      {
       IEnvelopePtr env=mc.TrackRectangle();
       IGeometryPtr *g=new IGeometryPtr;
       (*g)=env;
       e_geos.insert(e_geos.end(),g);
      }
      break;

     case gt_Polyline:
      { /*
       IPolylinePtr pl=mc.TrackLine();
       IGeometryPtr *g=new IGeometryPtr;
       (*g)=pl;
       e_geos.insert(e_geos.end(),g);
       */
       
       IActiveViewPtr av;
       IScreenDisplayPtr sd;
       av=mc.GetActiveView();
       av->get_ScreenDisplay(&sd);

       ISymbolPtr sym;
       IGeometryPtr *geo=new IGeometryPtr;
       IRubberBandPtr rp(__uuidof(RubberLine));
       rp->TrackNew(sd,sym,&(*geo)); //应该可以在track就有symbol效果
       e_geos.insert(e_geos.end(),geo);

       //转换用QI,应该ok
       //IPolylinePtr line;
       //line=*geo;
      }
      break;

     case gt_Circle:
      {
       IPolygonPtr c=mc.TrackCircle();
       IGeometryPtr *g=new IGeometryPtr;
       (*g)=c;
       e_geos.insert(e_geos.end(),g);
      }
      break;

     case gt_Polygon:
      {
       IPolygonPtr pg=mc.TrackPolygon();
       IGeometryPtr *g=new IGeometryPtr;
       (*g)=pg;
       e_geos.insert(e_geos.end(),g);
      }
      break;

     case gt_Text_Point:
      {

       textInfo *ti=new textInfo;
       IPointPtr pt(CLSID_Point);
       pt->PutCoords(mapX,mapY);
       ti->geo=pt;

       IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
       short res;
       gsd->DoModal(L"title",L"label",L"",NULL,&res);
       CComBSTR bstr;
       CString str;
       gsd->get_Value(&bstr);
       str=bstr;
       strcpy(ti->text,str);
       
       e_texts.insert(e_texts.end(),ti);

      }
      break;

     case gt_Text_Polyline:
      {
       textInfo *ti=new textInfo;
       ti->geo=mc.TrackLine();

       IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
       short res;
       gsd->DoModal(L"title",L"label",L"",NULL,&res);
       CComBSTR bstr;
       CString str;
       gsd->get_Value(&bstr);
       str=bstr;
       strcpy(ti->text,str);
       
       e_texts.insert(e_texts.end(),ti);

      }
      break;

     case gt_Text_Polygon:
      {

       textInfo *ti=new textInfo;
       ti->geo=mc.TrackPolygon(); //可以模拟圆形,矩形等

       IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
       short res;
       gsd->DoModal(L"title",L"label",L"",NULL,&res);
       CComBSTR bstr;
       CString str;
       gsd->get_Value(&bstr);
       str=bstr;
       strcpy(ti->text,str);
       
       e_texts.insert(e_texts.end(),ti);

      }
      break;

     }

     IActiveViewPtr av=mc.GetActiveView();
     av->Refresh();
    }

    void CagGeometrys::Draw(CMapControlDefault &mc)
    {
     //draw geometry
     long i,count;
     count=e_geos.size();
     for(i=0;i<count;i++)
     {
      mc.DrawShape((*e_geos[i]),NULL);
     }

     {
      ISelectionTrackerPtr sk;
      sk.CreateInstance(__uuidof(EnvelopeTracker));

      IActiveViewPtr av=mc.GetActiveView();
      IScreenDisplayPtr sd;
      av->get_ScreenDisplay(&sd);

      IEnvelopePtr env;
      count=e_sels.size();
      for(i=0;i<count;i++)
      {
       (*e_sels[i])->get_Envelope(&env);
       sk->put_Geometry(env);
       sk->Draw(sd,NULL,esriTrackerDominant);
      }
     }

     //文本
     count=e_texts.size();
     for(i=0;i<count;i++)
     {
      IMapPtr map=mc.GetMap();
      IActiveViewPtr av=mc.GetActiveView();
      IScreenDisplayPtr sd;
      av->get_ScreenDisplay(&sd);
    /* 屏幕中间
      ITextSymbolPtr t(__uuidof(TextSymbol));
      IFontDispPtr f; //无用途
      t->get_Font(&f);
      t->put_Size(18.0);
      OLE_HANDLE hdc;
      sd->get_hDC(&hdc);
      sd->StartDrawing(hdc,esriNoScreenCache);
      ISymbolPtr s=t;
      sd->SetSymbol(s);
      IAreaPtr a;
      IDisplayTransformationPtr dt;
      sd->get_DisplayTransformation(&dt);
      IEnvelopePtr e;
      dt->get_VisibleBounds(&e);
      a=e;
      IPointPtr pt;
      a->get_Centroid(&pt);
      sd->DrawText(pt,L"test");
    */
      ITextSymbolPtr t(__uuidof(TextSymbol));
      IColorPtr c(__uuidof(RgbColor));
      c->put_RGB(RGB(0,0,255));
      t->put_Color(c);
      IFontDispPtr f; //无用途
      t->get_Font(&f);
      t->put_Size(18.0);
      OLE_HANDLE hdc;
      sd->get_hDC(&hdc);
      sd->StartDrawing(hdc,esriNoScreenCache);
      ISymbolPtr s=t;
      sd->SetSymbol(s);
      USES_CONVERSION;
      //点位置是字符底部中间
      sd->DrawText(e_texts[i]->geo,A2W(e_texts[i]->text));
      sd->FinishDrawing();
     }
    }

    void CagGeometrys::HitTest(double x, double y)
    {
     /*
    esriGeometryNull          = 0
    esriGeometryPoint         = 1
    esriGeometryMultipoint    = 2
    esriGeometryPolyline      = 3
    esriGeometryPolygon       = 4
    esriGeometryEnvelope      = 5
    esriGeometryPath          = 6
    esriGeometryAny           = 7
    esriGeometryMultiPatch    = 9
    esriGeometryRing          = 11
    esriGeometryLine          = 13
    esriGeometryCircularArc   = 14
    esriGeometryBezier3Curve  = 15
    esriGeometryEllipticArc   = 16
    esriGeometryBag           = 17
    esriGeometryTriangleStrip = 18
    esriGeometryTriangleFan   = 19
    esriGeometryRay           = 20
    esriGeometrySphere        = 21
    */
    /*
    HRESULT HitTest(
      IPoint* QueryPoint,
      double searchRadius,
      esriGeometryHitPartType geometryPart,
      IPoint* hitPoint,
      double* hitDistance,
      long* hitPartIndex,
      long* hitSegmentIndex,
      VARIANT_BOOL* bRightSide,
      VARIANT_BOOL* bHit
    );
    */
     e_sels.clear();
     
     esriGeometryType gt;
     long i,count=e_geos.size();
     for(i=0;i<count;i++)
     {
      (*e_geos[i])->get_GeometryType(&gt);
      switch(gt)
      {
      case esriGeometryPoint:
       { //OK,但是被选择的显示方式有问题
        IHitTestPtr ht;
        IPointPtr pt;
        pt=e_geos[i];
        ht=pt;

        IPointPtr qp(__uuidof(Point));
        qp->PutCoords(x,y);

        IPointPtr hp(__uuidof(Point));
        double hd;
        long hpi,hs;
        short rs,h;
        ht->HitTest(qp,5.0,esriGeometryPartBoundary,hp,&hd,&hpi,&hs,&rs,&h);

        if(h==-1)
        {
         e_sels.insert(e_sels.end(),e_geos[i]);
        }
       }
       break;
      case esriGeometryPolyline:
       {
        IHitTestPtr ht;
        IPolylinePtr pl;
        pl=e_geos[i];
        ht=pl;

        IPointPtr qp(__uuidof(Point));
        qp->PutCoords(x,y);

        IPointPtr hp(__uuidof(Point));
        double hd;
        long hpi,hs;
        short rs,h;
        ht->HitTest(qp,5.0,esriGeometryPartBoundary,hp,&hd,&hpi,&hs,&rs,&h);

        if(h==-1)
        {
         e_sels.insert(e_sels.end(),e_geos[i]);
        }
       }
       break;

      case esriGeometryEnvelope:
      case esriGeometryPolygon:
       {
        IPointPtr qp(__uuidof(Point));
        qp->PutCoords(x,y);

        IRelationalOperatorPtr ro;
        ro=e_geos[i];
        short yes;
        ro->Contains(qp,&yes);
        if(yes==-1)
        {
         e_sels.insert(e_sels.end(),e_geos[i]);
        }
       }
       break;
      }
     }

    }

    long CagGeometrys::GetSelectCount()
    {
     return (e_sels.size());
    }

    void CagGeometrys::ClearSelect()
    {
     e_sels.clear();
    }

    BOOL CagGeometrys::DeleteSelect()
    {
     long i,j,count1,count=e_sels.size();
     
     //sel中不一定是用了geos中顺序,并且选择后可能添加了新的geo
     for(i=0;i<count;i++)
     {
      count1=e_geos.size();
      for(j=0;j<count1;j++)
      {
       if(e_geos[j]==e_sels[i])
       {
        e_geos.erase(e_geos.begin()+j);
        break;
       }
      }
     }

     return TRUE;
    }

    void CagGeometrys::Move(CMapControlDefault &mc)
    {
     IActiveViewPtr av;
     av=mc.GetActiveView();

     IScreenDisplayPtr sd;
     av->get_ScreenDisplay(&sd);
     
     ISymbolPtr sym;
     IGeometryPtr geo=(*e_sels[0]);
     IRubberBandPtr rb;
     short c;

     esriGeometryType gt;
    // long i,count=e_sels.size();
    // for(i=0;i<count;i++) 每次只可以移动一个shape
     {
      (*e_sels[0])->get_GeometryType(&gt);
      switch(gt)
      {
      case esriGeometryPoint:
       rb.CreateInstance(CLSID_RubberPoint);
       break;
      case esriGeometryPolyline:
       rb.CreateInstance(CLSID_RubberLine);
       break;

      case esriGeometryEnvelope:
       rb.CreateInstance(CLSID_RubberEnvelope); //移动后图形消失
    //   rb.CreateInstance(CLSID_RubberPolygon);//无效果
       break;

      case esriGeometryPolygon: //包括了circle
       rb.CreateInstance(CLSID_RubberPolygon);
       break;
      }
     }

     if(rb!=NULL)
      rb->TrackExisting(sd,sym,geo,&c); 
     av->Refresh();

    }

    BOOL CagGeometrys::AddImportPoint(CString sPathFile)
    {
     FILE *f;
     f=fopen(sPathFile,"rt");
     if(f==NULL)
     {
      AfxMessageBox("无法打开指定文件.");
      return FALSE;
     }

     IPointCollectionPtr pc(__uuidof(Multipoint));
     IPointPtr pt;
     double x,y;
     while(1)
     {
      if(fscanf(f,"%lf %lf",&x,&y)!=2)
       break;
      
      pt.CreateInstance(CLSID_Point);
      pt->put_X(x);
      pt->put_Y(y);
      pc->AddPoint(pt);
     }
     fclose(f);

     if(e_bUnique)
      e_geos.clear();

     IGeometryPtr *g=new IGeometryPtr;
     (*g)=pc;
     e_geos.insert(e_geos.end(),g);

     return TRUE;
    }


    BOOL CagGeometrys::AddImportPolyline(CString sPathFile)
    {
     FILE *f;
     f=fopen(sPathFile,"rt");
     if(f==NULL)
     {
      AfxMessageBox("无法打开指定文件.");
      return FALSE;
     }

     double x,y;
     IPointPtr pt;
     IPointCollectionPtr pts(CLSID_Polyline);
     while(1)
     {
      if(fscanf(f,"%lf %lf",&x,&y)!=2)
       break;
      
      pt.CreateInstance(CLSID_Point);
      pt->put_X(x);
      pt->put_Y(y);
      pts->AddPoint(pt);
     }
     fclose(f);

     if(e_bUnique)
      e_geos.clear();

     IGeometryPtr *g=new IGeometryPtr;
     (*g)=pts;
     e_geos.insert(e_geos.end(),g);

     return TRUE;
    }

    BOOL CagGeometrys::AddImportPolygon(CString sPathFile)
    {
     FILE *f;
     f=fopen(sPathFile,"rt");
     if(f==NULL)
     {
      AfxMessageBox("无法打开指定文件.");
      return FALSE;
     }

     IPolygonPtr pg(CLSID_Polygon);

     double x,y;
     IPointPtr pt;
     IPointCollectionPtr pts(__uuidof(Ring));
     while(1)
     {
      if(fscanf(f,"%lf %lf",&x,&y)!=2)
       break;
      
      pt.CreateInstance(CLSID_Point);
      pt->put_X(x);
      pt->put_Y(y);
      pts->AddPoint(pt);
     }
     fclose(f);

     IRingPtr r=pts;
     r->Close();
     IGeometryCollectionPtr gc=pg;
     gc->AddGeometry(r);

     if(e_bUnique)
      e_geos.clear();

     IGeometryPtr *g=new IGeometryPtr;
     (*g)=pg;
     e_geos.insert(e_geos.end(),g);

     return TRUE;
    }

    BOOL CagGeometrys::AddPoint(double x, double y)
    {
     if(e_bUnique)
      e_geos.clear();

     IPointPtr pt(__uuidof(Point));
     pt->PutCoords(x,y);
     IGeometryPtr *g=new IGeometryPtr;
     (*g)=pt;
     e_geos.insert(e_geos.end(),g);

     return TRUE;
    }

    BOOL CagGeometrys::AddCircle(double x, double y, double r)
    {
     if(e_bUnique)
      e_geos.clear();

     IPointPtr pt(__uuidof(Point));
     IConstructCircularArcPtr cca(__uuidof(CircularArc));
     pt->PutCoords(x,y);
     cca->ConstructCircle(pt,r,-1);

     IGeometryPtr *g=new IGeometryPtr;
     (*g)=cca;
     e_geos.insert(e_geos.end(),g);

     return TRUE;
    }

    2 绘制一条polyline

    可以使用AE里面的  IRubberBand 接口画在MapControl上:

      IRubberBand rubberLine = new RubberLineClass();
      IPolyline polyLine = (IPolyline)rubberLine.TrackNew(pActiveView.ScreenDisplay, null);

    //设置图形的样式
      m_Symbol = SetDisplaySymbol(polyLine);
          
       //画出图形
      pActiveView.ScreenDisplay.StartDrawing(m_QueryMap.ActiveView.ScreenDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
      pActiveView.ScreenDisplay.DrawPolyline(pGeometry);
      pActiveView.Refresh();
      pActiveView.ScreenDisplay.FinishDrawing();

    通过point构造Segment,再构造path,再构造polyline

    用到ISegmentCollection,IPointCollection等接口,帮助里有个例子

    The following subs are demonstrating how to create valid polylines efficiently.

    A. Geometry type: Polyline

    1. createMultipartPolylinePathSegmentCollection: Create a multipart polyline using path via ISegmentCollection.

    2. createMultipartPolylinePathPointCollection: Create a multipart polyline using path via IPointCollection.

    private IGeometry CreateShape(int x1,int y1,int x2,int y2)
                    {
                            IPoint p1 = this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x1,y1);
                            IPoint p2 = this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x2,y2);
                            IPolyline line = new PolylineClass();
                            line.FromPoint=p1;
                            line.ToPoint=p2;
                            IGeometry lineGeometry = line as IGeometry;
                              retrun lineGeometry ;

                    }
     
    利用上面创建好的Line,在grahic上画线,嗯。。里面的代码要改动一下。因为是直接贴的以前写的东西
    private void DrawShape(IGeometry line)
                    {
                            pgc.DeleteAllElements();
                            //定义颜色
                            //定义线符号
                            IRgbColor lcolor = Utility.GetRGBColor(btnLColor.BackColor);
                            ISimpleLineSymbol outline = new SimpleLineSymbolClass();
                            if(this.txtWidth.Text.Trim()=="")
                                    outline.Width=0;
                            else
                                    outline.Width=Double.Parse(this.txtWidth.Text);

                            outline.Color = lcolor;
                            outline.Style = (esriSimpleLineStyle)(((StringIntObject)this.cbLineStyle.SelectedItem).i);

                            //定义使用填充符号的面
                            ILineElement LineE = new LineElementClass();
                            LineE.Symbol=outline;
                            IElement pElement = LineE as IElement;
                            pElement.Geometry=line ;
                            pgc.AddElement(pElement,0);
                            axMapControl1.Refresh( esriViewDrawPhase.esriViewGraphics, null,null );

                    }
  • 相关阅读:
    边框大小 | box-sizing (Basic User Interface)
    边框图片 | border-image (Backgrounds & Borders)
    边框图像重复 | border-image-repeat (Backgrounds & Borders)
    边框图像路径 | border-image-source (Backgrounds & Borders)
    边框图像开始 | border-image-outset (Backgrounds & Borders)
    边框图像宽度 | border-image-width (Backgrounds & Borders)
    边框图像使用范围 | border-image-slice (Backgrounds & Borders)
    边框右上角半径 | border-top-right-radius (Backgrounds & Borders)
    边框半径 | border-radius (Backgrounds & Borders)
    边框 | border (Backgrounds & Borders)
  • 原文地址:https://www.cnblogs.com/xiexiaokui/p/1251960.html
Copyright © 2020-2023  润新知