void wxsVector::OnBuildCreatingCode() { int i,n; wxString vname; wxString pname; wxString cname; wxString fname; wxString xname; wxString yname; wxString dtext; wxString s; // we only know C++ language if (GetLanguage() != wxsCPP) wxsCodeMarks::Unknown(_T("wxsVector::OnBuildCreatingCode"),GetLanguage()); // usefull names vname = GetVarName(); pname = GetParent()->GetVarName(); cname = vname + _("_PEN"); fname = vname + _("_FONT"); xname = vname + _("_X"); yname = vname + _("_Y"); // the header for mathplot AddHeader(_T("<mathplot.h>"),GetInfo().ClassName,hfInPCH); // create the vector -- but not the setup code Codef(_T("%s = new mpFXYVector(_(\"%s\"), %d);\n"), vname.wx_str(), mLabel.wx_str(), mAlign); // BuildSetupWindowCode(); // assign a pen to the layer dtext = mPenColour.BuildCode(GetCoderContext()); if (dtext.Len() > 0) { Codef(_T("wxPen %s(%s);\n"), cname.wx_str(), dtext.wx_str()); Codef(_T("%s->SetPen(%s);\n"), vname.wx_str(), cname.wx_str()); }; // assign a font to the layer dtext = mPenFont.BuildFontCode(fname, GetCoderContext()); if (dtext.Len() > 0) { Codef(_T("%s"), dtext.wx_str()); Codef(_T("%s->SetFont(%s);\n"), vname.wx_str(), fname.wx_str()); }; // define the arrays dtext = _("std::vector<double> ") + xname + _(";"); AddDeclaration(dtext); dtext = _("std::vector<double> ") + yname + _(";"); AddDeclaration(dtext); // assign the data ParseXY(); n = mXs.GetCount(); if (n > 0) { for(i=0; i<n; i++) { Codef(_T("%s.push_back(%s); %s.push_back(%s);\n"), xname.wx_str(), mXs[i].wx_str(), yname.wx_str(), mYs[i].wx_str()); }; Codef(_T("%ASetData(%s, %s);\n"), xname.wx_str(), yname.wx_str()); }; // draw as points or a continuous line Codef(_T("%ASetContinuity(%b);\n"), mContinuous); // add to parent window -- should be a mpWindow if ((GetPropertiesFlags() & flHidden) && GetBaseProps()->m_Hidden) n = 0; // do nothing else Codef(_T("%s->AddLayer(%s);\n"), pname.wx_str(), vname.wx_str()); }
OGRGeometry *OGRIngresLayer::TranslateGeometry( const char *pszGeom ) { OGRGeometry *poGeom = NULL; /* -------------------------------------------------------------------- */ /* Parse the tuple list into an array of x/y vertices. The */ /* input may look like "(2,3)" or "((2,3),(4,5),...)". Extra */ /* spaces may occur between tokens. */ /* -------------------------------------------------------------------- */ double *padfXY = NULL; int nVertMax = 0; int nVertCount = 0; int nDepth = 0; const char *pszNext = pszGeom; while( *pszNext != '\0' ) { while( *pszNext == ' ' ) pszNext++; if( *pszNext == '(' ) { pszNext++; nDepth++; continue; } if( *pszNext == ')' ) { pszNext++; CPLAssert( nDepth == 1 ); nDepth--; break; } if( *pszNext == ',' ) { pszNext++; CPLAssert( nDepth == 1 ); continue; } if( nVertCount == nVertMax ) { nVertMax = nVertMax * 2 + 1; padfXY = (double *) CPLRealloc(padfXY, sizeof(double) * nVertMax * 2 ); } if( !ParseXY( &pszNext, padfXY + nVertCount*2 ) ) { CPLDebug( "INGRES", "Error parsing geometry: %s", pszGeom ); CPLFree( padfXY ); return NULL; } CPLAssert( *pszNext == ')' ); nVertCount++; pszNext++; nDepth--; while( *pszNext == ' ' ) pszNext++; } CPLAssert( nDepth == 0 ); /* -------------------------------------------------------------------- */ /* Handle Box/IBox. */ /* -------------------------------------------------------------------- */ if( EQUAL(osIngresGeomType,"BOX") || EQUAL(osIngresGeomType,"IBOX") ) { CPLAssert( nVertCount == 2 ); OGRLinearRing *poRing = new OGRLinearRing(); poRing->addPoint( padfXY[0], padfXY[1] ); poRing->addPoint( padfXY[2], padfXY[1] ); poRing->addPoint( padfXY[2], padfXY[3] ); poRing->addPoint( padfXY[0], padfXY[3] ); poRing->addPoint( padfXY[0], padfXY[1] ); OGRPolygon *poPolygon = new OGRPolygon(); poPolygon->addRingDirectly( poRing ); poGeom = poPolygon; } /* -------------------------------------------------------------------- */ /* Handle Point/IPoint */ /* -------------------------------------------------------------------- */ else if( EQUAL(osIngresGeomType,"POINT") || EQUAL(osIngresGeomType,"IPOINT") ) { CPLAssert( nVertCount == 1 ); poGeom = new OGRPoint( padfXY[0], padfXY[1] ); } /* -------------------------------------------------------------------- */ /* Handle various linestring types. */ /* -------------------------------------------------------------------- */ else if( EQUAL(osIngresGeomType,"LSEG") || EQUAL(osIngresGeomType,"ILSEG") || EQUAL(osIngresGeomType,"LINE") || EQUAL(osIngresGeomType,"LONG LINE") || EQUAL(osIngresGeomType,"ILINE") ) { OGRLineString *poLine = new OGRLineString(); int iVert; poLine->setNumPoints( nVertCount ); for( iVert = 0; iVert < nVertCount; iVert++ ) poLine->setPoint( iVert, padfXY[iVert*2+0], padfXY[iVert*2+1] ); poGeom = poLine; } /* -------------------------------------------------------------------- */ /* Handle Polygon/IPolygon/LongPolygon. */ /* -------------------------------------------------------------------- */ else if( EQUAL(osIngresGeomType,"POLYGON") || EQUAL(osIngresGeomType,"IPOLYGON") || EQUAL(osIngresGeomType,"LONG POLYGON") ) { OGRLinearRing *poLine = new OGRLinearRing(); int iVert; poLine->setNumPoints( nVertCount ); for( iVert = 0; iVert < nVertCount; iVert++ ) poLine->setPoint( iVert, padfXY[iVert*2+0], padfXY[iVert*2+1] ); // INGRES polygons are implicitly closed, but OGR expects explicit if( poLine->getX(nVertCount-1) != poLine->getX(0) || poLine->getY(nVertCount-1) != poLine->getY(0) ) poLine->addPoint( poLine->getX(0), poLine->getY(0) ); OGRPolygon *poPolygon = new OGRPolygon(); poPolygon->addRingDirectly( poLine ); poGeom = poPolygon; } return poGeom; }
wxObject* wxsVector::OnBuildPreview(wxWindow* Parent, long Flags) { int n; wxStaticText *Preview; mpFXYVector *vec; mpWindow *mp; wxPen pen(*wxBLACK_PEN); wxColour cc; wxFont ff; bool hide; // if parent is not an mpWindow, then exit out if (! Parent->IsKindOf(CLASSINFO(mpWindow))) return NULL; mp = (mpWindow *) Parent; // hide this vector hide = ((Flags & pfExact) && (GetPropertiesFlags() & flHidden) && GetBaseProps()->m_Hidden); // make the place-holder Preview = new wxStaticText(Parent, GetId(), mLabel, Pos(Parent), Size(Parent), (wxSUNKEN_BORDER|Style())); Preview->SetForegroundColour(wxColour(255,255,255)); Preview->SetBackgroundColour(wxColour(0,0,128)); SetupWindow(Preview,Flags); if (Flags & pfExact) Preview->Hide(); // the actual vector vec = new mpFXYVector(mLabel, mAlign); // pen color cc = mPenColour.GetColour(); if (cc.IsOk()) pen.SetColour(cc); vec->SetPen(pen); // text font ff = mPenFont.BuildFont(); vec->SetFont(ff); // update the place-holder if (cc.IsOk()) Preview->SetBackgroundColour(cc); Preview->SetFont(ff); // fill in the data ParseXY(); n = mXs.GetCount(); if (n > 0) { vec->SetData(mXf, mYf); }; // points or lines? vec->SetContinuity(mContinuous); // and add layer to parent if (! hide) mp->AddLayer(vec); // done return Preview; }