merge experimental void app
This commit is contained in:
parent
9e142fbe1e
commit
02fb3cd30d
80 changed files with 30437 additions and 813 deletions
112
src/void/sketch/curve.js
Normal file
112
src/void/sketch/curve.js
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
|
||||
|
||||
const CURVE_TYPE = {
|
||||
ARC: 'arc',
|
||||
CIRCLE: 'circle'
|
||||
};
|
||||
|
||||
const CURVE_DEF = {
|
||||
ARC_THREE_POINT: 'three-point',
|
||||
ARC_CENTER_POINT: 'center-point',
|
||||
ARC_TANGENT: 'tangent',
|
||||
CIRCLE_CENTER_POINT: 'center-point',
|
||||
CIRCLE_THREE_POINT: 'three-point'
|
||||
};
|
||||
|
||||
function isArcEntity(entity) {
|
||||
return entity?.type === 'arc' || entity?.curveType === CURVE_TYPE.ARC || entity?.curveType === CURVE_TYPE.CIRCLE || entity?.circle === true;
|
||||
}
|
||||
|
||||
function getCurveType(entity) {
|
||||
if (!entity || typeof entity !== 'object') return null;
|
||||
if (entity?.curveType === CURVE_TYPE.CIRCLE) return CURVE_TYPE.CIRCLE;
|
||||
if (entity?.curveType === CURVE_TYPE.ARC) return CURVE_TYPE.ARC;
|
||||
if (entity?.circle === true) return CURVE_TYPE.CIRCLE;
|
||||
if (entity?.type === 'arc') return CURVE_TYPE.ARC;
|
||||
return null;
|
||||
}
|
||||
|
||||
function isCircleCurve(entity) {
|
||||
return getCurveType(entity) === CURVE_TYPE.CIRCLE;
|
||||
}
|
||||
|
||||
function getCurveDefinition(entity) {
|
||||
if (!isArcEntity(entity)) return null;
|
||||
if (typeof entity?.curveDefinition === 'string' && entity.curveDefinition) {
|
||||
return entity.curveDefinition;
|
||||
}
|
||||
if (isCircleCurve(entity)) {
|
||||
return CURVE_DEF.CIRCLE_CENTER_POINT;
|
||||
}
|
||||
if (Number.isFinite(entity?.mx) && Number.isFinite(entity?.my)) {
|
||||
return CURVE_DEF.ARC_THREE_POINT;
|
||||
}
|
||||
return CURVE_DEF.ARC_CENTER_POINT;
|
||||
}
|
||||
|
||||
function applyCurveSchema(entity, curveType, curveDefinition) {
|
||||
if (!isArcEntity(entity)) return false;
|
||||
let changed = false;
|
||||
if (entity.curveType !== curveType) {
|
||||
entity.curveType = curveType;
|
||||
changed = true;
|
||||
}
|
||||
if (entity.curveDefinition !== curveDefinition) {
|
||||
entity.curveDefinition = curveDefinition;
|
||||
changed = true;
|
||||
}
|
||||
const legacyCircle = curveType === CURVE_TYPE.CIRCLE;
|
||||
if (entity.circle !== legacyCircle) {
|
||||
entity.circle = legacyCircle;
|
||||
changed = true;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
function markArcThreePoint(entity) {
|
||||
return applyCurveSchema(entity, CURVE_TYPE.ARC, CURVE_DEF.ARC_THREE_POINT);
|
||||
}
|
||||
|
||||
function markArcCenterPoint(entity) {
|
||||
return applyCurveSchema(entity, CURVE_TYPE.ARC, CURVE_DEF.ARC_CENTER_POINT);
|
||||
}
|
||||
|
||||
function markArcTangent(entity) {
|
||||
return applyCurveSchema(entity, CURVE_TYPE.ARC, CURVE_DEF.ARC_TANGENT);
|
||||
}
|
||||
|
||||
function markCircleCenterPoint(entity) {
|
||||
return applyCurveSchema(entity, CURVE_TYPE.CIRCLE, CURVE_DEF.CIRCLE_CENTER_POINT);
|
||||
}
|
||||
|
||||
function markCircleThreePoint(entity) {
|
||||
return applyCurveSchema(entity, CURVE_TYPE.CIRCLE, CURVE_DEF.CIRCLE_THREE_POINT);
|
||||
}
|
||||
|
||||
function isCenterPointCircle(entity) {
|
||||
return isCircleCurve(entity) && getCurveDefinition(entity) === CURVE_DEF.CIRCLE_CENTER_POINT;
|
||||
}
|
||||
|
||||
function isThreePointCircle(entity) {
|
||||
if (!isCircleCurve(entity)) return false;
|
||||
if (getCurveDefinition(entity) !== CURVE_DEF.CIRCLE_THREE_POINT) return false;
|
||||
const ids = Array.isArray(entity?.data?.threePointIds) ? entity.data.threePointIds.filter(Boolean) : [];
|
||||
return ids.length >= 3;
|
||||
}
|
||||
|
||||
export {
|
||||
CURVE_TYPE,
|
||||
CURVE_DEF,
|
||||
isArcEntity,
|
||||
getCurveType,
|
||||
isCircleCurve,
|
||||
getCurveDefinition,
|
||||
applyCurveSchema,
|
||||
markArcThreePoint,
|
||||
markArcCenterPoint,
|
||||
markArcTangent,
|
||||
markCircleCenterPoint,
|
||||
markCircleThreePoint,
|
||||
isCenterPointCircle,
|
||||
isThreePointCircle
|
||||
};
|
||||
Loading…
Reference in a new issue