支持返回空

This commit is contained in:
ChenX 2024-03-29 16:30:00 +08:00
parent 13b169882b
commit bdb033f410
6 changed files with 46 additions and 16 deletions

View File

@ -23207,8 +23207,15 @@ NestCache.NoPutCache = {};
NestCache.CacheRect = new Map(); NestCache.CacheRect = new Map();
const TEXT_BOX = NestCache.CreatePath(570, 110); const TEXT_BOX = NestCache.CreatePath(570, 110);
//分析文字放置位置 /**
function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) { * 分析文字放置位置
* @param contour 轮廓点表
* @param holes 网洞点表
* @param [textBox=TEXT_BOX] 标签盒子
* @param [allowReturnNullPos=false] 允许返回null 当没有找到合适的位置返回null
* @returns Vector3
*/
function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX, allowReturnNullPos = false) {
let hasTextBox = true; let hasTextBox = true;
let path = new Path(contour); let path = new Path(contour);
let nfps = path.GetInsideNFP(textBox)?.map(nfp => Path2Polyline(PathTranslate_Self(PathScale(nfp, 1e-4), path.OrigionMinPoint.x, path.OrigionMinPoint.y))); //可能无法获得 let nfps = path.GetInsideNFP(textBox)?.map(nfp => Path2Polyline(PathTranslate_Self(PathScale(nfp, 1e-4), path.OrigionMinPoint.x, path.OrigionMinPoint.y))); //可能无法获得
@ -23216,7 +23223,7 @@ function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) {
nfps = [Path2Polyline(contour)]; nfps = [Path2Polyline(contour)];
hasTextBox = false; hasTextBox = false;
} }
let holenfps = []; let holeNFPs = [];
for (let hole of holes) { for (let hole of holes) {
let hpath = new Path(hole); let hpath = new Path(hole);
let nfps = hpath.GetOutsideNFP(textBox); let nfps = hpath.GetOutsideNFP(textBox);
@ -23226,11 +23233,11 @@ function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) {
let boxpl = new exports.Polyline().RectangleFrom2Pt(new three.Vector3(box.min.x - 1e5, box.min.y - 1), new three.Vector3(box.max.x + 1e5, box.min.y + 1)); let boxpl = new exports.Polyline().RectangleFrom2Pt(new three.Vector3(box.min.x - 1e5, box.min.y - 1), new three.Vector3(box.max.x + 1e5, box.min.y + 1));
let con1 = Contour.CreateContour(pl, false); let con1 = Contour.CreateContour(pl, false);
let con2 = Contour.CreateContour(boxpl, false); let con2 = Contour.CreateContour(boxpl, false);
holenfps.push(...con1.UnionBoolOperation(con2).contours); holeNFPs.push(...con1.UnionBoolOperation(con2).contours);
} }
let shapes = nfps.map(pl => new Shape(Contour.CreateContour(pl, false))); let shapes = nfps.map(pl => new Shape(Contour.CreateContour(pl, false)));
let subShapes = new ShapeManager; let subShapes = new ShapeManager;
holenfps.forEach(pl => { holeNFPs.forEach(pl => {
subShapes.UnionBoolOperation(new ShapeManager([new Shape(pl)])); subShapes.UnionBoolOperation(new ShapeManager([new Shape(pl)]));
}); });
let resShapes = []; let resShapes = [];
@ -23238,8 +23245,12 @@ function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) {
// TestDraw(shape.Outline.Curve, 6); // TestDraw(shape.Outline.Curve, 6);
resShapes.push(...shape.SubstactBoolOperation(subShapes.ShapeList)); //可能减完丢了 resShapes.push(...shape.SubstactBoolOperation(subShapes.ShapeList)); //可能减完丢了
} }
if (resShapes.length === 0) if (resShapes.length === 0) {
//允许返回空的点 因为无法放置
if (allowReturnNullPos)
return;
resShapes = shapes; resShapes = shapes;
}
let maxDist = -Infinity; let maxDist = -Infinity;
let minp; let minp;
for (let shape of resShapes) { for (let shape of resShapes) {

File diff suppressed because one or more lines are too long

View File

@ -23180,8 +23180,15 @@ NestCache.NoPutCache = {};
NestCache.CacheRect = new Map(); NestCache.CacheRect = new Map();
const TEXT_BOX = NestCache.CreatePath(570, 110); const TEXT_BOX = NestCache.CreatePath(570, 110);
//分析文字放置位置 /**
function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) { * 分析文字放置位置
* @param contour 轮廓点表
* @param holes 网洞点表
* @param [textBox=TEXT_BOX] 标签盒子
* @param [allowReturnNullPos=false] 允许返回null 当没有找到合适的位置返回null
* @returns Vector3
*/
function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX, allowReturnNullPos = false) {
let hasTextBox = true; let hasTextBox = true;
let path = new Path(contour); let path = new Path(contour);
let nfps = path.GetInsideNFP(textBox)?.map(nfp => Path2Polyline(PathTranslate_Self(PathScale(nfp, 1e-4), path.OrigionMinPoint.x, path.OrigionMinPoint.y))); //可能无法获得 let nfps = path.GetInsideNFP(textBox)?.map(nfp => Path2Polyline(PathTranslate_Self(PathScale(nfp, 1e-4), path.OrigionMinPoint.x, path.OrigionMinPoint.y))); //可能无法获得
@ -23189,7 +23196,7 @@ function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) {
nfps = [Path2Polyline(contour)]; nfps = [Path2Polyline(contour)];
hasTextBox = false; hasTextBox = false;
} }
let holenfps = []; let holeNFPs = [];
for (let hole of holes) { for (let hole of holes) {
let hpath = new Path(hole); let hpath = new Path(hole);
let nfps = hpath.GetOutsideNFP(textBox); let nfps = hpath.GetOutsideNFP(textBox);
@ -23199,11 +23206,11 @@ function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) {
let boxpl = new Polyline().RectangleFrom2Pt(new Vector3(box.min.x - 1e5, box.min.y - 1), new Vector3(box.max.x + 1e5, box.min.y + 1)); let boxpl = new Polyline().RectangleFrom2Pt(new Vector3(box.min.x - 1e5, box.min.y - 1), new Vector3(box.max.x + 1e5, box.min.y + 1));
let con1 = Contour.CreateContour(pl, false); let con1 = Contour.CreateContour(pl, false);
let con2 = Contour.CreateContour(boxpl, false); let con2 = Contour.CreateContour(boxpl, false);
holenfps.push(...con1.UnionBoolOperation(con2).contours); holeNFPs.push(...con1.UnionBoolOperation(con2).contours);
} }
let shapes = nfps.map(pl => new Shape(Contour.CreateContour(pl, false))); let shapes = nfps.map(pl => new Shape(Contour.CreateContour(pl, false)));
let subShapes = new ShapeManager; let subShapes = new ShapeManager;
holenfps.forEach(pl => { holeNFPs.forEach(pl => {
subShapes.UnionBoolOperation(new ShapeManager([new Shape(pl)])); subShapes.UnionBoolOperation(new ShapeManager([new Shape(pl)]));
}); });
let resShapes = []; let resShapes = [];
@ -23211,8 +23218,12 @@ function ParseRegionTextPos(contour, holes, textBox = TEXT_BOX) {
// TestDraw(shape.Outline.Curve, 6); // TestDraw(shape.Outline.Curve, 6);
resShapes.push(...shape.SubstactBoolOperation(subShapes.ShapeList)); //可能减完丢了 resShapes.push(...shape.SubstactBoolOperation(subShapes.ShapeList)); //可能减完丢了
} }
if (resShapes.length === 0) if (resShapes.length === 0) {
//允许返回空的点 因为无法放置
if (allowReturnNullPos)
return;
resShapes = shapes; resShapes = shapes;
}
let maxDist = -Infinity; let maxDist = -Infinity;
let minp; let minp;
for (let shape of resShapes) { for (let shape of resShapes) {

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,13 @@
import { Vector3 } from "three"; import { Vector3 } from "three";
import { Point } from "../../../Nest/Common/Point"; import { Point } from "../../../Nest/Common/Point";
import { Path } from "../../../Nest/Core/Path"; import { Path } from "../../../Nest/Core/Path";
export declare function ParseRegionTextPos(contour: Point[], holes: (Point[])[], textBox?: Path): Vector3; /**
*
* @param contour
* @param holes
* @param [textBox=TEXT_BOX]
* @param [allowReturnNullPos=false] null null
* @returns Vector3
*/
export declare function ParseRegionTextPos(contour: Point[], holes: (Point[])[], textBox?: Path, allowReturnNullPos?: boolean): Vector3 | undefined;
//# sourceMappingURL=ParseRegionTextPos.d.ts.map //# sourceMappingURL=ParseRegionTextPos.d.ts.map

View File

@ -1 +1 @@
{"version":3,"file":"ParseRegionTextPos.d.ts","sourceRoot":"","sources":["../../../../../src/DatabaseServices/Room/ParseService/ParseRegionTextPos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAInD,OAAO,EAAE,IAAI,EAAiC,MAAM,yBAAyB,CAAC;AAS9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,OAAW,WAuG1F"} {"version":3,"file":"ParseRegionTextPos.d.ts","sourceRoot":"","sources":["../../../../../src/DatabaseServices/Room/ParseService/ParseRegionTextPos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAInD,OAAO,EAAE,IAAI,EAAiC,MAAM,yBAAyB,CAAC;AAQ9E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,OAAW,EAAE,kBAAkB,UAAQ,GAAG,OAAO,GAAG,SAAS,CA2G5I"}