Skip to content

Commit d2c45d0

Browse files
simple angular dimension
1 parent 1095364 commit d2c45d0

File tree

9 files changed

+209
-7
lines changed

9 files changed

+209
-7
lines changed

packages/dev/babylonjs/lib/api/bitbybit-base.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export class BitByBitBase {
8787
this.color = new Color(this.math);
8888
this.line = new Line(this.context, geometryHelper);
8989
this.transforms = new Transforms(this.vector, this.math);
90-
this.point = new Point(geometryHelper, this.transforms);
90+
this.point = new Point(geometryHelper, this.transforms, this.vector);
9191
this.polyline = new Polyline(this.context, geometryHelper);
9292
this.verb = new Verb(this.context, geometryHelper, this.math);
9393
this.time = new Time(this.context);

packages/dev/base/lib/api/services/point.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { GeometryHelper } from "./geometry-helper";
22
import * as Inputs from "../inputs";
33
import { Transforms } from "./transforms";
4+
import { Vector } from "./vector";
45

56
/**
67
* Contains various methods for points. Point in bitbybit is simply an array containing 3 numbers for [x, y, z].
@@ -10,7 +11,7 @@ import { Transforms } from "./transforms";
1011

1112
export class Point {
1213

13-
constructor(private readonly geometryHelper: GeometryHelper, private readonly transforms: Transforms) { }
14+
constructor(private readonly geometryHelper: GeometryHelper, private readonly transforms: Transforms, private readonly vector: Vector) { }
1415

1516
/**
1617
* Transforms the single point
@@ -450,7 +451,7 @@ export class Point {
450451
nz = -nz;
451452
}
452453

453-
return [nx, ny, nz];
454+
return this.vector.normalized({ vector: [nx, ny, nz] }) as Inputs.Base.Vector3;
454455
}
455456

456457
private closestPointFromPointData(inputs: Inputs.Point.ClosestPointFromPointsDto): {

packages/dev/base/lib/api/services/text.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe("Text unit tests", () => {
1313
const math = new MathBitByBit();
1414
const vector = new Vector(math, geometryHelper);
1515
const transforms = new Transforms(vector, math);
16-
const points = new Point(geometryHelper, transforms);
16+
const points = new Point(geometryHelper, transforms, vector);
1717
text = new TextBitByBit(points);
1818
});
1919

packages/dev/occt-worker/lib/api/occt/dimensions.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,16 @@ export class OCCTDimensions {
2020
simpleLinearLengthDimension(inputs: Inputs.OCCT.SimpleLinearLengthDimensionDto): Promise<Inputs.OCCT.TopoDSCompoundPointer> {
2121
return this.occWorkerManager.genericCallToWorkerPromise("dimensions.simpleLinearLengthDimension", inputs);
2222
}
23+
24+
/**
25+
* Creates simple angular dimension
26+
* @param inputs two points, direction, label size, label normal direction, offset, and unit suffix, decimal rounding place
27+
* @returns compound wires representing dimension
28+
* @group simple
29+
* @shortname angular dimension
30+
* @drawable true
31+
*/
32+
simpleAngularDimension(inputs: Inputs.OCCT.SimpleAngularDimensionDto): Promise<Inputs.OCCT.TopoDSCompoundPointer> {
33+
return this.occWorkerManager.genericCallToWorkerPromise("dimensions.simpleAngularDimension", inputs);
34+
}
2335
}

