Attaching geo-location data using ObjectARX

<?xml encoding=”UTF-8″>By Balaji Ramamoorthy

Here is a code snippet to create geo-location data in an AutoCAD drawing. If you are looking for a .Net code sample, please refer to this blog post.

To try this code, you will need to be signed-in using Autodesk 360 login credentials inside AutoCAD.

 AcDbDatabase *pDb 
     = acdbHostApplicationServices()->workingDatabase();
 
 AcDbBlockTable *pBlockTable;
 pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
 
 AcDbObjectId msId = AcDbObjectId::kNull;
 pBlockTable->getAt(ACDB_MODEL_SPACE, msId);
 pBlockTable->close();
 
 AcDbGeoData *pGeoData = <span>new</span><span>  AcDbGeoData();</span>
 pGeoData->setBlockTableRecordId(msId);
 AcDbObjectId geodataId = AcDbObjectId::kNull;
 pGeoData->postToDb(geodataId);
 
 <span>//coordinate system</span><span> </span>
 pGeoData->setCoordinateSystem(ACRX_T(<span>"WORLD-MERCATOR"</span><span> ));</span>
 pGeoData->setCoordinateType(AcDbGeoData::kCoordTypGrid);
 
 <span>//Get the model space point for </span><span> </span>
 <span>// LATITUDE = 37.8109 & LONGITUDE = -122.4776</span><span> </span>
 AcGePoint3d geoPoint(-122.4776, 37.8109, 0);
 AcGePoint3d drawingPt = AcGePoint3d::kOrigin; 
 pGeoData->transformFromLonLatAlt(geoPoint, drawingPt);
 pGeoData->setHorizontalUnits(AcDb::UnitsValue::kUnitsMeters);
 pGeoData->setVerticalUnits(AcDb::UnitsValue::kUnitsMeters);
 
 <span>//set the model space point;</span><span> </span>
 pGeoData->setDesignPoint(drawingPt);
 
 <span>//set the geo point.</span><span> </span>
 pGeoData->setReferencePoint(geoPoint);
 pGeoData->close();
 
 AcApDocument *pDoc = acDocManager->document(
            acdbHostApplicationServices()->workingDatabase());
 
 ACHAR zoomWcommand[200];
 AcGePoint3d pt1 = drawingPt + AcGeVector3d(-5000.0, 5000.0, 0.0);
 AcGePoint3d pt2 = drawingPt + AcGeVector3d(5000.0, -5000.0, 0.0);
 
 acutSPrintf(zoomWcommand, 
 ACRX_T(<span>"_.Zoom W %lf,%lf %lf,%lf "</span><span> ), pt1.x, pt1.y, pt2.x, pt2.y); </span>
 
 acDocManager->sendStringToExecute(pDoc, zoomWcommand, 
                                   <span>false</span><span> , <span>true</span><span> , <span>false</span><span> ); </span></span></span>
 acDocManager->sendStringToExecute(pDoc, 
                 L<span>"_geomap Road "</span><span> , </span>
                 <span>false</span><span> , <span>true</span><span> , <span>false</span><span> );</span></span></span>
 

The Latitude and longitude values in the code snippet are for geo-locating the drawing origin to the Golden Gate bridge.

Here is a screenshot :

GoldenGateBridge


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading