IBufferConstruction

554
4
05-09-2012 06:28 AM
BennettChamberland
New Contributor
Everything seems to work fine, up until I actually create the buffer, then it doesn't do anything and has 0 shapebuffers. the geometry collection does have 1 object as it enters ConstructBuffers.



IGeometryPtr BufferGeometry(IGeometryPtr inShapePtr, double distance, esriBufferConstructionSideEnum side)
{
long buffCount = -1;

IBufferConstructionPropertiesPtr bufferProp(CLSID_BufferConstruction);
IBufferConstructionPtr bufferPtr = (IBufferConstructionPtr)bufferProp;

bufferProp->put_SideOption(side);
bufferProp->put_EndOption(esriBufferFlat);
bufferProp->put_ExplodeBuffers(VARIANT_FALSE);
bufferProp->put_OutsideOnly(VARIANT_FALSE);
bufferProp->put_GenerateCurves(VARIANT_FALSE);
bufferProp->put_UnionOverlappingBuffers(VARIANT_TRUE);
bufferProp->put_DensifyDeviation(-1);

if(!inShapePtr)
  return NULL;

IGeometryCollectionPtr geometryBag(CLSID_GeometryBag);
IGeometryBagPtr shapesBagPtr = (IGeometryBagPtr)geometryBag;

ISpatialReferencePtr spatialRefPtr;
inShapePtr->get_SpatialReference(&spatialRefPtr);

((IGeometryPtr)shapesBagPtr)->putref_SpatialReference(spatialRefPtr);

((IGeometryCollectionPtr)shapesBagPtr)->AddGeometry(inShapePtr, &vtMissing, &vtMissing);

((IGeometryCollectionPtr)shapesBagPtr)->get_GeometryCount(&buffCount);


IGeometryCollectionPtr shapebuffer(CLSID_GeometryBag);
((IGeometryPtr)shapebuffer)->putref_SpatialReference(spatialRefPtr);

HRESULT hr = bufferPtr->ConstructBuffers((IEnumGeometryPtr)shapesBagPtr, distance, shapebuffer);

if(shapebuffer)
  shapebuffer->get_GeometryCount(&buffCount);

return shapebuffer;
}
0 Kudos
4 Replies
WeifengHe
Occasional Contributor II
Just from the code I don't see any problem.  Can you also please provide the input parameters?
0 Kudos
BennettChamberland
New Contributor
Turned out to be an input error. The IGeometryPtr i was passing in wasn't correct some how so I changed my method of creating it and it works fine now. I'm not entirely sure why pulling a polyline from a layer didn't work, but building the line in memory does.

Thanks
0 Kudos
WeifengHe
Occasional Contributor II
Glad it works now.  Just for curiousity, how did you code to pull a polyline from the layer?
0 Kudos
BennettChamberland
New Contributor
Before this I select a geometry within a specific layer


IGeometryPtr ClassName::GetSelectedShape(CString layerName)
{
IFeatureSelectionPtr featureSelection;
featureSelection = GetLayerByName(layerName);

if (!featureSelection)
  return NULL;

ISelectionSetPtr selectionSet;
featureSelection->get_SelectionSet(&selectionSet);

IEnumGeometryPtr enumGeometry;
enumGeometry.CreateInstance(CLSID_EnumFeatureGeometry);

IEnumGeometryBindPtr enumGeometryBind = enumGeometry;
enumGeometryBind->BindGeometrySource(NULL, selectionSet);

IGeometryPtr geometry;
enumGeometry->Next(&geometry);

return geometry;
}
0 Kudos