diff --git a/src/DatabaseServices/Polyline.ts b/src/DatabaseServices/Polyline.ts index a097fc348..222d419dd 100644 --- a/src/DatabaseServices/Polyline.ts +++ b/src/DatabaseServices/Polyline.ts @@ -1019,15 +1019,9 @@ export class Polyline extends Curve let pts = shape.getPoints(50).map(Vec2DTo3D); let plObj = en as THREE.Line; let geo = plObj.geometry as BufferGeometry; - if (pts.length <= geo.drawRange.count && geo.drawRange.count !== Infinity) + if (!BufferGeometryUtils.UpdatePts(geo, pts)) { - BufferGeometryUtils.UpdatePts(geo, pts); - geo.drawRange.count = pts.length; - } - else - { - geo = BufferGeometryUtils.CreateFromPts(pts); - updateGeometry(plObj, geo); + updateGeometry(plObj, BufferGeometryUtils.CreateFromPts(pts)); } } GetObjectSnapPoints( diff --git a/src/Geometry/BufferGeometryUtils.ts b/src/Geometry/BufferGeometryUtils.ts index 589a3f819..2e912a949 100644 --- a/src/Geometry/BufferGeometryUtils.ts +++ b/src/Geometry/BufferGeometryUtils.ts @@ -11,11 +11,23 @@ export namespace BufferGeometryUtils return geo; } - export function UpdatePts(geo: BufferGeometry, pts: Vector3[]) + /** + * 更新BufferGeometry的顶点 + * @param geo + * @param pts + * @returns 当成功时返回true,更新失败时返回false + */ + export function UpdatePts(geo: BufferGeometry, pts: Vector3[]): boolean { let bf = geo.getAttribute("position") as BufferAttribute; - bf.copyVector3sArray(pts); - bf.needsUpdate = true; + if (bf.count >= pts.length) + { + bf.copyVector3sArray(pts); + bf.needsUpdate = true; + geo.drawRange.count = pts.length; + return true; + } + return false; } let arrowGeometry: ShapeGeometry;