void Additional_Class::Get_PolyLine_Point( AcDbObjectId PolyLineId,AcGePoint3dArray &PointArray ) { AcDbEntity *pEnt_Temp = NULL; Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt_Temp, PolyLineId, AcDb::kForRead); if (es != Acad::eOk) { acutPrintf(_T("\nOPEN POLYLINE ERROR")); return; } if (!pEnt_Temp->isKindOf(AcDbPolyline::desc())) { acutPrintf(_T("\nENTITY IS NOT POLYLINE")); return; } AcDbPolyline *pPolyLine = AcDbPolyline::cast(pEnt_Temp); int num = pPolyLine->numVerts(); AcGePoint3d Start_temp_PT,End_temp_PT; for (int index=0; index<num; index++) { if (pPolyLine->segType(index) == AcDbPolyline::kLine) { AcGeLineSeg3d tempLine; pPolyLine->getLineSegAt(index,tempLine); Start_temp_PT = tempLine.startPoint(); End_temp_PT = tempLine.endPoint(); PointArray.append(Start_temp_PT); PointArray.append(End_temp_PT); } else if (pPolyLine->segType(index) == AcDbPolyline::kArc) { AcGeCircArc2d tempArc; pPolyLine->getArcSegAt(index,tempArc); Start_temp_PT.set(tempArc.startPoint().x,tempArc.startPoint().y,0); End_temp_PT.set(tempArc.endPoint().x,tempArc.endPoint().y,0); PointArray.append(Start_temp_PT); PointArray.append(End_temp_PT); } } pEnt_Temp->close(); AcGeIntArray IndexArray; for (int i=1; i<PointArray.length();i++) { if (PointArray[i] == PointArray[i-1]) { IndexArray.append(i); PointArray.remove(PointArray[i]); } } }
void Additional_Class::Get_PolyLine_Length( AcDbObjectId PolyLineId, AcGeDoubleArray &LengthArray ) { double PI=3.1415926535897932384626433832795; AcDbEntity *pEnt_Temp = NULL; Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt_Temp, PolyLineId, AcDb::kForRead); if (es != Acad::eOk) { acutPrintf(_T("\nOPEN POLYLINE ERROR")); return; } if (!pEnt_Temp->isKindOf(AcDbPolyline::desc())) { acutPrintf(_T("\nENTITY NOT POLYLINE")); return; } AcDbPolyline *pPolyLine = AcDbPolyline::cast(pEnt_Temp); int num = pPolyLine->numVerts(); for (int index=0; index<num; index++) { if (pPolyLine->segType(index) == AcDbPolyline::kLine) { AcGeLineSeg3d tempLine; pPolyLine->getLineSegAt(index,tempLine); double LineLength = tempLine.length(); LengthArray.append(LineLength); } else if (pPolyLine->segType(index) == AcDbPolyline::kArc) { AcGeCircArc2d tempArc; pPolyLine->getArcSegAt(index,tempArc); double StartAngle = tempArc.startAng(); double EndAngle = tempArc.endAng(); double Angle = EndAngle-StartAngle; //Angle = (180/PI)*Angle; double Radius = tempArc.radius(); double ArcLength = Radius*Angle; LengthArray.append(ArcLength); } } LengthArray.insertAt(0,0); }
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; }