!80 避免多段线偏移多余的合并,返回Curve.Join的多种状态,提高多段线长度的精度,增加Beak命令.

Merge pull request !80 from ChenX/arcjoin_new
pull/80/MERGE
ChenX 6 years ago
commit fa60c0bf64

@ -2,7 +2,7 @@
exports[`圆偏移 1`] = ` exports[`圆偏移 1`] = `
Vector3 { Vector3 {
"x": 2, "x": 7,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -10,7 +10,7 @@ Vector3 {
exports[`圆偏移 2`] = ` exports[`圆偏移 2`] = `
Vector3 { Vector3 {
"x": 2, "x": 7,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -18,7 +18,7 @@ Vector3 {
exports[`圆偏移 3`] = ` exports[`圆偏移 3`] = `
Vector3 { Vector3 {
"x": 5, "x": 15,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -26,7 +26,7 @@ Vector3 {
exports[`圆偏移 4`] = ` exports[`圆偏移 4`] = `
Vector3 { Vector3 {
"x": 5, "x": 15,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -34,7 +34,7 @@ Vector3 {
exports[`圆偏移 5`] = ` exports[`圆偏移 5`] = `
Vector3 { Vector3 {
"x": 20, "x": 30,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -42,7 +42,7 @@ Vector3 {
exports[`圆偏移 6`] = ` exports[`圆偏移 6`] = `
Vector3 { Vector3 {
"x": 20, "x": 30,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -50,7 +50,7 @@ Vector3 {
exports[`圆偏移 7`] = ` exports[`圆偏移 7`] = `
Vector3 { Vector3 {
"x": 20, "x": 30,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -58,7 +58,7 @@ Vector3 {
exports[`圆偏移 8`] = ` exports[`圆偏移 8`] = `
Vector3 { Vector3 {
"x": 20, "x": 30,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -66,7 +66,7 @@ Vector3 {
exports[`圆偏移 9`] = ` exports[`圆偏移 9`] = `
Vector3 { Vector3 {
"x": 5, "x": 15,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }
@ -74,7 +74,7 @@ Vector3 {
exports[`圆偏移 10`] = ` exports[`圆偏移 10`] = `
Vector3 { Vector3 {
"x": 5, "x": 15,
"y": 0, "y": 0,
"z": 0, "z": 0,
} }

@ -1,6 +1,7 @@
import { Vector3 } from 'three'; import { Vector3 } from 'three';
import { Arc } from '../../src/DatabaseServices/Arc'; import { Arc } from '../../src/DatabaseServices/Arc';
import { equaln, equalv3 } from '../../src/Geometry/GeUtils'; import { equaln, equalv3 } from '../../src/Geometry/GeUtils';
import { Status } from '../../src/Common/Status';
test("三点共线", () => test("三点共线", () =>
{ {
@ -193,8 +194,7 @@ test('圆弧合并', () =>
let arc2 = new Arc(new Vector3(), 1, 3, 4); let arc2 = new Arc(new Vector3(), 1, 3, 4);
//成了一个圆 //成了一个圆
expect(arc.Join(arc2)).toBeTruthy(); expect(arc.Join(arc2)).toBe(Status.ConverToCircle);
expect(equaln(arc.AllAngle, Math.PI * 2)).toBeTruthy();
arc = new Arc(new Vector3(), 1, 0, 1).Reverse(); arc = new Arc(new Vector3(), 1, 0, 1).Reverse();
arc2 = new Arc(new Vector3(), 1, 0.5, 0.2).Reverse(); arc2 = new Arc(new Vector3(), 1, 0.5, 0.2).Reverse();
@ -287,7 +287,5 @@ test('容差相接', () =>
arc2.StartAngle = 1; arc2.StartAngle = 1;
arc2.EndAngle = 0; arc2.EndAngle = 0;
expect(arc.Join(arc2)).toBeTruthy(); expect(arc.Join(arc2)).toBe(Status.ConverToCircle);
expect(arc.AllAngle).toBe(Math.PI * 2);
}); });

@ -2,198 +2,206 @@
exports[`IKKGK圆与直线补圆弧 1`] = `1`; exports[`IKKGK圆与直线补圆弧 1`] = `1`;
exports[`IKKGK圆与直线补圆弧 2`] = `44.99809767964709`; exports[`IKKGK圆与直线补圆弧 2`] = `44.99893545255324`;
exports[`IKKGK圆与直线补圆弧 3`] = `1`; exports[`IKKGK圆与直线补圆弧 3`] = `1`;
exports[`IKKGK圆与直线补圆弧 4`] = `44.99809767964709`; exports[`IKKGK圆与直线补圆弧 4`] = `44.99893545255324`;
exports[`IKKGK圆与直线补圆弧 5`] = `1`; exports[`IKKGK圆与直线补圆弧 5`] = `1`;
exports[`IKKGK圆与直线补圆弧 6`] = `52.52605376818707`; exports[`IKKGK圆与直线补圆弧 6`] = `52.52699197436397`;
exports[`中间区域需要圆裁剪 1`] = `1`; exports[`中间区域需要圆裁剪 1`] = `1`;
exports[`中间区域需要圆裁剪 2`] = `24.711300177432392`; exports[`中间区域需要圆裁剪 2`] = `24.711300177432424`;
exports[`圆求交错误导致的线丢失 1`] = `4148.643077512141`; exports[`圆求交错误导致的线丢失 1`] = `4148.6552839918695`;
exports[`圆求交错误导致的线丢失 2`] = `4425.2680383915285`; exports[`圆求交错误导致的线丢失 2`] = `4425.280774659357`;
exports[`圆求交错误导致的线丢失 3`] = `4021.8883370297244`; exports[`圆求交错误导致的线丢失 3`] = `4021.9003332433504`;
exports[`圆求交错误导致的线丢失 4`] = `4581.211144290334`; exports[`圆求交错误导致的线丢失 4`] = `4581.2242286506635`;
exports[`圆求交错误导致的线丢失 5`] = `3900.596094685299`; exports[`圆求交错误导致的线丢失 5`] = `3900.6079069452912`;
exports[`圆求交错误导致的线丢失 6`] = `4757.455003004337`; exports[`圆求交错误导致的线丢失 6`] = `4757.468532252381`;
exports[`圆求交错误导致的线丢失 7`] = `3783.7370117939813`; exports[`圆求交错误导致的线丢失 7`] = `3783.748662100121`;
exports[`圆求交错误导致的线丢失 8`] = `4971.998320028233`; exports[`圆求交错误导致的线丢失 8`] = `4972.012479701851`;
exports[`圆求交错误导致的线丢失 9`] = `1148.6589057383728`; exports[`圆求交错误导致的线丢失 9`] = `1148.6632687596884`;
exports[`圆求交错误导致的线丢失 10`] = `5979.860045322116`; exports[`圆求交错误导致的线丢失 10`] = `5979.881810920416`;
exports[`圆求交错误导致的线丢失 11`] = `1049.9556072438302`; exports[`圆求交错误导致的线丢失 11`] = `1049.9599133172644`;
exports[`圆求交错误导致的线丢失 12`] = `6051.204453232351`; exports[`圆求交错误导致的线丢失 12`] = `6051.226641876329`;
exports[`圆求交错误导致的线丢失 13`] = `722.4723063967795`; exports[`圆求交错误导致的线丢失 13`] = `722.4732418587954`;
exports[`圆求交错误导致的线丢失 14`] = `6316.957052295357`; exports[`圆求交错误导致的线丢失 14`] = `6316.980887212943`;
exports[`复杂圆盘选点 1`] = `1`; exports[`复杂圆盘选点 1`] = `1`;
exports[`复杂圆盘选点 2`] = `197.02243978484844`; exports[`复杂圆盘选点 2`] = `197.02551075687774`;
exports[`复杂圆盘选点 3`] = `1`; exports[`复杂圆盘选点 3`] = `1`;
exports[`复杂圆盘选点 4`] = `190.8250601645778`; exports[`复杂圆盘选点 4`] = `190.82843823827844`;
exports[`复杂圆盘选点 5`] = `1`; exports[`复杂圆盘选点 5`] = `1`;
exports[`复杂圆盘选点 6`] = `204.53759288661757`; exports[`复杂圆盘选点 6`] = `204.54080647675428`;
exports[`复杂圆盘选点 7`] = `1`; exports[`复杂圆盘选点 7`] = `1`;
exports[`复杂圆盘选点 8`] = `205.56709149039025`; exports[`复杂圆盘选点 8`] = `205.57027795132643`;
exports[`复杂圆盘选点 9`] = `1`; exports[`复杂圆盘选点 9`] = `1`;
exports[`复杂圆盘选点 10`] = `206.8201634712139`; exports[`复杂圆盘选点 10`] = `206.82332282556683`;
exports[`多段线存在0长度线段导致偏移错误 1`] = `1`; exports[`多段线存在0长度线段导致偏移错误 1`] = `1`;
exports[`多段线存在0长度线段导致偏移错误 2`] = `81933.49238918608`; exports[`多段线存在0长度线段导致偏移错误 2`] = `81933.70549460054`;
exports[`多段线存在0长度线段导致偏移错误 3`] = `1`; exports[`多段线存在0长度线段导致偏移错误 3`] = `1`;
exports[`多段线存在0长度线段导致偏移错误 4`] = `86143.95799639553`; exports[`多段线存在0长度线段导致偏移错误 4`] = `86144.16549499573`;
exports[`拱门偏移 1`] = `1`; exports[`拱门偏移 1`] = `1`;
exports[`拱门偏移 2`] = `4.314156035548454`; exports[`拱门偏移 2`] = `4.314159265358979`;
exports[`拱门偏移 3`] = `1`; exports[`拱门偏移 3`] = `1`;
exports[`拱门偏移 4`] = `6.827404319936081`; exports[`拱门偏移 4`] = `6.827433388230814`;
exports[`海豚圆选点导致的错误 1`] = `1`; exports[`海豚圆选点导致的错误 1`] = `1`;
exports[`海豚圆选点导致的错误 2`] = `1591.1950206532852`; exports[`海豚圆选点导致的错误 2`] = `1591.1982232513822`;
exports[`海豚圆选点导致的错误 3`] = `1`; exports[`海豚圆选点导致的错误 3`] = `1`;
exports[`海豚圆选点导致的错误 4`] = `1827.6300887246364`; exports[`海豚圆选点导致的错误 4`] = `1827.6352392619829`;
exports[`简单图形因为点在线内算法错误导致的丢失 1`] = `8.675026988029915`; exports[`简单图形因为点在线内算法错误导致的丢失 1`] = `8.675189454805246`;
exports[`简单图形因为点在线内算法错误导致的丢失 2`] = `8.252659494518674`; exports[`简单图形因为点在线内算法错误导致的丢失 2`] = `8.252841733482935`;
exports[`简单图形因为点在线内算法错误导致的丢失 3`] = `6.802593049888034`; exports[`简单图形因为点在线内算法错误导致的丢失 3`] = `6.802689012735881`;
exports[`简单图形因为点在线内算法错误导致的丢失 4`] = `6.045525633131274`; exports[`简单图形因为点在线内算法错误导致的丢失 4`] = `6.045609380056393`;
exports[`补充bug测试 1`] = `7385.097729441212`; exports[`纯圆生成的多段线偏移 1`] = `1`;
exports[`补充bug测试 2`] = `7455.833952762297`; exports[`纯圆生成的多段线偏移 2`] = `7585.215254159188`;
exports[`纯圆生成的多段线偏移 3`] = `1`;
exports[`纯圆生成的多段线偏移 4`] = `6328.578192723271`;
exports[`补充bug测试 1`] = `7385.123391644447`;
exports[`补充bug测试 2`] = `7455.861403941378`;
exports[`补圆弧测试 补圆弧测试1 1`] = `1`; exports[`补圆弧测试 补圆弧测试1 1`] = `1`;
exports[`补圆弧测试 补圆弧测试1 2`] = `202.39234999237365`; exports[`补圆弧测试 补圆弧测试1 2`] = `202.39253405175808`;
exports[`补圆弧测试 补圆弧测试1 3`] = `1`; exports[`补圆弧测试 补圆弧测试1 3`] = `1`;
exports[`补圆弧测试 补圆弧测试1 4`] = `202.97100463130596`; exports[`补圆弧测试 补圆弧测试1 4`] = `202.97120101469034`;
exports[`补圆弧测试 补圆弧测试1 5`] = `1`; exports[`补圆弧测试 补圆弧测试1 5`] = `1`;
exports[`补圆弧测试 补圆弧测试1 6`] = `203.63347010543052`; exports[`补圆弧测试 补圆弧测试1 6`] = `203.63368101398322`;
exports[`补圆弧测试 补圆弧测试1 7`] = `1`; exports[`补圆弧测试 补圆弧测试1 7`] = `1`;
exports[`补圆弧测试 补圆弧测试1 8`] = `204.40220678622498`; exports[`补圆弧测试 补圆弧测试1 8`] = `204.40243508941455`;
exports[`补圆弧测试 补圆弧测试1 9`] = `1`; exports[`补圆弧测试 补圆弧测试1 9`] = `1`;
exports[`补圆弧测试 补圆弧测试1 10`] = `205.30911616294782`; exports[`补圆弧测试 补圆弧测试1 10`] = `205.30936570465025`;
exports[`补圆弧测试 补圆弧测试1 11`] = `1`; exports[`补圆弧测试 补圆弧测试1 11`] = `1`;
exports[`补圆弧测试 补圆弧测试1 12`] = `206.40134291797384`; exports[`补圆弧测试 补圆弧测试1 12`] = `206.40161902342368`;
exports[`补圆弧测试 补圆弧测试1 13`] = `1`; exports[`补圆弧测试 补圆弧测试1 13`] = `1`;
exports[`补圆弧测试 补圆弧测试1 14`] = `207.75214121305123`; exports[`补圆弧测试 补圆弧测试1 14`] = `207.75245158170867`;
exports[`补圆弧测试 补圆弧测试1 15`] = `1`; exports[`补圆弧测试 补圆弧测试1 15`] = `1`;
exports[`补圆弧测试 补圆弧测试1 16`] = `209.48307101962263`; exports[`补圆弧测试 补圆弧测试1 16`] = `209.48342742923182`;
exports[`补圆弧测试 补圆弧测试1 17`] = `1`; exports[`补圆弧测试 补圆弧测试1 17`] = `1`;
exports[`补圆弧测试 补圆弧测试1 18`] = `211.8150599171729`; exports[`补圆弧测试 补圆弧测试1 18`] = `211.81548185565424`;
exports[`补圆弧测试 补圆弧测试1 19`] = `1`; exports[`补圆弧测试 补圆弧测试1 19`] = `1`;
exports[`补圆弧测试 补圆弧测试1 20`] = `215.20865129706962`; exports[`补圆弧测试 补圆弧测试1 20`] = `215.20917509215795`;
exports[`补圆弧测试 补圆弧测试1 21`] = `1`; exports[`补圆弧测试 补圆弧测试1 21`] = `1`;
exports[`补圆弧测试 补圆弧测试1 22`] = `220.89085248936073`; exports[`补圆弧测试 补圆弧测试1 22`] = `220.89156198708565`;
exports[`补圆弧测试 补圆弧测试1 23`] = `1`; exports[`补圆弧测试 补圆弧测试1 23`] = `1`;
exports[`补圆弧测试 补圆弧测试1 24`] = `243.05075247271327`; exports[`补圆弧测试 补圆弧测试1 24`] = `243.05208882995845`;
exports[`补圆弧测试 补圆弧测试1 25`] = `1`; exports[`补圆弧测试 补圆弧测试1 25`] = `1`;
exports[`补圆弧测试 补圆弧测试1 26`] = `236.6991306483004`; exports[`补圆弧测试 补圆弧测试1 26`] = `236.7000505929851`;
exports[`补圆弧测试 补圆弧测试1 27`] = `1`; exports[`补圆弧测试 补圆弧测试1 27`] = `1`;
exports[`补圆弧测试 补圆弧测试1 28`] = `236.69932095661932`; exports[`补圆弧测试 补圆弧测试1 28`] = `236.7000505929851`;
exports[`补圆弧测试 补圆弧测试1 29`] = `1`; exports[`补圆弧测试 补圆弧测试1 29`] = `1`;
exports[`补圆弧测试 补圆弧测试1 30`] = `205.62990409788847`; exports[`补圆弧测试 补圆弧测试1 30`] = `205.63007530643267`;
exports[`补圆弧测试 补圆弧测试1 31`] = `1`; exports[`补圆弧测试 补圆弧测试1 31`] = `1`;
exports[`补圆弧测试 补圆弧测试1 32`] = `198.55214618601138`; exports[`补圆弧测试 补圆弧测试1 32`] = `198.5522282383345`;
exports[`补圆弧测试 补圆弧测试1 33`] = `1`; exports[`补圆弧测试 补圆弧测试1 33`] = `1`;
exports[`补圆弧测试 补圆弧测试1 34`] = `195.91344487061264`; exports[`补圆弧测试 补圆弧测试1 34`] = `195.9134975736565`;
exports[`补圆弧测试 补圆弧测试1 35`] = `1`; exports[`补圆弧测试 补圆弧测试1 35`] = `1`;
exports[`补圆弧测试 补圆弧测试1 36`] = `194.55183899140644`; exports[`补圆弧测试 补圆弧测试1 36`] = `194.55187803685857`;
exports[`补圆弧测试 补圆弧测试1 37`] = `1`; exports[`补圆弧测试 补圆弧测试1 37`] = `1`;
exports[`补圆弧测试 补圆弧测试1 38`] = `193.73991606924534`; exports[`补圆弧测试 补圆弧测试1 38`] = `193.73994771001938`;
exports[`补圆弧测试 补圆弧测试1 39`] = `1`; exports[`补圆弧测试 补圆弧测试1 39`] = `1`;
exports[`补圆弧测试 补圆弧测试1 40`] = `193.2116315246781`; exports[`补圆弧测试 补圆弧测试1 40`] = `193.2116587563558`;
exports[`补圆弧测试 补圆弧测试1 41`] = `1`; exports[`补圆弧测试 补圆弧测试1 41`] = `1`;
exports[`补圆弧测试 补圆弧测试1 42`] = `192.84670578048616`; exports[`补圆弧测试 补圆弧测试1 42`] = `192.84673020284995`;
exports[`补圆弧测试 补圆弧测试1 43`] = `1`; exports[`补圆弧测试 补圆弧测试1 43`] = `1`;
exports[`补圆弧测试 补圆弧测试1 44`] = `192.58324938493251`; exports[`补圆弧测试 补圆弧测试1 44`] = `192.58327191623619`;
exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 1`] = `54789.14760701891`; exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 1`] = `54789.24964851233`;
exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 2`] = `54907.17933624483`; exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 2`] = `54907.28173780603`;
exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 3`] = `55497.39792073307`; exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 3`] = `55497.502122668855`;
exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 4`] = `56678.13326318633`; exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 4`] = `56678.241066044815`;
exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 5`] = `57859.26303559798`; exports[`闭合多段线判断精度和重复交点参数导致偏移丢失 5`] = `57859.37443960542`;

@ -1,25 +1,25 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`补充bug测试#IKWGF 1`] = `1.1376402440608806`; exports[`补充bug测试#IKWGF 1`] = `1.1376403544773543`;
exports[`补充bug测试#IKWGF 2`] = `0.44573816538516137`; exports[`补充bug测试#IKWGF 2`] = `0.4457395323615238`;
exports[`补充bug测试#IKWGF 3`] = `10.73282822209507`; exports[`补充bug测试#IKWGF 3`] = `10.73298136409425`;
exports[`补充bug测试#IKWGF 4`] = `12.786755410504352`; exports[`补充bug测试#IKWGF 4`] = `12.786911814880927`;
exports[`补充bug测试#IKWGF 5`] = `0.6246933329215183`; exports[`补充bug测试#IKWGF 5`] = `0.6246933440840137`;
exports[`补充bug测试#IKWGF 6`] = `10.586543051841131`; exports[`补充bug测试#IKWGF 6`] = `10.586693752451833`;
exports[`补充bug测试#IKWGF 7`] = `14.066950838248612`; exports[`补充bug测试#IKWGF 7`] = `14.067113755971715`;
exports[`补充bug测试#IKWGF 8`] = `2.168984971098264`; exports[`补充bug测试#IKWGF 8`] = `2.168984971098264`;
exports[`补充bug测试#IKWGF 9`] = `11.890848111457423`; exports[`补充bug测试#IKWGF 9`] = `11.891017922899268`;
exports[`补充bug测试#IKWGF 10`] = `1.0803373815793473`; exports[`补充bug测试#IKWGF 10`] = `1.0803374679586226`;
exports[`补充bug测试#IKWGF 11`] = `0.39474205429703246`; exports[`补充bug测试#IKWGF 11`] = `0.39474593983890766`;
exports[`补充bug测试#IKWGF 12`] = `10.698715561269278`; exports[`补充bug测试#IKWGF 12`] = `10.698868451254269`;

@ -8,7 +8,7 @@ Vector3 {
} }
`; `;
exports[`多段线 多段线点获取弧长 1`] = `35.70780177742267`; exports[`多段线 多段线点获取弧长 1`] = `35.70796326794897`;
exports[`多段线 存在大圆弧的多段线面积 1`] = `-24.019436375469752`; exports[`多段线 存在大圆弧的多段线面积 1`] = `-24.019436375469752`;

@ -889,3 +889,14 @@ test('多段线存在0长度线段导致偏移错误', () =>
testOffset(pl, 400); testOffset(pl, 400);
testOffset(pl, -400); testOffset(pl, -400);
}); });
test('纯圆生成的多段线偏移', () =>
{
let pl = loadFile(
[1, ["Polyline", 1, 1, 710, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1904.6173097681894, -4.547473508864641e-13, 0, 1], 2, 2, [18361.211643461193, 495.8146231175723], 0.7691548555148293, [18910.40925296759, 2564.4589522583397], 1.3001283068422635, true]]
)[0];
testOffset(pl, 100);
testOffset(pl, -100);
});

@ -0,0 +1,89 @@
import { Vector3 } from "../../node_modules/@types/three";
import { app } from "../ApplicationServices/Application";
import { Circle } from "../DatabaseServices/Circle";
import { Curve } from "../DatabaseServices/Curve";
import { Command } from "../Editor/CommandMachine";
import { PromptStatus } from "../Editor/PromptResult";
export class Command_Break implements Command
{
async exec()
{
let cuRes = await app.m_Editor.GetEntity({
Msg: "请选择被打断的曲线:"
});
if (cuRes.Status !== PromptStatus.OK)
return;
let cu = cuRes.Entity as Curve;
if (!cu) return;
let breakPts: Vector3[] = [];
while (true)
{
let ptRes = await app.m_Editor.GetPoint({
Msg: "请点击被打断的点:"
, KeyWordList: breakPts.length === 0 ? [{ key: "D", msg: "等分打断" }, { key: "S", msg: "等分打断" }] : []
});
if (ptRes.Status === PromptStatus.OK)
{
breakPts.push(ptRes.Value);
continue;
}
//用户输入关键字
else if (ptRes.Status === PromptStatus.Keyword)
{
if (ptRes.StringResult === "D")
{
let divRes = await app.m_Editor.GetDistance({ Msg: "请输入等分个数:" });
if (divRes.Status !== PromptStatus.OK)
return;
if (divRes.Value === 0)
{
app.m_Editor.Prompt("个数不能为0!");
continue;
}
let lenDiv = cu.Length / divRes.Value;
for (let i = 1; i < divRes.Value; i++)
breakPts.push(cu.GetPointAtDistance(lenDiv * i));
}
else if (ptRes.StringResult === "S")
{
let divRes = await app.m_Editor.GetDistance({ Msg: "请输入等分距离:" });
if (divRes.Status !== PromptStatus.OK)
return;
if (divRes.Value === 0)
{
app.m_Editor.Prompt("个数不能为0!");
return;
}
let divCount = cu.Length / divRes.Value;
for (let i = 1; i < divCount; i++)
breakPts.push(cu.GetPointAtDistance(divRes.Value * i));
}
else
{
app.m_Editor.Prompt("未知输入!");
continue;
}
if (cu instanceof Circle)
breakPts.push(cu.StartPoint);
}
break;
}
if (breakPts.length > 0)
{
let cus = cu.GetSplitCurvesByPts(breakPts);
cu.Erase();
cus.forEach(c =>
{
app.m_Database.ModelSpace.Append(c);
});
}
}
}

@ -1,4 +1,7 @@
import { app } from "../ApplicationServices/Application"; import { app } from "../ApplicationServices/Application";
import { Status } from "../Common/Status";
import { Arc } from "../DatabaseServices/Arc";
import { Circle } from "../DatabaseServices/Circle";
import { Curve } from '../DatabaseServices/Curve'; import { Curve } from '../DatabaseServices/Curve';
import { Command } from "../Editor/CommandMachine"; import { Command } from "../Editor/CommandMachine";
import { PromptStatus } from "../Editor/PromptResult"; import { PromptStatus } from "../Editor/PromptResult";
@ -17,11 +20,36 @@ export class Command_Join implements Command
{ {
if (cu2Res.Entity instanceof Curve) if (cu2Res.Entity instanceof Curve)
{ {
let bIsOK = cu1Res.Entity.Join(cu2Res.Entity); let status = cu1Res.Entity.Join(cu2Res.Entity);
if (bIsOK) if (status === Status.True)
{ {
cu2Res.Entity.Erase(); cu2Res.Entity.Erase();
} }
else if (status === Status.ConverToCircle)
{
let keyRes = await app.m_Editor.GetKeyWords({
Msg: "合并的圆弧段组成了一个圆。要转换为圆吗?",
KeyWordList: [
{ msg: "是", key: "Y" },
{ msg: "否", key: "N" }
]
});
if (keyRes.StringResult === "Y")
{
cu1Res.Entity.Erase();
cu2Res.Entity.Erase();
let arc = cu1Res.Entity as Arc;
let c = new Circle(arc.Center, arc.Radius);
app.m_Database.ModelSpace.Append(c);
}
}
else
{
app.m_Editor.Prompt("合并失败!");
}
} }
} }
} }

@ -0,0 +1,25 @@
import { Command } from "../Editor/CommandMachine";
import { app } from "../ApplicationServices/Application";
import { PromptStatus } from "../Editor/PromptResult";
import { Curve } from "../DatabaseServices/Curve";
export class Command_Length implements Command
{
async exec()
{
while (true)
{
let enRes = await app.m_Editor.GetEntity();
if (enRes.Status === PromptStatus.OK)
{
if (enRes.Entity instanceof Curve)
{
app.m_Editor.Prompt(enRes.Entity.Length.toFixed(8));
}
}
else
return;
}
}
}

@ -9,6 +9,7 @@ import { SelectBox } from '../Editor/SelectBox';
import { SelectSet } from '../Editor/SelectSet'; import { SelectSet } from '../Editor/SelectSet';
import { RenderType } from '../GraphicsSystem/Enum'; import { RenderType } from '../GraphicsSystem/Enum';
import { IntersectOption } from '../GraphicsSystem/IntersectWith'; import { IntersectOption } from '../GraphicsSystem/IntersectWith';
import { Status } from '../Common/Status';
/** /**
* trim. * trim.
@ -68,7 +69,7 @@ export class Command_Trim implements Command
//正向遍历 //正向遍历
for (; i < splitCus.length; i++) for (; i < splitCus.length; i++)
{ {
if (cuStart.Join(splitCus[i]) != true) if (cuStart.Join(splitCus[i]) != Status.True)
break; break;
} }
splitCus.splice(0, i);//移除0->(i-1)的元素 splitCus.splice(0, i);//移除0->(i-1)的元素

@ -0,0 +1,11 @@
export enum Status
{
False = 0,
True = 1,
Canel = -1,
ConverToCircle = 101,
}

@ -12,6 +12,7 @@ import { Circle } from './Circle';
import { Curve } from './Curve'; import { Curve } from './Curve';
import { Line } from './Line'; import { Line } from './Line';
import { Polyline } from './Polyline'; import { Polyline } from './Polyline';
import { Status } from '../Common/Status';
/** /**
* *
* ACAD,,. * ACAD,,.
@ -292,7 +293,7 @@ export class Arc extends Curve
this.Update(); this.Update();
} }
Join(cu: Curve): boolean Join(cu: Curve): Status
{ {
if (cu instanceof Arc) if (cu instanceof Arc)
{ {
@ -312,43 +313,43 @@ export class Arc extends Curve
if (eaAllan > allAn) if (eaAllan > allAn)
this.EndAngle = ea; this.EndAngle = ea;
return true; return Status.True;
} }
else if (equaln(sa, this.m_EndAngle))//this终点对起点 else if (equaln(sa, this.m_EndAngle))//this终点对起点
{ {
if (eaAllan < allAn || equaln(ea, this.m_StartAngle)) if (eaAllan < allAn || equaln(ea, this.m_StartAngle))
this.ConverToCircle();//圆 return Status.ConverToCircle;
else else
this.EndAngle = ea; this.EndAngle = ea;
return true; return Status.True;
} }
else if (equaln(ea, this.StartAngle))//this起点对终点 else if (equaln(ea, this.StartAngle))//this起点对终点
{ {
if (saAllan < allAn) if (saAllan < allAn)
this.ConverToCircle();//圆 return Status.ConverToCircle;
else else
this.StartAngle = sa; this.StartAngle = sa;
return true; return Status.True;
} }
else if (equaln(ea, this.m_EndAngle))//this终点对终点 else if (equaln(ea, this.m_EndAngle))//this终点对终点
{ {
if (saAllan > allAn) if (saAllan > allAn)
this.StartAngle = sa; this.StartAngle = sa;
return true; return Status.True;
} }
else if (this.ParamOnCurve(this.GetParamAtAngle(sa))) else if (this.ParamOnCurve(this.GetParamAtAngle(sa)))
{ {
if (eaAllan < saAllan) if (eaAllan < saAllan)
this.ConverToCircle(); return Status.ConverToCircle;
else if (eaAllan > allAn) else if (eaAllan > allAn)
this.EndAngle = ea; this.EndAngle = ea;
return true; return Status.True;
} }
else if (this.ParamOnCurve(this.GetParamAtAngle(ea))) else if (this.ParamOnCurve(this.GetParamAtAngle(ea)))
{ {
this.StartAngle = sa; this.StartAngle = sa;
return true; return Status.True;
} }
//使用按负方向去计算它的参数 //使用按负方向去计算它的参数
@ -373,11 +374,11 @@ export class Arc extends Curve
this.StartAngle = sa; this.StartAngle = sa;
if (eaParam > 1) if (eaParam > 1)
this.EndAngle = ea; this.EndAngle = ea;
return true; return Status.True;
} }
} }
} }
return false; return Status.False;
} }
private ConverToCircle() private ConverToCircle()

@ -1,5 +1,5 @@
import * as THREE from 'three'; import * as THREE from 'three';
import { Box3, EllipseCurve, Geometry, Object3D, Vector3, Shape } from 'three'; import { Box3, EllipseCurve, Geometry, Object3D, Vector3, Shape, Quaternion } from 'three';
import { arrayLast, arrayRemoveDuplicateBySort } from '../Common/ArrayExt'; import { arrayLast, arrayRemoveDuplicateBySort } from '../Common/ArrayExt';
import { ColorMaterial } from '../Common/ColorPalette'; import { ColorMaterial } from '../Common/ColorPalette';
import { clamp } from '../Common/Utils'; import { clamp } from '../Common/Utils';
@ -55,9 +55,7 @@ export class Circle extends Curve
get StartPoint(): Vector3 get StartPoint(): Vector3
{ {
let startPt = new Vector3(this.m_Radius, 0, 0); return this.GetPointAtParam(0);
this.Center.clone().add(startPt);
return startPt;
} }
get StartParam(): number get StartParam(): number
{ {
@ -65,9 +63,7 @@ export class Circle extends Curve
} }
get EndPoint(): Vector3 get EndPoint(): Vector3
{ {
let endPt = new Vector3(this.m_Radius, 0, 0); return this.GetPointAtParam(0);
this.Center.clone().add(endPt);
return endPt;
} }
get EndParam(): number get EndParam(): number
{ {

@ -6,6 +6,7 @@ import { RenderType } from '../GraphicsSystem/Enum';
import { IntersectOption } from '../GraphicsSystem/IntersectWith'; import { IntersectOption } from '../GraphicsSystem/IntersectWith';
import { Factory } from './CADFactory'; import { Factory } from './CADFactory';
import { Entity } from './Entity'; import { Entity } from './Entity';
import { Status } from '../Common/Status';
export enum ExtendType export enum ExtendType
{ {
@ -115,7 +116,7 @@ export abstract class Curve extends Entity
* @returns {boolean} * @returns {boolean}
* @memberof Curve * @memberof Curve
*/ */
Join(cu: Curve): boolean { return false }; Join(cu: Curve): Status { return Status.False };
//翻转曲线.首尾调换. //翻转曲线.首尾调换.
Reverse(): this { return this; }; Reverse(): this { return this; };
@ -126,6 +127,12 @@ export abstract class Curve extends Entity
return equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12) || this.ParamOnCurve(this.GetParamAtPoint(pt)); return equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12) || this.ParamOnCurve(this.GetParamAtPoint(pt));
} }
//点在曲线中,不在起点或者终点.
PtOnCurve2(pt: Vector3): boolean
{
return !(equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12)) && this.ParamOnCurve(this.GetParamAtPoint(pt), 0);
}
//参数在曲线上 容差,1e-12 //参数在曲线上 容差,1e-12
ParamOnCurve(param: number, fuzz = 1e-12): boolean { return !isNaN(param) && param >= -fuzz && param <= this.EndParam + fuzz; } ParamOnCurve(param: number, fuzz = 1e-12): boolean { return !isNaN(param) && param >= -fuzz && param <= this.EndParam + fuzz; }
GetOffsetCurves(offsetDist: number): Array<Curve> { return; } GetOffsetCurves(offsetDist: number): Array<Curve> { return; }

@ -12,6 +12,7 @@ import { Circle } from './Circle';
import { Curve } from './Curve'; import { Curve } from './Curve';
import { Polyline } from './Polyline'; import { Polyline } from './Polyline';
import { Vec3DTo2D } from '../Common/CurveUtils'; import { Vec3DTo2D } from '../Common/CurveUtils';
import { Status } from '../Common/Status';
@Factory @Factory
export class Line extends Curve export class Line extends Curve
@ -223,13 +224,13 @@ export class Line extends Curve
} }
} }
Join(cu: Curve): boolean Join(cu: Curve): Status
{ {
if (cu instanceof Line) if (cu instanceof Line)
{ {
//如果不平行 //如果不平行
if (!isParallelTo(this.GetFistDeriv(0), cu.GetFistDeriv(0))) if (!isParallelTo(this.GetFistDeriv(0), cu.GetFistDeriv(0)))
return false; return Status.False;
let [param1, param2] = arraySortByNumber([this.GetParamAtPoint(cu.StartPoint), this.GetParamAtPoint(cu.EndPoint)]); let [param1, param2] = arraySortByNumber([this.GetParamAtPoint(cu.StartPoint), this.GetParamAtPoint(cu.EndPoint)]);
@ -241,10 +242,10 @@ export class Line extends Curve
this.Extend(param1); this.Extend(param1);
if (param2 > 1) if (param2 > 1)
this.Extend(param2); this.Extend(param2);
return true; return Status.True;
} }
} }
return false; return Status.False;
}; };
Reverse(): this Reverse(): this

@ -5,8 +5,9 @@ import { arrayLast, arrayRemoveDuplicateBySort } from '../Common/ArrayExt';
import { ColorMaterial } from '../Common/ColorPalette'; import { ColorMaterial } from '../Common/ColorPalette';
import { getDeterminantFor2V, Vec2DTo3D, Vec3DTo2D } from '../Common/CurveUtils'; import { getDeterminantFor2V, Vec2DTo3D, Vec3DTo2D } from '../Common/CurveUtils';
import { matrixAlignCoordSys } from '../Common/Matrix4Utils'; import { matrixAlignCoordSys } from '../Common/Matrix4Utils';
import { Status } from '../Common/Status';
import { FixIndex } from '../Common/Utils'; import { FixIndex } from '../Common/Utils';
import { equalv3, equaln, updateGeometry } from '../Geometry/GeUtils'; import { equaln, equalv3, updateGeometry } from '../Geometry/GeUtils';
import { RenderType } from '../GraphicsSystem/Enum'; import { RenderType } from '../GraphicsSystem/Enum';
import { IntersectOption, IntersectPolylineAndCurve } from '../GraphicsSystem/IntersectWith'; import { IntersectOption, IntersectPolylineAndCurve } from '../GraphicsSystem/IntersectWith';
import { PolyOffsetUtil } from '../GraphicsSystem/OffsetPolyline'; import { PolyOffsetUtil } from '../GraphicsSystem/OffsetPolyline';
@ -253,7 +254,7 @@ export class Polyline extends Curve
} }
get Length() get Length()
{ {
return this.Shape.getLength(); return this.Explode().reduce((l, cu) => l + cu.Length, 0);
} }
/** /**
@ -540,10 +541,10 @@ export class Polyline extends Curve
this.Update(); this.Update();
} }
Join(cu: Curve, fuzz = 1e-5): boolean Join(cu: Curve, fuzz = 1e-5)
{ {
if (this.m_ClosedMark) if (this.m_ClosedMark)
return false; return Status.False;
let [sp, ep, cuSp, cuEp] = [this.StartPoint, this.EndPoint, cu.StartPoint, cu.EndPoint]; let [sp, ep, cuSp, cuEp] = [this.StartPoint, this.EndPoint, cu.StartPoint, cu.EndPoint];
@ -569,7 +570,7 @@ export class Polyline extends Curve
this.ReadFile(f); this.ReadFile(f);
} }
else else
return false; return Status.False;
} }
else else
{ {
@ -592,7 +593,7 @@ export class Polyline extends Curve
this.m_LineData.push({ pt: cuSp2, bul: 0 }); this.m_LineData.push({ pt: cuSp2, bul: 0 });
} }
else else
return false; return Status.False;
} }
else if (cu instanceof Arc) else if (cu instanceof Arc)
{ {
@ -616,11 +617,11 @@ export class Polyline extends Curve
this.m_LineData.push({ pt: cuSp2, bul: 0 }); this.m_LineData.push({ pt: cuSp2, bul: 0 });
} }
else else
return false; return Status.False;
} }
else if (cu instanceof Polyline) else if (cu instanceof Polyline)
{ {
if (cu.CloseMark) return false; if (cu.CloseMark) return Status.False;
let { pts, buls } = this.PtsBuls; let { pts, buls } = this.PtsBuls;
@ -667,7 +668,7 @@ export class Polyline extends Curve
buls = buls.concat(cuPtsBul.buls); buls = buls.concat(cuPtsBul.buls);
} }
else else
return false; return Status.False;
this.m_LineData.length = 0; this.m_LineData.length = 0;
for (let i = 0; i < pts.length; i++) for (let i = 0; i < pts.length; i++)
@ -676,12 +677,12 @@ export class Polyline extends Curve
} }
} }
else else
return false; return Status.False;
} }
//在上面的其他分支已经返回了假 所以这里直接返回真. //在上面的其他分支已经返回了假 所以这里直接返回真.
this.Update(); this.Update();
return true; return Status.True;
}; };
PtOnCurve(pt: Vector3): boolean PtOnCurve(pt: Vector3): boolean

@ -66,6 +66,8 @@ import { Command_DimTest } from '../DatabaseServices/Dimension/dimTest';
import { commandMachine } from './CommandMachine'; import { commandMachine } from './CommandMachine';
import { Sweep } from '../Add-on/Sweep'; import { Sweep } from '../Add-on/Sweep';
import { Command_Scale } from '../Add-on/Scale'; import { Command_Scale } from '../Add-on/Scale';
import { Command_Break } from '../Add-on/Break';
import { Command_Length } from '../Add-on/Length';
export function registerCommand() export function registerCommand()
{ {
@ -96,7 +98,9 @@ export function registerCommand()
commandMachine.RegisterCommand("br", new Command_DrawBoard()) commandMachine.RegisterCommand("br", new Command_DrawBoard())
commandMachine.RegisterCommand("c0", new DrawCircle0()) commandMachine.RegisterCommand("c0", new DrawCircle0());
commandMachine.RegisterCommand("break", new Command_Break());
commandMachine.RegisterCommand("s", new Stretch()) commandMachine.RegisterCommand("s", new Stretch())
@ -145,6 +149,7 @@ export function registerCommand()
commandMachine.RegisterCommand("f", new CommandFillet()); commandMachine.RegisterCommand("f", new CommandFillet());
commandMachine.RegisterCommand("O", new Command_Offset()); commandMachine.RegisterCommand("O", new Command_Offset());
commandMachine.RegisterCommand("Length", new Command_Length());
commandMachine.RegisterCommand("br2", new Command_DrawBoard2()); commandMachine.RegisterCommand("br2", new Command_DrawBoard2());

@ -12,6 +12,7 @@ import { equaln, equalv2, equalv3 } from "../Geometry/GeUtils";
import { EBox, SortEntityByBox } from "../Geometry/SortEntityByBox"; import { EBox, SortEntityByBox } from "../Geometry/SortEntityByBox";
import { IsPtsAllOutOrOnReg } from "./BoolOperateUtils"; import { IsPtsAllOutOrOnReg } from "./BoolOperateUtils";
import { IntersectOption } from "./IntersectWith"; import { IntersectOption } from "./IntersectWith";
import { Status } from "../Common/Status";
interface offsetRes interface offsetRes
{ {
@ -125,13 +126,16 @@ export class PolyOffsetUtil
if (c2b.min.y - 1e-6 > c1b.max.y) if (c2b.min.y - 1e-6 > c1b.max.y)
continue; continue;
if (c1.Join(c2)) //有共线部分才允许合并.
{ if (c2.PtOnCurve2(c1.StartPoint) || c2.PtOnCurve2(c1.EndPoint)
this.m_RetCurves.splice(j, 1); || c1.PtOnCurve2(c2.StartPoint) || c1.PtOnCurve2(c2.EndPoint))
c1b = c1.BoundingBox; if (c1.Join(c2) === Status.True)
boxCurves.set(c1, c1b); {
j--; this.m_RetCurves.splice(j, 1);
} c1b = c1.BoundingBox;
boxCurves.set(c1, c1b);
j--;
}
} }
} }
} }

@ -21,7 +21,7 @@ function PointToString(pt: Vector3): string
*/ */
export class DownPanelStore export class DownPanelStore
{ {
@observable m_MousePostionPrompt: string; @observable m_MousePostionPrompt: string = "0,0,0";
@observable useDynInput: boolean = true; @observable useDynInput: boolean = true;
@observable showToolBar: boolean = true; @observable showToolBar: boolean = true;
@observable useDynSnap: boolean = true; @observable useDynSnap: boolean = true;

Loading…
Cancel
Save