packages/dev/occt/lib/api/inputs/occ-inputs.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6029,6 +6029,93 @@ export namespace OCCT {
60296029
* @step 0.1
60306030
*/
60316031
labelOffset? = 0.3;
6032+
}
6033+
export class SimpleAngularDimensionDto {
6034+
constructor(direction1?: Base.Point3, direction2?: Base.Point3, center?: Base.Point3, radius?: number, offsetFromCenter?: number, crossingSize?: number, radians?: boolean, labelSuffix?: string, labelSize?: number, labelOffset?: number) {
6035+
if (direction1 !== undefined) { this.direction1 = direction1; }
6036+
if (direction2 !== undefined) { this.direction2 = direction2; }
6037+
if (center !== undefined) { this.center = center; }
6038+
if( radius !== undefined) { this.radius = radius; }
6039+
if (offsetFromCenter !== undefined) { this.offsetFromCenter = offsetFromCenter; }
6040+
if (crossingSize !== undefined) { this.extraSize = crossingSize; }
6041+
if (radians !== undefined) { this.radians = radians; }
6042+
if (labelSuffix !== undefined) { this.labelSuffix = labelSuffix; }
6043+
if (labelSize !== undefined) { this.labelSize = labelSize; }
6044+
if (labelOffset !== undefined) { this.labelOffset = labelOffset; }
6045+
}
60326046

6047+
/**
6048+
* The first direction for dimension
6049+
* @default [1, 0, 0]
6050+
*/
6051+
direction1: Base.Point3 = [1, 0, 0];
6052+
/**
6053+
* The second direction for dimension
6054+
* @default [0, 0, 1]
6055+
*/
6056+
direction2: Base.Point3 = [0, 0, 1];
6057+
/**
6058+
* The center point for dimension
6059+
* @default [0, 0, 0]
6060+
*/
6061+
center: Base.Point3 = [0, 0, 0];
6062+
/**
6063+
* The dimension radius
6064+
* @default 4
6065+
* @minimum 0
6066+
* @maximum Infinity
6067+
* @step 0.1
6068+
*/
6069+
radius = 4;
6070+
/**
6071+
* Offset from center
6072+
* @default 0.5
6073+
* @minimum -Infinity
6074+
* @maximum Infinity
6075+
* @step 0.1
6076+
*/
6077+
offsetFromCenter = 0.5;
6078+
/**
6079+
* The dimension crossing size
6080+
* @default 0
6081+
* @minimum 0
6082+
* @maximum Infinity
6083+
* @step 0.1
6084+
*/
6085+
extraSize = 0;
6086+
/**
6087+
* The dimension label decimal places
6088+
* @default 2
6089+
* @minimum 0
6090+
* @maximum Infinity
6091+
* @step 1
6092+
*/
6093+
decimalPlaces = 2;
6094+
/**
6095+
* The dimension label suffix
6096+
* @default (deg)
6097+
*/
6098+
labelSuffix = "(deg)";
6099+
/**
6100+
* The dimension label size
6101+
* @default 0.1
6102+
* @minimum 0
6103+
* @maximum Infinity
6104+
* @step 0.1
6105+
*/
6106+
labelSize = 0.1;
6107+
/**
6108+
* The dimension label offset
6109+
* @default 0.3
6110+
* @minimum -Infinity
6111+
* @maximum Infinity
6112+
* @step 0.1
6113+
*/
6114+
labelOffset = 0.3;
6115+
/**
6116+
* If true the angle is in radians
6117+
* @default false
6118+
*/
6119+
radians = false;
60336120
}
60346121
}

packages/dev/occt/lib/occ-helper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class OccHelper {
6363
this.math = new MathBitByBit();
6464
this.vector = new Vector(this.math, this.geometryHelper);
6565
this.transforms = new Transforms(this.vector, this.math);
66-
this.point = new Point(this.geometryHelper, this.transforms);
66+
this.point = new Point(this.geometryHelper, this.transforms, this.vector);
6767
this.textService = new TextBitByBit(this.point);
6868

6969
this.occRefReturns = new OCCReferencedReturns(occ);
@@ -85,7 +85,7 @@ export class OccHelper {
8585
this.enumService, this.entitiesService, this.converterService, this.geomService, this.edgesService, this.textService, this.operationsService);
8686

8787
this.dimensionsService = new DimensionsService(this.vector, this.point, this.transformsService,
88-
this.converterService, this.wiresService);
88+
this.converterService, this.entitiesService, this.edgesService, this.wiresService);
8989

9090
this.verticesService.wiresService = this.wiresService;
9191

packages/dev/occt/lib/services/base/dimensions.service.ts

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import {
22
TopoDS_Compound,
3+
TopoDS_Edge,
34
} from "../../../bitbybit-dev-occt/bitbybit-dev-occt";
45
import * as Inputs from "../../api/inputs/inputs";
56
import { TransformsService } from "./transforms.service";
67
import { ConverterService } from "./converter.service";
78
import { WiresService } from "./wires.service";
89
import { Point, Vector } from "@bitbybit-dev/base";
10+
import { EdgesService } from "./edges.service";
11+
import { EntitiesService } from "./entities.service";
912

