本节将介绍如何从一个SoildBase实体中获取它的点,线,面数据。

4.4.1 创建SoildBase几何实体

在获取几何实体点,线,面几何数据前,先要创建一个实体,示例代码4-2是创建实体的过程:

  • 创建点。
  • 由点形成线。
  • 由线形成面。
  • 通过面和拉伸向量,形成一个拉伸体。
BPModelP pModel = BPViewManager::getInstance().getActivedViewport()->getTargetModel();
//点
GePoint3d pointS = GePoint3d::create(1, 1, 0);
GePoint3d pointE = GePoint3d::create(8000, 8000, 0);
GePoint3d pointB = GePoint3d::create(8000, 1, 0);
GePoint3d pointT = GePoint3d::create(16000, 8000, 0);
//线
IGeCurveBasePtr ptrCurve = IGeCurveBase::createSegment(GeSegment3d::create(pointS, pointE));
IGeCurveBasePtr ptrCurve1 = IGeCurveBase::createSegment(GeSegment3d::create(pointE, pointT));
IGeCurveBasePtr ptrCurve2 = IGeCurveBase::createSegment(GeSegment3d::create(pointT, pointB));
IGeCurveBasePtr ptrCurve3 = IGeCurveBase::createSegment(GeSegment3d::create(pointB, pointS));
//面
GeCurveArrayPtr ptrCurveList = GeCurveArray::create(GeCurveArray::BoundaryType::BOUNDARY_TYPE_Outer);
if (ptrCurveList == nullptr)
    return;
ptrCurveList->add(ptrCurve);
ptrCurveList->add(ptrCurve1);
ptrCurveList->add(ptrCurve2);
ptrCurveList->add(ptrCurve3);
//体
GeVec3d v3d = GeVec3d::create(0, 0, 2000);
GeExtrusionInfo extrusionInfo(ptrCurveList, v3d, true);
IGeSolidBasePtr ptrSolid = IGeSolidBase::createGeExtrusion(extrusionInfo);
if (ptrSolid == nullptr)
    return;
BPGraphicsPtr ptrGrapic = pModel->createPhysicalGraphics();
if (ptrGrapic.isNull())
    return;
ptrGrapic->addGeSolidBase(*ptrSolid);
ptrGrapic->save();

代码4-2:创建实体

4.4.2 获取SoildBase几何数据

示例代码4-3是获取实体几何数据的过程:

  • 通过getFaceIndices接口获取几何实体所有面的序号。
  • 遍历面的序号拿到对应面的数据。
  • 遍历每个面拿到面中所有线的数据。
  • 遍历线拿到点的数据。
//拿到几何体的点,线,面
pvector <GeSolidLocationInfo::GeFaceIndices> indices;
//得到soild里面indices
ptrSolid->getFaceIndices(indices);
pvector<GeCurveArrayPtr> curearray;
//通过indices拿到对应的面
for (auto indice : indices)
{    
    IGeometryPtr ptrGeom = ptrSolid->getFace(indice); 
    if(ptrGeom.isNull())        
        continue;
    GeCurveArrayPtr ptrCv = ptrGeom->getAsGeCurveArray();
    if(ptrCv.isNull())        
        continue;    
    curearray.push_back(ptrCv);
}
for (int i = 0; i < curearray.size(); i++)
{    
    //拿出每一个面    
    GeCurveArrayPtr ptrCu = curearray[i];    
    if (ptrCu != nullptr)    
    {        
        int size = ptrCu->size();        
        for (int j = 0; j < size; j++)        
        {            
            IGeCurveBase::CurveBaseType type = ptrCu->at(j)->getCurveBaseType();
            //拿出每一个面中线的信息            
            if (type == IGeCurveBase::CurveBaseType::CURVE_BASE_TYPE_Segment)
            {                
                IGeCurveBasePtr ptrCurbase = ptrCu->at(j);    
                if(ptrCurbase.isNull())                    
                    continue;                
                GePoint3d pointA = GePoint3d::create(0, 0, 0);    
                GePoint3d pointB = GePoint3d::create(0, 0, 0);
                ptrCurbase->getStartEndPoint(pointA, pointB);    
            }            
            else if (type == IGeCurveBase::CurveBaseType::CURVE_BASE_TYPE_LineString)
            {                
                IGeCurveBasePtr ptrCurbase = ptrCu->at(j);    
                if(ptrCurbase.isNull())                    
                    continue;                            
                const pvector<GePoint3d> *pts = 
                    ptrCurbase->getLineStringCP();
            }
        }
    }
}

代码4-3:获取实体几何数据