diff --git a/src/Add-on/BoardCutting/LinearCutting.ts b/src/Add-on/BoardCutting/LinearCutting.ts index 4487cdc3d..aef34b22b 100644 --- a/src/Add-on/BoardCutting/LinearCutting.ts +++ b/src/Add-on/BoardCutting/LinearCutting.ts @@ -9,11 +9,11 @@ import { Polyline } from "../../DatabaseServices/Entity/Polyline"; import { Command } from "../../Editor/CommandMachine"; import { PromptStatus } from "../../Editor/PromptResult"; import { CreateContour2 } from "../../Geometry/CreateContour2"; -import { AsVector2, ComparePointFnGenerate, equaln, isParallelTo } from "../../Geometry/GeUtils"; +import { AsVector2, equaln, isParallelTo } from "../../Geometry/GeUtils"; import { PlaneExt } from "../../Geometry/Plane"; -import { RegionParse } from "../../Geometry/RegionParse"; import { IntersectOption } from "../../GraphicsSystem/IntersectWith"; import { AppToaster } from "../../UI/Components/Toaster"; +import { SplitPolyline } from "./SplitPolyline"; export class LinearCutting implements Command { @@ -294,72 +294,3 @@ class FixBoard2dPath }, "split_2dpath"); } } - -/** - * 线性切割多线段 - * - * @export - * @param {Polyline} meatPl 被切割的曲线 - * @param {Polyline[]} knifePls 刀曲线 - * @return {*} - */ -export function SplitPolyline(meatPl: Polyline, knifePls: Polyline[]): Polyline[] -{ - let allSplitPls: Polyline[] = []; - let allIntersePts: Vector3[] = []; - for (let pl of knifePls) - { - - let ipts = pl.IntersectWith(meatPl, IntersectOption.ExtendThis); - allIntersePts.push(...ipts); - if (pl.LineData.length === 2 && ipts.length > 1) //直线切割,且有2个已经的顶点 - { - if (ipts.length === 2) - { - pl.StartPoint = ipts[0]; - pl.EndPoint = ipts[1]; - } - - else - { - ipts.sort(ComparePointFnGenerate("xy")); - pl.StartPoint = ipts[0]; - pl.EndPoint = arrayLast(ipts); - } - } - - else - { - let iptsNotExt = ipts.filter(p => pl.PtOnCurve(p)); - if (iptsNotExt.length < 2 && ipts.length === 2) - { - let params = ipts.map(p => pl.GetParamAtPoint(p)); - pl.Extend(params[0]); - pl.Extend(params[1]); - } - } - - let splitPls = pl.GetSplitCurvesByPts(ipts) as Polyline[]; - allSplitPls.push(...splitPls); - } - - let brSplitCus = meatPl.GetSplitCurvesByPts(allIntersePts) as Polyline[]; - - allSplitPls = allSplitPls.filter(pl => - { - return meatPl.PtInCurve(pl.GetPointAtParam(pl.EndParam / 2)); //切割线必须在板内才有用 - }); - - let regionParse = new RegionParse(brSplitCus.concat(allSplitPls)); - - let cus = regionParse.RegionsInternal.map(r => - { - let pl = new Polyline(); - for (let route of r) - pl.Join(route.curve); - if (pl.Area2 < 0) - pl.Reverse(); - return pl; - }); - return cus; -} diff --git a/src/Add-on/BoardCutting/SplitPolyline.ts b/src/Add-on/BoardCutting/SplitPolyline.ts new file mode 100644 index 000000000..ea76d17df --- /dev/null +++ b/src/Add-on/BoardCutting/SplitPolyline.ts @@ -0,0 +1,78 @@ +import { Vector3 } from "three"; +import { arrayLast } from "../../Common/ArrayExt"; +import { Polyline } from "../../DatabaseServices/Entity/Polyline"; +import { ComparePointFnGenerate } from "../../Geometry/GeUtils"; +import { RegionParse } from "../../Geometry/RegionParse"; +import { IntersectOption } from "../../GraphicsSystem/IntersectWith"; + +/** + * 线性切割多线段 + * + * @export + * @param {Polyline} meatPl 被切割的曲线 + * @param {Polyline[]} knifePls 刀曲线 + * @return {*} + */ + +export function SplitPolyline(meatPl: Polyline, knifePls: Polyline[]): Polyline[] +{ + let allSplitPls: Polyline[] = []; + let allIntersePts: Vector3[] = []; + for (let pl of knifePls) + { + + let ipts = pl.IntersectWith(meatPl, IntersectOption.ExtendThis); + allIntersePts.push(...ipts); + if (pl.LineData.length === 2 && ipts.length > 1) //直线切割,且有2个已经的顶点 + { + if (ipts.length === 2) + { + pl.StartPoint = ipts[0]; + pl.EndPoint = ipts[1]; + } + + + else + { + ipts.sort(ComparePointFnGenerate("xy")); + pl.StartPoint = ipts[0]; + pl.EndPoint = arrayLast(ipts); + } + } + + + else + { + let iptsNotExt = ipts.filter(p => pl.PtOnCurve(p)); + if (iptsNotExt.length < 2 && ipts.length === 2) + { + let params = ipts.map(p => pl.GetParamAtPoint(p)); + pl.Extend(params[0]); + pl.Extend(params[1]); + } + } + + let splitPls = pl.GetSplitCurvesByPts(ipts) as Polyline[]; + allSplitPls.push(...splitPls); + } + + let brSplitCus = meatPl.GetSplitCurvesByPts(allIntersePts) as Polyline[]; + + allSplitPls = allSplitPls.filter(pl => + { + return meatPl.PtInCurve(pl.GetPointAtParam(pl.EndParam / 2)); //切割线必须在板内才有用 + }); + + let regionParse = new RegionParse(brSplitCus.concat(allSplitPls)); + + let cus = regionParse.RegionsInternal.map(r => + { + let pl = new Polyline(); + for (let route of r) + pl.Join(route.curve); + if (pl.Area2 < 0) + pl.Reverse(); + return pl; + }); + return cus; +} diff --git a/src/Add-on/DrawDrilling/DrawDrillingTool.ts b/src/Add-on/DrawDrilling/DrawDrillingTool.ts index 5590c86d9..8bd68b1e7 100644 --- a/src/Add-on/DrawDrilling/DrawDrillingTool.ts +++ b/src/Add-on/DrawDrilling/DrawDrillingTool.ts @@ -30,7 +30,7 @@ import { FindInWall } from "../../Editor/TranstrolControl/ParseWalls"; import { FindClosestInterval, Segment1d, Segment1dSubtraction2, operInterval } from "../../Editor/TranstrolControl/Segment1dUtil"; import { userConfig } from "../../Editor/UserConfig"; import { Box3Ext } from "../../Geometry/Box"; -import { CanDrawHoleFuzz } from "../../Geometry/DrillParse/BoardGetFace"; +import { CanDrawHoleFuzz } from "../../Geometry/DrillParse/CanDrawHoleFuzz"; import { CollisionDetection } from "../../Geometry/DrillParse/CollisionDetection"; import { Face } from "../../Geometry/DrillParse/Face"; import { MoveMatrix, YAxis, ZAxis, equaln, isIntersect, isParallelTo } from "../../Geometry/GeUtils"; diff --git a/src/Add-on/DrawDrilling/DrillingReactor.ts b/src/Add-on/DrawDrilling/DrillingReactor.ts index 7d184a237..78472d6eb 100644 --- a/src/Add-on/DrawDrilling/DrillingReactor.ts +++ b/src/Add-on/DrawDrilling/DrillingReactor.ts @@ -5,7 +5,7 @@ import { Board } from "../../DatabaseServices/Entity/Board"; import { HardwareCompositeEntity } from "../../DatabaseServices/Hardware/HardwareCompositeEntity"; import { userConfig } from "../../Editor/UserConfig"; import { Box3Ext } from "../../Geometry/Box"; -import { CanDrawHoleFuzz } from "../../Geometry/DrillParse/BoardGetFace"; +import { CanDrawHoleFuzz } from "../../Geometry/DrillParse/CanDrawHoleFuzz"; import { AppToaster } from "../../UI/Components/Toaster"; import { DrawDrillingTool } from "./DrawDrillingTool"; diff --git a/src/Editor/SelectPick.ts b/src/Editor/SelectPick.ts index 9d4990217..2a89ecb44 100644 --- a/src/Editor/SelectPick.ts +++ b/src/Editor/SelectPick.ts @@ -1,8 +1,8 @@ import { Object3D, Raycaster, Vector2, Vector3 } from 'three'; -import { Viewer } from '../GraphicsSystem/Viewer'; -import { SelectBox, SelectType } from './SelectBox'; -import { GenerateRaycaster, Raycast } from './PointPick'; import { AsVector2 } from '../Geometry/GeUtils'; +import { IViewer } from '../GraphicsSystem/IView'; +import { GenerateRaycaster, Raycast } from './PointPick'; +import { SelectBox, SelectType } from './SelectBox'; /** * 点选的数据结构 @@ -12,7 +12,7 @@ export class SelectPick extends SelectBox //用户点击选择时,点击的鼠标点(屏幕坐标系) _PickPointVcs: Vector3; _Raycaster: Raycaster = new Raycaster(); - constructor(view: Viewer, ptVcs: Vector3, size = 10.1) + constructor(view: IViewer, ptVcs: Vector3, size = 10.1) { super(view, AsVector2(ptVcs).add(new Vector2(-size, -size)), diff --git a/src/Geometry/DrillParse/BoardGetFace.ts b/src/Geometry/DrillParse/BoardGetFace.ts index ce2fcf406..eeb0ff4a6 100644 --- a/src/Geometry/DrillParse/BoardGetFace.ts +++ b/src/Geometry/DrillParse/BoardGetFace.ts @@ -1,6 +1,6 @@ import { Matrix4, Vector2, Vector3 } from "three"; import { ArcBoardBuild } from "../../Add-on/ArcBoard/ArcBoardBuild"; -import { SplitPolyline } from "../../Add-on/BoardCutting/LinearCutting"; +import { SplitPolyline } from "../../Add-on/BoardCutting/SplitPolyline"; import { DrillType, FaceDirection } from "../../Add-on/DrawDrilling/DrillType"; import { MergeCurvelist } from "../../Common/CurveUtils"; import { MakeMirrorMtx } from "../../Common/Matrix4Utils"; @@ -10,11 +10,10 @@ import { Curve } from "../../DatabaseServices/Entity/Curve"; import { Polyline } from "../../DatabaseServices/Entity/Polyline"; import { Region } from "../../DatabaseServices/Entity/Region"; import { AsVector2, ZAxis, angle, equaln, equalv3 } from "../GeUtils"; +import { CanDrawHoleFuzz } from "./CanDrawHoleFuzz"; import { Face } from "./Face"; -export const CanDrawHoleFuzz = 0.1; - export enum BoardFaceType { Side = 0, diff --git a/src/Geometry/DrillParse/CanDrawHoleFuzz.ts b/src/Geometry/DrillParse/CanDrawHoleFuzz.ts new file mode 100644 index 000000000..99f63f9ca --- /dev/null +++ b/src/Geometry/DrillParse/CanDrawHoleFuzz.ts @@ -0,0 +1,3 @@ + + +export const CanDrawHoleFuzz = 0.1; diff --git a/src/Geometry/DrillParse/CollisionDetection.ts b/src/Geometry/DrillParse/CollisionDetection.ts index 4d92d62e0..ad4fd60c2 100644 --- a/src/Geometry/DrillParse/CollisionDetection.ts +++ b/src/Geometry/DrillParse/CollisionDetection.ts @@ -1,7 +1,8 @@ import { DrillType } from "../../Add-on/DrawDrilling/DrillType"; import { Board } from "../../DatabaseServices/Entity/Board"; import { Box3Ext } from "../Box"; -import { BoardGetFace, CanDrawHoleFuzz } from "./BoardGetFace"; +import { BoardGetFace } from "./BoardGetFace"; +import { CanDrawHoleFuzz } from "./CanDrawHoleFuzz"; import { Face } from "./Face"; export class CollisionDetection diff --git a/src/GraphicsSystem/ToolPath/FeedingToolPath.ts b/src/GraphicsSystem/ToolPath/FeedingToolPath.ts index 4938ceadb..049c9a6df 100644 --- a/src/GraphicsSystem/ToolPath/FeedingToolPath.ts +++ b/src/GraphicsSystem/ToolPath/FeedingToolPath.ts @@ -17,7 +17,8 @@ import { Shape } from "../../DatabaseServices/Shape"; import { ShapeManager } from "../../DatabaseServices/ShapeManager"; import { Box3Ext } from "../../Geometry/Box"; import { Route } from "../../Geometry/CurveMap"; -import { CanDrawHoleFuzz, GetSideFaceMtx } from "../../Geometry/DrillParse/BoardGetFace"; +import { GetSideFaceMtx } from "../../Geometry/DrillParse/BoardGetFace"; +import { CanDrawHoleFuzz } from "../../Geometry/DrillParse/CanDrawHoleFuzz"; import { AsVector2, equaln, isParallelTo } from "../../Geometry/GeUtils"; import { RegionParse } from "../../Geometry/RegionParse"; import { FixIndex } from "../../Nest/Common/Util"; diff --git a/src/Production/Product.ts b/src/Production/Product.ts index df8b17857..6a70d4c32 100644 --- a/src/Production/Product.ts +++ b/src/Production/Product.ts @@ -23,7 +23,7 @@ import { GroupRecord } from "../DatabaseServices/GroupTableRecord"; import { HardwareCompositeEntity } from "../DatabaseServices/Hardware/HardwareCompositeEntity"; import { HardwareTopline } from "../DatabaseServices/Hardware/HardwareTopline"; import { Shape } from "../DatabaseServices/Shape"; -import { CanDrawHoleFuzz } from "../Geometry/DrillParse/BoardGetFace"; +import { CanDrawHoleFuzz } from "../Geometry/DrillParse/CanDrawHoleFuzz"; import { IsBetweenA2B, MoveMatrix, XAxis, angle, angleTo, equaln, equalv2, equalv3, isIntersect2, isParallelTo, isPerpendicularityTo } from "../Geometry/GeUtils"; import { BrSealedData, GetSealedBoardContour } from "../GraphicsSystem/CalcEdgeSealing"; import { FeedingToolPath, GetModelingFromCustomDrill } from "../GraphicsSystem/ToolPath/FeedingToolPath";