void ArxDbgUtils::collectVertices(const AcDb3dPolyline* pline, AcGePoint3dArray& pts) { ASSERT(pline != NULL); ASSERT(pts.isEmpty()); AcDbObjectIterator* vertexIter = pline->vertexIterator(); ASSERT(vertexIter != NULL); if (vertexIter == NULL) return; AcDb3dPolylineVertex* vertex; for (; !vertexIter->done(); vertexIter->step()) { if (acdbOpenObject(vertex, vertexIter->objectId(), AcDb::kForRead) == Acad::eOk) { if (vertex->vertexType() != AcDb::k3dControlVertex) pts.append(vertex->position()); vertex->close(); } } delete vertexIter; ASSERT(pts.isEmpty() == false); if (pline->isClosed()) { AcGePoint3d tmpPt = pts[0]; // used to be a bug in dynamic arrays (not sure if its still there??) pts.append(tmpPt); } }
Acad::ErrorStatus rx_scanPline(AcDb2dPolyline* pline, AcGePoint3dArray& points, AcGeDoubleArray& bulges) { Acad::ErrorStatus es = Acad::eOk; AcDb2dVertex* vert = NULL; AcDbObjectId vId; AcDbObjectIterator *vIter; vIter = pline->vertexIterator(); for (; !vIter->done(); vIter->step()) { vId = vIter->objectId(); if ( (es =pline->openVertex(vert, vId, AcDb::kForRead)) != Acad::eOk ) return es; points.append(vert->position()); bulges.append(vert->bulge()); } delete vIter; return es; }
void ArxDbgUtils::collectVertices(const AcDbPolyFaceMesh* pface, AcDbObjectIdArray& vfaces, AcGePoint3dArray& pts) { AcDbObjectIterator* vertexIter = pface->vertexIterator(); if (vertexIter == NULL) return; AcDbFaceRecord* vface; AcDbPolyFaceMeshVertex* pfaceVertex; AcDbObject* obj; // walk through and seperate vfaces and vertices into two // seperate arrays Acad::ErrorStatus es; for (; !vertexIter->done(); vertexIter->step()) { es = acdbOpenObject(obj, vertexIter->objectId(), AcDb::kForRead); if (es == Acad::eOk) { if ((vface = AcDbFaceRecord::cast(obj)) != NULL) vfaces.append(obj->objectId()); else if ((pfaceVertex = AcDbPolyFaceMeshVertex::cast(obj)) != NULL) pts.append(pfaceVertex->position()); else { ASSERT(0); } obj->close(); } else ArxDbgUtils::rxErrorMsg(es); } delete vertexIter; }
void ArxDbgUtils::collectVertices(const AcDb2dPolyline* pline, AcGePoint3dArray& pts, AcGeDoubleArray& bulges, bool asWcsPts) { ASSERT(pline != NULL); ASSERT(pts.isEmpty() && bulges.isEmpty()); AcDbObjectIterator* vertexIter = pline->vertexIterator(); ASSERT(vertexIter != NULL); if (vertexIter == NULL) return; AcDb2dVertex* vertex; for (; !vertexIter->done(); vertexIter->step()) { if (acdbOpenObject(vertex, vertexIter->objectId(), AcDb::kForRead) == Acad::eOk) { if (vertex->vertexType() != AcDb::k2dSplineCtlVertex) { if (asWcsPts) pts.append(pline->vertexPosition(*vertex)); // returns WCS else pts.append(vertex->position()); // returns ECS bulges.append(vertex->bulge()); } vertex->close(); } } delete vertexIter; ASSERT(pts.isEmpty() == Adesk::kFalse); if (pline->isClosed()) { AcGePoint3d tmpPt = pts[0]; // used to be a bug in dynamic arrays (not sure if its still there??) pts.append(tmpPt); bulges.append(0.0); } }
bool ArxDbgUtils::plineHasWidth(const AcDb2dPolyline* pline) { ASSERT(pline != NULL); AcDbObjectIterator* vertexIter = pline->vertexIterator(); ASSERT(vertexIter != NULL); if (vertexIter == NULL) return false; AcDb2dVertex* vertex; for (; !vertexIter->done(); vertexIter->step()) { if (acdbOpenObject(vertex, vertexIter->objectId(), AcDb::kForRead) == Acad::eOk) { if (vertex->vertexType() != AcDb::k2dSplineCtlVertex) { if ((vertex->startWidth() != 0.0) || (vertex->endWidth() != 0.0)) { vertex->close(); delete vertexIter; return true; // bail out, we found what we needed } } vertex->close(); } } delete vertexIter; return false; }
bool ArxDbgUtils::collectVertices(const AcDbPolygonMesh* pmesh, AcGePoint3dArray& pts, int& mSize, int& nSize) { AcDbObjectIterator* vertexIter = pmesh->vertexIterator(); if (vertexIter == NULL) return false; Acad::ErrorStatus es; AcDbPolygonMeshVertex* pVertex; AcGePoint3d tmpPt; if (pmesh->polyMeshType() == AcDb::kSimpleMesh) { mSize = pmesh->mSize(); nSize = pmesh->nSize(); } else { mSize = pmesh->mSurfaceDensity(); nSize = pmesh->nSurfaceDensity(); } int nCount = 0; int totalCount = 0; for (; !vertexIter->done(); vertexIter->step()) { es = acdbOpenObject(pVertex, vertexIter->objectId(), AcDb::kForRead); if (es != Acad::eOk) { ArxDbgUtils::rxErrorMsg(es); delete vertexIter; return false; } pts.append(pVertex->position()); nCount++; totalCount++; if (nCount == nSize) { if (pmesh->isNClosed()) { tmpPt = pts[totalCount - nSize]; // work around bug by making temp copy (not sure if still a bug??) pts.append(tmpPt); totalCount++; } nCount = 0; } } delete vertexIter; if (pmesh->isNClosed()) nSize++; if (pmesh->isMClosed()) { mSize++; for (int i=0; i<nSize; i++) { tmpPt = pts[i]; // see note above pts.append(tmpPt); } } return true; }
void ArxDbgUtils::collectVertices(const AcDb2dPolyline* pline, AcGePoint3dArray& pts, AcDbIntArray& types, AcGeDoubleArray& bulges, AcGeDoubleArray& startWidths, AcGeDoubleArray& endWidths, bool& hasWidth) { ASSERT(pline != NULL); ASSERT(pts.isEmpty() && bulges.isEmpty()); hasWidth = false; AcDbObjectIterator* vertexIter = pline->vertexIterator(); ASSERT(vertexIter != NULL); if (vertexIter == NULL) return; AcDb2dVertex* vertex; for (; !vertexIter->done(); vertexIter->step()) { if (acdbOpenObject(vertex, vertexIter->objectId(), AcDb::kForRead) == Acad::eOk) { if (vertex->vertexType() != AcDb::k2dSplineCtlVertex) { pts.append(pline->vertexPosition(*vertex)); // returns WCS bulges.append(vertex->bulge()); startWidths.append(vertex->startWidth()); endWidths.append(vertex->endWidth()); if (vertex->startWidth() || vertex->endWidth()) hasWidth = true; types.append(vertex->vertexType()); } vertex->close(); } } delete vertexIter; ASSERT(pts.isEmpty() == false); if (pline->isClosed()) { AcGePoint3d tmpPt = pts[0]; // used to be a bug in dynamic arrays (not sure if its still there??) pts.append(tmpPt); bulges.append(0.0); int tmpType = types[0]; types.append(tmpType); double tmpWidth = startWidths[0]; startWidths.append(tmpWidth); tmpWidth = endWidths[0]; endWidths.append(tmpWidth); } }
void extractVertexCoords(const AcDbObjectId& objID, std::map<std::wstring, AcGePoint3d>& m_3dPoints) { AcDbEntity* pEnt = nullptr; acdbOpenObject(pEnt, objID, AcDb::kForRead); /*****Pline****/ if (pEnt->isA() == AcDbPolyline::desc()) { AcDbPolyline* pLine = static_cast<AcDbPolyline*>(pEnt); pEnt->close(); acdbOpenObject(pLine, objID, AcDb::kForRead); AcGePoint3d vertex; for (LONGLONG i = 0; i < pLine->numVerts(); i++) { pLine->getPointAt(i, vertex); std::wstring w_nrPunct = std::to_wstring(i + 1); m_3dPoints.insert(std::pair<std::wstring, AcGePoint3d>(w_nrPunct, vertex)); } pLine->close(); } /******P2dLine****/ else if (pEnt->isA() == AcDb2dPolyline::desc()) { AcGePoint3d point; AcDbObjectId vertexID; AcDb3dPolylineVertex* pVertex = nullptr; AcDb2dPolyline* p2dline = static_cast<AcDb2dPolyline*>(pEnt); pEnt->close(); acdbOpenObject(p2dline, objID, AcDb::kForRead); AcDbObjectIterator* pIterator = p2dline->vertexIterator(); for (pIterator->start(); !pIterator->done(); pIterator->step()) { LONGLONG contor = 1; vertexID = pIterator->objectId(); acdbOpenObject(pVertex, vertexID, AcDb::kForRead); point = pVertex->position(); std::wstring w_nrPunct = std::to_wstring(contor); contor++; m_3dPoints.insert(std::pair<std::wstring, AcGePoint3d>(w_nrPunct, point)); pVertex->close(); } delete pIterator; p2dline->close(); } /***********P3dLine**************/ else if (pEnt->isA() == AcDb3dPolyline::desc()) { AcGePoint3d point; AcDbObjectId vertexID; AcDb3dPolylineVertex* pVertex = nullptr; AcDb3dPolyline* p3dline = static_cast<AcDb3dPolyline*>(pEnt); pEnt->close(); acdbOpenObject(p3dline, objID, AcDb::kForRead); AcDbObjectIterator* pIterator = p3dline->vertexIterator(); for (pIterator->start(); !pIterator->done(); pIterator->step()) { LONGLONG contor = 1; vertexID = pIterator->objectId(); acdbOpenObject(pVertex, vertexID, AcDb::kForRead); point = pVertex->position(); std::wstring w_nrPunct = std::to_wstring(contor); m_3dPoints.insert(std::pair<std::wstring, AcGePoint3d>(w_nrPunct, point)); pVertex->close(); } delete pIterator; p3dline->close(); } else { pEnt->close(); acutPrintf(_T("\nObiectul selectat nu este o polilinie")); } }