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

4.4.1 创建SoildBase几何实体

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

①创建点。

②由点形成线。

③由线形成面。

④通过面和拉伸向量,形成一个拉伸体。

//点
GePoint3d pointS = new GePoint3d(1, 1, 0);
GePoint3d pointE = new GePoint3d(8000, 8000, 0); 
GePoint3d pointB = new GePoint3d(8000, 1, 0);
GePoint3d pointT = new GePoint3d(16000, 8000, 0); 
// 线
var curve = IGeCurveBase.createSegment(new GeSegment3d(pointS, pointE)); 
var curve1 = IGeCurveBase.createSegment(new GeSegment3d(pointE, pointT)); 
var curve2 = IGeCurveBase.createSegment(new GeSegment3d(pointT, pointB)); 
var curve3 = IGeCurveBase.createSegment(new GeSegment3d(pointB, pointS));
// 面
GeCurveArray curveLGeCurveArray.create(GeCurveArray.BoundaryType.Outer); 
curveList.add(curve);
curveList.add(curve1);
curveList.add(curve2);
curveList.add(curve3);
// 体
GeVec3d v3d = new GeVec3d(0,0,2000);
GeExtrusionInfo extrusionInfo = new GeExtrusionInfo(curveList,v3d, true);
var solid = IGeSolidBase.createExtrusion(extrusionInfo);
BPGraphics graphic = new BPGraphics();
graphic.addSolid(solid);
graphic.save();

代码4-2 创建拉伸体

4.4.2 获取SoildBase几何数据

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

①通过getFaceIndices接口获取几何实体所有面的序号。

②遍历面的序号拿到对应面的数据。

③遍历每个面拿到面中所有线的数据。

④遍历线拿到点的数据。

//得到soild里面indices
List<GeFaceIndices> indices = solid.getFaceIndices();
List<GeCurveArray> curvearr = new List<GeCurveArray>();
//通过 indices拿到对应的面
foreach(GeFaceIndices fIdx in indices)
{
    GeCurveArray arr = solid.getFace(fIdx);
    if (arr != nul1)
        curvearr.Add(arr);
}
if (curvearr != nul1)
{
    long num = curvearr.Count;
    List<IGeCurveBase> curvel = new List<IGeCurveBase>();
    for (long a = 0; a < num; a++)
    {
        //拿出每一个面
        GeCurveArray curvearray = GeCurveArray.create(GeCurveArray.BoundaryType.Outer);
        int b = Convert.ToInt32(a);
        curvearray = curvearr[b];
        if (a == 0)
        {
            //画出第一个面
            BPGeSymbology symb = new BPGeSymbology(); 
            symb.color = System.Drawing.Color.Green;
            graphics.addCurveVector(curvearray, symb,0);
        }
        //拿出每一个面中线的信息
        if (curvearray != null)
        {
            long length = curvearray.size;
            for (long line = 0; line < length; line++)
            {
                curvel.Add(curvearray.at(line));
                int c = Convert.ToInt32(line);
                IGeCurveBase.CurveBaseType style = curvearray.at(line).getCurveBaseType();
                //拿出每一个线中点的信息
                if (style == IGeCurveBase.CurveBaseType.Segment)
                {
                    IGeCurveBase curveone =
                    IGeCurveBase.createSegment(new GeSegment3d(pointS, pointE));
                    curveone = curvearray.at(line);
                    if (curveone != null)
                    {
                        GePoint3d startq = curveone.startPoint;
                        GePoint3d endq = curveone.endPoint;
                    }
                }
                //如果是lingsrting类型,则拿到线里所有的点
                else if (style == IGeCurveBase.CurveBaseType.LineString)
                {
                    IGeCurveBase curveone1 =
                    IGeCurveBase.createLineString(points);
                    List<GePoint3d> pointsvect = new List<GePoint3d>();
                    curveone1 = curvearray.at(line);
                    if (curveone1 != null)
                    {
                        pointsvect = curveone1.getLineString();
                    }
                }
            }
        }
    }
}

代码4-3 获取实体点线面数据