awv3
Version:
⚡ AWV3 embedded CAD
142 lines (136 loc) • 5.04 kB
JavaScript
// highlevel commands are those that map to different lowlevel commands depending on the arguments
import { angleox, distance, horizontalDistance, radius, verticalDistance } from '../constraint/type';
import { getArcAngles, getClass } from '../geomutils';
import {
AddPoint,
AddLine,
AddArc,
AddCircle,
AddConstraint,
RemovePoint,
RemoveLine,
RemoveArc,
RemoveCircle,
RemoveConstraint,
UpdatePoint,
UpdateLine,
UpdateArc,
UpdateCircle,
GetOrigin,
SketchAppendNewObj,
Assign,
Call,
Member,
Sequence,
Variable,
} from './lowlevel';
export function addCommand(sketch, geomParams) {
switch (getClass(geomParams)) {
case 'CC_Point':
return AddPoint(sketch, geomParams.start);
case 'CC_Line':
return AddLine(sketch, geomParams.start, geomParams.end);
case 'CC_Arc':
return AddArc(sketch, geomParams.start, getArcAngles(geomParams).mid, geomParams.end);
case 'CC_Circle':
return AddCircle(sketch, geomParams.center, geomParams.radius);
}
if (geomParams.entities)
return AddConstraint(
sketch,
geomParams.class,
geomParams.class,
geomParams.entities,
geomParams.value.type,
geomParams.value.value,
geomParams.value.userValue,
geomParams.value.dimPos,
[geomParams.value.sector, geomParams.value.reflex],
);
}
export function removeCommands(sketch, ...ccrefs) {
return ccrefs.filter(ccref => ccref === ccref.encompassing).map(ccref => {
switch (ccref.class) {
case 'CC_Point':
return RemovePoint(sketch, ccref);
case 'CC_Line':
return RemoveLine(sketch, ccref);
case 'CC_Arc':
return RemoveArc(sketch, ccref);
case 'CC_Circle':
return RemoveCircle(sketch, ccref);
}
if (ccref.isConstraint()) return RemoveConstraint(sketch, ccref);
});
}
export function updateCommand(sketch, ccref, geomParams) {
switch (ccref.class) {
case 'CC_Point': {
const encompassing = ccref.encompassing;
if (ccref === encompassing)
return UpdatePoint(sketch, ccref, geomParams.start);
else
return updateCommand(sketch, encompassing, {
...encompassing.geomParams,
[ccref.pointType]: geomParams.start,
});
}
case 'CC_Line':
return UpdateLine(sketch, ccref, geomParams.start, geomParams.end);
case 'CC_Arc':
return UpdateArc(
sketch,
ccref,
geomParams.start,
geomParams.end,
geomParams.center,
geomParams.start.distanceTo(geomParams.center),
getArcAngles(geomParams).bulge,
);
case 'CC_Circle':
return UpdateCircle(sketch, ccref, geomParams.center, geomParams.radius);
}
}
export function restrictionCommands(sketch, ccref, restrictions) {
let commands = [];
function add(ct, entities, value) {
if (value !== undefined) commands.push(addCommand(sketch, { class: ct.type, entities, value: { value } }));
}
const origin = sketch.getMember('originReference').value
? sketch.getMember('originReference', 'Ccref')
: GetOrigin(sketch);
switch (ccref.class) {
case 'CC_Point':
add(horizontalDistance, [origin, ccref], restrictions.xabsolute);
add(verticalDistance, [origin, ccref], restrictions.yabsolute);
break;
case 'CC_Line':
add(distance, ccref.children, restrictions.length);
add(angleox, [ccref], restrictions.angle);
add(horizontalDistance, ccref.children, restrictions.xoffset);
add(verticalDistance, ccref.children, restrictions.yoffset);
add(horizontalDistance, [origin, ccref.endPoint], restrictions.xabsolute);
add(verticalDistance, [origin, ccref.endPoint], restrictions.yabsolute);
break;
case 'CC_Arc':
add(radius, [ccref], restrictions.radius);
add(horizontalDistance, [ccref.startPoint, ccref.endPoint], restrictions.xoffset);
add(verticalDistance, [ccref.startPoint, ccref.endPoint], restrictions.yoffset);
add(horizontalDistance, [origin, ccref.endPoint], restrictions.xabsolute);
add(verticalDistance, [origin, ccref.endPoint], restrictions.yabsolute);
break;
case 'CC_Circle':
add(radius, [ccref], restrictions.radius);
break;
}
return commands;
}
export function setPlaneCommands(sketch, plane) {
const v = Variable();
return Sequence(
Assign(v, sketch),
Call(Member(v, 'SetPlaneRef'), plane),
Call(Member(v, 'SetCoordSys')),
1,
);
}