1013
export class DimensionsService {
1114

@@ -14,6 +17,8 @@ export class DimensionsService {
1417
private readonly point: Point,
1518
private readonly transformsService: TransformsService,
1619
private readonly converterService: ConverterService,
20+
private readonly entitiesService: EntitiesService,
21+
private readonly edgesService: EdgesService,
1722
private readonly wiresService: WiresService
1823
) { }
1924

@@ -115,4 +120,97 @@ export class DimensionsService {
115120
return res;
116121
}
117122

123+
simpleAngularDimension(inputs: Inputs.OCCT.SimpleAngularDimensionDto): TopoDS_Compound {
124+
const normDir1 = this.vector.normalized({ vector: inputs.direction1 });
125+
const endVec = this.vector.mul({ vector: normDir1, scalar: inputs.radius }) as Inputs.Base.Point3;
126+
const endPt = this.point.translatePoints({
127+
points: [endVec],
128+
translation: inputs.center,
129+
})[0];
130+
const line1WithExt = this.wiresService.createLineWireWithExtensions({
131+
start: inputs.center,
132+
end: endPt,
133+
extensionStart: -inputs.offsetFromCenter,
134+
extensionEnd: inputs.extraSize,
135+
});
136+
137+
const normDir2 = this.vector.normalized({ vector: inputs.direction2 });
138+
const endVec2 = this.vector.mul({ vector: normDir2, scalar: inputs.radius }) as Inputs.Base.Point3;
139+
const endPt2 = this.point.translatePoints({
140+
points: [endVec2],
141+
translation: inputs.center,
142+
})[0];
143+
const line2WithExt = this.wiresService.createLineWireWithExtensions({
144+
start: inputs.center,
145+
end: endPt2,
146+
extensionStart: -inputs.offsetFromCenter,
147+
extensionEnd: inputs.extraSize,
148+
});
149+
150+
const normalThreePoints = this.point.normalFromThreePoints({
151+
point1: inputs.center,
152+
point2: endPt,
153+
point3: endPt2,
154+
reverseNormal: true,
155+
});
156+
157+
const normalThreePointsRev = this.point.normalFromThreePoints({
158+
point1: inputs.center,
159+
point2: endPt,
160+
point3: endPt2,
161+
reverseNormal: false,
162+
});
163+
164+
const circ = this.entitiesService.createCircle(inputs.radius, inputs.center, normalThreePointsRev, Inputs.OCCT.typeSpecificityEnum.edge) as TopoDS_Edge;
165+
const arc = this.edgesService.arcFromCircleAndTwoPoints({
166+
circle: circ,
167+
start: endPt,
168+
end: endPt2,
169+
sense: false,
170+
});
171+
const wireArc = this.wiresService.createWireFromEdge({ shape: arc });
172+
173+
const midPt = this.wiresService.midPointOnWire({ shape: wireArc });
174+
const angleDeg = this.vector.angleBetween({
175+
first: inputs.direction1,
176+
second: inputs.direction2,
177+
}) as number;
178+
179+
const txtOpt = new Inputs.OCCT.TextWiresDto();
180+
txtOpt.text = angleDeg.toFixed(inputs.decimalPlaces) + " " + inputs.labelSuffix;
181+
txtOpt.xOffset = 0;
182+
txtOpt.yOffset = 0;
183+
txtOpt.height = inputs.labelSize;
184+
txtOpt.centerOnOrigin = true;
185+
const txt = this.wiresService.textWiresWithData(txtOpt);
186+
187+
const vectorToMid = this.vector.sub({
188+
first: midPt,
189+
second: inputs.center,
190+
}) as Inputs.Base.Vector3;
191+
const normVecToMid = this.vector.normalized({ vector: vectorToMid }) as Inputs.Base.Vector3;
192+
193+
const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({
194+
shape: txt.compound,
195+
fromOrigin: [0, 0, 0],
196+
fromNorm: [0, 1, 0],
197+
fromAx: [0, 0, 1],
198+
toOrigin: [0, 0, 0],
199+
toNorm: normalThreePoints,
200+
toAx: normVecToMid,
201+
});
202+
const offsetLabelVec = this.vector.mul({ vector: normVecToMid, scalar: inputs.labelOffset });
203+
const addToDir = this.vector.add({
204+
first: midPt,
205+
second: offsetLabelVec,
206+
}) as Inputs.Base.Vector3;
207+
const labelTransformed = this.transformsService.translate({
208+
shape: alignedLabelTxtToDir,
209+
translation: addToDir
210+
});
211+
212+
const res = this.converterService.makeCompound({ shapes: [line1WithExt, line2WithExt, wireArc, labelTransformed] });
213+
return res;
214+
}
215+
118216
}

packages/dev/occt/lib/services/dimensions.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@ export class OCCTDimensions {
1414
return this.och.dimensionsService.simpleLinearLengthDimension(inputs);
1515
}
1616

17+
simpleAngularDimension(inputs: Inputs.OCCT.SimpleAngularDimensionDto): TopoDS_Compound {
18+
return this.och.dimensionsService.simpleAngularDimension(inputs);
19+
}
20+
1721
}

packages/dev/threejs/lib/api/bitbybit-base.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export class BitByBitBase {
7474
this.color = new Color(this.math);
7575
this.line = new Line(this.context, geometryHelper);
7676
this.transforms = new Transforms(this.vector, this.math);
77-
this.point = new Point(geometryHelper, this.transforms);
77+
this.point = new Point(geometryHelper, this.transforms, this.vector);
7878
this.polyline = new Polyline(this.context, geometryHelper);
7979
this.verb = new Verb(this.context, geometryHelper, this.math);
8080
this.time = new Time(this.context);

0 commit comments

Comments
 (0)