String GetSelectedExtent() { ads_name selection; int returnValue = acedSSGet(_T("I"), NULL, NULL, NULL, selection); if (returnValue == RTCAN) return 0; if (returnValue != RTNORM) { return L""; } if (acedSSSetFirst(selection, NULL) != RTNORM) { acedSSFree(selection); return L""; } ads_name element; acedSSName(selection, 0, element); acedSSFree(selection); AcDbObjectId idEntity; if (acdbGetObjectId(idEntity, element) != Acad::eOk) { acedSSFree(element); return L""; } AcDbEntity * entity; if ((acdbGetObjectId(idEntity, element) != Acad::eOk) || (acdbOpenObject(entity, idEntity, AcDb::kForRead) != Acad::eOk)) { acedSSFree(element); return L""; } acedSSFree(element); if (!entity->isKindOf(AcDbPolyline::desc())) return L""; AcDbPolyline * poly = static_cast<AcDbPolyline*>(entity); if (!poly->isClosed()) return 0; String extent = L"POLYGON(("; AcGePoint2d start; AcGePoint2d current; for (int i = 0; i < poly->numVerts(); i++) { poly->getPointAt(i, current); if (i > 0) { extent += L", "; } else { start = current; } extent += Round(current.x, 0) + L" " + Round(current.y, 0); } if (!start.isEqualTo(current)) { extent += L", " + Round(start.x, 0) + L" " + Round(start.y, 0); } extent += L"))"; poly->close(); return extent; }
CCadEntity * CCadEntityFactory::GetCadEntity(AcDbEntity * entity) { CCadEntity * cadEntity = 0; if (entity->isKindOf(AcDbPoint::desc()) || entity->isKindOf(AcDbText::desc()) || entity->isKindOf(AcDbMText::desc()) || entity->isKindOf(AcDbBlockReference::desc())) { cadEntity = new CCadPoint(entity); } else if (entity->isKindOf(AcDbLine::desc()) || entity->isKindOf(AcDbArc::desc()) || entity->isKindOf(AcDbSpline::desc())) { cadEntity = new CCadLine(entity); } else if (entity->isKindOf(AcDbEllipse::desc()) || entity->isKindOf(AcDbCircle::desc())) { cadEntity = new CCadPolygon(entity); } else if (entity->isKindOf(AcDb2dPolyline::desc())) { AcDb2dPolyline * e = AcDb2dPolyline::cast(entity); if (e->isClosed()) cadEntity = new CCadPolygon(entity); else cadEntity = new CCadLine(entity); } else if (entity->isKindOf(AcDbPolyline::desc())) { AcDbPolyline * e = AcDbPolyline::cast(entity); if (e->isClosed()) cadEntity = new CCadPolygon(entity); else cadEntity = new CCadLine(entity); } resbuf * data = entity->xData(APPNAME); if (data != NULL) cadEntity->SetData(CFeatureData(data->rbnext->resval.rstring)); acutRelRb(data); return cadEntity; }
virtual Acad::ErrorStatus getOsnapInfo( AcDbEntity* pickedObject, Adesk::GsMarker gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcArray<AcGePoint3d>& snapPoints, AcArray<int>& geomIdsForPts, AcArray<AcGeCurve3d*>& snapCurves, AcArray<int>& geomIdsForLines) { // Specialised implementation for AcDbPolylines: // Parametrisation of AcDbPolylines is different: each whole numbered paramater appears // at a vertex, so we cannot simply divide by three to get the correct parameter. // Protocol Extension insures that the following assertion is always // true, but check in non-prod versions just to be safe. assert( pickedObject->isKindOf( AcDbPolyline::desc() )); // but in production, a hard cast is fastest AcDbPolyline *pPline = (AcDbPolyline*)pickedObject; Acad::ErrorStatus es; if ( bSnapToSegments ) { // Snap to a third of each of the segments unsigned int numSegs = pPline->numVerts() - 1; AcGeLineSeg3d segLn; AcGeCircArc3d segArc; double startParam, endParam, newParam, dist; AcGePoint3d pt; for ( unsigned int idx = 0; idx < numSegs; idx++ ) { switch( pPline->segType( idx )) { case AcDbPolyline::kLine: es=pPline->getLineSegAt( idx, segLn ); startParam = segLn.paramOf( segLn.startPoint() ); endParam = segLn.paramOf( segLn.endPoint() ); snapPoints.append(segLn.evalPoint( startParam + ((endParam - startParam) / 3 ))); snapPoints.append(segLn.evalPoint( startParam + ((endParam - startParam) * 2 / 3 ))); break; case AcDbPolyline::kArc: es=pPline->getArcSegAt( idx, segArc ); startParam = segArc.paramOf( segArc.startPoint() ); endParam = segArc.paramOf( segArc.endPoint() ); dist = segArc.length( startParam, endParam ); newParam = segArc.paramAtLength( startParam, dist / 3 ); snapPoints.append( segArc.evalPoint( newParam )); newParam = segArc.paramAtLength( startParam, dist * 2 / 3 ); snapPoints.append( segArc.evalPoint( newParam )); break; default: break; } } } else { double endParam; AcGePoint3d pt; double dist; es=pPline->getEndParam( endParam ); es=pPline->getDistAtParam( endParam, dist ); es=pPline->getPointAtDist( dist / 3, pt ); assert(Acad::eOk==es); snapPoints.append( pt ); es=pPline->getPointAtDist( dist * 2 / 3, pt ); assert(Acad::eOk==es); snapPoints.append( pt ); if ( pPline->isClosed() ) { es=pPline->getStartPoint( pt ); snapPoints.append( pt ); } } return Acad::eOk; }